[automerger skipped] Import translations. DO NOT MERGE ANYWHERE am: 0f9906f9aa -s ours
am skip reason: subject contains skip directive
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/TvSettings/+/18441086
Change-Id: If9c22f357e43a9be79d308322ba0285bc02bf823
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..a770630
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,20 @@
+# Trusty Style
+# This is a Google-derived style with 4-space indent and a few quirks for
+# systems code.
+BasedOnStyle: Chromium
+# 4-space indent, no tabs.
+IndentWidth: 4
+UseTab: Never
+TabWidth: 4
+# Double indent arguments when none of them are on the first line.
+ContinuationIndentWidth: 8
+ConstructorInitializerIndentWidth: 8
+# Don't indent public/private/protected.
+# It's a little more common to do a half indent, but folks didn't like that.
+AccessModifierOffset: -4
+# Don't indent case labels.
+IndentCaseLabels: false
+# Don't break strings to make it easier to grep for error messages.
+# Note: this can result in lines that exceed the column limit.
+BreakStringLiterals: false
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e6d6125
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+
+# Eclipse project
+**/.classpath
+**/.project
+
+# IntelliJ project
+**/.idea
+**/*.iml
+**/*.ipr
+
+# Misc files
+**/.gitignore
diff --git a/Android.bp b/Android.bp
index 5feb6e6..a3873d9 100644
--- a/Android.bp
+++ b/Android.bp
@@ -34,7 +34,7 @@
system_ext_specific: true,
required: ["privapp_whitelist_com.android.tv.settings"],
optimize: {
- proguard_flags_files: ["Settings/proguard.cfg"],
+ proguard_flags_files: ["Settings/proguard.flags"],
},
privileged: true,
static_libs: [
@@ -52,6 +52,7 @@
"tvsettings-logtags",
"TwoPanelSettingsLib",
"zxing-core-1.7",
+ "TvSettingsAPI",
],
}
@@ -78,7 +79,7 @@
system_ext_specific: true,
required: ["privapp_whitelist_com.android.tv.settings"],
optimize: {
- proguard_flags_files: ["Settings/proguard.cfg"],
+ proguard_flags_files: ["Settings/proguard.flags"],
},
privileged: true,
static_libs: [
@@ -96,6 +97,7 @@
"tvsettings-logtags",
"TwoPanelSettingsLib",
"zxing-core-1.7",
+ "TvSettingsAPI",
],
jacoco: {
include_filter: [
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index f3db20e..5100c03 100644
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -1,2 +1,8 @@
[Hook Scripts]
+checkcolor_hook = ${REPO_ROOT}/prebuilts/checkcolor/checkcolor.py -p .
+
+strings_lint_hook = ${REPO_ROOT}/frameworks/base/tools/stringslint/stringslint_sha.sh ${PREUPLOAD_COMMIT}
+
checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT}
+
+robolectric_hook = ${REPO_ROOT}/packages/apps/Settings/tests/robotests/new_tests_hook.sh ${REPO_PROJECT}
diff --git a/Settings/AndroidManifest.xml b/Settings/AndroidManifest.xml
index 8efd96c..588f69a 100644
--- a/Settings/AndroidManifest.xml
+++ b/Settings/AndroidManifest.xml
@@ -23,13 +23,15 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
- <uses-sdk android:minSdkVersion="23"/>
+ <uses-sdk android:minSdkVersion="31"
+ tools:overrideLibrary="com.android.tv.settings.library"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.BACKUP"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
+ <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
<uses-permission android:name="android.permission.DELETE_CACHE_FILES"/>
@@ -69,6 +71,7 @@
<uses-permission android:name="com.google.android.assistant.READ_HOTWORD_STATE"/>
<uses-permission android:name="com.google.android.assistant.WRITE_HOTWORD_STATE"/>
<uses-permission android:name="android.permission.MANAGE_SLICE_PERMISSIONS"/>
+ <uses-permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"/>
<application
android:name=".TvSettingsApplication"
@@ -159,7 +162,13 @@
android:configChanges="keyboard|keyboardHidden|navigation"
android:excludeFromRecents="true"
android:exported="true"
- android:theme="@style/Theme.SettingsConnectivity" />
+ android:permission="android.permission.NETWORK_SETTINGS"
+ android:theme="@style/Theme.SettingsConnectivity" >
+ <intent-filter>
+ <action android:name="com.android.settings.wifi.action.WIFI_CONNECTION_SETTINGS"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ </intent-filter>
+ </activity>
<activity
android:name=".connectivity.EditProxySettingsActivity"
@@ -193,7 +202,12 @@
android:configChanges="keyboard|keyboardHidden|navigation"
android:excludeFromRecents="true"
android:exported="true"
- android:theme="@style/Theme.SettingsConnectivity" />
+ android:theme="@style/Theme.SettingsConnectivity">
+ <intent-filter>
+ <action android:name="com.android.settings.wifi.action.ADD_WIFI_NETWORK"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ </intent-filter>
+ </activity>
<!-- AccountSliceActivity is just here to facilitate the activity-alias below to eliminate
the risk of repackaging. -->
@@ -311,6 +325,19 @@
</activity>
<activity
+ android:name=".device.apps.specialaccess.AllFilesAccessActivity"
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:taskAffinity=""
+ android:theme="@style/TvSettingsActivityTheme">
+ <intent-filter android:priority="1">
+ <category android:name="android.intent.category.DEFAULT"/>
+ <action android:name="android.settings.MANAGE_APP_ALL_FILES_ACCESS_PERMISSION"/>
+ <data android:scheme="package" />
+ </intent-filter>
+ </activity>
+
+ <activity
android:name=".device.apps.specialaccess.AppUsageAccessActivity"
android:excludeFromRecents="true"
android:exported="true"
@@ -402,7 +429,7 @@
</activity>
<activity android:name=".device.storage.ResetActivity"
- android:theme="@style/GuidedStepFragmentThemeTwoPanel"
+ android:theme="@style/Theme.Reset"
android:configChanges="keyboard|keyboardHidden|navigation"
android:excludeFromRecents="true" />
<activity
@@ -571,6 +598,18 @@
</activity>
<activity
+ android:name=".system.TextToSpeechActivity"
+ android:configChanges="keyboard|keyboardHidden|navigation"
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:theme="@style/TvSettingsActivityTheme">
+ <intent-filter>
+ <action android:name="android.settings.TTS_SETTINGS"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ </intent-filter>
+ </activity>
+
+ <activity
android:name=".system.development.DevelopmentActivity"
android:configChanges="keyboard|keyboardHidden|navigation"
android:excludeFromRecents="true"
@@ -627,6 +666,19 @@
</activity>
<activity
+ android:name=".system.AppLanguageActivity"
+ android:configChanges="keyboard|keyboardHidden|navigation|locale"
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:theme="@style/TvSettingsActivityTheme">
+ <intent-filter>
+ <action android:name="android.settings.APP_LOCALE_SETTINGS"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <data android:scheme="package" />
+ </intent-filter>
+ </activity>
+
+ <activity
android:name=".system.LanguageActivity"
android:configChanges="keyboard|keyboardHidden|navigation|locale"
android:excludeFromRecents="true"
@@ -649,6 +701,7 @@
android:configChanges="keyboard|keyboardHidden|navigation"
android:excludeFromRecents="true"
android:exported="true"
+ android:permission="android.permission.BLUETOOTH_CONNECT"
android:theme="@style/TvSettingsActivityTheme" />
<activity
@@ -657,6 +710,7 @@
android:excludeFromRecents="true"
android:exported="true"
android:launchMode="singleTask"
+ android:permission="android.permission.BLUETOOTH_CONNECT"
android:persistableMode="persistNever"
android:showWhenLocked="true"
android:taskAffinity=""
@@ -680,6 +734,7 @@
android:configChanges="keyboard|keyboardHidden|navigation"
android:excludeFromRecents="true"
android:exported="true"
+ android:permission="android.permission.BLUETOOTH_PRIVILEGED"
android:taskAffinity="">
<intent-filter>
<action android:name="android.bluetooth.device.action.PAIRING_REQUEST"/>
@@ -738,7 +793,7 @@
<activity
android:name=".name.DeviceNameSettingsActivity"
- android:theme="@style/GuidedStepFragmentThemeTwoPanel"
+ android:theme="@style/Theme.SettingsDeviceName"
android:configChanges="keyboardHidden|navigation"
android:excludeFromRecents="true"
android:exported="true">
@@ -781,11 +836,15 @@
</intent-filter>
</activity>
- <service android:name=".users.UserSwitchListenerService" />
+ <service
+ android:name=".users.UserSwitchListenerService"
+ android:exported="false"
+ android:singleUser="true" />
<receiver
android:name=".users.UserSwitchListenerService$BootReceiver"
- android:exported="true">
+ android:exported="true"
+ android:singleUser="true">
<intent-filter android:priority="1">
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
@@ -833,7 +892,13 @@
<activity
android:name=".device.storage.FormatActivity"
android:excludeFromRecents="true"
- android:exported="false" />
+ android:exported="false" >
+ <intent-filter>
+ <action android:name="com.android.tv.settings.device.storage.FormatActivity.formatAsPublic"/>
+ <action android:name="com.android.tv.settings.device.storage.FormatActivity.formatAsPrivate"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ </intent-filter>
+ </activity>
<activity
android:name=".device.storage.MigrateStorageActivity"
@@ -999,14 +1064,6 @@
</intent-filter>
</provider>
- <!-- Workaround to fix b/139637267 in Q. -->
- <provider
- android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
- android:authorities="${applicationId}.lifecycle-tests"
- android:exported="false"
- android:multiprocess="true"
- tools:replace="android:authorities" />
-
<activity
android:name=".deviceadmin.ProfileOwnerAdd"
android:clearTaskOnLaunch="true"
@@ -1155,14 +1212,6 @@
<service
android:name=".accessories.BluetoothDevicesService"
android:exported="false" />
-
- <service
- android:name=".service.SettingsService"
- android:exported="true">
- <intent-filter>
- <action android:name="com.android.tv.settings.SETTINGS_SERVICE" />
- </intent-filter>
- </service>
<provider
android:name=".accessories.ConnectedDevicesSliceProvider"
android:authorities="com.android.tv.settings.accessories.sliceprovider"
@@ -1210,6 +1259,24 @@
</intent-filter>
</activity>
+ <activity
+ android:name=".device.apps.ConfirmationActivity"
+ android:theme="@style/GuidedStepFragmentThemeTwoPanel"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.settings.ui.CONFIRM" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <receiver
+ android:name=".GlobalKeyReceiver"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.GLOBAL_BUTTON"/>
+ </intent-filter>
+ </receiver>
+
</application>
</manifest>
diff --git a/Settings/com.android.tv.settings.xml b/Settings/com.android.tv.settings.xml
index 5b2955b..5b65009 100644
--- a/Settings/com.android.tv.settings.xml
+++ b/Settings/com.android.tv.settings.xml
@@ -18,6 +18,8 @@
<permissions>
<privapp-permissions package="com.android.tv.settings">
<permission name="android.permission.BACKUP"/>
+ <permission name="android.permission.BLUETOOTH_CONNECT"/>
+ <permission name="android.permission.BLUETOOTH_PRIVILEGED"/>
<permission name="android.permission.DELETE_CACHE_FILES"/>
<permission name="android.permission.DUMP"/>
<permission name="android.permission.FORCE_STOP_PACKAGES"/>
@@ -32,5 +34,6 @@
<permission name="android.permission.USE_RESERVED_DISK"/>
<permission name="android.permission.WRITE_MEDIA_STORAGE"/>
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
+ <permission name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"/>
</privapp-permissions>
</permissions>
diff --git a/Settings/proguard.cfg b/Settings/proguard.flags
similarity index 100%
rename from Settings/proguard.cfg
rename to Settings/proguard.flags
diff --git a/Settings/res-twopanel/drawable/ic_assistant_broadcast.xml b/Settings/res-twopanel/drawable/ic_assistant_broadcast.xml
new file mode 100644
index 0000000..326d8f1
--- /dev/null
+++ b/Settings/res-twopanel/drawable/ic_assistant_broadcast.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<layer-list
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item android:drawable="@drawable/compound_icon_background" />
+ <item android:left="@dimen/preference_icon_offset" android:right="@dimen/preference_icon_offset" android:top="@dimen/preference_icon_offset" android:bottom="@dimen/preference_icon_offset"
+ android:drawable="@drawable/ic_assistant_broadcast_base"/>
+</layer-list>
\ No newline at end of file
diff --git a/Settings/res-twopanel/drawable/ic_assistant_broadcast_base.xml b/Settings/res-twopanel/drawable/ic_assistant_broadcast_base.xml
new file mode 100644
index 0000000..420fb5f
--- /dev/null
+++ b/Settings/res-twopanel/drawable/ic_assistant_broadcast_base.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:fillColor="@color/preference_icon_color"
+ android:pathData="M32.78,13.47c-0.58,-0.59 -1.53,-0.6 -2.12,-0.02c-0.59,0.58 -0.6,1.53 -0.02,2.12c2.86,2.9 2.82,7.59 -0.08,10.44c-0.59,0.58 -0.6,1.53 -0.02,2.12c0.29,0.3 0.68,0.45 1.07,0.45c0.38,0 0.76,-0.14 1.05,-0.43C36.74,24.14 36.79,17.55 32.78,13.47z"/>
+ <path
+ android:fillColor="@color/preference_icon_color"
+ android:pathData="M37.74,6.8c-0.58,-0.59 -1.53,-0.6 -2.12,-0.02c-0.59,0.58 -0.6,1.53 -0.02,2.12c6.53,6.62 6.45,17.32 -0.18,23.85c-0.59,0.58 -0.6,1.53 -0.02,2.12c0.29,0.3 0.68,0.45 1.07,0.45c0.38,0 0.76,-0.14 1.05,-0.43C45.33,27.2 45.42,14.6 37.74,6.8z"/>
+ <path
+ android:fillColor="@color/preference_icon_color"
+ android:pathData="M25.77,31.15H9.34c-2.64,0 -4.79,2.1 -4.79,4.67v4.33c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5v-4.33c0,-0.92 0.8,-1.67 1.79,-1.67h16.43c0.99,0 1.79,0.75 1.79,1.67v4.33c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5v-4.33C30.56,33.24 28.41,31.15 25.77,31.15z"/>
+ <path
+ android:fillColor="@color/preference_icon_color"
+ android:pathData="M17.56,27.58c3.54,0 6.43,-2.88 6.43,-6.43s-2.88,-6.43 -6.43,-6.43s-6.43,2.88 -6.43,6.43S14.01,27.58 17.56,27.58zM17.56,17.72c1.89,0 3.43,1.54 3.43,3.43s-1.54,3.43 -3.43,3.43s-3.43,-1.54 -3.43,-3.43S15.67,17.72 17.56,17.72z"/>
+</vector>
diff --git a/Settings/res-twopanel/drawable/ic_camera_off_base.xml b/Settings/res-twopanel/drawable/ic_camera_off_base.xml
new file mode 100644
index 0000000..9d402b9
--- /dev/null
+++ b/Settings/res-twopanel/drawable/ic_camera_off_base.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48"
+ android:tint="@color/preference_icon_color">
+
+ <path
+ android:fillType="evenOdd"
+ android:pathData="M0 48V0h48v48z" />
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M3.85 8.09a1.5 1.5 0 1 1 2.12-2.12l36.06 36.06a1.5 1.5 0 0 1-2.12 2.12L3.85 8.09zM34.269 22.158a1.5 1.5 0 1 1-1.538-2.576l9-5.37A1.5 1.5 0 0 1 44 15.5v17a1.5 1.5 0 0 1-2.269 1.288l-9-5.37a1.5 1.5 0 1 1 1.538-2.576L41 29.858V18.142l-6.731 4.016z" />
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M17.86 13a1.5 1.5 0 0 1 0-3H32a3 3 0 0 1 3 3v14.13a1.5 1.5 0 0 1-3 0V13H17.86zM34.38 35a1.5 1.5 0 0 1 0 3H7a3 3 0 0 1-3-3V13a3 3 0 0 1 3-3h2.38a1.5 1.5 0 0 1 0 3H7v22h27.38z" />
+</vector>
diff --git a/Settings/res-twopanel/drawable/ic_devices_other.xml b/Settings/res-twopanel/drawable/ic_devices_other.xml
new file mode 100644
index 0000000..ee6c24c
--- /dev/null
+++ b/Settings/res-twopanel/drawable/ic_devices_other.xml
@@ -0,0 +1,23 @@
+<?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 android:drawable="@drawable/compound_icon_background" />
+ <item android:left="@dimen/preference_icon_offset" android:right="@dimen/preference_icon_offset" android:top="@dimen/preference_icon_offset" android:bottom="@dimen/preference_icon_offset"
+ android:drawable="@drawable/ic_devices_other_base"/>
+</layer-list>
diff --git a/Settings/res-twopanel/drawable/ic_devices_other_base.xml b/Settings/res-twopanel/drawable/ic_devices_other_base.xml
new file mode 100644
index 0000000..87d2d09
--- /dev/null
+++ b/Settings/res-twopanel/drawable/ic_devices_other_base.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="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="@color/preference_icon_color"
+ android:pathData="M3,6h18V4H3C1.9,4 1,4.9 1,6v12c0,1.1 0.9,2 2,2h4v-2H3V6zM13,12H9v1.78C8.39,14.33 8,15.11 8,16c0,0.89 0.39,1.67 1,2.22V20h4v-1.78c0.61,-0.55 1,-1.34 1,-2.22s-0.39,-1.67 -1,-2.22V12zM11,17.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.5S11.83,17.5 11,17.5zM22,8h-6c-0.5,0 -1,0.5 -1,1v10c0,0.5 0.5,1 1,1h6c0.5,0 1,-0.5 1,-1V9C23,8.5 22.5,8 22,8zM21,18h-4v-8h4V18z"/>
+</vector>
+
diff --git a/Settings/res-twopanel/drawable/ic_internal_settings.xml b/Settings/res-twopanel/drawable/ic_internal_settings.xml
new file mode 100644
index 0000000..51e7df0
--- /dev/null
+++ b/Settings/res-twopanel/drawable/ic_internal_settings.xml
@@ -0,0 +1,23 @@
+<?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 android:drawable="@drawable/compound_icon_background" />
+ <item android:left="@dimen/preference_icon_offset" android:right="@dimen/preference_icon_offset" android:top="@dimen/preference_icon_offset" android:bottom="@dimen/preference_icon_offset"
+ android:drawable="@drawable/ic_internal_settings_base"/>
+</layer-list>
diff --git a/Settings/res-twopanel/drawable/ic_internal_settings_base.xml b/Settings/res-twopanel/drawable/ic_internal_settings_base.xml
new file mode 100644
index 0000000..5dbc213
--- /dev/null
+++ b/Settings/res-twopanel/drawable/ic_internal_settings_base.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="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="@color/preference_icon_color"
+ android:pathData="M12,13.9v-3.72h9.36c0.14,0.63 0.25,1.22 0.25,2.05 0,5.71 -3.83,9.77 -9.6,9.77C6.48,22 2,17.52 2,12S6.48,2 12,2c2.7,0 4.96,0.99 6.69,2.61l-2.84,2.76c-0.72,-0.68 -1.97,-1.49 -3.85,-1.49 -3.31,0 -6.01,2.75 -6.01,6.12s2.7,6.12 6.01,6.12c3.83,0 5.24,-2.65 5.5,-4.22H12z"/>
+</vector>
diff --git a/Settings/res-twopanel/drawable/ic_settings.xml b/Settings/res-twopanel/drawable/ic_settings.xml
new file mode 100644
index 0000000..620594a
--- /dev/null
+++ b/Settings/res-twopanel/drawable/ic_settings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/compound_icon_background" />
+ <item
+ android:bottom="@dimen/preference_icon_offset"
+ android:drawable="@drawable/ic_settings_base"
+ android:left="@dimen/preference_icon_offset"
+ android:right="@dimen/preference_icon_offset"
+ android:top="@dimen/preference_icon_offset" />
+</layer-list>
diff --git a/Settings/res-twopanel/drawable/ic_settings_base.xml b/Settings/res-twopanel/drawable/ic_settings_base.xml
new file mode 100644
index 0000000..d11997c
--- /dev/null
+++ b/Settings/res-twopanel/drawable/ic_settings_base.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="@color/two_panel_preference_icon_color"
+ android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z" />
+</vector>
diff --git a/Settings/res-twopanel/layout/preference_access_point.xml b/Settings/res-twopanel/layout/preference_access_point.xml
index b057ee8..130c827 100644
--- a/Settings/res-twopanel/layout/preference_access_point.xml
+++ b/Settings/res-twopanel/layout/preference_access_point.xml
@@ -23,7 +23,6 @@
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:gravity="center_vertical"
- android:background="?android:attr/selectableItemBackground"
android:clipToPadding="false"
android:layout_marginBottom="@dimen/tp_preference_item_margin_bottom"
android:paddingTop="@dimen/lb_preference_item_text_space_top"
diff --git a/Settings/res-twopanel/values/dimens.xml b/Settings/res-twopanel/values/dimens.xml
index 547801c..b17bf44 100644
--- a/Settings/res-twopanel/values/dimens.xml
+++ b/Settings/res-twopanel/values/dimens.xml
@@ -31,4 +31,6 @@
<dimen name="tp_preference_summary_min_height">16dp</dimen>
<dimen name="tp_preference_item_margin_bottom">4dp</dimen>
<dimen name="lb_settings_fragment_padding">40dp</dimen>
+ <dimen name="sensor_physical_privacy_enabled_info_radius">12dp</dimen>
+ <dimen name="sensor_physical_privacy_enabled_info_margin_bottom">24dp</dimen>
</resources>
diff --git a/Settings/res/drawable/camera_physical_privacy_enabled_panel_image.xml b/Settings/res/drawable/camera_physical_privacy_enabled_panel_image.xml
new file mode 100644
index 0000000..ef55689
--- /dev/null
+++ b/Settings/res/drawable/camera_physical_privacy_enabled_panel_image.xml
@@ -0,0 +1,18 @@
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+ <drawable name="camera_physical_privacy_enabled_panel_image" android:drawable="@null" />
+</resources>
diff --git a/Settings/res/drawable/ic_adb_ethernet_132dp.xml b/Settings/res/drawable/ic_adb_ethernet_132dp.xml
new file mode 100644
index 0000000..97eab3e
--- /dev/null
+++ b/Settings/res/drawable/ic_adb_ethernet_132dp.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector android:height="132dp" android:viewportHeight="24"
+ android:viewportWidth="24" android:width="132dp" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="#FFFFFFFF" android:pathData="M19,10.3V16c0,3.87 -3.13,7 -7,7s-7,-3.13 -7,-7v-5.7H19zM14.5,12.5l-0.7,0.7l2.29,2.3l-2.29,2.3l0.7,0.7l3,-3L14.5,12.5zM9.5,12.5l-3,3l3,3l0.7,-0.7l-2.29,-2.3l2.29,-2.3L9.5,12.5zM10,15.07c-0.28,0 -0.5,0.19 -0.5,0.43s0.22,0.43 0.5,0.43s0.5,-0.19 0.5,-0.43S10.28,15.07 10,15.07zM12,15.07c-0.28,0 -0.5,0.19 -0.5,0.43s0.22,0.43 0.5,0.43s0.5,-0.19 0.5,-0.43S12.28,15.07 12,15.07zM14,15.07c-0.28,0 -0.5,0.19 -0.5,0.43s0.22,0.43 0.5,0.43s0.5,-0.19 0.5,-0.43S14.28,15.07 14,15.07zM16.6,1.4c0.17,0.09 0.2,0.25 0.13,0.43L16.7,1.9l-1.1,2c1.84,1.11 3.08,3 3.37,5.12L19,9.3H5c0.21,-2.14 1.37,-4.07 3.16,-5.25L8.4,3.9l-1.1,-2C7.2,1.7 7.2,1.5 7.4,1.4c0.17,-0.09 0.38,-0.07 0.53,0.04L8,1.5l1.2,2.1c1.69,-0.76 3.61,-0.8 5.32,-0.12L14.8,3.6L16,1.5C16.15,1.33 16.4,1.29 16.6,1.4zM8.8,6C8.38,6.04 8.04,6.38 8,6.8c0.04,0.42 0.38,0.76 0.8,0.8c0.44,0 0.8,-0.36 0.8,-0.8S9.24,6 8.8,6zM15.2,6c-0.44,0 -0.8,0.36 -0.8,0.8s0.36,0.8 0.8,0.8c0.42,-0.04 0.76,-0.38 0.8,-0.8C15.96,6.38 15.62,6.04 15.2,6z"/>
+</vector>
diff --git a/Settings/res/drawable/ic_adb_wifi_132dp.xml b/Settings/res/drawable/ic_adb_wifi_132dp.xml
new file mode 100644
index 0000000..23284e8
--- /dev/null
+++ b/Settings/res/drawable/ic_adb_wifi_132dp.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="132dp"
+ android:height="132dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19,10.3L19,16A7,7 0,0 1,5 16L5,10.3ZM7.5,14.5l0.8,0.8a5.3,5.3 0,0 1,7.4 0l0.8,-0.8A6.3,6.3 0,0 0,7.5 14.5ZM10.8,17.8L12,19l1.2,-1.2A1.6,1.6 0,0 0,10.8 17.8ZM9.1,16.1l0.9,0.9a2.7,2.7 0,0 1,4 0l0.9,-0.9A4.3,4.3 0,0 0,9.1 16.1Z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M15.6,3.9l1.1,-2c0.1,-0.2 0.1,-0.4 -0.1,-0.5a0.5,0.5 0,0 0,-0.6 0.1L14.8,3.6a6.8,6.8 0,0 0,-5.6 0L8,1.5a0.5,0.5 0,0 0,-0.6 -0.1c-0.2,0.1 -0.2,0.3 -0.1,0.5l1.1,2A7.1,7.1 0,0 0,5 9.3L19,9.3A7.1,7.1 0,0 0,15.6 3.9ZM8.8,7.6A0.9,0.9 0,0 1,8 6.8,0.9 0.9,0 0,1 8.8,6a0.8,0.8 0,1 1,0 1.6ZM15.2,7.6a0.8,0.8 0,1 1,0 -1.6,0.9 0.9,0 0,1 0.8,0.8A0.9,0.9 0,0 1,15.2 7.6Z"/>
+</vector>
diff --git a/Settings/res/drawable/ic_assistant_broadcast.xml b/Settings/res/drawable/ic_assistant_broadcast.xml
new file mode 100644
index 0000000..c27008b
--- /dev/null
+++ b/Settings/res/drawable/ic_assistant_broadcast.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M32.78,13.47c-0.58,-0.59 -1.53,-0.6 -2.12,-0.02c-0.59,0.58 -0.6,1.53 -0.02,2.12c2.86,2.9 2.82,7.59 -0.08,10.44c-0.59,0.58 -0.6,1.53 -0.02,2.12c0.29,0.3 0.68,0.45 1.07,0.45c0.38,0 0.76,-0.14 1.05,-0.43C36.74,24.14 36.79,17.55 32.78,13.47z"/>
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M37.74,6.8c-0.58,-0.59 -1.53,-0.6 -2.12,-0.02c-0.59,0.58 -0.6,1.53 -0.02,2.12c6.53,6.62 6.45,17.32 -0.18,23.85c-0.59,0.58 -0.6,1.53 -0.02,2.12c0.29,0.3 0.68,0.45 1.07,0.45c0.38,0 0.76,-0.14 1.05,-0.43C45.33,27.2 45.42,14.6 37.74,6.8z"/>
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M25.77,31.15H9.34c-2.64,0 -4.79,2.1 -4.79,4.67v4.33c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5v-4.33c0,-0.92 0.8,-1.67 1.79,-1.67h16.43c0.99,0 1.79,0.75 1.79,1.67v4.33c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5v-4.33C30.56,33.24 28.41,31.15 25.77,31.15z"/>
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M17.56,27.58c3.54,0 6.43,-2.88 6.43,-6.43s-2.88,-6.43 -6.43,-6.43s-6.43,2.88 -6.43,6.43S14.01,27.58 17.56,27.58zM17.56,17.72c1.89,0 3.43,1.54 3.43,3.43s-1.54,3.43 -3.43,3.43s-3.43,-1.54 -3.43,-3.43S15.67,17.72 17.56,17.72z"/>
+</vector>
diff --git a/Settings/res/drawable/ic_camera_off_base.xml b/Settings/res/drawable/ic_camera_off_base.xml
new file mode 100644
index 0000000..8bfc61d
--- /dev/null
+++ b/Settings/res/drawable/ic_camera_off_base.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+
+ <path
+ android:fillType="evenOdd"
+ android:pathData="M0 48V0h48v48z" />
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M3.85 8.09a1.5 1.5 0 1 1 2.12-2.12l36.06 36.06a1.5 1.5 0 0 1-2.12 2.12L3.85 8.09zM34.269 22.158a1.5 1.5 0 1 1-1.538-2.576l9-5.37A1.5 1.5 0 0 1 44 15.5v17a1.5 1.5 0 0 1-2.269 1.288l-9-5.37a1.5 1.5 0 1 1 1.538-2.576L41 29.858V18.142l-6.731 4.016z" />
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M17.86 13a1.5 1.5 0 0 1 0-3H32a3 3 0 0 1 3 3v14.13a1.5 1.5 0 0 1-3 0V13H17.86zM34.38 35a1.5 1.5 0 0 1 0 3H7a3 3 0 0 1-3-3V13a3 3 0 0 1 3-3h2.38a1.5 1.5 0 0 1 0 3H7v22h27.38z" />
+</vector>
diff --git a/Settings/res/drawable/ic_camera_on.xml b/Settings/res/drawable/ic_camera_on.xml
new file mode 100644
index 0000000..afcc701
--- /dev/null
+++ b/Settings/res/drawable/ic_camera_on.xml
@@ -0,0 +1,18 @@
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/ic_camera_on_base"/>
+</layer-list>
diff --git a/Settings/res/drawable/ic_camera_on_base.xml b/Settings/res/drawable/ic_camera_on_base.xml
new file mode 100644
index 0000000..f1750eb
--- /dev/null
+++ b/Settings/res/drawable/ic_camera_on_base.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.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+
+ <path
+ android:fillType="evenOdd"
+ android:pathData="M0 48V0h48v48z" />
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M7 13v22h25V13H7zm-0.75-3h26.5A2.25 2.25 0 0 1 35 12.25v23.5A2.25 2.25 0 0 1 32.75 38H6.25A2.25 2.25 0 0 1 4 35.75v-23.5A2.25 2.25 0 0 1 6.25 10z" />
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M34.269 22.158a1.5 1.5 0 1 1-1.538-2.576l9-5.37A1.5 1.5 0 0 1 44 15.5v17a1.5 1.5 0 0 1-2.269 1.288l-9-5.37a1.5 1.5 0 1 1 1.538-2.576L41 29.858V18.142l-6.731 4.016z" />
+</vector>
\ No newline at end of file
diff --git a/Settings/res/drawable/ic_devices_other.xml b/Settings/res/drawable/ic_devices_other.xml
new file mode 100644
index 0000000..193d3c5
--- /dev/null
+++ b/Settings/res/drawable/ic_devices_other.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="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M3,6h18V4H3C1.9,4 1,4.9 1,6v12c0,1.1 0.9,2 2,2h4v-2H3V6zM13,12H9v1.78C8.39,14.33 8,15.11 8,16c0,0.89 0.39,1.67 1,2.22V20h4v-1.78c0.61,-0.55 1,-1.34 1,-2.22s-0.39,-1.67 -1,-2.22V12zM11,17.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.5S11.83,17.5 11,17.5zM22,8h-6c-0.5,0 -1,0.5 -1,1v10c0,0.5 0.5,1 1,1h6c0.5,0 1,-0.5 1,-1V9C23,8.5 22.5,8 22,8zM21,18h-4v-8h4V18z"/>
+</vector>
+
diff --git a/Settings/res/drawable/ic_internal_settings.xml b/Settings/res/drawable/ic_internal_settings.xml
new file mode 100644
index 0000000..9b0dbdb
--- /dev/null
+++ b/Settings/res/drawable/ic_internal_settings.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="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M12,13.9v-3.72h9.36c0.14,0.63 0.25,1.22 0.25,2.05 0,5.71 -3.83,9.77 -9.6,9.77C6.48,22 2,17.52 2,12S6.48,2 12,2c2.7,0 4.96,0.99 6.69,2.61l-2.84,2.76c-0.72,-0.68 -1.97,-1.49 -3.85,-1.49 -3.31,0 -6.01,2.75 -6.01,6.12s2.7,6.12 6.01,6.12c3.83,0 5.24,-2.65 5.5,-4.22H12z"/>
+</vector>
diff --git a/Settings/res/drawable/ic_camera.xml b/Settings/res/drawable/ic_laptop_132dp.xml
similarity index 60%
rename from Settings/res/drawable/ic_camera.xml
rename to Settings/res/drawable/ic_laptop_132dp.xml
index 29d23f7..31ce945 100644
--- a/Settings/res/drawable/ic_camera.xml
+++ b/Settings/res/drawable/ic_laptop_132dp.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2021 The Android Open Source Project
+ ~ Copyright (C) 2022 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
@@ -14,12 +14,13 @@
~ 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="17dp"
- android:height="17dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:width="132dp"
+ android:height="132dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
<path
- android:fillColor="#FFF"
- android:pathData="M20,5h-3.17L15,3H9L7.17,5H4C2.9,5 2,5.9 2,7v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V7C22,5.9 21.1,5 20,5zM20,19H4V7h16V19zM12,9c-2.21,0 -4,1.79 -4,4c0,2.21 1.79,4 4,4s4,-1.79 4,-4C16,10.79 14.21,9 12,9z"/>
-</vector>
\ No newline at end of file
+ android:fillColor="#FFFFFF"
+ android:pathData="M20,18c1.1,0 2,-0.9 2,-2V6c0,-1.1 -0.9,-2 -2,-2H4C2.9,4 2,4.9 2,6v10c0,1.1 0.9,2 2,2H0v2h24v-2H20zM4,6h16v10H4V6z" />
+</vector>
diff --git a/Settings/res/drawable/ic_mic_off.xml b/Settings/res/drawable/ic_mic_off.xml
index bcdf737..ac960f3 100644
--- a/Settings/res/drawable/ic_mic_off.xml
+++ b/Settings/res/drawable/ic_mic_off.xml
@@ -1,25 +1,18 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:viewportWidth="24"
- android:viewportHeight="24"
- android:width="24dp"
- android:height="24dp">
- <path
- android:pathData="M19 11l-1.7 0c0 0.74 -0.16 1.43 -0.43 2.05l1.23 1.23C18.66 13.3 19 12.19 19 11Zm-4.02 0.17C14.98 11.11 15 11.06 15 11L15 5C15 3.34 13.66 2 12 2 10.34 2 9 3.34 9 5l0 0.18 5.98 5.99zM4.27 3L3 4.27l6.01 6.01 0 0.72c0 1.66 1.33 3 2.99 3 0.22 0 0.44 -0.03 0.65 -0.08l1.66 1.66C13.6 15.91 12.81 16.1 12 16.1 9.24 16.1 6.7 14 6.7 11L5 11c0 3.41 2.72 6.23 6 6.72l0 3.28 2 0 0 -3.28c0.91 -0.13 1.77 -0.45 2.54 -0.9L19.73 21 21 19.73 4.27 3Z"
- android:fillColor="#FFFFFF" />
-</vector>
\ No newline at end of file
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/ic_mic_off_base"/>
+</layer-list>
diff --git a/Settings/res/drawable/ic_mic_off_base.xml b/Settings/res/drawable/ic_mic_off_base.xml
new file mode 100644
index 0000000..bcdf737
--- /dev/null
+++ b/Settings/res/drawable/ic_mic_off_base.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:width="24dp"
+ android:height="24dp">
+ <path
+ android:pathData="M19 11l-1.7 0c0 0.74 -0.16 1.43 -0.43 2.05l1.23 1.23C18.66 13.3 19 12.19 19 11Zm-4.02 0.17C14.98 11.11 15 11.06 15 11L15 5C15 3.34 13.66 2 12 2 10.34 2 9 3.34 9 5l0 0.18 5.98 5.99zM4.27 3L3 4.27l6.01 6.01 0 0.72c0 1.66 1.33 3 2.99 3 0.22 0 0.44 -0.03 0.65 -0.08l1.66 1.66C13.6 15.91 12.81 16.1 12 16.1 9.24 16.1 6.7 14 6.7 11L5 11c0 3.41 2.72 6.23 6 6.72l0 3.28 2 0 0 -3.28c0.91 -0.13 1.77 -0.45 2.54 -0.9L19.73 21 21 19.73 4.27 3Z"
+ android:fillColor="#FFFFFF" />
+</vector>
\ No newline at end of file
diff --git a/Settings/res/drawable/ic_mic_on.xml b/Settings/res/drawable/ic_mic_on.xml
index a3bdd67..b8eb8bb 100644
--- a/Settings/res/drawable/ic_mic_on.xml
+++ b/Settings/res/drawable/ic_mic_on.xml
@@ -1,25 +1,18 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:viewportWidth="24"
- android:viewportHeight="24"
- android:width="24dp"
- android:height="24dp">
- <path
- android:pathData="M12 14c1.66 0 2.99 -1.34 2.99 -3L15 5C15 3.34 13.66 2 12 2 10.34 2 9 3.34 9 5l0 6c0 1.66 1.34 3 3 3zm5.3 -3c0 3 -2.54 5.1 -5.3 5.1C9.24 16.1 6.7 14 6.7 11L5 11c0 3.41 2.72 6.23 6 6.72l0 3.28 2 0 0 -3.28c3.28 -0.48 6 -3.3 6 -6.72l-1.7 0z"
- android:fillColor="#FFFFFF" />
-</vector>
\ No newline at end of file
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/ic_mic_on_base"/>
+</layer-list>
diff --git a/Settings/res/drawable/ic_mic_on_base.xml b/Settings/res/drawable/ic_mic_on_base.xml
new file mode 100644
index 0000000..a3bdd67
--- /dev/null
+++ b/Settings/res/drawable/ic_mic_on_base.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:width="24dp"
+ android:height="24dp">
+ <path
+ android:pathData="M12 14c1.66 0 2.99 -1.34 2.99 -3L15 5C15 3.34 13.66 2 12 2 10.34 2 9 3.34 9 5l0 6c0 1.66 1.34 3 3 3zm5.3 -3c0 3 -2.54 5.1 -5.3 5.1C9.24 16.1 6.7 14 6.7 11L5 11c0 3.41 2.72 6.23 6 6.72l0 3.28 2 0 0 -3.28c3.28 -0.48 6 -3.3 6 -6.72l-1.7 0z"
+ android:fillColor="#FFFFFF" />
+</vector>
\ No newline at end of file
diff --git a/Settings/res/drawable/ic_settings.xml b/Settings/res/drawable/ic_settings.xml
new file mode 100644
index 0000000..c87a559
--- /dev/null
+++ b/Settings/res/drawable/ic_settings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z" />
+</vector>
diff --git a/Settings/res/drawable/microphone_physical_privacy_enabled_panel_image.xml b/Settings/res/drawable/microphone_physical_privacy_enabled_panel_image.xml
new file mode 100644
index 0000000..410888b
--- /dev/null
+++ b/Settings/res/drawable/microphone_physical_privacy_enabled_panel_image.xml
@@ -0,0 +1,18 @@
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+ <drawable name="microphone_physical_privacy_enabled_panel_image" android:drawable="@null" />
+</resources>
diff --git a/Settings/res/drawable/sensor_physical_privacy_enabled_info_bg.xml b/Settings/res/drawable/sensor_physical_privacy_enabled_info_bg.xml
new file mode 100644
index 0000000..1f34182
--- /dev/null
+++ b/Settings/res/drawable/sensor_physical_privacy_enabled_info_bg.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_focused="true">
+ <shape android:shape="rectangle">
+ <solid android:color="@color/sensor_physical_privacy_enabled_info_background_focused"/>
+ <corners android:radius="@dimen/sensor_physical_privacy_enabled_info_radius"/>
+ </shape>
+ </item>
+ <item>
+ <shape android:shape="rectangle">
+ <solid android:color="@color/sensor_physical_privacy_enabled_info_background"/>
+ <corners android:radius="@dimen/sensor_physical_privacy_enabled_info_radius"/>
+ </shape>
+ </item>
+</selector>
diff --git a/Settings/res/layout/image_preference.xml b/Settings/res/layout/image_preference.xml
new file mode 100644
index 0000000..d672496
--- /dev/null
+++ b/Settings/res/layout/image_preference.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2022 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <ImageView
+ android:id="@android:id/icon"
+ android:adjustViewBounds="true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/Settings/res/layout/pairing_code_guided_action.xml b/Settings/res/layout/pairing_code_guided_action.xml
new file mode 100644
index 0000000..a28ac18
--- /dev/null
+++ b/Settings/res/layout/pairing_code_guided_action.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical" >
+ <TextView
+ android:id="@+id/pairing_code_title"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="@dimen/guided_action_text_size" />
+ <TextView
+ android:id="@+id/pairing_code"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="@dimen/lb_content_fragment_title_text_size" />
+ <TextView
+ android:id="@+id/ip_address_port_title"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="@dimen/guided_action_text_size" />
+ <TextView
+ android:id="@+id/ip_address_port"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="@dimen/guided_action_text_size" />
+</LinearLayout>
diff --git a/Settings/res/layout/picker_dialog_fragment.xml b/Settings/res/layout/picker_dialog_fragment.xml
index 4625708..d6266ef 100644
--- a/Settings/res/layout/picker_dialog_fragment.xml
+++ b/Settings/res/layout/picker_dialog_fragment.xml
@@ -27,7 +27,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/defaultBrandColor"
- android:elevation="@dimen/lb_preference_decor_title_container_elevation"
android:transitionGroup="false"
>
<TextView
diff --git a/Settings/res/layout/preference_access_point.xml b/Settings/res/layout/preference_access_point.xml
index e2eac1a..17c32c5 100644
--- a/Settings/res/layout/preference_access_point.xml
+++ b/Settings/res/layout/preference_access_point.xml
@@ -33,7 +33,6 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
- android:background="?android:attr/selectableItemBackground"
android:gravity="start|center_vertical"
android:clipToPadding="false">
diff --git a/Settings/res/layout/sensor_physical_privacy_enabled_info.xml b/Settings/res/layout/sensor_physical_privacy_enabled_info.xml
new file mode 100644
index 0000000..53c6425
--- /dev/null
+++ b/Settings/res/layout/sensor_physical_privacy_enabled_info.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<LinearLayout 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:gravity="center_vertical"
+ android:background="@drawable/sensor_physical_privacy_enabled_info_bg"
+ android:padding="8dp"
+ android:layout_marginBottom="@dimen/sensor_physical_privacy_enabled_info_margin_bottom">
+
+ <ImageView
+ android:id="@android:id/icon"
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_margin="12dp"
+ app:tint="#cccccc"
+ android:contentDescription="@null" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@android:id/title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="?android:attr/textColorPrimary"
+ android:ellipsize="marquee"
+ android:textAppearance="?android:attr/textAppearanceListItem" />
+
+ <TextView
+ android:id="@android:id/summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+ android:textColor="?android:attr/textColorSecondary" />
+ </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/Settings/res/xml/sensor_toggle_info.xml b/Settings/res/layout/sensor_toggle_info.xml
similarity index 100%
rename from Settings/res/xml/sensor_toggle_info.xml
rename to Settings/res/layout/sensor_toggle_info.xml
diff --git a/Settings/res/layout/setup_qr_code.xml b/Settings/res/layout/setup_qr_code.xml
index 302cb27..d7e4693 100644
--- a/Settings/res/layout/setup_qr_code.xml
+++ b/Settings/res/layout/setup_qr_code.xml
@@ -68,7 +68,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:layout_marginVertical="16dp"
+ android:layout_marginVertical="24dp"
android:lineSpacingExtra="6sp"
android:text="@string/wifi_scan_qr_code_description"
android:textColor="#9AA0A6"
diff --git a/Settings/res/raw/Deselect.ogg b/Settings/res/raw/Deselect.ogg
index 06f97cd..c7d2d80 100644
--- a/Settings/res/raw/Deselect.ogg
+++ b/Settings/res/raw/Deselect.ogg
Binary files differ
diff --git a/Settings/res/raw/Select.ogg b/Settings/res/raw/Select.ogg
index 2e97e80..ef8099b 100644
--- a/Settings/res/raw/Select.ogg
+++ b/Settings/res/raw/Select.ogg
Binary files differ
diff --git a/Settings/res/values-af/strings.xml b/Settings/res/values-af/strings.xml
index 8fee259..60ccb53 100644
--- a/Settings/res/values-af/strings.xml
+++ b/Settings/res/values-af/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Voeg \'n rekening by"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Rekeninge en aanmelding"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Geen rekeninge nie"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> rekeninge</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> rekening</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# rekening}other{# rekeninge}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Mediadienste, Assistent, betalings"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Netwerk en internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Klank"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Programme"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Toestelvoorkeure"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Afstandbeheerders en toebehore"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Geen gekoppelde Bluetooth-toestelle nie"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> bykomstighede</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> bykomstigheid</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Skerm en klank"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Hulp en terugvoer"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privaatheid"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Fabrieksterugstelling"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrering"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Energiebespaarder"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Toestelle"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Kies formate"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Omringklank"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"GEAKTIVEERDE FORMATE"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"GEDEAKTIVEERDE FORMATE"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Verander die formaatkeuse na Handmatig om dit te deaktiveer."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolusie"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Outomaties"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Resolusie is verander"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Kies OK om %1$s van nou af te gebruik."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Kanselleer"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Moet gekaste data uitgevee word?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Sal gekaste data vir alle programme uitvee."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Voeg by: bykomstigheid"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Bind tans saam…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Koppel tans…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Bykomstighede"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Afstandbeheerder"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Afstandbeheerderinstellings"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Stel afstandbeheerknoppies op"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Beheer volume, krag, invoer op TV\'s, ontvangers en klankbalke"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Koppel"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Koppel aan %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Ontkoppel"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Nie beskikbaar nie"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Toesteladministrasieprogramme"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Geen aktiewe programme nie"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktiewe programme</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aktiewe program</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Gedeaktiveer deur administrateur, enkripsiebeleid of eiebewysberging"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Inligting oor bestuurde toestel"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Veranderinge en instellings wat deur jou organisasie bestuur word"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Geen"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Programme is geïnstalleer"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Aantal programme is geskat. Dit sluit dalk nie programme in wat buite die Play Winkel geïnstalleer is nie."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Minstens <xliff:g id="COUNT_1">%d</xliff:g> programme</item>
- <item quantity="one">Minstens <xliff:g id="COUNT_0">%d</xliff:g> program</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum # program}other{Minimum # programme}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Liggingtoestemmings"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mikrofoontoestemmings"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Kameratoestemmings"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Verstekprogramme"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> programme</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> program</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# program}other{# programme}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Versteksleutelbord"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Gestel na <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Altyd-aan-VPN is aangeskakel"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Vertroude eiebewyse"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Vertroude eiebewyse in jou persoonlike profiel"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Vertroude eiebewyse in jou werkprofiel"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Minstens <xliff:g id="COUNT_1">%d</xliff:g> CA-sertifikate</item>
- <item quantity="one">Minstens <xliff:g id="COUNT_0">%d</xliff:g> CA-sertifikaat</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA-sertifikaat}other{# CA-sertifikate}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Die administrateur kan die toestel sluit en die wagwoord terugstel"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Die administrateur kan alle toesteldata uitvee"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Mislukte wagwoordpogings voordat alle toesteldata uitgevee word"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Mislukte wagwoordpogings voordat alle werkprofieldata uitgevee word"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> pogings</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> poging</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# poging}other{# pogings}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Hierdie toestel word deur jou organisasie bestuur."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Hierdie toestel word deur <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> bestuur."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Kom meer te wete"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Kameraprogramme</item>
- <item quantity="one">Kameraprogram</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Kameraprogram}other{Kameraprogramme}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Kalenderprogram"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Kontakteprogram"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">E-poskliëntprogramme</item>
- <item quantity="one">E-poskliëntprogram</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{E-poskliëntprogram}other{E-poskliëntprogramme}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Kaartprogram"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Foonprogramme</item>
- <item quantity="one">Foonprogram</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Foonprogram}other{Foonprogramme}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Blaaierprogram"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV-bedryfstelselweergawe"</string>
<string name="about_serial" msgid="3432319328808745459">"Reeksnommer"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV-bedryfstelselbou"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Jy is nou <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> stappe daarvan af om \'n ontwikkelaar te wees</item>
- <item quantity="one">Jy is nou <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> stap daarvan af om \'n ontwikkelaar te wees</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Advertensies"</string>
<string name="ads_description" msgid="8081069475265061074">"Bestuur instellings, soos reklame-ID-terugstelling"</string>
<string name="ads_content_description" msgid="1006489792324920289">"Advertensies: Bestuur jou advertensie-instellings, soos om jou reklame-ID terug te stel."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Bykomende stelselopdaterings"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Netwerk kan dalk gemonitor word"</string>
<string name="done_button" msgid="616159688526431451">"Klaar"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Vertrou of verwyder sertifikate</item>
- <item quantity="one">Vertrou of verwyder sertifikaat</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> het sertifikaatinstansies op jou toestel geïnstalleer wat dit vir hulle moontlik kan maak om jou toestelnetwerkaktiwiteit, insluitend e-posse, programme en beveiligde webwerwe, te monitor.\n\nKontak jou admin vir meer inligting oor hierdie sertifikate.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> het \'n sertifikaatinstansie op jou toestel geïnstalleer wat dit vir hulle moontlik kan maak om jou toestelnetwerkaktiwiteit, insluitend e-posse, programme en beveiligde webwerwe, te monitor.\n\nKontak jou admin vir meer inligting oor hierdie sertifikaat.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> het sertifikaatinstansies vir jou werkprofiel geïnstalleer wat dit vir hulle moontlik kan maak om werknetwerkaktiwiteit, insluitend e-posse, programme en beveiligde webwerwe, te monitor.\n\nKontak jou admin vir meer inligting oor hierdie sertifikate.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> het \'n sertifikaatinstansie vir jou werkprofiel geïnstalleer wat dit vir hulle moontlik kan maak om werknetwerkaktiwiteit, insluitend e-posse, programme en beveiligde webwerwe, te monitor.\n\nKontak jou admin vir meer inligting oor hierdie sertifikaat.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"\'n Derde party kan jou netwerkaktiwiteit monitor, insluitend e-posse, programme en veilige webwerwe.\n\n\'n Vertroude eiebewys wat op jou toestel geïnstalleer is, maak dit moontlik."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Gaan sertifikate na</item>
- <item quantity="one">Gaan sertifikaat na</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Vertrou of verwyder sertifikaat}other{Vertrou of verwyder sertifikate}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Netwerk, reeksnommers en ander inligting"</string>
<string name="manual" msgid="5683935624321864999">"Handmatig"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Koppel"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Vergeet netwerk"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Dit vee inligting uit wat gebruik word om aan hierdie netwerk te koppel, insluitend \'n gestoorde wagwoord"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Sluit aan by \'n Wifi deur die QR-kode met jou selfoon te skandeer en die instruksie te volg."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Koppel aan \'n wi-fi deur die QR-kode met jou selfoon te skandeer en volg die instruksies.\n \n Gaan van \'n "<b>"Android-foon"</b>" af na Instellings -> Netwerk en internet -> wi-fi -> Kies \'n wi-fi -> Gevorderd -> Voeg toestel by en skandeer dan die QR-kode."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Druk die terugknoppie om te kanselleer"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Gaan voort"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Toestelberging"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Verwyderbare berging"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Stel terug"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Maak berging beskikbaar"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Vee gekaste data uit"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Maak <xliff:g id="SPACE">%1$s</xliff:g> beskikbaar"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Vee tydelike lêers uit wat spasie opneem. Sal nie gestoorde data soos programvoorkeure of vanlyn video\'s raak nie, en jy sal nie weer by programme moet aanmeld nie."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Moet gekaste data uitgevee word?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Sal gekaste data vir alle programme uitvee."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Deïnstalleer programme"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> is gemonteer"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Kon <xliff:g id="NAME">%1$s</xliff:g> nie monteer nie"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB-berging is herkoppel"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofoon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Mikrofoontoegang"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Programtoegang tot mikrofoon"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Mikrofoontoegang is geblokkeer"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Om te deblokkeer, moet jy die privaatheidskakelaar op jou toestel na die Mikrofoon Aan-posisie beweeg om mikrofoontoegang toe te laat."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Kameratoegang"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Programtoegang tot kamera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Kameratoegang is geblokkeer"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Om te deblokkeer, moet jy die privaatheidskakelaar op jou toestel na die Kamera Aan-posisie beweeg om kameratoegang toe te laat."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Mikrofoontoegang: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Wanneer dit aangeskakel is, sal alle programme en dienste met toestemming toegang tot enige mikrofoon op hierdie toestel hê.\n\nOudio-randtoestelle met \'n gepasmaakte protokol sal nie deur hierdie instelling geraak word nie."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Kameratoegang: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Siaan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Geel"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Oudiobeskrywing"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Hoor ’n beskrywing van wat op die skerm gebeur in gesteunde flieks en programme"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Aktiveer"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Opstelling"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Gebruik <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitering"</string>
<string name="system_apps" msgid="8481888654606868074">"Programme"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Bly wakker"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Skerm sal nooit slaap nie"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP-kontrolering"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI-optimering"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Herbegin nou?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Skakel HDMI-toestelle met die TV af"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV skakel outomaties aan"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Skakel die TV met HDMI-toestel aan"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Gekoppelde invoere</item>
- <item quantity="one">Gekoppelde invoer</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Bystandinvoere</item>
- <item quantity="one">Bystandinvoer</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Nie-gekoppelde invoere</item>
- <item quantity="one">Nie-gekoppelde invoer</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Gekoppelde invoer}other{Gekoppelde invoere}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Bystandinvoer}other{Bystandinvoere}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Niegekoppelde invoer}other{Niegekoppelde invoere}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Beperk toegang tot programme en ander inhoud in jou rekening"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Beperkte profiel"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Beheer deur <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Skep beperkte profiel"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Instellings"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Toegelate programme"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d programme toegelaat</item>
- <item quantity="one">1 program toegelaat</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Toegelaat"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Nie toegelaat nie"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Pasmaak beperkings"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Derdepartybron"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Toestemmings"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Program is nie beskikbaar nie"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Ongebruikte programme"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Bevestig"</string>
<string name="settings_cancel" msgid="576094334743686152">"Kanselleer"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Hierdie toestemming laat \'n program toe om stelselinstellings te wysig."</string>
<string name="write_settings_on" msgid="71675710746513956">"Ja"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Nee"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Toegang tot alle lêers"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Laat toegang toe om alle lêers te bestuur"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Laat hierdie program toe om alle lêers op hierdie toestel of enige gekoppelde bergingvolumes te lees, te wysig en uit te vee. Indien toestemming verleen word, kan die program sonder jou uitdruklike medewete by lêers ingaan."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Beeld-in-beeld"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Laat beeld-in-beeld toe"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Geen geïnstalleerde program steun beeld-in-beeld nie"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Laat programme toe om \'n beeld-in-beeld-venster te skep terwyl die program oop is of nadat jy dit verlaat het (byvoorbeeld, om aan te hou om \'n video te kyk). Hierdie venster wys bo-oor ander programme wat jy gebruik."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Laat programme toe om wekkers te stel en tydsensitiewe handelinge te skeduleer. Dit laat die programme op die agtergrond werk, wat meer krag kan gebruik.\n\nAs hierdie toestemming af is, sal bestaande wekkers en tydgegronde geleenthede wat deur die program geskeduleer is, nie werk nie."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Skakel skerm aan"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Laat toe dat die skerm aangeskakel word"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Laat \'n program toe om die skerm aan te skakel. As toestemming gegee word, kan die program die skerm enige tyd aanskakel sonder jou uitdruklike bedoeling."</string>
<string name="special_access" msgid="21806055758289916">"Spesiale programtoegang"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Oudio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Databespaarder"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Verstel outomaties die videogehalte om minder mobiele data te gebruik"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Datagebruik en -waarskuwings"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Jy kan aan die internet koppel met Wi-Fi, Ethernet, of jou foon se warmkol. Besoek "<b>"g.co/network"</b>" vir meer hulp."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Jy kan aan die internet koppel met wi-fi, Ethernet of jou foon se warmkol."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Handeling word nie toegelaat nie"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Kan nie volume verander nie"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Krag en energie"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Aanskakelgedrag"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Stel terug"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet-saambindkode"</string>
</resources>
diff --git a/Settings/res/values-am/strings.xml b/Settings/res/values-am/strings.xml
index 5b6d653..59ea888 100644
--- a/Settings/res/values-am/strings.xml
+++ b/Settings/res/values-am/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"መለያ ያክሉ"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"መለያዎች እና በመለያ መግባት"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"ምንም መለያዎች የለም"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> መለያዎች</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> መለያዎች</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# መለያ}one{# መለያዎች}other{# መለያዎች}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"የሚዲያ አገልግሎቶች፣ ረዳት፣ ክፍያዎች"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"አውታረ መረብ እና በይነመረብ"</string>
<string name="sound_category_title" msgid="7899816751041939518">"ድምፅ"</string>
<string name="applications_category_title" msgid="7112019490898586223">"መተግበሪያዎች"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"የመሣሪያ ምርጫዎች"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"ርቀት መቆጣጠሪያዎች እና መለዋወጫዎች"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"ምንም የተገናኙ የብሉቱዝ መሣሪያዎች የሉም"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ተጨማሪዎች</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ተጨማሪዎች</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ማሳያ እና ድምጽ"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"እገዛ እና ግብረመለስ"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"ግላዊነት"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"የፋብሪካ ውሂብን ዳግም አስጀምር"</string>
<string name="device_calibration" msgid="2907914144048739705">"መዘወግ"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"ኃይል ቆጣቢ"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"መሣሪያዎች"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ቅርጸቶችን ይምረጡ"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"የዙሪያ ድምጽ"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"ዶልባይዲጂታል"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"የነቁ ቅርጸቶች"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"የተሰናከሉ ቅርጸቶች"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"ለማሰናከል የቅርጸት ምርጫውን ወደ ራስዎ ይቀይሩ።"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"ጥራት"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"ራስ-ሰር"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"ጥራት ተቀይሯል"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"ከአሁን በኋላ %1$sን ለመጠቀም እሺን ይምረጡ።"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"ይቅር"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"እሺ"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"ኸርዝ"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"የተሸጎጠ ውሂብ ይጽዳ?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"ይሄ የተሸጎጡ የሁሉም መተግበሪያዎች ውሂብ ያጸዳል።"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"መለዋወጫ ያክሉ"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"በማጣመር ላይ…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"በመገናኘት ላይ…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"ተቀጥላዎች"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"የርቀት መቆጣጠሪያ"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"የርቀት መቆጣጠሪያ ቅንብሮች"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"የርቀት አዝራሮችን ያቀናብሩ"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"በቲቪዎች፣ ተቀባዮችን እና የድምፅ አሞሌዎች ላይ ድምፅን፣ ኃይልን፣ ግብዓትን ይቆጣጠሩ"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"አገናኝ"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"ከ%1$s ጋር ይገናኙ"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"ግንኙነት አቋርጥ"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"አይገኝም"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"የመሣሪያ አስተዳደር መተግበሪያዎች"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"ምንም ገቢር መተግበሪያዎች የሉም"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"በአስተዳዳሪ፣ የምስጠራ መመሪያ ወይም የምስክርነት ማከማቻ ተሰናክሏል"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"የሚተዳደር መሣሪያ መረጃ"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"በእርስዎ ድርጅት የሚተዳደሩ ለውጦች እና ቅንብሮች"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"ምንም"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"የተጫኑ መተግበሪያዎች"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"የመተግበሪያዎች ብዛት የተገመተ ነው። ከPlay መደብር ውጭ የተጫኑ መተግበሪያዎችን ላያካትት ይችላል።"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{ቢያንስ # መተግበሪያ}one{ቢያንስ # መተግበሪያዎች}other{ቢያንስ # መተግበሪያዎች}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"የአካባቢ ፈቃዶች"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"የማይክሮፎን ፈቃዶች"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"የካሜራ ፈቃዶች"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"ነባሪ መተግበሪያዎች"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# መተግበሪያ}one{# መተግበሪያዎች}other{# መተግበሪያዎች}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"ነባሪ የቁልፍ ሰሌዳ"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"ወደ <xliff:g id="APP_LABEL">%s</xliff:g> አቀናብር"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"ሁልጊዜ የበራ VPN በርቷል"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"የሚታመን ማስረጃ"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"በእርስዎ የግል መገለጫ ውስጥ ያሉ የታመኑ ምስክርነቶች"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"በእርስዎ የሥራ መገለጫ ውስጥ ያሉ የታመኑ ምስክርነቶች"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">ዝቅተኛ <xliff:g id="COUNT_1">%d</xliff:g> CA ምስክርነቶች</item>
- <item quantity="other">ዝቅተኛ <xliff:g id="COUNT_1">%d</xliff:g> CA ምስክርነቶች</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA ምስክርነት}one{# CA ምስክርነቶች}other{# CA ምስክርነቶች}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"አስተዳዳሪ መሣሪያውን መቆለፍና የይለፍ ቃል ዳግም ማስጀመር ይችላል"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"አስተዳዳሪ ሁሉንም የመሣሪያ ውሂብ መሰረዝ ይችላል"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"ሁሉም የመሣሪያ ውሂብ ከመሰረዙ በፊት ያልተሳኩ የይለፍ ቃል ሙከራዎች"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"የሥራ መገለጫ ውሂብ ከመሰረዙ በፊት ያልተሳኩ የይለፍ ቃል ሙከራዎች"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# ሙከራ}one{# ሙከራዎች}other{# ሙከራዎች}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"ይህ መሣሪያ በእርስዎ ድርጅት የሚተዳደር ነው።"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"ይህ መሣሪያ በ<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> የሚተዳደር ነው።"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"የበለጠ መረዳት"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">የካሜራ መተግበሪያዎች</item>
- <item quantity="other">የካሜራ መተግበሪያዎች</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{የካሜራ መተግበሪያ}one{የካሜራ መተግበሪያዎች}other{የካሜራ መተግበሪያዎች}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"የቀን መቁጠሪያ መተግበሪያ"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"የእውቂያዎች መተግበሪያ"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">የኢሜይል ደንበኛ መተግበሪያዎች</item>
- <item quantity="other">የኢሜይል ደንበኛ መተግበሪያዎች</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{የኢሜይል ደንበኛ መተግበሪያ}one{የኢሜይል ደንበኛ መተግበሪያዎች}other{የኢሜይል ደንበኛ መተግበሪያዎች}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"የካርታ መተግበሪያ"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">የስልክ መተግበሪያዎች</item>
- <item quantity="other">የስልክ መተግበሪያዎች</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{የስልክ መተግበሪያ}one{የስልክ መተግበሪያዎች}other{የስልክ መተግበሪያዎች}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"የአሳሽ መተግበሪያ"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>፣ <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>፣ <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>፣ <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"የAndroid TV ስርዓተ ስሪት"</string>
<string name="about_serial" msgid="3432319328808745459">"መለያ ቁጥር"</string>
<string name="about_build" msgid="8467840394761634575">"የAndroid TV ስርዓተ ክወና ግንብ"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{አሁን ገንቢ ለመሆን # ደረጃ ይቀረዎታል}one{አሁን ገንቢ ለመሆን # ደረጃዎች ይቀሩዎታል}other{አሁን ገንቢ ለመሆን # ደረጃዎች ይቀሩዎታል}}"</string>
<string name="about_ads" msgid="7662896442040086522">"ማስታወቂያዎች"</string>
<string name="ads_description" msgid="8081069475265061074">"እንደ የእርስዎን የማስተወቂያ መታወቂያን ዳግም ማስጀመር የመሳሰሉ የእርስዎን የማስታወቂያ ቅንብሮች ያስተዳድሩ።"</string>
<string name="ads_content_description" msgid="1006489792324920289">"ማስታወቂያዎች የማስታወቂያ መታወቂያዎን ዳግም ማስጀመር የመሳሰሉ የማስታወቂያዎች ቅንብሮችዎን ያስተዳድራል።"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"ተጨማሪ የስርዓት ዝማኔዎች"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"አውታረ መረብ በክትትል ውስጥ ሊሆን ይችላል"</string>
<string name="done_button" msgid="616159688526431451">"ተከናውኗል"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">የእውቅና ማረጋገጫዎችን ይመኑ ወይም ያስወግዱ</item>
- <item quantity="other">የእውቅና ማረጋገጫዎችን ይመኑ ወይም ያስወግዱ</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> በመሣሪያዎ ላይ የእውቅና ማረጋገጫ ባለስልጣናትን ጭነዋል፣ ይህም ኢሜይሎች፣ መተግበሪያዎች እና ደህንነታቸው የተጠበቁ ድር ጣቢያዎችም ጨምሮ የሥራ አውታረ መረብ እንቅስቃሴዎን እንዲከታተሉ ሊያስችላቸው ይችላል።\n\nስለነዚህ የእውቅና ማረጋገጫዎች የበለጠ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> በመሣሪያዎ ላይ የእውቅና ማረጋገጫ ባለስልጣናትን ጭነዋል፣ ይህም ኢሜይሎች፣ መተግበሪያዎች እና ደህንነታቸው የተጠበቁ ድር ጣቢያዎችም ጨምሮ የሥራ አውታረ መረብ እንቅስቃሴዎን እንዲከታተሉ ሊያስችላቸው ይችላል።\n\nስለነዚህ የእውቅና ማረጋገጫዎች የበለጠ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ለስራ መገለጫዎ የእውቅና ማረጋገጫ ባለስልጣናትን ጭነዋል፣ ይህም ኢሜይሎች፣ መተግበሪያዎች እና ደህንነታቸው የተጠበቁ ድር ጣቢያዎችም ጨምሮ የስራ አውታረ መረብ እንቅስቃሴን እንዲከታተሉ ሊያስችላቸው ይችላል።\n\nስለነዚህ የእውቅና ማረጋገጫዎች የበለጠ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ለስራ መገለጫዎ የእውቅና ማረጋገጫ ባለስልጣናትን ጭነዋል፣ ይህም ኢሜይሎች፣ መተግበሪያዎች እና ደህንነታቸው የተጠበቁ ድር ጣቢያዎችም ጨምሮ የስራ አውታረ መረብ እንቅስቃሴን እንዲከታተሉ ሊያስችላቸው ይችላል።\n\nስለነዚህ የእውቅና ማረጋገጫዎች የበለጠ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"ሶስተኛ ወገን ኢሜይሎች፣ መተግበሪያዎች እና ደህንነታቸው የተጠበቁ ድር ጣቢያዎችም ጨምሮ የእርስዎን የአውታረ መረብ እንቅስቃሴ የመከታተል ችሎታ አለው።\n\nበእርስዎ መሣሪያ ላይ የተጫነ አንድ የሚታመን ምስክርነት ይሄ እንዲከሰት የሚቻል እያደረገ ነው።"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">የእውቅና ማረጋገጫዎችን ይፈትሹ</item>
- <item quantity="other">የእውቅና ማረጋገጫዎችን ይፈትሹ</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{የእውቅና ማረጋገጫን ይመኑ ወይም ያስወግዱ}one{የእውቅና ማረጋገጫዎችን ይመኑ ወይም ያስወግዱ}other{የእውቅና ማረጋገጫዎችን ይመኑ ወይም ያስወግዱ}}"</string>
<string name="device_status" msgid="8266002761193692207">"ሁኔታ"</string>
<string name="device_status_summary" msgid="3270932829412434985">"አውታረ መረብ፣ ተከታታይ ቁጥሮች እና ሌላ መረጃ"</string>
<string name="manual" msgid="5683935624321864999">"መመሪያ"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"ተገናኝ"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"አውታረ መረብ እርሳ"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"ይሄ ማንኛውንም የተቀመጠ የይለፍ ቃልን ጨምሮ ከዚህ አውታረ መረብ ጋር ለመገናኘት ስራ ላይ የዋለ መረጃን ያጸዳል።"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"ከተንቀሳቃሽ ስልክዎ የQR ኮድን በመቃኘት Wifiን ይቀላቀሉ እና መመሪያውን ይከተሉ።"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" QR ኮዱን ከሞባይል ስልክ በመቃኘት አንድ Wi-Fiን ይቀላቀሉ እና መመሪያዎቹን ይከተሉ።\n \n ከአንድ "<b>"የAndroid ስልክ"</b>" ሆነው ወደ ቅንብሮች -> አውታረ መረብ እና በይነመረብ -> Wi-Fi -> አንድ Wi-Fi ይምረጡ -> የላቀ -> መሣሪያን አክል ይሂዱና ከዚያ QR ኮዱን ይቃኙ።"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"ለመሰረዝ የተመለስ አዝራርን ይጫኑ"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"እሺ"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"ቀጥል"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"የመሣሪያ ማከማቻ"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"መወገድ የሚችል ማከማቻ"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"ዳግም አስጀምር"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"የማከማቻ ቦታ ያስለቅቁ"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"የተሸጎጠ ውሂብን ያጽዱ"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> ያስለቅቁ"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"ቦታ የሚወስዱ ጊዜያዊ ፋይሎችን ያጸዳል። እንደ የመተግበሪያ ምርጫዎች ወይም ከመስመር ውጭ ቪዲዮዎች ባለ የተቀመጡ ውሂብ ላይ ተጽዕኖ አይኖረውም፣ እና እንደገና በመለያ ወደ መተግበሪያዎች መግባት አያስፈልግዎትም።"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"የተሸጎጠ ውሂብ ይጽዳ?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"ይሄ የተሸጎጠ ውሂብን ለሁሉም መተግበሪያዎች ያጸዳል።"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"መተግበሪያዎችን ያራግፉ"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> ተፈናጧል"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> ማፈናጠጥ አልተቻለም"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"የዩኤስቢ ማከማቻ እንደገና ተገናኝቷል"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"ማይክሮፎን"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"የማይክሮፎን መዳረሻ"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"የመተግበሪያ የማይክሮፎን መዳረሻ"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"የማይክራፎን መዳረሻ ታግዷል"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"እገዳውን ማንሳት እንዲችሉ የማይክሮፎን መዳረሻ ለመፍቀድ በመሣሪያዎ ላይ ያለውን የግላዊነት መቀየሪያ ቦታው ላይ ወዳለው ማይክሮፎን ያንቀሳቅሱት።"</string>
<string name="camera" msgid="1226671478936288283">"ካሜራ"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"የካሜራ መዳረሻ"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"የመተግበሪያ የካሜራ መዳረሻ"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"የካሜራ መዳረሻ ታግዷል"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"እገዳውን ማንሳት እንዲችሉ የካሜራ መዳረሻ ለመፍቀድ በመሣሪያዎ ላይ ያለውን የግላዊነት መቀየሪያ ቦታው ላይ ወዳለው ካሜራ ያንቀሳቅሱት።"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"የማይክሮፎን መዳረሻ፦ <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"ሲበራ ሁሉም ፈቃድ ያላቸው መተግበሪያዎች እና አገልግሎቶች በዚህ መሣሪያ ላይ ያለ ማንኛውም ማይክሮፎን መድረስ ይችላሉ።\n\nብጁ ፕሮቶኮል ያላቸው የኦዲዮ ተቀጥላዎች በዚህ ቅንብር ተጽዕኖ አይደርስባቸውም።"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"የካሜራ መዳረሻ፦ <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"አረንጓዴ-ሰማያዊ"</string>
<string name="color_yellow" msgid="3519470952904560404">"ቢጫ"</string>
<string name="color_magenta" msgid="2377854703399624607">"ሰማያዊ-ቀይ"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"የኦዲዮ ማብራሪያ"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"በሚደገፉ ፊልሞች እና ትርዒቶች ላይ በማያ ገጹ ላይ ምን እየተፈጠረ እንዳለ መግለጫ ይስሙ"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"አንቃ"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"ውቅር"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> ይጠቀሙ?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"መከታተል"</string>
<string name="system_apps" msgid="8481888654606868074">"መተግበሪያዎች"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"ነቅተህ ቆይ"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"ማያ ገጽ በጭራሽ አያንቀላፋም"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"የHDCP ማረጋገጥ"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"የHDMI ማመቻቸት"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"አሁን ድጋሚ ይጀመር?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"የኤችዲኤምአይ መሣሪያዎች ከቴሌቪዥኑ ጋር አጥፋ"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"ቴሌቪዥን በራስ-ሰር አብራ"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"ቴሌቪዥኑን ከኤችዲኤምአይ መሣሪያ ጋር አብራ"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">የተገናኙ ግቤቶች</item>
- <item quantity="other">የተገናኙ ግቤቶች</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">በመጠባበቅ ላይ ያሉ ግቤቶች</item>
- <item quantity="other">በመጠባበቅ ላይ ያሉ ግቤቶች</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">ያልተገናኙ ግቤቶች</item>
- <item quantity="other">ያልተገናኙ ግቤቶች</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{የተገናኘ ግቤት}one{የተገናኙ ግቤቶች}other{የተገናኙ ግቤቶች}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{በመጠባበቅ ላይ ያለ ግቤት}one{በመጠባበቅ ላይ ያሉ ግቤቶች}other{በመጠባበቅ ላይ ያሉ ግቤቶች}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{ያልተገናኘ ግቤት}one{ያልተገናኙ ግቤቶች}other{ያልተገናኙ ግቤቶች}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"በእርስዎ መለያ ውስጥ ያሉ የመተግበሪያዎች እና የይዘት መዳረሻ ይገድቡ"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"የተገደበ መገለጫ"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"በ<xliff:g id="APP">%1$s</xliff:g> የሚቆጣጠሩ"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"የተገደበ መገለጫ ፍጠር"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"ቅንብሮች"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"የሚፈቀዱ መተግበሪያዎች"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d መተግበሪያዎች ተፈቅደዋል</item>
- <item quantity="other">%d መተግበሪያዎች ተፈቅደዋል</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"ተፈቅዷል"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"አይፈቀድም"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"ገደቦችን ያብጁ"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"የሦስተኛ ወገን ምንጭ"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"ፍቃዶች"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"መተግበሪያ ሊገኝ አይችልም"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"ስራ ላይ ያልዋሉ መተግበሪያዎች"</string>
<string name="settings_ok" msgid="5950888975075541964">"እሺ"</string>
<string name="settings_confirm" msgid="4489126458677153411">"ያረጋግጡ"</string>
<string name="settings_cancel" msgid="576094334743686152">"ይቅር"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"ይህ ፈቃድ መተግበሪያው የሥርዓት ቅንብሮችን ለመቀየር ያስችለዋል።"</string>
<string name="write_settings_on" msgid="71675710746513956">"አዎ"</string>
<string name="write_settings_off" msgid="6730113471695092167">"አይ"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"የሁሉም ፋይሎች መዳረሻ"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"ሁሉንም ፋይሎች ለማስተዳደር መዳረሻ ፍቀድ"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"ይህ መተግበሪያ በዚህ መሣሪያ ላይ ወይም በማናቸውም የተገናኙ የማከማቻ መጠኖች ላይ ሁሉንም ፋይሎች እንዲያነብ፣ እንዲያሻሽል እና እንዲሰርዝ ይፍቀዱ። ፈቃድ ከተሰጠ፣ መተግበሪያ ያለ የእርስዎ ግልጽ የሆነ ዕውቀት ፋይሎችን መድረስ ይችላል።"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"በሥዕል-ላይ-ሥዕል"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"ሥዕል-በሥዕል-ውስጥ ፍቀድ"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"ምንም መተግበሪያዎች ሥዕል-ላይ-ሥዕልን አይደግፉም"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"ይህ መተግበሪያ ክፍት ሆኖ ሳለ ወይም ከተዉት በኋላ (ለምሳሌ፦ አንድ ቪዲዮ ለመመልከት) የሥዕል-በሥዕል ውስጥ መስኮት እንዲፈጥር ይፍቀዱለት። ይህ መስኮት እየተጠቀሙባቸው ባሉ ሌሎች መተግበሪያዎች ላይ ያሳያል።"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"መተግበሪያዎች ማንቂያዎችን እንዲያቀናብሩ እና የጊዜ ትብነት ያላቸው እርምጃዎችን መርሐግብር እንዲይዙ ይፍቀዱላቸው። ይህ መተግበሪያዎቹ ከበስተጀርባ ማሄድ እንዲችሉ ያስችላቸዋል፣ ይህም የበለጠ ኃይል ሊጠቀም ይችላል።\n\nይህ ፈቃድ ከጠፋ በመተግበሪያው መርሐግብር የተያዘላቸው ነባር ማንቂያዎች እና ጊዜ-ተኮር ክስተቶች አይሰሩም።"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"ማያ ገጽን ያብሩ"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"ማያ ገጹን ማብራት ይፍቀዱ"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"አንድ መተግበሪያ ማያ ገጹን እንዲያበራ ይፍቀዱለት። ከተሰጠ፣ መተግበሪያው ያለእርስዎ ግልጽ ሐሳብ በማንኛውም ጊዜ ማያ ገጹን ሊያበራ ይችላል።"</string>
<string name="special_access" msgid="21806055758289916">"ልዩ የመተግበሪያ መዳረሻ"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>፣ <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"ኦዲዮ"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"ውሂብ ቆጣቢ"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"ያነሰ የሞባይል ውሂብን ለመጠቀም የቪዲዮ ጥራትን በራስ-ሰር አስተካክል"</string>
<string name="title_data_alert" msgid="8262081890052682475">"የውሂብ አጠቃቀም እና ማንቂያዎች"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"በWi-Fi፣ ኤተርኔት ወይም የእርስዎ ስልክ መገናኛ ነጥብ በኩል ከበይነመረብ ጋር መገናኘት ይችላሉ። ለተጨማሪ እገዛ "<b>"g.co/network"</b>"ን ይጎብኙ።"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"በWi-Fi፣ ኤተርኔት ወይም በእርስዎ ስልክ መገናኛ ነጥብ በኩል ከበይነመረብ ጋር መገናኘት ይችላሉ።"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"እርምጃ አይፈቀድም"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"የድምጽ መጠንን መለወጥ አይቻልም"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"ኃይል እና ጉልበት"</string>
<string name="power_on_behavior" msgid="927607372303160716">"የኃይል ማብራት ባህሪ"</string>
<string name="reset_options_title" msgid="7632580482285108955">"ዳግም አስጀምር"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"የኤተርኔት ማጣመሪያ ኮድ"</string>
</resources>
diff --git a/Settings/res/values-ar/strings.xml b/Settings/res/values-ar/strings.xml
index e005c3a..70b58ff 100644
--- a/Settings/res/values-ar/strings.xml
+++ b/Settings/res/values-ar/strings.xml
@@ -45,29 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"إضافة حساب"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"الحسابات وتسجيل الدخول"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"ليست هناك حسابات."</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="zero"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> حساب</item>
- <item quantity="two">حسابان (<xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g>)</item>
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> حسابات</item>
- <item quantity="many"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> حسابًا</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> حساب</item>
- <item quantity="one">حساب واحد (<xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g>)</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{حساب واحد}zero{# حساب}two{حسابان}few{# حسابات}many{# حسابًا}other{# حساب}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"خدمات الوسائط و\"مساعد Google\" والدفعات"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"الشبكة والإنترنت"</string>
<string name="sound_category_title" msgid="7899816751041939518">"الصوت"</string>
<string name="applications_category_title" msgid="7112019490898586223">"التطبيقات"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"إعدادات الجهاز"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"أجهزة التحكّم عن بُعد والمُلحَقات"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"ليس هناك أجهزة بلوتوث متّصلة."</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="zero"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> مُلحَق</item>
- <item quantity="two">مُلحَقان (<xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g>)</item>
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> مُلحَقات</item>
- <item quantity="many"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> مُلحَقًا</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> مُلحَق</item>
- <item quantity="one">مُلحَق واحد (<xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g>)</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"العرض والصوت"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"المساعدة والملاحظات"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"الخصوصية"</string>
@@ -126,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"إعادة الضبط على الإعدادات الأصلية"</string>
<string name="device_calibration" msgid="2907914144048739705">"المعايرة"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"أداة توفير الطاقة"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"الأجهزة"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"اختيار الصيغ"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"الصوت المحيطي"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -193,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"الصيغ المفعَّلة"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"الصيغ المتوقّفة"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"لإيقاف صيغة، غيِّر إعدادات اختيار الصيغ إلى \"يدوي\"."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"درجة الدقة"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"تلقائي"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"تم تغيير درجة الدقة."</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"اختَر \"حسنًا\" لاستخدام %1$s من الآن فصاعدًا."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"إلغاء"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"حسنًا"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"هرتز"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"هل تريد محو البيانات المؤقتة؟"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"يؤدي ذلك إلى محو البيانات المؤقتة لكل التطبيقات."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"إضافة ملحق"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"جارٍ الإقران..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"جارٍ الاتصال..."</string>
@@ -232,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"الملحقات"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"وحدة التحكّم عن بُعد"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"إعدادات وحدة التحكّم عن بُعد"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"إعداد أزرار جهاز التحكّم عن بُعد"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"التحكّم في مستوى الصوت وإمكانية الإيقاف أو التشغيل والإدخال في أجهزة التلفزيون وأجهزة الاستقبال ومكبّرات الصوت العمودية"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"الاتصال"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"الاتصال بـ %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"قطع الاتصال"</string>
@@ -270,14 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"غير متاح"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"تطبيقات مشرف الجهاز"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"ما مِن تطبيقات نشطة."</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"تم إيقافه بواسطة المشرف، أو سياسة التشفير، أو وحدة تخزين بيانات الاعتماد"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"معلومات الجهاز المُدار"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"تتولى مؤسستك إدارة التغييرات والإعدادات."</string>
@@ -295,26 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"لم يتم اتخاذ أي إجراء."</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"التطبيقات المثبّتة"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"عدد التطبيقات تقديري. وقد لا يشمل التطبيقات المُثبَّتة خارج \"متجر Play\"."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{تطبيق واحد كحد أدنى}zero{# تطبيق كحد أدنى}two{تطبيقان كحد أدنى}few{# تطبيقات كحد أدنى}many{# تطبيقًا كحد أدنى}other{# تطبيق كحد أدنى}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"أذونات تحديد الموقع"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"أذونات الميكروفون"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"أذونات الكاميرا"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"التطبيقات التلقائية"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{تطبيق واحد}zero{# تطبيق}two{تطبيقان}few{# تطبيقات}many{# تطبيقًا}other{# تطبيق}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"لوحة المفاتيح التلقائية"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"ضبط على <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"تم تفعيل إعداد \"شبكة افتراضية خاصة (VPN) دائمة التفعيل\""</string>
@@ -324,57 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"بيانات الاعتماد الموثوقة"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"بيانات اعتماد موثوقة في ملفك الشخصي"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"بيانات اعتماد موثوقة في ملفك الشخصي للعمل"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> شهادة CA كحد أدنى</item>
- <item quantity="two">شهادتا CA (<xliff:g id="COUNT_1">%d</xliff:g>) كحد أدنى</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> شهادات CA كحد أدنى</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> شهادة CA كحد أدنى</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> شهادة CA كحد أدنى</item>
- <item quantity="one">شهادة CA واحدة (<xliff:g id="COUNT_0">%d</xliff:g>) كحد أدنى</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{شهادة CA واحدة}zero{# شهادة CA}two{شهادتا CA}few{# شهادات CA}many{# شهادة CA}other{# شهادة CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"يمكن للمشرف قفل الجهاز وإعادة ضبط كلمة المرور"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"يمكن للمشرف حذف جميع بيانات الجهاز"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"محاولات كلمة المرور الخاطئة قبل حذف جميع بيانات الجهاز"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"محاولات كلمة المرور الخاطئة قبل حذف بيانات الملف الشخصي للعمل"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{محاولة واحدة}zero{# محاولة}two{محاولتان}few{# محاولات}many{# محاولة}other{# محاولة}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"تتولى مؤسستك إدارة هذا الجهاز."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"تتم إدارة هذا الجهاز بواسطة <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"مزيد من المعلومات"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="zero">تطبيقات الكاميرا</item>
- <item quantity="two">تطبيقا الكاميرا</item>
- <item quantity="few">تطبيقات الكاميرا</item>
- <item quantity="many">تطبيقات الكاميرا</item>
- <item quantity="other">تطبيقات الكاميرا</item>
- <item quantity="one">تطبيق الكاميرا</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{تطبيق الكاميرا}zero{تطبيقات الكاميرا}two{تطبيقا الكاميرا}few{تطبيقات الكاميرا}many{تطبيقات الكاميرا}other{تطبيقات الكاميرا}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"تطبيق التقويم"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"تطبيق جهات الاتصال"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="zero">تطبيقات البريد الإلكتروني</item>
- <item quantity="two">تطبيقا البريد الإلكتروني</item>
- <item quantity="few">تطبيقات البريد الإلكتروني</item>
- <item quantity="many">تطبيقات البريد الإلكتروني</item>
- <item quantity="other">تطبيقات البريد الإلكتروني</item>
- <item quantity="one">تطبيق البريد الإلكتروني</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{تطبيق البريد الإلكتروني}zero{تطبيقات البريد الإلكتروني}two{تطبيقا البريد الإلكتروني}few{تطبيقات البريد الإلكتروني}many{تطبيقات البريد الإلكتروني}other{تطبيقات البريد الإلكتروني}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"تطبيق الخريطة"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="zero">تطبيقات الهاتف</item>
- <item quantity="two">تطبيقا الهاتف</item>
- <item quantity="few">تطبيقات الهاتف</item>
- <item quantity="many">تطبيقات الهاتف</item>
- <item quantity="other">تطبيقات الهاتف</item>
- <item quantity="one">تطبيق الهاتف</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{تطبيق الهاتف}zero{تطبيقات الهاتف}two{تطبيقا الهاتف}few{تطبيقات الهاتف}many{تطبيقات الهاتف}other{تطبيقات الهاتف}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"تطبيق المتصفّح"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>، <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>، <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>، <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -393,14 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"نسخة نظام تشغيل Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"الرقم المسلسل"</string>
<string name="about_build" msgid="8467840394761634575">"إصدار نظام تشغيل Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="zero">You are now <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> steps away from being a developer</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="4064986225625409361">"{count,plural, =1{تتبقّى خطوة واحدة فقط لتصبح مطوّر برامج.}zero{تتبقّى # خطوة فقط لتصبح مطوّر برامج.}two{تتبقّى خطوتان فقط لتصبح مطوّر برامج.}few{تتبقّى # خطوات فقط لتصبح مطوّر برامج.}many{تتبقّى # خطوة فقط لتصبح مطوّر برامج.}other{تتبقّى # خطوة فقط لتصبح مطوّر برامج.}}"</string>
<string name="about_ads" msgid="7662896442040086522">"الإعلانات"</string>
<string name="ads_description" msgid="8081069475265061074">"إدارة إعدادات الإعلانات كإعادة ضبط المعرف الإعلاني"</string>
<string name="ads_content_description" msgid="1006489792324920289">"الإعلانات، إدارة إعدادات الإعلانات كإعادة ضبط المعرّف الإعلاني."</string>
@@ -414,39 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"تحديثات إضافية للنظام"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"قد تكون الشبكة خاضعة للمراقبة"</string>
<string name="done_button" msgid="616159688526431451">"تم"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="zero">إضافة شهادات أو إزالتها</item>
- <item quantity="two">إضافة شهادتَين أو إزالتهما</item>
- <item quantity="few">إضافة شهادات أو إزالتها</item>
- <item quantity="many">إضافة شهادات أو إزالتها</item>
- <item quantity="other">إضافة شهادات أو إزالتها</item>
- <item quantity="one">إضافة شهادة أو إزالتها</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="zero">تم تثبيت شهادات CA من قِبل \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" على جهازك، وهذا قد يسمح لمن أجرى التثبيت برصد أنشطة الشبكة على جهازك، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية الآمنة.\n\nللحصول على مزيد من المعلومات حول هذه الشهادات، يُرجى التواصل مع المشرف.</item>
- <item quantity="two">تم تثبيت شهادتَي CA من قِبل \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" على جهازك، وهذا قد يسمح لمن أجرى التثبيت برصد أنشطة الشبكة على جهازك، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية الآمنة.\n\nللحصول على مزيد من المعلومات حول هاتين الشهادتَين، يُرجى التواصل مع المشرف.</item>
- <item quantity="few">تم تثبيت شهادات CA من قِبل \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" على جهازك، وهذا قد يسمح لمن أجرى التثبيت برصد أنشطة الشبكة على جهازك، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية الآمنة.\n\nللحصول على مزيد من المعلومات حول هذه الشهادات، يُرجى التواصل مع المشرف.</item>
- <item quantity="many">تم تثبيت شهادات CA من قِبل \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" على جهازك، وهذا قد يسمح لمن أجرى التثبيت برصد أنشطة الشبكة على جهازك، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية الآمنة.\n\nللحصول على مزيد من المعلومات حول هذه الشهادات، يُرجى التواصل مع المشرف.</item>
- <item quantity="other">تم تثبيت شهادات CA من قِبل \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" على جهازك، وهذا قد يسمح لمن أجرى التثبيت برصد أنشطة الشبكة على جهازك، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية الآمنة.\n\nللحصول على مزيد من المعلومات حول هذه الشهادات، يُرجى التواصل مع المشرف.</item>
- <item quantity="one">تم تثبيت شهادة CA من قِبل \"<xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g>\" على جهازك، وهذا قد يسمح لمن أجرى التثبيت برصد أنشطة الشبكة على جهازك، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية الآمنة.\n\nللحصول على مزيد من المعلومات حول هذه الشهادة، يُرجى التواصل مع المشرف.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="zero">تم تثبيت شهادات CA من قِبل \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" لملفك الشخصي للعمل، وهذا قد يسمح لمن أجرى التثبيت برصد أنشطة شبكة العمل، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية الآمنة.\n\nللحصول على مزيد من المعلومات حول هذه الشهادات، يُرجى التواصل مع المشرف.</item>
- <item quantity="two">تم تثبيت شهادتَي CA من قِبل \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" لملفك الشخصي للعمل، وهذا قد يسمح لمن أجرى التثبيت برصد أنشطة شبكة العمل، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية الآمنة.\n\nللحصول على مزيد من المعلومات حول هاتين الشهادتَين، يُرجى التواصل مع المشرف.</item>
- <item quantity="few">تم تثبيت شهادات CA من قِبل \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" لملفك الشخصي للعمل، وهذا قد يسمح لمن أجرى التثبيت برصد أنشطة شبكة العمل، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية الآمنة.\n\nللحصول على مزيد من المعلومات حول هذه الشهادات، يُرجى التواصل مع المشرف.</item>
- <item quantity="many">تم تثبيت شهادات CA من قِبل \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" لملفك الشخصي للعمل، وهذا قد يسمح لمن أجرى التثبيت برصد أنشطة شبكة العمل، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية الآمنة.\n\nللحصول على مزيد من المعلومات حول هذه الشهادات، يُرجى التواصل مع المشرف.</item>
- <item quantity="other">تم تثبيت شهادات CA من قِبل \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" لملفك الشخصي للعمل، وهذا قد يسمح لمن أجرى التثبيت برصد أنشطة شبكة العمل، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية الآمنة.\n\nللحصول على مزيد من المعلومات حول هذه الشهادات، يُرجى التواصل مع المشرف.</item>
- <item quantity="one">تم تثبيت شهادة CA من قِبل \"<xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g>\" لملفك الشخصي للعمل، وهذا قد يسمح لمن أجرى التثبيت برصد أنشطة شبكة العمل، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية الآمنة.\n\nللحصول على مزيد من المعلومات حول هذه الشهادة، يُرجى التواصل مع المشرف.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"يُمكن لأي جهة خارجية مراقبة نشاط الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب الآمنة.\n\nويُمكن لبيانات اعتماد موثوقة ومثبتة على جهاز الكمبيوتر إتاحة إجراء ذلك."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="zero">الاطّلاع على الشهادات</item>
- <item quantity="two">الاطّلاع على الشهادتَين</item>
- <item quantity="few">الاطّلاع على الشهادات</item>
- <item quantity="many">الاطّلاع على الشهادات</item>
- <item quantity="other">الاطّلاع على الشهادات</item>
- <item quantity="one">الاطّلاع على الشهادة</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{إضافة شهادة أو إزالتها}zero{إضافة شهادات أو إزالتها}two{إضافة شهادتَين أو إزالتهما}few{إضافة شهادات أو إزالتها}many{إضافة شهادات أو إزالتها}other{إضافة شهادات أو إزالتها}}"</string>
<string name="device_status" msgid="8266002761193692207">"الحالة"</string>
<string name="device_status_summary" msgid="3270932829412434985">"الشبكة والأرقام التسلسلية ومعلومات أخرى"</string>
<string name="manual" msgid="5683935624321864999">"يدوي"</string>
@@ -538,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"الاتصال"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"حذف الشبكة"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"يؤدي هذا إلى محو المعلومات المستخدمة للاتصال بهذه الشبكة، بما في ذلك كلمات المرور المحفوظة"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"يمكنك الانضمام إلى شبكة Wi-Fi عن طريق مسح رمز الاستجابة السريعة ضوئيًا باستخدام هاتفك الجوّال واتّباع التعليمات."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" يمكنك الانضمام إلى شبكة Wi-Fi من خلال مسح رمز الاستجابة السريعة ضوئيًا باستخدام هاتف جوّال واتّباع التعليمات.\n \n من "<b>"هاتف Android"</b>" انتقِل إلى الإعدادات -> الشبكة & الإنترنت -> شبكة Wi-Fi -> اختيار شبكة Wi-Fi -> الإعدادات المتقدّمة -> إضافة جهاز، ثم امسح رمز الاستجابة السريعة ضوئيًا."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"اضغط على زر الرجوع للإلغاء."</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"موافقة"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"متابعة"</string>
@@ -607,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"مساحة التخزين للجهاز"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"وحدة التخزين القابلة للنقل"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"إعادة الضبط"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"إخلاء مساحة تخزين"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"محو البيانات المخزَّنة مؤقتًا"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"إخلاء <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"يؤدي هذا الإجراء إلى محو الملفات المؤقتة التي تستهلك مساحة. ولن يؤثر ذلك في البيانات المحفوظة مثل الإعدادات المفضّلة للتطبيقات أو الفيديوهات المتوفّرة بلا اتصال بالإنترنت، ولن تحتاج إلى تسجيل الدخول إلى التطبيقات من جديد."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"هل تريد محو البيانات المخزَّنة مؤقتًا؟"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"هذا يمحي البيانات المخزّنة مؤقتًا لكل التطبيقات"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"إلغاء تثبيت التطبيقات"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"تم تثبيت <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"تعذر تثبيت <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"تم إعادة توصيل وحدة تخزين USB"</string>
@@ -684,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"الميكروفون"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"الوصول إلى الميكروفون"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"إذن وصول التطبيق إلى الميكروفون"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"تم حظر الوصول إلى الميكروفون"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"لإزالة الحظر، حرّك مفتاح الخصوصية بجهازك إلى وضع تفعيل الميكروفون للسماح بالوصول إلى الميكروفون."</string>
<string name="camera" msgid="1226671478936288283">"الكاميرا"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"الوصول إلى الكاميرا"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"إذن وصول التطبيق إلى الكاميرا"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"تم حظر الوصول إلى الكاميرا"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"لإزالة الحظر، حرّك مفتاح الخصوصية بجهازك إلى وضع تفعيل الكاميرا للسماح بالوصول إلى الكاميرا."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"الوصول إلى الميكروفون: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"في حال تشغيل الميكروفون، ستتمكن التطبيقات والخدمات التي لديها إذن من الوصول إلى أي ميكروفون على هذا الجهاز.\n\nأما الأجهزة الصوتية الملحقة المزوّدة ببروتوكول مخصّص، فلن تتأثّر بهذا الإعداد."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"الوصول إلى الكاميرا: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -758,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"سماوي"</string>
<string name="color_yellow" msgid="3519470952904560404">"أصفر"</string>
<string name="color_magenta" msgid="2377854703399624607">"أرجواني"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"وصف صوتي"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"يمكنك الاستماع إلى وصف لما يحدث على الشاشة في الأفلام والبرامج المتوافقة."</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"تفعيل"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"الإعداد"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"هل تريد استخدام <xliff:g id="SERVICE">%1$s</xliff:g>؟"</string>
@@ -778,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"المراقبة"</string>
<string name="system_apps" msgid="8481888654606868074">"التطبيقات"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"البقاء في الوضع النشط"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"لن تدخل الشاشة أبدًا في وضع السكون."</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"التحقق من HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"تحسين HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"هل تريد إعادة التشغيل الآن؟"</string>
@@ -898,30 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"إيقاف أجهزة HDMI باستخدام التلفزيون"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"تشغيل التلفزيون تلقائيًا"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"تشغيل التلفزيون باستخدام جهاز HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="zero">Connected Inputs</item>
- <item quantity="two">الإدخالان المتصلان</item>
- <item quantity="few">الإدخالات المتصلة</item>
- <item quantity="many">الإدخالات المتصلة</item>
- <item quantity="other">الإدخالات المتصلة</item>
- <item quantity="one">الإدخال المتصل</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="zero">Standby Inputs</item>
- <item quantity="two">إدخالا وضع الاستعداد</item>
- <item quantity="few">إدخالات وضع الاستعداد</item>
- <item quantity="many">إدخالات وضع الاستعداد</item>
- <item quantity="other">إدخالات وضع الاستعداد</item>
- <item quantity="one">إدخال وضع الاستعداد</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="zero">Not Connected Inputs</item>
- <item quantity="two">الإدخالان غير المتصلين</item>
- <item quantity="few">الإدخالات غير المتصلة</item>
- <item quantity="many">الإدخالات غير المتصلة</item>
- <item quantity="other">الإدخالات غير المتصلة</item>
- <item quantity="one">الإدخال غير المتصل</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{جهاز الإدخال المتصل}zero{أجهزة الإدخال المتصلة}two{جهازا الإدخال المتصلان}few{أجهزة الإدخال المتصلة}many{أجهزة الإدخال المتصلة}other{أجهزة الإدخال المتصلة}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{جهاز الإدخال في وضع الاستعداد}zero{أجهزة الإدخال في وضع الاستعداد}two{جهازا الإدخال في وضع الاستعداد}few{أجهزة الإدخال في وضع الاستعداد}many{أجهزة الإدخال في وضع الاستعداد}other{أجهزة الإدخال في وضع الاستعداد}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{جهاز الإدخال غير المتصل}zero{أجهزة الإدخال غير المتصلة}two{جهازا الإدخال غير المتصلين}few{أجهزة الإدخال غير المتصلة}many{أجهزة الإدخال غير المتصلة}other{أجهزة الإدخال غير المتصلة}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"تقييد الدخول إلى التطبيقات والمحتوى الآخر في حسابك"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"ملف شخصي محظور"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"تخضع لتحكم <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -935,14 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"إنشاء ملف شخصي مُقيَّد"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"الإعدادات"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"التطبيقات المسموح بها"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="zero">لم يتم السماح بأي تطبيقات</item>
- <item quantity="two">تم السماح بتطبيقين (%d)</item>
- <item quantity="few">تم السماح بـ %d تطبيقات</item>
- <item quantity="many">تم السماح بـ %d تطبيقًا</item>
- <item quantity="other">تم السماح بـ %d من التطبيقات</item>
- <item quantity="one">تم السماح بتطبيق واحد</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"مسموح بها"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"غير مسموح بها"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"تخصيص القيود"</string>
@@ -987,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"رمز المصدر من الجهة الخارجية"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"الأذونات"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"التطبيق غير متاح"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"التطبيقات غير المستخدمة"</string>
<string name="settings_ok" msgid="5950888975075541964">"موافقة"</string>
<string name="settings_confirm" msgid="4489126458677153411">"تأكيد"</string>
<string name="settings_cancel" msgid="576094334743686152">"إلغاء"</string>
@@ -1070,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"يتيح هذا الإذن للتطبيق إمكانية تعديل إعدادات النظام."</string>
<string name="write_settings_on" msgid="71675710746513956">"نعم"</string>
<string name="write_settings_off" msgid="6730113471695092167">"لا"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"الوصول إلى كل الملفات"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"السماح بالوصول إلى كل الملفات لإدارتها"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"يسمح هذا الإعداد لهذا التطبيق بقراءة كل الملفات وتعديلها وحذفها من هذا الجهاز أو أي وحدات تخزين متصلة. في حال تفعيله، يمكن أن يصل التطبيق إلى الملفات بدون إعلامك بذلك."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"نافذة ضمن نافذة"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"السماح بعرض نافذة ضمن النافذة"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"ليست هناك تطبيقات مثبَّتة تتيح عرض نافذة ضمن نافذة."</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"يمكنك السماح للتطبيقات بإنشاء نافذة ضمن نافذة أثناء استخدامها أو بعد مغادرتها (مثلاً لمواصلة مشاهدة فيديو). وستظهر هذه النافذة فوق التطبيقات الأخرى التي تستخدمها."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"يمكنك السماح للتطبيقات بضبط المنبّهات وتحديد موعد لتنفيذ الإجراءات العاجلة. يسمح هذا الأذن بتشغيل التطبيقات في الخلفية، ما قد يستهلك المزيد من الطاقة.\n\nإذا لم يتم منح هذا الإذن، لن تعمل المنبّهات الحالية والأحداث المستندة إلى وقت حدَّده التطبيق."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"تشغيل الشاشة"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"السماح بتشغيل الشاشة"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"يمكنك السماح لأحد التطبيقات بتشغيل الشاشة. في حال منح الإذن، قد يشغِّل التطبيق الشاشة في أي وقت بدون نية صريحة منك."</string>
<string name="special_access" msgid="21806055758289916">"وصول خاص إلى التطبيقات"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>، <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"الصوت"</string>
@@ -1091,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"توفير البيانات"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"ضبط جودة الفيديو تلقائيًا لتقليل استخدام بيانات الجوّال"</string>
<string name="title_data_alert" msgid="8262081890052682475">"التنبيهات واستخدام البيانات"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"يمكنك الاتصال بالإنترنت باستخدام شبكة Wi-Fi أو إيثرنت أو نقطة اتصال هاتفك. للحصول على مزيد من المساعدة، يُرجى الانتقال إلى "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"يمكنك الاتصال بالإنترنت باستخدام شبكة Wi-Fi أو إيثرنت أو نقطة اتصال هاتفك."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"غير مسموح بهذا الإجراء"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"يتعذّر تغيير مستوى الصوت."</string>
@@ -1141,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"التشغيل والطاقة"</string>
<string name="power_on_behavior" msgid="927607372303160716">"سلوك التلفزيون عندما يكون قيد التشغيل"</string>
<string name="reset_options_title" msgid="7632580482285108955">"إعادة الضبط"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"رمز إقران شبكة إيثرنت"</string>
</resources>
diff --git a/Settings/res/values-as/strings.xml b/Settings/res/values-as/strings.xml
index a46d039..9e392c7 100644
--- a/Settings/res/values-as/strings.xml
+++ b/Settings/res/values-as/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"একাউণ্ট যোগ কৰক"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"একাউণ্টসমূহ আৰু ছাইন-ইন"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"কোনো একাউণ্ট নাই"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g>টা একাউণ্ট</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g>টা একাউণ্ট</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# টা একাউণ্ট}one{# টা একাউণ্ট}other{# টা একাউণ্ট}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"মিডিয়া সেৱা, Assistant, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"নেটৱৰ্ক আৰু ইণ্টাৰনেট"</string>
<string name="sound_category_title" msgid="7899816751041939518">"ধ্বনি"</string>
<string name="applications_category_title" msgid="7112019490898586223">"এপসমূহ"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"ডিভাইচৰ অগ্ৰাধিকাৰ"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"ৰিম’ট আৰু সহায়ক সঁজুলিসমূহ"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"কোনো ব্লুটুথ ডিভাইচ সংযোজিত হৈ থকা নাই"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g>টা সহায়ক সামগ্ৰী</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g>টা সহায়ক সামগ্ৰী</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ডিছপ্লে’ আৰু শব্দ"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"সহায় আৰু মতামত"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"গোপনীয়তা"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"ফেক্টৰী ডেটা ৰিছেট"</string>
<string name="device_calibration" msgid="2907914144048739705">"ক্ৰমাংকণ"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"শক্তি সঞ্চয়কাৰী"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"ডিভাইচ"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ফৰমেটসমূহ বাছনি কৰক"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"ছাৰাউণ্ড ছাউণ্ড"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"সক্ষম কৰা ফৰ্মেট"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"অক্ষম কৰা ফৰ্মেট"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"অক্ষম কৰিবলৈ ফৰ্মেটৰ বাছনি মেনুৱেললৈ সলনি কৰক।"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"ৰিজ’লিউশ্বন"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"স্বয়ংক্ৰিয়"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"ৰিজ’লিউশ্বন সলনি কৰা হ’ল"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"এতিয়াৰ পৰা %1$s ব্যৱহাৰ কৰিবলৈ ঠিক আছে বাছনি কৰক।"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"বাতিল কৰক"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ঠিক আছে"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"হাৰ্টজ"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"কেশ্ব কৰা ডেটা মচিবনে?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"এই কাৰ্যই সকলো এপৰ কেশ্ব ডেটা পৰিষ্কাৰ কৰিব।"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"সহায়ক সামগ্ৰী যোগ কৰক"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"যোৰা লগোৱা হৈ আছে…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"সংযোগ কৰি থকা হৈছে…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"আনুষংগিক সামগ্ৰী"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"ৰিম’ট কণ্ট্ৰ’ল"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"ৰিম’ট কণ্ট্ৰ’লৰ ছেটিংসমূহ"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"ৰিম’টৰ বুটামসমূহ ছেট আপ কৰক"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"টিভি, ৰিচিভাৰ আৰু ছাউণ্ডবাৰত ভলিউম, পাৱাৰ আৰু ইনপুট নিয়ন্ত্ৰণ কৰক"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"সংযোগ কৰক"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$sৰ সৈতে সংযোগ কৰক"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"সংযোগ বিচ্ছিন্ন কৰক"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"উপলব্ধ নহয়"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"ডিভাইচৰ প্ৰশাসকৰ এপসমূহ"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"কোনো সক্ৰিয় এপ্ নাই"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"প্ৰশাসক, এনক্ৰিপশ্বন নীতি বা ক্ৰেডেনশ্বিয়েল ষ্ট’ৰেজৰ দ্বাৰা অক্ষম কৰা হৈছে"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"ডিভাইচ সম্পৰ্কীয় তথ্য পৰিচালনা কৰক"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"আপোনাৰ প্ৰতিষ্ঠানে সাল-সলনি আৰু ছেটিংসমূহ পৰিচালনা কৰে"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"একো নাই"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"এপ্ ইনষ্টল কৰা হৈছে"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"এপৰ সংখ্যাটো আনুমানিকহে। Play Storeৰ বাহিৰৰ পৰা ইনষ্টল কৰা এপ্সমূহ ইয়াত অন্তৰ্ভুক্ত নহ’বও পাৰে।"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{ন্যূনতম # টা এপ্}one{ন্যূনতম # টা এপ্}other{ন্যূনতম # টা এপ্}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"অৱস্থানৰ অনুমতিসমূহ"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"মাইক্ৰ\'ফোনত অনুমতি"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"কেমেৰাৰ অনুমতিসমূহ"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"ডিফ\'ল্ট এপসমূহ"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# টা এপ্}one{# টা এপ্}other{# টা এপ্}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"ডিফ\'ল্ট কীব\'ৰ্ড"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g>লৈ ছেট কৰা হৈছে"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"সদা-সক্ৰিয় ভিপিএন অনহৈ আছে"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"বিশ্বাসী ক্ৰেডেনশ্বিয়েলসমূহ"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"আপোনাৰ ব্যক্তিগত প্ৰ’ফাইলত থকা বিশ্বাসী ক্ৰেডেনশ্বিয়েলবোৰ"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"আপোনাৰ কৰ্মস্থানৰ প্ৰ’ফাইলত থকা বিশ্বাসী ক্ৰেডেনশ্বিয়েলবোৰ"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">ন্যূনতম <xliff:g id="COUNT_1">%d</xliff:g> খন CA প্ৰমাণপত্ৰ</item>
- <item quantity="other">ন্যূনতম <xliff:g id="COUNT_1">%d</xliff:g> খন CA প্ৰমাণপত্ৰ</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# খন CA প্ৰমাণপত্ৰ}one{# খন CA প্ৰমাণপত্ৰ}other{# খন CA প্ৰমাণপত্ৰ}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"প্ৰশাসকে ডিভাইচটো লক কৰিব আৰু পাছৱৰ্ড ৰিছেট কৰিব পাৰে"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"প্ৰশাসকে ডিভাইচৰ সকলো ডেটা মচিব পাৰে"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"ডিভাইচৰ সকলো ডেটা মচাৰ পূৰ্বে সঠিক পাছৱৰ্ড দিয়াৰ প্ৰচেষ্টা ব্যৰ্থ হ’ল"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"কৰ্মস্থানৰ ডেটা মচাৰ আগতে কেইবাবাৰো ভূল পাছৱৰ্ড টাইপ কৰা হ’ল"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# টা প্ৰয়াস}one{# টা প্ৰয়াস}other{# টা প্ৰয়াস}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"এই ডিভাইচটো আপোনাৰ প্ৰতিষ্ঠানৰ দ্বাৰা পৰিচালিত৷"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"এই ডিভাইচটো <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>ৰ দ্বাৰা পৰিচালিত।"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"অধিক জানক"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">কেমেৰা এপ্</item>
- <item quantity="other">কেমেৰা এপ্</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{কেমেৰা এপ্}one{কেমেৰা এপ্}other{কেমেৰা এপ্}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"কেলণ্ডাৰ এপ্"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"সম্পৰ্কসূচীৰ এপ্"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">ইমেইল ক্লায়েণ্ট এপ্</item>
- <item quantity="other">ইমেইল ক্লায়েণ্ট এপ্</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ইমেইল ক্লাইণ্ট এপ্}one{ইমেইল ক্লাইণ্ট এপ্}other{ইমেইল ক্লাইণ্ট এপ্}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"মেপ এপ্"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">ফ’ন এপ্</item>
- <item quantity="other">ফ’ন এপ্</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{ফ’ন এপ্}one{ফ’ন এপ্}other{ফ’ন এপ্}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"ব্ৰাউজাৰ এপ্"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS সংস্কৰণ"</string>
<string name="about_serial" msgid="3432319328808745459">"ক্ৰমাংক"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS বিল্ড"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{আপুনি এতিয়া এগৰাকী বিকাশকৰ্তা হোৱাৰ পৰা # টা পদক্ষেপ দূৰত আছে}one{আপুনি এতিয়া এগৰাকী বিকাশকৰ্তা হোৱাৰ পৰা # টা পদক্ষেপ দূৰত আছে}other{আপুনি এতিয়া এগৰাকী বিকাশকৰ্তা হোৱাৰ পৰা # টা পদক্ষেপ দূৰত আছে}}"</string>
<string name="about_ads" msgid="7662896442040086522">"বিজ্ঞাপনসমূহ"</string>
<string name="ads_description" msgid="8081069475265061074">"আপোনাৰ বিজ্ঞাপন ID ৰিছেট কৰাৰ দৰে নিজৰ বিজ্ঞাপনৰ ছেটিং পৰিচালনা কৰক।"</string>
<string name="ads_content_description" msgid="1006489792324920289">"বিজ্ঞাপন, আপোনাৰ বিজ্ঞাপনৰ আইডি ৰিছেট কৰাৰ দৰে নিজৰ বিজ্ঞাপনৰ ছেটিং পৰিচালনা কৰক।"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"অতিৰিক্ত ছিষ্টেম আপডেইটসমূহ"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"নেটৱৰ্ক নিৰীক্ষণ কৰা হ\'ব পাৰে"</string>
<string name="done_button" msgid="616159688526431451">"হ’ল"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">প্ৰমাণপত্ৰক বিশ্বাস কৰক অথবা আঁতৰাওক</item>
- <item quantity="other">প্ৰমাণপত্ৰক বিশ্বাস কৰক অথবা আঁতৰাওক</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>এ আপোনাৰ ডিভাইচত প্ৰমাণপত্ৰ প্ৰদানকাৰী কৰ্তৃপক্ষসমূহ ইনষ্টল কৰিছে, যিয়ে ইমেইল, এপ্ আৰু সুৰক্ষিত ৱেবছাইটকে ধৰি আপোনাৰ কৰ্মস্থানৰ নেটৱৰ্কৰ কাৰ্যকলাপ নিৰীক্ষণ কৰিবলৈ তেওঁলোকক হয়তো অনুমতি দিব পাৰে।\n\nএই প্ৰমাণপত্ৰসমূহৰ বিষয়ে অধিক তথ্যৰ বাবে, আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>এ আপোনাৰ ডিভাইচত প্ৰমাণপত্ৰ প্ৰদানকাৰী কৰ্তৃপক্ষসমূহ ইনষ্টল কৰিছে, যিয়ে ইমেইল, এপ্ আৰু সুৰক্ষিত ৱেবছাইটকে ধৰি আপোনাৰ কৰ্মস্থানৰ নেটৱৰ্কৰ কাৰ্যকলাপ নিৰীক্ষণ কৰিবলৈ তেওঁলোকক হয়তো অনুমতি দিব পাৰে।\n\nএই প্ৰমাণপত্ৰসমূহৰ বিষয়ে অধিক তথ্যৰ বাবে, আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>এ আপোনাৰ কৰ্মস্থানৰ প্ৰ’ফাইলৰ বাবে প্ৰমাণপত্ৰ প্ৰদানকাৰী কৰ্তৃপক্ষসমূহ ইনষ্টল কৰিছে, যিয়ে ইমেইল, এপ্ আৰু সুৰক্ষিত ৱেবছাইটকে ধৰি আপোনাৰ কৰ্মস্থানৰ নেটৱৰ্কৰ কাৰ্যকলাপ নিৰীক্ষণ কৰিবলৈ তেওঁলোকক হয়তো অনুমতি দিব পাৰে।\n\nএই প্ৰমাণপত্ৰসমূহৰ বিষয়ে অধিক তথ্যৰ বাবে, আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>এ আপোনাৰ কৰ্মস্থানৰ প্ৰ’ফাইলৰ বাবে প্ৰমাণপত্ৰ প্ৰদানকাৰী কৰ্তৃপক্ষসমূহ ইনষ্টল কৰিছে, যিয়ে ইমেইল, এপ্ আৰু সুৰক্ষিত ৱেবছাইটকে ধৰি আপোনাৰ কৰ্মস্থানৰ নেটৱৰ্কৰ কাৰ্যকলাপ নিৰীক্ষণ কৰিবলৈ তেওঁলোকক হয়তো অনুমতি দিব পাৰে।\n\nএই প্ৰমাণপত্ৰসমূহৰ বিষয়ে অধিক তথ্যৰ বাবে, আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"তৃতীয় পক্ষই ইমেইল, এপ্সমূহ আৰু সুৰক্ষিত ৱেবছাইটসমূহক সামৰি আপোনাৰ নেটৱৰ্কৰ কাৰ্যকলাপ নিৰীক্ষণ কৰিব পাৰে৷\n\nআপোনাৰ ডিভাইচত ইনষ্টল কৰি থোৱা এটা বিশ্বাসী ক্ৰেডেনশ্বিয়েল এইটো সম্ভৱ কৰি তুলিছে।"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">প্ৰমাণপত্ৰসমূহ পৰীক্ষা কৰক</item>
- <item quantity="other">প্ৰমাণপত্ৰসমূহ পৰীক্ষা কৰক</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{প্ৰমাণপত্ৰক বিশ্বাস কৰক অথবা আঁতৰাওক}one{প্ৰমাণপত্ৰক বিশ্বাস কৰক অথবা আঁতৰাওক}other{প্ৰমাণপত্ৰক বিশ্বাস কৰক অথবা আঁতৰাওক}}"</string>
<string name="device_status" msgid="8266002761193692207">"স্থিতি"</string>
<string name="device_status_summary" msgid="3270932829412434985">"নেটৱৰ্ক, ক্ৰমাংক আৰু অন্যান্য তথ্য"</string>
<string name="manual" msgid="5683935624321864999">"মেনুৱেল"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"সংযোগ কৰক"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"নেটৱৰ্কটো পাহৰি যাওক"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"এই কাৰ্যই ছেভ কৰি ৰখা পাছৱৰ্ডকে ধৰি এই নেটৱৰ্কৰ সৈতে সংযোগ কৰিবলৈ ব্যৱহাৰ হোৱা সকলো তথ্য মচি পেলাব"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"আপোনাৰ ম\'বাইল ফ\'নৰ পৰা কিউআৰ ক\'ডটো স্কেন কৰি এটা ৱাই-ফাইত যোগদান কৰক আৰু নিৰ্দেশনাখিনি মানি চলক।"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" এটা ম\'বাইল ফ\'নৰ পৰা কিউআৰ ক\'ডটো স্কেন কৰি এটা ৱাই-ফাইত যোগদান কৰক আৰু নিৰ্দেশনাৱলী অনুসৰণ কৰক।\n \n এটা "<b>"Android ফ\'ন"</b>"ৰ পৰা ছেটিং -> নেটৱর্ক আৰু ইণ্টাৰনেট -> ৱাই-ফাই -> এটা ৱাই-ফাই বাছনি কৰক -> উচ্চখাপৰ -> ডিভাইচ যোগ দি কিউআৰ ক\'ডটো স্কেন কৰক।"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"বাতিল কৰিবলৈ উভতি যাওক বুটামটো টিপক"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ঠিক আছে"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"অব্যাহত ৰাখক"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"ডিভাইচৰ ষ্ট’ৰেজ"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"আঁতৰাব পৰা ষ্ট’ৰেজ"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"ৰিছেট কৰক"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"ষ্ট’ৰেজৰ ঠাই খালী কৰক"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"কেশ্ব কৰা ডেটা মচক"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> খালী কৰক"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"ঠাই দখল কৰা অস্থায়ী ফাইলসমূহ মচে। এপৰ অগ্ৰাধিকাৰ অথবা অফলাইন ভিডিঅ’ৰ দৰে ছেভ কৰি থোৱা ডেটাত প্ৰভাৱ নেপেলাব আৰু আপুনি এপত পুনৰ ছাইন ইন কৰিব নালাগিব।"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"কেশ্ব কৰা ডেটা মচিবনে?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"এইটোৱে আটাইবোৰ এপৰ কেশ্ব কৰা ডেটা মচিব।"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"এপ্ আনইনষ্টল কৰক"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> সংলগ্ন কৰা হৈছে"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> সংলগ্ন কৰিব পৰা নগ\'ল"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"ইউএছবি ষ্ট’ৰেজ পুনৰ সংলগ্ন হ’ল"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"মাইক্ৰ’ফ’ন"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"মাইক্ৰ’ফ’নৰ এক্সেছ"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"এপে মাইক্ৰ’ফ’ন এক্সেছ কৰাৰ অনুমতি"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"মাইক্ৰ’ফ’নৰ এক্সেছ অৱৰোধ কৰা হৈছে"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"অৱৰোধৰ পৰা আঁতৰাবৰ বাবে মাইক্ৰ’ফ’নৰ এক্সেছ দিবলৈ আপোনাৰ ডিভাইচত গোপনীয়তাৰ ছুইচটো মাইক্ৰ’ফ’ন অন স্থিতিলৈ নিয়ক।"</string>
<string name="camera" msgid="1226671478936288283">"কেমেৰা"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"কেমেৰাৰ এক্সেছ"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"এপে কেমেৰা এক্সেছ কৰাৰ অনুমতি"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"কেমেৰাৰ এক্সেছ অৱৰোধ কৰা হৈছে"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"অৱৰোধৰ পৰা আঁতৰাবৰ বাবে কেমেৰাৰ এক্সেছ দিবলৈ আপোনাৰ ডিভাইচত গোপনীয়তাৰ ছুইচটো কেমেৰা অন স্থিতিলৈ নিয়ক।"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"মাইক্ৰ’ফ’নৰ এক্সেছ <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"অন কৰা থাকিলে, অনুমতিপ্ৰাপ্ত আটাইবোৰ এপ্ আৰু সেৱাই এই ডিভাইচত থকা যিকোনো মাইক্ৰ’ফ’ন এক্সেছ কৰিব পাৰে।\n\nএই ছেটিঙে এটা কাষ্টম প্ৰ’ট’কল থকা অডিঅ’ৰ পৰিধীয় আহিলাসমূহ প্ৰভাৱিত নকৰে।"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"কেমেৰাৰ এক্সেছ: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"চাইয়ান"</string>
<string name="color_yellow" msgid="3519470952904560404">"হালধীয়া"</string>
<string name="color_magenta" msgid="2377854703399624607">"মেজেণ্টা"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"অডিঅ’ৰ বিৱৰণ"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"সমৰ্থিত চলচ্চিত্ৰ আৰু শ্ব’ত স্ক্ৰীনত কি ঘটি আছে তাৰ এটা বিৱৰণ শুনক"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"সক্ষম কৰক"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"কনফিগাৰেশ্বন"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> ব্যৱহাৰ কৰিব নেকি?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"নিৰীক্ষণ"</string>
<string name="system_apps" msgid="8481888654606868074">"এপ্"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"স্ক্ৰীণ সক্ৰিয় ৰাখক"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"স্ক্ৰীনখন কেতিয়াও নিষ্ক্ৰিয় নহ’ব"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP পৰীক্ষণ"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI অপ্টিমাইজেশ্বন"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"এতিয়া ৰিষ্টার্ট কৰিবনে?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"টিভিৰ লগতে HDMI ডিভাইচৰ পাৱাৰ বন্ধ কৰক"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"টিভিৰ অট\' পাৱাৰ অন কৰক"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI ডিভাইচৰ দ্বাৰা টিভি পাৱাৰ অন কৰক"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">সংযুক্ত ইনপুটসমূহ</item>
- <item quantity="other">সংযুক্ত ইনপুটসমূহ</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">ষ্টেণ্ডবাই ইনপুট</item>
- <item quantity="other">ষ্টেণ্ডবাই ইনপুটবোৰ</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">কোনো সংযুক্ত ইনপুট নাই</item>
- <item quantity="other">কোনো সংযুক্ত ইনপুট নাই</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{সংযুক্ত ইনপুট}one{সংযুক্ত ইনপুট}other{সংযুক্ত ইনপুট}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{ষ্টেণ্ডবাই ইনপুট}one{ষ্টেণ্ডবাই ইনপুট}other{ষ্টেণ্ডবাই ইনপুট}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{সংযুক্ত হৈ নথকা ইনপুট}one{সংযুক্ত হৈ নথকা ইনপুট}other{সংযুক্ত হৈ নথকা ইনপুট}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"আপোনাৰ একাউণ্টত এপ আৰু অন্য সমলবোৰৰ প্ৰৱেশাধিকাৰ সীমিত কৰক"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"সীমিত প্ৰ’ফাইল"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g>ৰ দ্বাৰা নিয়ন্ত্ৰিত"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"সীমিত প্ৰ’ফাইল সৃষ্টি কৰক"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"ছেটিংসমূহ"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"অনুমতিপ্ৰাপ্ত এপবোৰ"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d এপৰ অনুমতি আছে</item>
- <item quantity="other">%d এপৰ অনুমতি আছে</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"অনুমতি দিয়া হৈছে"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"অনুমতি দিয়া হোৱা নাই"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"নিজৰ উপযোগিতা অনুসৰি কৰা অৱৰোধসমূহ"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"তৃতীয় পক্ষৰ উৎস"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"অনুমতি"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"এপ্লিকেশ্বন নাই"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"অব্যৱহৃত এপ্"</string>
<string name="settings_ok" msgid="5950888975075541964">"ঠিক আছে"</string>
<string name="settings_confirm" msgid="4489126458677153411">"নিশ্চিত কৰক"</string>
<string name="settings_cancel" msgid="576094334743686152">"বাতিল কৰক"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"এই অনুমতিয়ে কোনো এপক ছিষ্টেম ছেটিংসমূহ সলনি কৰিবলৈ সুবিধা দিব।"</string>
<string name="write_settings_on" msgid="71675710746513956">"হয়"</string>
<string name="write_settings_off" msgid="6730113471695092167">"নালাগে"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"আটাইবোৰ ফাইলৰ এক্সেছ"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"আটাইবোৰ ফাইল পৰিচালনা কৰিবলৈ এক্সেছ দিয়ক"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"এই এপ্টোক এই ডিভাইচটোত অথবা অন্য যিকোনো সংযুক্ত ষ্ট’ৰেজৰ ভলিউমসমূহত আটাইবোৰ ফাইল পঢ়িবলৈ, সংশোধন কৰিবলৈ আৰু মচিবলৈ অনুমতি দিয়ক। যদি অনুমতি দিয়ে, আপোনাৰ নিশ্চিত জ্ঞানৰ অবিহনে এপে ফাইলবোৰ এক্সেছ কৰিব পাৰে।"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"picture-in-pictureক অনুমতি দিয়ক"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"ইনষ্টল কৰি থোৱা কোনো এপে চিত্ৰৰ ভিতৰত চিত্ৰ দেখুৱাব নোৱাৰে"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"আপুনি এই এপটো খুলি ৰখাৰ সময়ত বা ইয়াৰ পৰা আঁতৰি যোৱাৰ পিছত (উদাহৰণস্বৰূপে, ইতিমধ্যে চাই থকা ভিডিঅ\'টোলৈ উভতি যাবলৈ) ইয়াক picture-in-picture ৱিণ্ড\' সৃষ্টি কৰিবলৈ অনুমতি দিয়ক। আপুনি ব্যৱহাৰ কৰি থকা অন্য এপৰ ওপৰত এই ৱিণ্ড\' প্ৰদৰ্শিত হ\'ব।"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"এপক এলাৰ্ম ছেট কৰিবলৈ আৰু সময় সংবেদনশীল কাৰ্যৰ সময়সূচী নিৰ্ধাৰণ কৰিবলৈ দিয়ক। ই এপক নেপথ্যত চলি থকাৰ অনুমতি দিয়ে, যাৰ ফলত অধিক বেটাৰী ব্যৱহাৰ হ’ব পাৰে।\n\nএই অনুমতিটো অফ কৰা থাকিলে, ইতিমধ্যে ছেট কৰা এলাৰ্ম আৰু এপ্টোৱে সময়সূচী নিৰ্ধাৰণ কৰা সময় ভিত্তিক অনুষ্ঠানসমূহে কাম নকৰা হ’ব।"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"স্ক্ৰীন অন কৰক"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"স্ক্ৰীনখন অন কৰিবলৈ অনুমতি দিয়ক"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"এপ্টোক স্ক্ৰীনখন অন কৰিবলৈ অনুমতি দিয়ক। যদি অনুমতি দিয়া হয়, এপ্টোৱে আপোনাৰ স্পষ্ট উদ্দেশ্য অবিহনেও যিকোনো সময়তে স্ক্ৰীনখন অন কৰিব পাৰে।"</string>
<string name="special_access" msgid="21806055758289916">"এপৰ বিশেষ প্ৰবেশাধিকাৰ"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"অডিঅ’"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"ডেটা সঞ্চয়কাৰী"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"কম ম’বাইল ডেটা ব্যৱহাৰ কৰিবলৈ স্বয়ংক্ৰিয়ভাৱে ভিডিঅ’ৰ গুণগত মান মিলাওক"</string>
<string name="title_data_alert" msgid="8262081890052682475">"ডেটাৰ ব্যৱহাৰ আৰু সতৰ্কবাৰ্তাসমূহ"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"আপুনি ৱাই-ফাই, ইথাৰনেট অথবা আপোনাৰ ফ’নৰ হটস্পটৰ জৰিয়তে ইণ্টাৰনেটৰ সৈতে সংযুক্ত হ’ব পাৰে। অধিক সহায়ৰ বাবে, "<b>"g.co/network"</b>"লৈ যাওক।"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"আপুনি ৱাই-ফাই, ইথাৰনেট অথবা আপোনাৰ ফ’নৰ হটস্পটৰ জৰিয়তে ইণ্টাৰনেটৰ সৈতে সংযুক্ত হ’ব পাৰে।"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"এই কাম বৈধ নহয়"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"ভলিউম সলনি কৰিব নোৱাৰি"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"ক্ষমতা আৰু শক্তি"</string>
<string name="power_on_behavior" msgid="927607372303160716">"আৰম্ভ হওঁতে প্ৰদৰ্শিত হোৱা কাৰ্যকলাপ"</string>
<string name="reset_options_title" msgid="7632580482285108955">"ৰিছেট কৰক"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"ইথাৰনেট পেয়াৰ কৰাৰ ক’ড"</string>
</resources>
diff --git a/Settings/res/values-az/strings.xml b/Settings/res/values-az/strings.xml
index 85d3864..2fb8654 100644
--- a/Settings/res/values-az/strings.xml
+++ b/Settings/res/values-az/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Hesab əlavə edin"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Hesablar & giriş"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Hesab yoxdur"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> hesab</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> hesab</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# hesab}other{# hesab}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Media xidmətləri, Assistent, Ödənişlər"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Şəbəkə və İnternet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Səs"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Tətbiqlər"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Cihaz Tərcihləri"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Pult & aksesuarlar"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Qoşulmuş Bluetooth cihazı yoxdur"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> aksessuar</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> aksessuar</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Displey & Səs"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Yardım və Rəy"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Məxfilik"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Data zavod sıfırlaması"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrləmə"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Enerjiyə qənaət"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Cihazlar"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Format seçin"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Əhatəli Səs"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"AKTİV FORMATLAR"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"DEAKTİV FORMATLAR"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Deaktiv etmək üçün format seçimini Manual olaraq dəyişin."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Ayırdetmə dəqiqliyi"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Avtomatik"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Ayırdetmə dəqiqliyi dəyişdirildi"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Bundan sonra %1$s istifadə etmək üçün OK seçin"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Ləğv edin"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hs"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Keşlənmiş data silinsin?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Bu, bütün tətbiqlər üçün keşlənmiş verilənləri siləcək."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Aksessuar əlavə edin"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Qoşalaşdırılır..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Qoşulur..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Aksesuarlar"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Pult"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Pult ayarları"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Məsafədən idarə düymələrini ayarlayın"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"TV\'lər, qəbuledicilər və səs panellərində səsi, yandırıb-söndürməni və girişi idarə edin"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Qoşun"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s cihazına qoşulun"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Ayırın"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Əlçatmazdır"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Administrator tətbiqləri"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Aktiv tətbiq yoxdur"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktiv tətbiq</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aktiv tətbiq</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Admin, siyasət və ya yaddaş deaktiv etdi"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"İdarə edilən cihaz məlumatı"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Dəyişiklik və ayarlar təşkilat tərəfindən idarə olunur"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Heç bir"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Tətbiqlər quraşdırıldı"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Tətbiq sayı hesablanır. Siyahıya Play Mağazadan quraşdırılmayan tətbiqlər də daxil ola bilər."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> tətbiq</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> tətbiq</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum # tətbiq}other{Minimum # tətbiq}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Məkan icazələri"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mikrofon icazələri"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Kamera icazələri"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Defolt tətbiqlər"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tətbiq</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> tətbiq</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# tətbiq}other{# tətbiq}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Defolt klaviatura"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> kimi ayarlandı"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Həmişə aktiv VPN yandırıldı"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Güvənli kimlik bilgiləri"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Şəxsi profilinizdəki etibarlı kredensiallar"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"İş profilinizdəki etibarlı kredensiallar"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> CA sertifikatı</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> CA sertifikatı</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA sertifikatı}other{# CA sertifikatı}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Admin cihazı kilidləyə və parolu sıfırlaya bilər"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Admin cihazın bütün datalarını silə bilər"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Cihazın bütün datasını silməzdən əvvəl parol cəhdləri alınmadı"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"İş profil datasını silməzdən əvvəl parol cəhdləri alınmadı"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> cəhd</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> cəhd</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# cəhd}other{# cəhd}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Bu cihaz təşkilatınız tərəfindən idarə olunur."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Bu cihaz <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> tərəfindən idarə olunur."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Ətraflı məlumat"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Kamera tətbiqləri</item>
- <item quantity="one">Kamera tətbiqi</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Kamera tətbiqi}other{Kamera tətbiqləri}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Təqvim tətbiqi"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Kontakt tətbiqi"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">E-poçt klient tətbiqləri</item>
- <item quantity="one">E-poçt klient tətbiqi</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{E-poçt klient tətbiqi}other{E-poçt klient tətbiqləri}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Xəritə tətbiqi"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Telefon tətbiqləri</item>
- <item quantity="one">Telefon tətbiqi</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Telefon tətbiqi}other{Telefon tətbiqləri}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Brauzer tətbiqi"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV ƏS versiyası"</string>
<string name="about_serial" msgid="3432319328808745459">"Seriya nömrəsi"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV ƏS buraxılışı"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Siz indi tərtibatçı olmaqdan <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> addım uzaqsınız.</item>
- <item quantity="one">Siz indi tərtibatçı olmaqdan <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> addım uzaqsınız.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Reklamlar"</string>
<string name="ads_description" msgid="8081069475265061074">"Reklam ID\'nizin sıfırlanması kimi reklam ayarlarınızı idarə edin."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Reklamlar: Reklam ID\'nizin sıfırlanması kimi reklam ayarlarınızı idarə edin."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Əlavə sistem güncəlləmələri"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Şəbəkə nəzərdən keçirilə bilər"</string>
<string name="done_button" msgid="616159688526431451">"Hazırdır"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Sertifikatlara güvənin və ya silin</item>
- <item quantity="one">Sertifikata güvənin və ya silin</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> cihazınızda e-poçt, tətbiq və təhlükəsiz veb saytları daxil olmaqla cihaz şəbəkə fəaliyyətinizi izləməyə icazə verəcək sertifikat səlahiyyətlərini quraşdırdı.\n\nBu sertifikatlar haqqında daha çox məlumat üçün administratorunuzla əlaqə saxlayın.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> cihazınızda e-poçt, tətbiq və təhlükəsiz veb saytları daxil olmaqla cihaz şəbəkə fəaliyyətinizi izləməyə icazə verəcək sertifikat səlahiyyətini quraşdırdı.\n\nBu sertifikat haqqında daha çox məlumat üçün administratorunuzla əlaqə saxlayın.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> iş profiliniz üçün e-poçt, tətbiq və təhlükəsiz veb saytları daxil olmaqla iş şəbəkə fəaliyyətinizi izləməyə icazə verəcək sertifikat səlahiyyətlərini quraşdırdı.\n\nBu sertifikatlar haqqında daha çox məlumat üçün administratorunuzla əlaqə saxlayın.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> iş profiliniz üçün e-poçt, tətbiq və təhlükəsiz veb saytları daxil olmaqla iş şəbəkə fəaliyyətinizi izləməyə icazə verəcək sertifikat səlahiyyətini quraşdırdı.\n\nBu sertifikat haqqında daha çox məlumat üçün administratorunuzla əlaqə saxlayın.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Üçüncü tərəf e-məktublar, tətbiqlər və təhlükəsiz saytlar kimi şəbəkə fəaliyyətinizi izləmək imkanına malikdir.\n\nCihazınıza quraşdırılmış etibarlı etimad bunu mümkün edir."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Sertifikatları yoxlayın</item>
- <item quantity="one">Sertifikatı yoxlayın</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Sertifikata güvənin və ya silin}other{Sertifikatlara güvənin və ya silin}}"</string>
<string name="device_status" msgid="8266002761193692207">"Vəziyyət"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Şəbəkə, seriya nömrələri və digər məlumat"</string>
<string name="manual" msgid="5683935624321864999">"Təlimat"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Qoşul"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Şəbəkəni unudun"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Bu, saxlanılmış parol daxil olmaqla bu şəbəkəyə qoşulmaq üçün istifadə olunan məlumatı silir"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Mobil telefonunuzdan QR kodunu skan edərək Wifi\'a qoşulun və təlimatı izləyin."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Mobil telefonunuzdan QR kodunu skan edərək Wi-Fi\'a qoşulun və təlimatları izləyin.\n \n "<b>"Android Telefonunda"</b>" Ayarlar -> Şəbəkə və internet -> Wi-Fi -> Wi-Fi seç -> Qabaqcıl -> Cihaz əlavə et bölməsinə keçin və QR kodunu skan edin."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Ləğv etmək üçün Geri düyməsinə basın"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Davam edin"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Cihaz yaddaşı"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Çıxarıla bilən yaddaş"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Sıfırlayın"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Yaddaşda yer boşaldın"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Keşlənmiş datanı silin"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> yer boşaldın"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Yer tutan müvəqqəti faylları silir. Tətbiq tərcihləri və ya oflayn videolar kimi saxlanılan dataya təsir etməyəcək və tətbiqlərə yenidən daxil olmağınız lazım olmayacaq."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Keşlənmiş data silinsin?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Bu, bütün tətbiqlər üçün keşlənmiş datanı siləcək."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Tətbiqləri sistemdən silin"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> taxıldı"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> taxıla bilmədi"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB yaddaş yenidən qoşuldu"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Mikrofona giriş"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Mikrofona tətbiqin girişi"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Mikrofona giriş blok edilib"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Blokdan çıxarmaq üçün cihazınızda məxfilik açarını \"mikrofon aktivdir\" vəziyyətinə keçirərək mikrofona giriş icazəsi verin."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Kameraya giriş"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Kameraya tətbiqin girişi"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Kameraya giriş blok edilib"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Blokdan çıxarmaq üçün cihazınızda məxfilik açarını \"kamera aktivdir\" vəziyyətinə keçirərək kameraya giriş icazəsi verin."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Mikrofona giriş: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Aktiv edildikdə, icazəsi olan bütün tətbiqlər və xidmətlər bu cihazdakı istənilən mikrofona giriş edə bilər.\n\nFərdi protokolu olan audio köməkçi cihazları bu ayardan təsirlənməyəcəkdir."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Kameraya giriş: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Mavi"</string>
<string name="color_yellow" msgid="3519470952904560404">"Sarı"</string>
<string name="color_magenta" msgid="2377854703399624607">"Çəhrayı qırmızı"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audio təsviri"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Dəstəklənən film və şoularda ekranda baş verənlərin təsvirini eşidin"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Aktivləşdirin"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfiqurasiya"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> xidmətindən istifadə edilsin?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitorinq"</string>
<string name="system_apps" msgid="8481888654606868074">"Tətbiqlər"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Oyaq qal"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Ekran heç vaxt yuxu rejiminə keçməyəcək"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP yoxlanışı"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimallaşdırılması"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Yenidən başladılsın?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"TV ilə HDMI cihazlarını söndürün"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV avto yanılıdır"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI cihazı ilə TV\'ni yandırın"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Qoşulu Daxiletmə</item>
- <item quantity="one">Qoşulu Daxiletmə</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Gözləmə Daxiletməsi</item>
- <item quantity="one">Gözləmə Daxiletməsi</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Qoşulu Olmayan Daxiletmə</item>
- <item quantity="one">Qoşulu Olmayan Daxiletmə</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Qoşulmuş Giriş}other{Qoşulmuş Girişlər}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Gözləmə Rejimindəki Giriş}other{Gözləmə Rejimindəki Girişlər}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Qoşulmamış Giriş}other{Qoşulmamış Girişlər}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Hesabınızdakı tətbiqlərə və digər kontentə girişi məhdudlaşdırın"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Məhdud Profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> tərəfindən idarə olunan"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Məhdud profil yaradın"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Ayarlar"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"İcazəli tətbiqlər"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d proqrama icazə verilir</item>
- <item quantity="one">1 proqrama icazə verilir</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"İcazəli"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"İcazə verilmir"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Məhdudiyyətləri fərdiləşdirin"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Üçüncü Tərəf Mənbəyi"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"İcazələr"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Tətbiq əlçatan deyil"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"İstifadə olunmayan tətbiqlər"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Təsdiq edin"</string>
<string name="settings_cancel" msgid="576094334743686152">"Ləğv edin"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Bu icazə tətbiqə sistem ayarlarını dəyişdirməyə imkan verir."</string>
<string name="write_settings_on" msgid="71675710746513956">"Bəli"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Xeyr"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Bütün fayllara giriş"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Bütün faylları idarə etmək üçün giriş icazəsi verin"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Bu tətbiqə bu cihazda və ya qoşulmuş cihazların yaddaşındakı bütün faylları oxumaq, dəyişmək və silmək icazəsi verin. İcazə verilsə, tətbiq xəbəriniz olmadan fayllara daxil ola bilər."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Şəkil içində şəkil"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Şəkil içində şəklə icazə verin"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Quraşdırılmış tətbiqlərdən heç biri Şəkil-içində-şəkil funksiyasını dəstəkləmir"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Tətbiq açıq olanda və ya tətbiqdən çıxdıqdan sonra (məsələn, videoya baxmağa davam etmək üçün) bu tətbiqə şəkil içində şəkil pəncərəsi yaratmağa icazə versəniz, bu pəncərə digər tətbiqlərin üzərində görünəcək."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Tətbiqlərə siqnallar ayarlamağa və vaxta əsaslanan əməliyyatları planlaşdırmağa icazə verin. Bu, tətbiqlərin arxa fonda işləməsinə imkan verir ki, nəticədə daha çox enerji istifadə edilə bilər.\n\nBu icazə deaktiv olsa, bu tətbiq tərəfindən planlaşdırılan mövcud siqnallar və vaxta əsaslanan tədbirlər işləməyəcəkdir."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Ekranı aktiv etmək"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Ekranı aktiv etməyə icazə verin"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Tətbiqin ekranı aktiv etməsinə icazə verin. İcazə verilərsə, tətbiq istənilən vaxt sizə soruşmadan ekranı aktiv edə bilər."</string>
<string name="special_access" msgid="21806055758289916">"Xüsusi tətbiq girişi"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Trafikə qənaət"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Daha az mobil data istifadə etmək üçün video keyfiyyətini avtomatik tənzimləyin"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Data istifadəsi və siqnalları"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"İnternetə Wi-Fi, Ethernet və ya telefonun hotspotu ilə qoşula bilərsiniz. Əlavə yardım üçün "<b>"g.co/network"</b>" ünvanına daxil olun."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"İnternetə Wi-Fi, Ethernet və ya telefonun hotspotu ilə qoşula bilərsiniz."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Əməliyyata icazə verilmir"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Səsi dəyişmək olmur"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Güc və Enerji"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Aktiv edildikdə davranış"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Sıfırlayın"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet qoşulma kodu"</string>
</resources>
diff --git a/Settings/res/values-b+sr+Latn/strings.xml b/Settings/res/values-b+sr+Latn/strings.xml
index 94e9579..692f384 100644
--- a/Settings/res/values-b+sr+Latn/strings.xml
+++ b/Settings/res/values-b+sr+Latn/strings.xml
@@ -45,23 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Dodajte nalog"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Nalozi i prijavljivanje"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Nema naloga"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> nalog</item>
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> naloga</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> naloga</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# nalog}one{# nalog}few{# naloga}other{# naloga}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Medijske usluge, Pomoćnik, Plaćanja"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Mreža i internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Zvuk"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplikacije"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Podešavanja uređaja"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Daljinski upravljači i dodatna oprema"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Nijedan Bluetooth uređaj nije povezan"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> uređaj dodatne opreme</item>
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> uređaja dodatne opreme</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> uređaja dodatne opreme</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Prikaz i zvuk"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Pomoć i povratne informacije"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privatnost"</string>
@@ -120,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Resetovanje na fabrička podešavanja"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibracija"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Ušteda energije"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Uređaji"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Izaberite formate"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Prostorni zvuk"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -187,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"OMOGUĆENI FORMATI"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ONEMOGUĆENI FORMATI"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Da biste onemogućili ovo, promenite izbor formata u Ručno."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Rezolucija"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatski"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Rezolucija je promenjena"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Izaberite Potvrdi da biste koristili %1$s od sada."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Otkaži"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Potvrdi"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Želite li da obrišete keširane podatke?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Biće obrisani keširani podaci za sve aplikacije."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Dodaj pomoćni uređaj"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Uparivanje..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Povezivanje…"</string>
@@ -226,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Dodaci"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Daljinski upravljač"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Podešavanja daljinskog upravljanja"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Podesite dugmad na daljinskom upravljaču"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Kontrolišite jačinu zvuka, napajanje i ulaz TV-a, prijemnika i saundbarova"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Poveži"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Povežite sa uređajem %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Prekini vezu"</string>
@@ -264,11 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Nije dostupno"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Apl. za administratora uređaja"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Nema aktivnih aplikacija"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> aktivna aplikacija</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aktivne aplikacije</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktivnih aplikacija</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Onemogućio administrator, smernice za šifrovanje ili skladište akreditiva"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informacije o uređaju kojim se upravlja"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Promene i podešavanja kojima upravlja organizacija"</string>
@@ -286,20 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Ništa"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Aplikacije su instalirane"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Broj aplikacija predstavlja procenu. Možda ne obuhvata aplikacije instalirane izvan Play prodavnice."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="one">Najmanje <xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- <item quantity="few">Najmanje <xliff:g id="COUNT_1">%d</xliff:g> aplikacije</item>
- <item quantity="other">Najmanje <xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Najmanje # aplikacija}one{Najmanje # aplikacija}few{Najmanje # aplikacije}other{Najmanje # aplikacija}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Dozvole za lokaciju"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Dozvole za mikrofon"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Dozvole za kameru"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Podrazumevane aplikacije"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aplikacije</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplikacija}one{# aplikacija}few{# aplikacije}other{# aplikacija}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Podrazumevana tastatura"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Podešeno je na <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Stalno uključen VPN je uključen"</string>
@@ -309,42 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Pouzdani akreditivi"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Pouzdani akreditivi na ličnom profilu"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Pouzdani akreditivi na poslovnom profilu"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Najmanje <xliff:g id="COUNT_1">%d</xliff:g> CA sertifikat</item>
- <item quantity="few">Najmanje <xliff:g id="COUNT_1">%d</xliff:g> CA sertifikata</item>
- <item quantity="other">Najmanje <xliff:g id="COUNT_1">%d</xliff:g> CA sertifikata</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA sertifikat}one{# CA sertifikat}few{# CA sertifikata}other{# CA sertifikata}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administrator može da zaključava uređaj i resetuje lozinku"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administrator može da briše sve podatke sa uređaja"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Neuspeli pokušaji unosa lozinke pre brisanja svih podataka sa uređaja"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Neuspeli pokušaji unosa lozinke pre brisanja podataka sa poslovnog profila"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> pokušaj</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> pokušaja</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> pokušaja</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# pokušaj}one{# pokušaj}few{# pokušaja}other{# pokušaja}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Ovim uređajem upravlja organizacija."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Ovim uređajem upravlja <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Saznajte više"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Aplikacije za kameru</item>
- <item quantity="few">Aplikacije za kameru</item>
- <item quantity="other">Aplikacije za kameru</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Aplikacija za kameru}one{Aplikacije za kameru}few{Aplikacije za kameru}other{Aplikacije za kameru}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Aplikacija Kalendar"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplikacija Kontakti"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Aplikacije imejl klijenta</item>
- <item quantity="few">Aplikacije imejl klijenta</item>
- <item quantity="other">Aplikacije imejl klijenta</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Aplikacija imejl klijenta}one{Aplikacije imejl klijenta}few{Aplikacije imejl klijenta}other{Aplikacije imejl klijenta}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Aplikacija za mape"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Aplikacije za telefon</item>
- <item quantity="few">Aplikacije za telefon</item>
- <item quantity="other">Aplikacije za telefon</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Aplikacija za telefon}one{Aplikacije za telefon}few{Aplikacije za telefon}other{Aplikacije za telefon}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Aplikacija pregledača"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -363,11 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Verzija operativnog sistema Android TV-a"</string>
<string name="about_serial" msgid="3432319328808745459">"Serijski broj"</string>
<string name="about_build" msgid="8467840394761634575">"Verzija operativnog sistema Android TV-a"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="one">Još samo <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> korak i postaćete programer</item>
- <item quantity="few">Još samo <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka i postaćete programer</item>
- <item quantity="other">Još samo <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka i postaćete programer</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Oglasi"</string>
<string name="ads_description" msgid="8081069475265061074">"Upravljajte podešavanjima oglasa poput resetovanja ID-a oglašavanja."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Oglasi, Upravljajte podešavanjima oglasa poput resetovanja ID-a oglašavanja."</string>
@@ -381,27 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Dodatna ažuriranja sistema"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Mreža se možda nadgleda"</string>
<string name="done_button" msgid="616159688526431451">"Gotovo"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Označite sertifikate kao pouzdane ili ih uklonite</item>
- <item quantity="few">Označite sertifikate kao pouzdane ili ih uklonite</item>
- <item quantity="other">Označite sertifikate kao pouzdane ili ih uklonite</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je instalirao autoritete za izdavanje sertifikata na uređaju, što može da mu omogući da prati aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i bezbedne veb-sajtove.\n\nObratite se administratoru da biste dobili više informacija o ovom sertifikatu.</item>
- <item quantity="few"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je instalirao autoritete za izdavanje sertifikata na uređaju, što može da mu omogući da prati aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i bezbedne veb-sajtove.\n\nObratite se administratoru da biste dobili više informacija o ovom sertifikatu.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je instalirao autoritete za izdavanje sertifikata na uređaju, što može da mu omogući da prati aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i bezbedne veb-sajtove.\n\nObratite se administratoru da biste dobili više informacija o ovom sertifikatu.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je instalirao autoritete za izdavanje sertifikata za poslovni profil, što može da mu omogući da prati aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i bezbedne veb-sajtove.\n\nObratite se administratoru da biste dobili više informacija o ovom sertifikatu.</item>
- <item quantity="few"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je instalirao autoritete za izdavanje sertifikata za poslovni profil, što može da mu omogući da prati aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i bezbedne veb-sajtove.\n\nObratite se administratoru da biste dobili više informacija o ovom sertifikatu.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je instalirao autoritete za izdavanje sertifikata za poslovni profil, što može da mu omogući da prati aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i bezbedne veb-sajtove.\n\nObratite se administratoru da biste dobili više informacija o ovom sertifikatu.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Treća strana može da prati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i bezbedne veb-sajtove.\n\nTo omogućava pouzdani akreditiv koji je instaliran na uređaju."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Proveri sertifikate</item>
- <item quantity="few">Proveri sertifikate</item>
- <item quantity="other">Proveri sertifikate</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Označite sertifikat kao pouzdan ili ga uklonite}one{Označite sertifikate kao pouzdane ili ih uklonite}few{Označite sertifikate kao pouzdane ili ih uklonite}other{Označite sertifikate kao pouzdane ili ih uklonite}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Mreža, serijski brojevi i druge informacije"</string>
<string name="manual" msgid="5683935624321864999">"Uputstvo"</string>
@@ -493,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Poveži"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Zaboravi mrežu"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Ovako ćete obrisati informacije za povezivanje na ovu mrežu, uključujući i sačuvanu lozinku"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Pridružite se WiFi mreži tako što ćete skenirati QR kôd pomoću mobilnog telefona i pratiti uputstva."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Pridružite se WiFi mreži tako što ćete skenirati QR kôd pomoću mobilnog telefona i pratiti uputstva.\n \n Na "<b>"Android telefonu"</b>" idite u Podešavanja -> Mreža i internet -> WiFi -> Izaberite WiFi -> Napredno -> Dodajte uređaj i skenirajte QR kôd."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Pritisnite dugme Nazad da biste otkazali"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Potvrdi"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Nastavi"</string>
@@ -562,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Memorija uređaja"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Prenosiva memorija"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Resetovanje"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Oslobodite memorijski prostor"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Obrišite keširane podatke"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Oslobodite <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Briše privremene fajlove koji zauzimaju prostor. Ne utiče na sačuvane podatke, poput podešavanja aplikacije ili oflajn video snimaka i nećete morati da se ponovo prijavljujete u aplikacije"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Želite li da obrišete keširane podatke?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Biće obrisani keširani podaci za sve aplikacije."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Deinstaliraj aplikacije"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Uređaj <xliff:g id="NAME">%1$s</xliff:g> je priključen"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Priključivanje uređaja <xliff:g id="NAME">%1$s</xliff:g> nije uspelo"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB memorija je ponovo povezana"</string>
@@ -639,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Pristup mikrofonu"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Pristup aplikacije mikrofonu"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Pristup mikrofonu je blokiran"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Da biste odblokirali, pomerite prekidač za privatnost na uređaju na poziciju uključeno za mikrofon kako biste omogućili pristup mikrofonu."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Pristup kameri"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Pristup aplikacije kameri"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Pristup kameri je blokiran"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Da biste odblokirali, pomerite prekidač za privatnost na uređaju na poziciju uključeno za kameru kako biste omogućili pristup kameri."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Pristup mikrofonu: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Kada je uključeno, sve aplikacije i usluge sa dozvolom mogu da pristupaju svakom mikrofonu na ovom uređaju.\n\nOvo podešavanje ne utiče na periferne audio uređaje sa prilagođenim protokolom."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Pristup kameri: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -713,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Tirkizna"</string>
<string name="color_yellow" msgid="3519470952904560404">"Žuta"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Zvučni opis"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Slušajte opis trenutnih dešavanja na ekranu u podržanim filmovima i serijama"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Omogući"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfiguracija"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Želite li da koristite <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -733,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Nadgledanje"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplikacije"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Ne zaključavaj"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Ekran nikada neće biti u režimu spavanja"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP provera"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimizacija"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Želite li ponovo da pokrenete odmah?"</string>
@@ -853,21 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Gašenje HDMI uređaja pomoću TV-a"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Automatski uključi TV"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Uključi TV pomoću HDMI uređaja"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Povezani ulazi</item>
- <item quantity="few">Povezani ulazi</item>
- <item quantity="other">Povezani ulazi</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Ulazi u režimu pripravnosti</item>
- <item quantity="few">Ulazi u režimu pripravnosti</item>
- <item quantity="other">Ulazi u režimu pripravnosti</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Nepovezani ulazi</item>
- <item quantity="few">Nepovezani ulazi</item>
- <item quantity="other">Nepovezani ulazi</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Povezani ulaz}one{Povezani ulazi}few{Povezani ulazi}other{Povezani ulazi}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Ulaz u režimu mirovanja}one{Ulazi u režimu mirovanja}few{Ulazi u režimu mirovanja}other{Ulazi u režimu mirovanja}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Nepovezani ulaz}one{Nepovezani ulazi}few{Nepovezani ulazi}other{Nepovezani ulazi}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Ograničite pristup aplikacijama i drugom sadržaju na nalogu"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Ograničeni profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Kontroliše <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -881,11 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Napravite profil sa ograničenim pristupom"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Podešavanja"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Dozvoljene aplikacije"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">Dozvoljena je %d aplikacija</item>
- <item quantity="few">Dozvoljene su %d aplikacije</item>
- <item quantity="other">Dozvoljeno je %d aplikacija</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Dozvoljeno"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Nije dozvoljeno"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Prilagodi ograničenja"</string>
@@ -930,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Nezavisni izvor"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Dozvole"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplikacija nije dostupna"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Aplikacije koje se ne koriste"</string>
<string name="settings_ok" msgid="5950888975075541964">"Potvrdi"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Potvrdi"</string>
<string name="settings_cancel" msgid="576094334743686152">"Otkaži"</string>
@@ -1013,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Ova dozvola dozvoljava aplikaciji da menja podešavanja sistema."</string>
<string name="write_settings_on" msgid="71675710746513956">"Da"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Ne"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Pristup svim datotekama"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Dozvoli pristup za upravljanje svim datotekama"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Dozvolite da ova aplikacija čita, menja i briše sve datoteke na ovom uređaju ili svim povezanim uređajima za skladištenje. Ako to dozvolite, aplikacija može da pristupa datotekama bez vašeg znanja."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Slika u slici"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Dozvoli sliku u slici"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Nijedna instalirana aplikacija ne podržava sliku u slici"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Dozvolite aplikacijama da prave prozor slike u slici dok je aplikacija otvorena ili kada izađete iz nje (na primer, da biste nastavili da gledate video). Ovaj prozor se prikazuje preko drugih aplikacija koje koristite."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Omogućite aplikacijama da podešavaju alarme i zakazuju vremenski osetljive radnje. To omogućava da aplikacije budu pokrenute u pozadini, što može da troši više energije.\n\nAko je ova dozvola isključena, postojeći alarmi i događaji zasnovani na vremenu zakazani pomoću aplikacije neće raditi."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Uključite ekran"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Dozvoli uključivanje ekrana"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Dozvoljava aplikaciji da uključi podešavanje. Ako se omogući, aplikacija može da uključi ekran u bilo kom trenutku bez vaše eksplicitne namere."</string>
<string name="special_access" msgid="21806055758289916">"Poseban pristup aplikacija"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Zvuk"</string>
@@ -1034,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Ušteda podataka"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Automatski prilagođava kvalitet videa radi uštede mobilnih podataka"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Potrošnja podataka i obaveštenja"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Možete da se povežete na internet pomoću WiFi-a, eterneta ili hotspota na telefonu. Dodatnu pomoć potražite na "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Možete da se povežete na internet pomoću WiFi-ja, eterneta ili hotspota na telefonu."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Radnja nije dozvoljena"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Ne možete da promenite jačinu zvuka"</string>
@@ -1084,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Napajanje i energija"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Ponašanje pri uključivanju"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Resetuj"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Kôd za uparivanje za eternet"</string>
</resources>
diff --git a/Settings/res/values-be/strings.xml b/Settings/res/values-be/strings.xml
index e5932f2..6fd23a2 100644
--- a/Settings/res/values-be/strings.xml
+++ b/Settings/res/values-be/strings.xml
@@ -45,25 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Дадаць уліковы запіс"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Уліковыя запісы і ўваход"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Няма ўліковых запісаў"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> уліковы запіс</item>
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> уліковыя запісы</item>
- <item quantity="many"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> уліковых запісаў</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> уліковага запісу</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# уліковы запіс}one{# уліковы запіс}few{# уліковыя запісы}many{# уліковых запісаў}other{# уліковага запісу}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Сэрвісы мультымедыя, Памочнік, Плацяжы"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Сетка і інтэрнэт"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Гук"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Праграмы"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Параметры экрана прылады"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Тэлевізійныя пульты і аксесуары"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Няма падключаных прылад Bluetooth"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> аксесуар</item>
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> аксесуары</item>
- <item quantity="many"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> аксесуараў</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> аксесуара</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Дысплэй і гук"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Даведка і водгукі"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Прыватнасць"</string>
@@ -122,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Скід да заводскіх налад"</string>
<string name="device_calibration" msgid="2907914144048739705">"Каліброўка"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Эканомія энергіі"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Прылады"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Выбар фарматаў"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Аб\'ёмны гук"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -189,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"УКЛЮЧАНЫЯ ФАРМАТЫ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ВЫКЛЮЧАНЫЯ ФАРМАТЫ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Каб выключыць, змяніце выбар фармату на ручны."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Раздзяляльнасць"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Аўтаматычна"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Раздзяляльнасць зменена"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Выберыце ОК, каб адразу ж выкарыстоўваць %1$s."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Скасаваць"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ОК"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Гц"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Ачысціць кэшаваныя даныя?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Гэта ачысціць кэшаваныя даныя для ўсіх праграм."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Дадаць аксэсуар"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Спалучэнне..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Падключэнне..."</string>
@@ -228,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Аксесуары"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Дыстанцыйнае кіраванне"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Налады пульта дыстанцыйнага кіравання"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Наладзіць кнопкі пульта кіравання"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Кіраванне гучнасцю, сілкаваннем, уваходнымі сігналамі на тэлевізарах, рэсіверах і гукавых панэлях"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Падключыць"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Падключыцца да %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Адключыць"</string>
@@ -266,12 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Недаступна"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Праграмы адміністратара прылады"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Няма актыўных праграм"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Адключана адміністратарам, палітыкай шыфравання ці сховішчам уліковых даных"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Інфармацыя пра прыладу пад кіраваннем"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Змяненні і налады знаходзяцца пад кіраваннем вашай арганізацыі"</string>
@@ -289,22 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Няма"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Усталяваныя праграмы"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Колькасць праграм – прыблізная. Сюды могуць не ўваходзіць праграмы, усталяваныя не з Крамы Play."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Мінімум # праграма}one{Мінімум # праграма}few{Мінімум # праграмы}many{Мінімум # праграм}other{Мінімум # праграмы}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Доступ да геаданых"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Дазволы мікрафона"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Дазволы камеры"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Стандартныя праграмы"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# праграма}one{# праграма}few{# праграмы}many{# праграм}other{# праграмы}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Стандартная клавіятура"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Усталявана на <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Заўсёды ўключаны VPN уключаны"</string>
@@ -314,47 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Давераныя ўліковыя даныя"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Давераныя ўліковыя даныя ў вашым асабістым профілі"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Давераныя ўліковыя даныя ў вашым працоўным профілі"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <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="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# сертыфікат ЦС}one{# сертыфікат ЦС}few{# сертыфікаты ЦС}many{# сертыфікатаў ЦС}other{# сертыфіката ЦС}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Адміністратар можа блакіраваць прыладу і скідваць пароль"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Адміністратар можа выдаляць усе даныя прылады"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Няўдалыя спробы ўводу пароля перад выдаленнем усіх даных прылады"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Няўдалыя спробы ўводу пароля перад выдаленнем даных працоўнага профілю"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# спроба}one{# спроба}few{# спробы}many{# спроб}other{# спробы}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Гэта прылада знаходзіцца пад кіраваннем вашай арганізацыі."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Гэта прылада знаходзіцца пад кіраваннем <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Даведацца больш"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Праграмы \"Камера\"</item>
- <item quantity="few">Праграмы \"Камера\"</item>
- <item quantity="many">Праграмы \"Камера\"</item>
- <item quantity="other">Праграмы \"Камера\"</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Праграма \"Камера\"}one{Праграмы \"Камера\"}few{Праграмы \"Камера\"}many{Праграмы \"Камера\"}other{Праграмы \"Камера\"}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Праграма \"Каляндар\""</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Праграма \"Кантакты\""</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Праграмы \"Паштовы кліент\"</item>
- <item quantity="few">Праграмы \"Паштовы кліент\"</item>
- <item quantity="many">Праграмы \"Паштовы кліент\"</item>
- <item quantity="other">Праграмы \"Паштовы кліент\"</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Праграма \"Паштовы кліент\"}one{Праграмы \"Паштовы кліент\"}few{Праграмы \"Паштовы кліент\"}many{Праграмы \"Паштовы кліент\"}other{Праграмы \"Паштовы кліент\"}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Праграма \"Карта\""</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Праграмы \"Тэлефон\"</item>
- <item quantity="few">Праграмы \"Тэлефон\"</item>
- <item quantity="many">Праграмы \"Тэлефон\"</item>
- <item quantity="other">Праграмы \"Тэлефон\"</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Праграма \"Тэлефон\"}one{Праграмы \"Тэлефон\"}few{Праграмы \"Тэлефон\"}many{Праграмы \"Тэлефон\"}other{Праграмы \"Тэлефон\"}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Праграма \"Браўзер\""</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -373,12 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Версія АС Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Серыйны нумар"</string>
<string name="about_build" msgid="8467840394761634575">"Зборка АС Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{Цяпер вы ў # кроку ад таго, каб стаць распрацоўшчыкам}one{Цяпер вы ў # кроку ад таго, каб стаць распрацоўшчыкам}few{Цяпер вы ў # кроках ад таго, каб стаць распрацоўшчыкам}many{Цяпер вы ў # кроках ад таго, каб стаць распрацоўшчыкам}other{Цяпер вы ў # кроку ад таго, каб стаць распрацоўшчыкам}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Рэклама"</string>
<string name="ads_description" msgid="8081069475265061074">"Кіруйце наладамі рэкламы – скідам ідэнтыфікатараў."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Рэклама. Кіруйце наладамі рэкламы, напрыклад скідам рэкламных ідэнтыфікатараў."</string>
@@ -392,31 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Дадатковыя абнаўленні сістэмы"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"За сеткай можа назіраць"</string>
<string name="done_button" msgid="616159688526431451">"Гатова"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Давяраць сертыфікатам або выдаліць іх</item>
- <item quantity="few">Давяраць сертыфікатам або выдаліць іх</item>
- <item quantity="many">Давяраць сертыфікатам або выдаліць іх</item>
- <item quantity="other">Давяраць сертыфікатам або выдаліць іх</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one">Адміністратар дамена \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" усталяваў на вашай прыладзе сертыфікаты ЦС, якія дазваляюць яму кантраляваць вашы дзеянні ў працоўнай сетцы, у тым ліку выкарыстанне электроннай пошты і праграм, а таксама наведванне бяспечных вэб-сайтаў.\n\nПа дадатковую інфармацыю пра гэтыя сертыфікаты звяртайцеся да адміністратара.</item>
- <item quantity="few">Адміністратар дамена \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" усталяваў на вашай прыладзе сертыфікаты ЦС, якія дазваляюць яму кантраляваць вашы дзеянні ў працоўнай сетцы, у тым ліку выкарыстанне электроннай пошты і праграм, а таксама наведванне бяспечных вэб-сайтаў.\n\nПа дадатковую інфармацыю пра гэтыя сертыфікаты звяртайцеся да адміністратара.</item>
- <item quantity="many">Адміністратар дамена \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" усталяваў на вашай прыладзе сертыфікаты ЦС, якія дазваляюць яму кантраляваць вашы дзеянні ў працоўнай сетцы, у тым ліку выкарыстанне электроннай пошты і праграм, а таксама наведванне бяспечных вэб-сайтаў.\n\nПа дадатковую інфармацыю пра гэтыя сертыфікаты звяртайцеся да адміністратара.</item>
- <item quantity="other">Адміністратар дамена \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" усталяваў на вашай прыладзе сертыфікаты ЦС, якія дазваляюць яму кантраляваць вашы дзеянні ў працоўнай сетцы, у тым ліку выкарыстанне электроннай пошты і праграм, а таксама наведванне бяспечных вэб-сайтаў.\n\nПа дадатковую інфармацыю пра гэтыя сертыфікаты звяртайцеся да адміністратара.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one">Адміністратар дамена \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" усталяваў для вашага працоўнага профілю сертыфікаты ЦС, якія дазваляюць яму кантраляваць вашы дзеянні ў працоўнай сетцы, у тым ліку выкарыстанне электроннай пошты і праграм, а таксама наведванне бяспечных вэб-сайтаў.\n\nПа дадатковую інфармацыю пра гэтыя сертыфікаты звяртайцеся да адміністратара.</item>
- <item quantity="few">Адміністратар дамена \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" усталяваў для вашага працоўнага профілю сертыфікаты ЦС, якія дазваляюць яму кантраляваць вашы дзеянні ў працоўнай сетцы, у тым ліку выкарыстанне электроннай пошты і праграм, а таксама наведванне бяспечных вэб-сайтаў.\n\nПа дадатковую інфармацыю пра гэтыя сертыфікаты звяртайцеся да адміністратара.</item>
- <item quantity="many">Адміністратар дамена \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" усталяваў для вашага працоўнага профілю сертыфікаты ЦС, якія дазваляюць яму кантраляваць вашы дзеянні ў працоўнай сетцы, у тым ліку выкарыстанне электроннай пошты і праграм, а таксама наведванне бяспечных вэб-сайтаў.\n\nПа дадатковую інфармацыю пра гэтыя сертыфікаты звяртайцеся да адміністратара.</item>
- <item quantity="other">Адміністратар дамена \"<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>\" усталяваў для вашага працоўнага профілю сертыфікаты ЦС, якія дазваляюць яму кантраляваць вашы дзеянні ў працоўнай сетцы, у тым ліку выкарыстанне электроннай пошты і праграм, а таксама наведванне бяспечных вэб-сайтаў.\n\nПа дадатковую інфармацыю пра гэтыя сертыфікаты звяртайцеся да адміністратара.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Трэцяя асоба мае магчымасць маніторынгу вашай сеткавай актыўнасці, у тым ліку электроннай пошты, дадаткаў і абароненых вэб-сайтаў.\n\nГэта магчыма з-за даверанага сертыфіката, усталяванага на вашай прыладзе."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Праверыць сертыфікаты</item>
- <item quantity="few">Праверыць сертыфікаты</item>
- <item quantity="many">Праверыць сертыфікаты</item>
- <item quantity="other">Праверыць сертыфікаты</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Давяраць сертыфікату або выдаліць яго}one{Давяраць сертыфікатам або выдаліць іх}few{Давяраць сертыфікатам або выдаліць іх}many{Давяраць сертыфікатам або выдаліць іх}other{Давяраць сертыфікатам або выдаліць іх}}"</string>
<string name="device_status" msgid="8266002761193692207">"Стан"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Сетка, серыйныя нумары і іншая інфармацыя"</string>
<string name="manual" msgid="5683935624321864999">"Уручную"</string>
@@ -508,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Падключыцца"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Забыцца пра сетку"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Гэта ачышчае інфармацыю, якая выкарыстоўваецца для падключэння да гэтай сеткі, у тым ліку пароль"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Каб далучыцца да сеткі Wi-Fi, адсканіруйце QR-код з мабільнага тэлефона і выканайце інструкцыі."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Каб далучыцца да сеткі Wi-Fi, адсканіруйце QR-код з мабільнага тэлефона і выканайце інструкцыі.\n \n На "<b>"тэлефоне Android"</b>" адкрыйце Налады -> Сетка & інтэрнэт -> Wi-Fi -> выберыце Wi-Fi -> Пашыраныя налады -> Дадаць прыладу, а потым адсканіруйце QR-код."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Каб скасаваць, націсніце кнопку \"Назад\""</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Працягнуць"</string>
@@ -577,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Сховішча прылады"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Здымныя сховішчы"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Скінуць"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Вызваліце месца ў сховішчы"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Ачысціце кэшаваныя даныя"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Вызваліць <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Выдаляе часовыя файлы, якія займаюць месца ў сховішчы. Не закранае захаваныя даныя, напрыклад налады ў праграмах і пазасеткавыя відэа, так што вам не спатрэбіцца зноў уваходзіць у праграмы."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Выдаліць кэшаваныя даныя?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Будуць выдалены кэшаваныя даныя для ўсіх праграм."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Выдаліць праграмы"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> падключана"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Не атрымалася падключыць <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB-сховішча зноў падключана"</string>
@@ -654,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Мікрафон"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Доступ да мікрафона"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Доступ праграмы да мікрафона"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Доступ да мікрафона заблакіраваны"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Каб атрымаць доступ да мікрафона, перавядзіце на прыладзе пераключальнік прыватнасці ў становішча \"мікрафон уключаны\"."</string>
<string name="camera" msgid="1226671478936288283">"Камера"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Доступ да камеры"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Доступ праграмы да камеры"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Доступ да камеры заблакіраваны"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Каб атрымаць доступ да камеры, перавядзіце на прыладзе пераключальнік прыватнасці ў становішча \"камера ўключана\"."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Доступ да мікрафона: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Калі гэта налада ўключана, усе праграмы і сэрвісы, якія маюць дазвол, могуць атрымліваць доступ да любога мікрафона на гэтай прыладзе.\n\nНа перыферыйныя аўдыяпрылады з карыстальніцкім пратаколам гэта налада не паўплывае."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Доступ да камеры: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -728,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Блакітны"</string>
<string name="color_yellow" msgid="3519470952904560404">"Жоўты"</string>
<string name="color_magenta" msgid="2377854703399624607">"Пурпурны"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Аўдыяапісанне"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Аўдыяапісанне кадраў фільмаў і шоу"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Уключыць"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Канфігурацыя"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Уключыць <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -748,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Маніторынг"</string>
<string name="system_apps" msgid="8481888654606868074">"Праграмы"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Прадухіляць ад пераходу ў рэжым сну"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Экран ніколі не будзе пераходзіць у рэжым сну"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Праверка HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Аптымізацыя HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Перазапусціць?"</string>
@@ -868,24 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Выключаць прылады HDMI разам з тэлевізарам"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Аўтаўключэнне тэлевізара"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Уключаць тэлевізар разам з прыладай HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Падключаныя ўваходы</item>
- <item quantity="few">Падключаныя ўваходы</item>
- <item quantity="many">Падключаныя ўваходы</item>
- <item quantity="other">Падключаныя ўваходы</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Уваходы ў рэжыме чакання</item>
- <item quantity="few">Уваходы ў рэжыме чакання</item>
- <item quantity="many">Уваходы ў рэжыме чакання</item>
- <item quantity="other">Уваходы ў рэжыме чакання</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Не падключаныя ўваходы</item>
- <item quantity="few">Не падключаныя ўваходы</item>
- <item quantity="many">Не падключаныя ўваходы</item>
- <item quantity="other">Не падключаныя ўваходы</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Падключаны порт уваходу}one{Падключаныя парты ўваходу}few{Падключаныя парты ўваходу}many{Падключаныя парты ўваходу}other{Падключаныя парты ўваходу}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Порт уваходу ў рэжыме чакання}one{Парты ўваходу ў рэжыме чакання}few{Парты ўваходу ў рэжыме чакання}many{Парты ўваходу ў рэжыме чакання}other{Парты ўваходу ў рэжыме чакання}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Не падключаны порт уваходу}one{Не падключаныя парты ўваходу}few{Не падключаныя парты ўваходу}many{Не падключаныя парты ўваходу}other{Не падключаныя парты ўваходу}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Абмежаваць доступ да праграм і іншага змесціва ў вашым уліковым запісе"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Профіль з абмежаваннямі"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Пад кіраваннем <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -899,12 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Стварыць профіль з абмежаваннямі"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Налады"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Дазволеныя праграмы"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d праграма дазволена</item>
- <item quantity="few">%d праграмы дазволены</item>
- <item quantity="many">%d праграм дазволены</item>
- <item quantity="other">%d праграмы дазволены</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Дазволены"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Забаронены"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Наладзіць абмежаванні"</string>
@@ -949,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Старонняя крыніца"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Дазволы"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Праграма недаступная"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Праграмы, якія не выкарыстоўваюцца"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Пацвердзіць"</string>
<string name="settings_cancel" msgid="576094334743686152">"Скасаваць"</string>
@@ -1032,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Праграма можа змяняць налады сістэмы."</string>
<string name="write_settings_on" msgid="71675710746513956">"Так"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Не"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Доступ да ўсіх файлаў"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Дазволіць доступ да кіравання ўсімі файламі"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Дазвольце гэтай праграме счытваць, змяняць і выдаляць усе файлы на гэтай прыладзе ці ў падключаных сховішчах. З такім дазволам праграма зможа атрымліваць доступ да файлаў без вашага ведама."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Відарыс у відарысе"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Відарыс у відарысе"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Ніводная з усталяваных праграм не падтрымлівае рэжым \"відарыс у відарысе\""</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Дазволіць гэтай праграме ствараць акно відарыса ў відарысе, калі праграма адкрыта або пасля выхаду з яе (напрыклад, каб працягнуць прагляд відэа). Гэта акно паказваецца паверх іншых праграм, якія вы выкарыстоўваеце."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Дазвольце праграмам уключаць будзільнікі і задаваць час дзеянняў. З такім дазволам праграмы могуць працаваць у фонавым рэжыме і ў выніку спажываць больш энергіі.\n\nКалі вы не ўключыце гэты дазвол, існуючыя будзільнікі і запланаваны праграмай час падзей не будуць працаваць."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Уключаць экран"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Дазволіць уключэнне экрана"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Дазволіць праграме ўключаць экран. Калі дазвол дадзены, праграма зможа ў любы час уключаць экран без вашага яўнага намеру."</string>
<string name="special_access" msgid="21806055758289916">"Асобы доступ для праграм"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Аўдыя"</string>
@@ -1053,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Эканомія трафіка"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Аўтаматычна рэгуляваць якасць відэа, каб эканоміць на мабільнай перадачы даных"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Выкарыстанне трафіка і абвесткі"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Вы можаце падключыцца да інтэрнэту з дапамогай Wi-Fi, Ethernet ці хот-спота тэлефона. Дадатковую інфармацыю шукайце на сайце "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Вы можаце падключыцца да інтэрнэту з дапамогай Wi-Fi, Ethernet ці хот-спота тэлефона."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Дзеянне забаронена"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Не ўдалося змяніць гучнасць"</string>
@@ -1103,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Сілкаванне і энергія"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Налады ўключэння"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Скінуць"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Код спалучэння ппраз Ethernet"</string>
</resources>
diff --git a/Settings/res/values-bg/strings.xml b/Settings/res/values-bg/strings.xml
index 8b7eb12..a65fbc0 100644
--- a/Settings/res/values-bg/strings.xml
+++ b/Settings/res/values-bg/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Добавяне на профил"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Профили и вход"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Няма профили"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> профила</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> профил</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# профил}other{# профила}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Медийни услуги, Асистент, Google Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Мрежа и интернет"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Звук"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Приложения"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Предпочитания за устройството"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Дистанционни управления и аксесоари"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Няма свързани устройства с Bluetooth"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> аксесоара</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> аксесоар</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Дисплей и звук"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Помощ и отзиви"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Поверителност"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Възстановяване на фабричните настройки"</string>
<string name="device_calibration" msgid="2907914144048739705">"Калибриране"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Икономия на енергия"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Устройства"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Избиране на формати"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Обемен звук"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"АКТИВИРАНИ ФОРМАТИ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ДЕАКТИВИРАНИ ФОРМАТИ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"За да деактивирате, променете избора на формат на „Ръчно“."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Разделителна способност"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Автоматично"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Разделителната способност е променена"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Изберете OK, за да използвате %1$s занапред."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Отказ"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Да се изчистят ли кешираните данни?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Това ще изчисти кешираните данни за всички прил."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Добавяне на аксесоар"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Извършва се сдвояване…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Установява се връзка…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Аксесоари"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Дистанционно управление"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Настройки за дистанционното управление"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Настройване на бутоните на дистанционното управление"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Управление на бутоните за силата на звука, включване/изключване и избор на вход на телевизори, приемници и звукови панели"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Свързване"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Установяване на връзка с(ъс) %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Прекратяване на връзката"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Не е налице"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Администраторски приложения на устройството"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Няма активни приложения"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Деакт. от админ., правила за шифроване или хранил. за идент. данни"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Информация за управляваното устройство"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Промени и настройки, управлявани от организацията ви"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Няма"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Инсталирани са приложения"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Броят на приложенията е приблизителен и може да не включва тези, които не са инсталирани от Google Play Магазин."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Поне # приложение}other{Поне # приложения}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Разрешения за местоположението"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Разрешения за микрофона"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Разрешения за камерата"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Приложения по подразбиране"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# приложение}other{# приложения}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Клавиатура по подразбиране"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Зададено: <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Режимът за винаги включена виртуална частна мрежа (VPN) е активиран"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Надеждни идентификационни данни"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Надеждни идентификационни данни в личния ви потребителски профил"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Надеждни идентификационни данни в служебния ви потребителски профил"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item 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="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# сертификат от сертифициращ орган}other{# сертификата от сертифициращи органи}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Администраторът може да заключва устройството и да променя паролата"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Администраторът може да изтрие всички данни на устройството"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Неуспешни опити за въвеждане на паролата, преди всички данни на устройството да бъдат изтрити"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Неуспешни опити за въвеждане на паролата, преди данните в служебния потребителски профил да бъдат изтрити"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# опит}other{# опита}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Това устройство се управлява от организацията ви."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Това устройство се управлява от <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Научете повече"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Приложения за камера</item>
- <item quantity="one">Приложение за камера</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Приложение за камера}other{Приложения за камера}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Приложение за календар"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Приложение за контакти"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Приложения за електронна поща</item>
- <item quantity="one">Приложение за електронна поща</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Приложение за електронна поща}other{Приложения за електронна поща}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Приложение за карти"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Приложения за телефон</item>
- <item quantity="one">Приложение за телефон</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Приложение за телефон}other{Приложения за телефон}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Приложение за браузър"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Версия на операционната система на Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Сериен номер"</string>
<string name="about_build" msgid="8467840394761634575">"Компилация на операционната система на Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{Вече сте на # стъпка от това, да бъдете програмист}other{Вече сте на # стъпки от това, да бъдете програмист}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Реклами"</string>
<string name="ads_description" msgid="8081069475265061074">"Управлявайте настройките за рекламите, като например нулиране на идентификатора за рекламиране."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Реклами – Управлявайте настройките за рекламите, като например нулиране на идентификатора за рекламиране."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Други сист. актуализации"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Мрежата може да се наблюдава"</string>
<string name="done_button" msgid="616159688526431451">"Готово"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Доверете се на сертификатите или ги премахнете</item>
- <item quantity="one">Доверете се на сертификата или го премахнете</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other">Домейнът <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> е инсталирал сертифициращи органи на устройството ви. Това може да му даде възможност да следи мрежовата активност на устройството, включително имейли, приложения и защитени уебсайтове.\n\nЗа повече информация относно тези сертификати се обърнете към администратора си.</item>
- <item quantity="one">Домейнът <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> е инсталирал сертифициращ орган на устройството ви. Това може да му даде възможност да следи мрежовата активност на устройството, включително имейли, приложения и защитени уебсайтове.\n\nЗа повече информация относно този сертификат се обърнете към администратора си.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other">Домейнът <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> е инсталирал сертифициращи органи за служебния ви потребителски профил. Това може да му даде възможност да следи служебната мрежова активност, включително имейли, приложения и защитени уебсайтове.\n\nЗа повече информация относно тези сертификати се обърнете към администратора си.</item>
- <item quantity="one">Домейнът <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> е инсталирал сертифициращ орган за служебния ви потребителски профил. Това може да му даде възможност да следи служебната мрежова активност, включително имейли, приложения и защитени уебсайтове.\n\nЗа повече информация относно този сертификат се обърнете към администратора си.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Трета страна може да наблюдава активността ви в мрежата, включително имейлите, приложенията и защитените уебсайтове.\n\nТова е възможно благодарение на инсталирани на устройството ви надеждни идентификационни данни."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Проверка на сертификатите</item>
- <item quantity="one">Проверка на сертификата</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Доверете се на сертификата или го премахнете}other{Доверете се на сертификатите или ги премахнете}}"</string>
<string name="device_status" msgid="8266002761193692207">"Състояние"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Мрежа, серийни номера и друга информация"</string>
<string name="manual" msgid="5683935624321864999">"Ръководство"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Свързване"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Забравяне на мрежата"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Това изчиства информацията, ползвана за свързване с тази мрежа, включително запазените пароли"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Присъединете се към Wi-Fi мрежа, като сканирате кода за бърза реакция от мобилния си телефон и изпълните инструкциите."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Присъединете се към Wi-Fi мрежа, като сканирате QR кода с мобилен телефон и изпълните инструкциите.\n\nНа "<b>"телефон с Android"</b>" отворете „Настройки“ -> „Мрежа и интернет“ -> „Wi-Fi“ -> изберете Wi-Fi мрежа -> „Разширени“ -> „Добавяне на устройство“ и след това сканирайте QR кода."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Докоснете бутона за връщане назад, за да анулирате"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Напред"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Хранилище на устройството"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Сменяемо хранилище"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Нулиране"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Освобождаване на място в хранилището"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Изчистване на кешираните данни"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Освобождаване на <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Изчиства временните файлове, които заемат място. Няма да засегне запазените данни, като например предпочитанията за приложения или офлайн видеоклиповете, и няма да е необходимо да влизате отново в приложенията."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Да се изчистят ли кешираните данни?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Това ще изчисти кешираните данни за всички прил."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Деинсталиране на приложения"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g>: Свързването бе успешно"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g>: Не можа да се свърже"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB хранилището е повторно свързано"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Микрофон"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Достъп до микрофона"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Достъп на приложенията до микрофона"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Достъпът до микрофона е блокиран"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"За да го отблокирате, преместете превключвателя за поверителността на устройството си във включено положение за микрофона, за да разрешите достъпа до него."</string>
<string name="camera" msgid="1226671478936288283">"Камера"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Достъп до камерата"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Достъп на приложенията до камерата"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Достъпът до камерата е блокиран"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"За да я отблокирате, преместете превключвателя за поверителността на устройството си във включено положение за камерата, за да разрешите достъпа до нея."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Достъп до микрофона: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Когато настройката е включена, всички приложения и услуги, които имат разрешение, ще получат достъп до всички микрофони на това устройство.\n\nПериферните аудиоустройства с персонализиран протокол няма да бъдат засегнати от тази настройка."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Достъп до камерата: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Синьо-зелен"</string>
<string name="color_yellow" msgid="3519470952904560404">"Жълт"</string>
<string name="color_magenta" msgid="2377854703399624607">"Пурпурен"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Аудиоописание"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Чуйте описание на случващото се на екрана в поддържаните филми и предавания"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Активиране"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Конфигурация"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Да се използва ли „<xliff:g id="SERVICE">%1$s</xliff:g>“?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Наблюдение"</string>
<string name="system_apps" msgid="8481888654606868074">"Приложения"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Да остане активен"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Екранът никога няма да преминава в спящ режим"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Проверка с HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Оптимизиране на HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Да се рестартира ли сега?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Изключване на HDMI устройствата чрез телевизора"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Автоматично вкл. на телевизора"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Включване на телевизора чрез HDMI устройство"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Свързани входа</item>
- <item quantity="one">Свързан вход</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Входа в режим на готовност</item>
- <item quantity="one">Вход в режим на готовност</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Свободни входа</item>
- <item quantity="one">Свободен вход</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Свързан вход}other{Свързани входове}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Вход в режим на готовност}other{Входове в режим на готовност}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Несвързан вход}other{Несвързани входове}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Ограничаване на достъпа до приложенията и другото съдържание в профила ви"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Потр. профил с огран. функц."</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Контролирани от <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Създаване на потребителски профил с ограничена функционалност"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Настройки"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Разрешени приложения"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">Разрешени са %d приложения</item>
- <item quantity="one">Разрешено е 1 приложение</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Разрешено"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Не е разрешено"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Персонализиране на ограниченията"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Източник на трета страна"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Разрешения"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Приложението не е налице"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Неизползвани приложения"</string>
<string name="settings_ok" msgid="5950888975075541964">"ОК"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Потвърждаване"</string>
<string name="settings_cancel" msgid="576094334743686152">"Отказ"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Това разрешение позволява на дадено приложение да променя системните настройки."</string>
<string name="write_settings_on" msgid="71675710746513956">"Да"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Не"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Достъп до всички файлове"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Разрешете достъп за управл. на всички файлове"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Разрешете на това приложение да чете, променя и изтрива всички файлове на устройството или обемите на свързаните хранилища. Ако то получи разрешението, може да осъществява достъп до файловете без изричното ви знание."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Картина в картината"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Разрешаване на режима „Картина в картината“"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Никое от инсталираните приложения не поддържа режим „Картина в картината“"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Разрешаване на приложенията да създават прозорец в режима „Картина в картината“, докато приложението е отворено или след като излезете от него (например за да продължите да гледате видеоклип). Съответният прозорец ще се показва върху другите приложения, които използвате."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Разрешаване на приложенията да задават будилници и да насрочват действия, ограничени във времето. Това им позволява да работят на заден план, което може да доведе до по-висок разход на енергия.\n\nАко разрешението е изключено, съществуващите будилници и събитията въз основа на времето, насрочени от приложението, няма да работят."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Включване на екрана"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Разрешаване на включването на екрана"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Разрешете на дадено приложение да включва екрана. Ако го направите, то може да включва екрана по всяко време без явното ви намерение."</string>
<string name="special_access" msgid="21806055758289916">"Специален достъп за приложението"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Аудио"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Икономия на данни"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Автомат. коригиране на видеокачеството с цел използване на по-малко моб. данни"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Пренос на данни и сигнали"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Можете да се свържете с интернет посредством Wi-Fi, Ethernet или точката за достъп на телефона ви. За още помощ посетете "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Можете да се свържете с интернет посредством Wi-Fi, Ethernet или точката за достъп на телефона ви."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Непозволено действие"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Силата на звука не може да бъде променена"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Включване и захранване"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Поведение при включване"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Нулиране"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Код за сдвояване с Ethernet"</string>
</resources>
diff --git a/Settings/res/values-bn/strings.xml b/Settings/res/values-bn/strings.xml
index d9827b5..4196ccf 100644
--- a/Settings/res/values-bn/strings.xml
+++ b/Settings/res/values-bn/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"একটি অ্যাকাউন্ট জুড়ুন"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"অ্যাকাউন্ট ও সাইন-ইন"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"কোনও অ্যাকাউন্ট নেই"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g>টি অ্যাকাউন্ট</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g>টি অ্যাকাউন্ট</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{#টি অ্যাকাউন্ট}one{#টি অ্যাকাউন্ট}other{#টি অ্যাকাউন্ট}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"মিডিয়া পরিষেবা, Assistant, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"নেটওয়ার্ক ও ইন্টারনেট"</string>
<string name="sound_category_title" msgid="7899816751041939518">"সাউন্ড"</string>
<string name="applications_category_title" msgid="7112019490898586223">"অ্যাপ"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"ডিভাইস সম্পর্কিত পছন্দ"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"রিমোট ও অ্যাক্সেসরি"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"কোনও ব্লুটুথ ডিভাইস কানেক্ট করা নেই"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g>টি অ্যাক্সেসরি</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g>টি অ্যাক্সেসরি</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ডিসপ্লে এবং সাউন্ড"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"সহায়তা ও মতামত"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"গোপনীয়তা"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"ফ্যাক্টরি ডেটা রিসেট করুন"</string>
<string name="device_calibration" msgid="2907914144048739705">"ক্রমাঙ্কন"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"পাওয়ার সেভার"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"ডিভাইস"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ফর্ম্যাট বেছে নিন"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"চারিপাশের সাউন্ড"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"ডলবি ডিজিটাল"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"চালু করা আছে এমন ফর্ম্যাট"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"বন্ধ করা আছে এমন ফর্ম্যাট"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"বন্ধ করতে, ফর্ম্যাট বেছে নেওয়ার বিকল্পটি ম্যানুয়ালে পরিবর্তন করুন।"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"রেজোলিউশন"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"অটোমেটিক"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"রেজোলিউশন পরিবর্তন করা হয়েছে"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"এখন থেকে %1$s ব্যবহার করার জন্য \'ঠিক আছে\' বিকল্প বেছে নিন।"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"বাতিল করুন"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ঠিক আছে"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"ক্যাশে করা ডেটা সাফ করবেন?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"এটি সব অ্যাপ্লিকেশানগুলি থেকে ক্যাশে করা ডেটা সাফ করে দেবে।"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"আনুষঙ্গিক উপকরণ জুড়ুন"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"যুক্ত করা হচ্ছে..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"সংযুক্ত হচ্ছে..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"অ্যাক্সেসরি"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"রিমোট কন্ট্রোল"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"রিমোট কন্ট্রোল সেটিংস"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"রিমোটের বোতাম সেটআপ করুন"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"ভলিউম, পাওয়ার, টিভির ইনপুট, রিসিভার ও সাউন্ডবার কন্ট্রোল করুন"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"কানেক্ট করুন"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s-এ কানেক্ট করুন"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"ডিসকানেক্ট করুন"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"উপলভ্য নয়"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"ডিভাইস প্রশাসক অ্যাপ"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"কোনও সক্রিয় অ্যাপ নেই"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"প্রশাসক, এনক্রিপশন নীতি বা ক্রেডেনশিয়াল স্টোরেজ দ্বারা অক্ষম"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"পরিচালিত ডিভাইসের তথ্য"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"আপনার প্রতিষ্ঠান দ্বারা পরিচালিত পরিবর্তন এবং সেটিংগুলি"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"কোনওটিই নয়"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"অ্যাপগুলি ইনস্টল করা আছে"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"অ্যাপের সংখ্যা আনুমানিক। Play Store ছাড়া অন্য কোনও জায়গা থেকে ইনস্টল করা অ্যাপ এর মধ্যে অন্তর্ভুক্ত নাও থাকতে পারে।"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{কমপক্ষে #টি অ্যাপ}one{কমপক্ষে #টি অ্যাপ}other{কমপক্ষে #টি অ্যাপ}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"লোকেশনের অনুমতি"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"মাইক্রোফোনের অনুমতি"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"ক্যামেরার অনুমতি"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"ডিফল্ট অ্যাপ"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{#টি অ্যাপ}one{#টি অ্যাপ}other{#টি অ্যাপ}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"ডিফল্ট কিবোর্ড"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> এ সেট করুন"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"সর্বদা-চালু VPN অন করা আছে"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"বিশ্বস্ত ক্রেডেনশিয়াল"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"আপনার ব্যক্তিগত প্রোফাইলের বিশ্বস্ত ক্রেডেনশিয়াল"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"আপনার অফিস প্রোফাইলের বিশ্বস্ত ক্রেডেনশিয়াল"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">কমপক্ষে <xliff:g id="COUNT_1">%d</xliff:g>টি CA সার্টিফিকেট</item>
- <item quantity="other">কমপক্ষে <xliff:g id="COUNT_1">%d</xliff:g>টি CA সার্টিফিকেট</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{#টি CA সার্টিফিকেট}one{#টি CA সার্টিফিকেট}other{#টি CA সার্টিফিকেট}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"প্রশাসক ডিভাইসটি লক করতে ও পাসওয়ার্ড আবার সেট করতে পারেন"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"প্রশাসক ডিভাইসের সমস্ত ডেটা মুছে দিতে পারবেন"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"ডিভাইসের সমস্ত ডেটা মুছে যাওয়ার আগে পাসওয়ার্ড দেওয়ার সর্বাধিক সংখ্যা"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"কর্মস্থলের প্রোফাইলের ডেটা মুছে যাওয়ার আগে পাসওয়ার্ড দেওয়ার সর্বাধিক সংখ্যা"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# বার চেষ্টা করা হয়েছে}one{# বার চেষ্টা করা হয়েছে}other{# বার চেষ্টা করা হয়েছে}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"আপনার প্রতিষ্ঠান এই ডিভাইসটি পরিচালনা করে।"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"এই ডিভাইসটি <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> দ্বারা পরিচালিত।"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"আরও জানুন"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">ক্যামেরা অ্যাপ</item>
- <item quantity="other">ক্যামেরা অ্যাপ</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{ক্যামেরা অ্যাপ}one{ক্যামেরা অ্যাপ}other{ক্যামেরা অ্যাপ}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"ক্যালেন্ডার অ্যাপ"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"পরিচিতি অ্যাপ"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">ইমেল ক্লায়েন্ট অ্যাপ</item>
- <item quantity="other">ইমেল ক্লায়েন্ট অ্যাপ</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ইমেল ক্লায়েন্ট অ্যাপ}one{ইমেল ক্লায়েন্ট অ্যাপ}other{ইমেল ক্লায়েন্ট অ্যাপ}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"ম্যাপ অ্যাপ"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">ফোন অ্যাপ</item>
- <item quantity="other">ফোন অ্যাপ</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{ফোন অ্যাপ}one{ফোন অ্যাপ}other{ফোন অ্যাপ}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"ব্রাউজার অ্যাপ"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS ভার্সন"</string>
<string name="about_serial" msgid="3432319328808745459">"ক্রমিক সংখ্যা"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS বিল্ড ভার্সন"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{আপনাকে ডেভেলপার হতে #টি ধাপ এখনও পেরোতে হবে}one{আপনাকে ডেভেলপার হতে #টি ধাপ এখনও পেরোতে হবে}other{আপনাকে ডেভেলপার হতে #টি ধাপ এখনও পেরোতে হবে}}"</string>
<string name="about_ads" msgid="7662896442040086522">"বিজ্ঞাপনগুলি"</string>
<string name="ads_description" msgid="8081069475265061074">"আপনার বিজ্ঞাপন আইডি রিসেট করার মতো বিজ্ঞাপন সেটিংস ম্যানেজ করুন।"</string>
<string name="ads_content_description" msgid="1006489792324920289">"বিজ্ঞাপন, বিজ্ঞাপন সেটিংস ম্যানেজ করুন - যেমন আপনার বিজ্ঞাপন আইডি রিসেট করা।"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"অতিরিক্ত সিস্টেম আপডেটগুলি"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"নেটওয়ার্ক নিরীক্ষণ করা হতে পারে"</string>
<string name="done_button" msgid="616159688526431451">"সম্পন্ন হয়েছে"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">সার্টিফিকেটের উপরে ভরসা করুন বা সেটিকে সরান</item>
- <item quantity="other">সার্টিফিকেটের উপরে ভরসা করুন বা সেটিকে সরান</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> আপনার অফিস প্রোফাইলের জন্য একটি CA সার্টিফিকেট ইনস্টল করেছে, যেটি তাদেরকে ইমেল, অ্যাপ এবং নিরাপদ ওয়েবসাইটগুলি সহ ডিভাইস নেটওয়ার্কের কার্যকলাপকে নিরীক্ষণ করার অনুমতি দিতে পারে৷\n\nএই সার্টিফিকেট সম্পর্কে আরও তথ্যের জন্য আপনার অ্যাডমিনের সাথে যোগাযোগ করুন।</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> আপনার অফিস প্রোফাইলের জন্য একটি CA সার্টিফিকেট ইনস্টল করেছে, যেটি তাদেরকে ইমেল, অ্যাপ এবং নিরাপদ ওয়েবসাইটগুলি সহ ডিভাইস নেটওয়ার্কের কার্যকলাপকে নিরীক্ষণ করার অনুমতি দিতে পারে৷\n\nএই সার্টিফিকেট সম্পর্কে আরও তথ্যের জন্য আপনার অ্যাডমিনের সাথে যোগাযোগ করুন।</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> আপনার অফিস প্রোফাইলের জন্য একটি CA সার্টিফিকেট ইনস্টল করেছে, যেটি তাদেরকে ইমেল, অ্যাপ এবং নিরাপদ ওয়েবসাইটগুলি সহ অফিস নেটওয়ার্কের কার্যকলাপকে নিরীক্ষণ করার অনুমতি দিতে পারে৷\n\nএই সার্টিফিকেট সম্পর্কে আরও তথ্যের জন্য আপনার অ্যাডমিনের সাথে যোগাযোগ করুন।</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> আপনার অফিস প্রোফাইলের জন্য একটি CA সার্টিফিকেট ইনস্টল করেছে, যেটি তাদেরকে ইমেল, অ্যাপ এবং নিরাপদ ওয়েবসাইটগুলি সহ অফিস নেটওয়ার্কের কার্যকলাপকে নিরীক্ষণ করার অনুমতি দিতে পারে৷\n\nএই সার্টিফিকেট সম্পর্কে আরও তথ্যের জন্য আপনার অ্যাডমিনের সাথে যোগাযোগ করুন।</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"একজন তৃতীয় পক্ষ ইমেল অ্যাপ্লিকেশান, এবং নিরাপদ ওয়েবসাইটগুলি সহ আপনার নেটওয়ার্ক ক্রিয়াকলাপ নিরীক্ষণ করতে সক্ষম হবে। \n\nআপনার ডিভাইসে ইনস্টল করা একটি বিশ্বস্ত ক্রেডেনশিয়াল এটিকে সম্ভব করছে।"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">সার্টিফিকেট দেখে নিন</item>
- <item quantity="other">সার্টিফিকেট দেখে নিন</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{সার্টিফিকেটে ভরসা করুন অথবা সেটি সরিয়ে দিন}one{সার্টিফিকেটে ভরসা করুন অথবা সরিয়ে দিন}other{সার্টিফিকেটে ভরসা করুন অথবা সরিয়ে দিন}}"</string>
<string name="device_status" msgid="8266002761193692207">"স্থিতি"</string>
<string name="device_status_summary" msgid="3270932829412434985">"নেটওয়ার্ক, সিরিয়াল নম্বর এবং অন্যান্য তথ্য"</string>
<string name="manual" msgid="5683935624321864999">"ম্যানুয়াল"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"সংযুক্ত হন"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"নেটওয়ার্কটি মনে রাখবে না"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"এটি এই নেটওয়ার্কের সাথে সংযোগ স্থাপনের জন্য ব্যবহৃত তথ্য সাফ করে, এর মধ্যে সংরক্ষিত পাসওয়ার্ডও অন্তর্ভুক্ত"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"ওয়াই ফাই নেটওয়ার্কে যোগ দিতে আপনার মোবাইল ফোন দিয়ে QR কোড স্ক্যান করুন ও দেখানো নির্দেশগুলি পালন করুন।"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" মোবাইল ফোন ব্যবহার করে QR কোডের সাহায্যে স্ক্যান করে ওয়াই-ফাই কানেক্ট করুন এবং নির্দেশ অনুসরণ করুন।\n \n কোনও একটি "<b>"Android ফোন"</b>" থেকে সেটিংস -> নেটওয়ার্ক ও ইন্টারনেট -> ওয়াই-ফাই -> ওয়াই-ফাই বেছে নিন -> উন্নত -> বিকল্প বেছে নিয়ে এবং ডিভাইস যোগ করে QR কোড স্ক্যান করুন।"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"বাতিল করতে \'ফিরে যান\' বোতাম প্রেস করুন"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ঠিক আছে"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"চালিয়ে যান"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"ডিভাইস স্টোরেজ"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"অপসারণযোগ্য সঞ্চয়স্থান"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"আবার সেট করুন"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"জায়গা খালি করুন"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"ক্যাশে করা ডেটা মুছুন"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> খালি করুন"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"জায়গা জোড়া করে রাখা অস্থায়ী ফাইল মুছে দেয়। অ্যাপে সেট করা পছন্দ বা অফলাইন ভিডিওর মতো সেভ করা ডেটাতে এর কোনও প্রভাব পড়বে না এবং আপনাকে অ্যাপে আবার সাইন-ইন করতে হবে না।"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"ক্যাশে করা ডেটা মুছবেন?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"এটি সব অ্যাপের ক্যাশে করা ডেটা মুছে দেবে।"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"অ্যাপ আনইনস্টল করুন"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> মাউন্ট করা হয়েছে"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> মাউন্ট করা যায়নি"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB সঞ্চয়স্থান আবার সংযুক্ত হয়েছে"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"মাইক্রোফোন"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"মাইক্রোফোনের অ্যাক্সেস"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"অ্যাপের জন্য মাইক্রোফোন অ্যাক্সেসের অনুমতি"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"মাইক্রোফোনের অ্যাক্সেস ব্লক করা হয়েছে"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"আনব্লক করার জন্য মাইক্রোফোন অ্যাক্সেসের অনুমতি দিতে, আপনার ডিভাইসের প্রাইভেসি সুইচ \'মাইক্রোফোন চালু রয়েছে\' অবস্থানে সরান।"</string>
<string name="camera" msgid="1226671478936288283">"ক্যামেরা"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"ক্যামেরার অ্যাক্সেস"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"অ্যাপের জন্য ক্যামেরা অ্যাক্সেসের অনুমতি"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"ক্যামেরার অ্যাক্সেস ব্লক করা হয়েছে"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"আনব্লক করার জন্য ক্যামেরা অ্যাক্সেসের অনুমতি দিতে, আপনার ডিভাইসের প্রাইভেসি সুইচ \'ক্যামেরা চালু রয়েছে\' অবস্থানে সরান।"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"মাইক্রোফোনের অ্যাক্সেস: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"চালু করা থাকলে, অনুমতি পাওয়া সব অ্যাপ ও পরিষেবা এই ডিভাইসের যেকোনও মাইক্রোফোন অ্যাক্সেস করতে পারবে।\n\nএই সেটিংয়ের প্রভাব কাস্টম প্রোটোকল সহ প্লাগ-ইন অডিও পেরিফেরালের উপর পড়বে না।"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"ক্যামেরার অ্যাক্সেস: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"সবজে নীল"</string>
<string name="color_yellow" msgid="3519470952904560404">"হলুদ"</string>
<string name="color_magenta" msgid="2377854703399624607">"ম্যাজেন্টা"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"অডিওর বিবরণ"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"স্ক্রিনে সিনেমা ও শোতে যা কিছু হয়, সেই সম্পর্কে শুনুন। এটির ব্যবহার সেইসব সিনেমা ও শোয়ের জন্য করা হয়, যাতে এই সুবিধা উপলভ্য আছে"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"চালু করুন"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"কনফিগারেশন"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> ব্যবহার করবেন?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"মনিটরিং"</string>
<string name="system_apps" msgid="8481888654606868074">"অ্যাপ"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"জাগিয়ে রাখুন"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"স্ক্রিন কখনই \'স্লিপ\' মোডে থাকবে না"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP পরীক্ষণ"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI অপ্টিমাইজেশান"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"এখনই রিস্টার্ট করবেন?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"টিভির সঙ্গে HDMI ডিভাইসগুলির পাওয়ার বন্ধ করুন"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"টিভির পাওয়ার স্বতঃচালু করা"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI ডিভাইসের মাধ্যমে টিভির পাওয়ার চালু করুন"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">টি সংযুক্ত ইনপুট</item>
- <item quantity="other">টি সংযুক্ত ইনপুট</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">টি অপেক্ষারত ইনপুট</item>
- <item quantity="other">টি অপেক্ষারত ইনপুট</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">টি সংযুক্ত না থাকা ইনপুট</item>
- <item quantity="other">টি সংযুক্ত না থাকা ইনপুট</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{কানেক্ট করা ইনপুট}one{কানেক্ট করা ইনপুট}other{কানেক্ট করা ইনপুট}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{স্ট্যান্ডবাই ইনপুট}one{স্ট্যান্ডবাই ইনপুট}other{স্ট্যান্ডবাই ইনপুট}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{কানেক্ট করা নেই এমন ইনপুট}one{কানেক্ট করা নেই এমন ইনপুট}other{কানেক্ট করা নেই এমন ইনপুট}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"আপনার অ্যাকাউন্টের মধ্যে অ্যাপ্লিকেশান এবং অন্যান্য সামগ্রীর অ্যাক্সেস সীমাবদ্ধ করুন"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"বিধিনিষেধযুক্ত প্রোফাইল"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g>-এর দ্বারা নিয়ন্ত্রিত"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"বিধিনিষেধযুক্ত প্রোফাইল তৈরি করুন"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"সেটিংস"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"অনুমোদিত অ্যাপ্লিকেশানগুলি"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%dটি অ্যাপ্লিকেশান অনুমোদিত</item>
- <item quantity="other">%dটি অ্যাপ্লিকেশান অনুমোদিত</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"অনুমতি আছে"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"অনুমতি নেই"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"বিধিনিষেধগুলি কাস্টমাইজ করুন"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"থার্ড-পার্টির সোর্স"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"অনুমতিগুলি"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"অ্যাপ্লিকেশান অনুপলব্ধ"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"ব্যবহার করা হয়নি এমন অ্যাপ"</string>
<string name="settings_ok" msgid="5950888975075541964">"ঠিক আছে"</string>
<string name="settings_confirm" msgid="4489126458677153411">"কনফার্ম করুন"</string>
<string name="settings_cancel" msgid="576094334743686152">"বাতিল করুন"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"কোনও অ্যাপকে এই অনুমতি দিলে সেটি সিস্টেম সেটিংস পরিবর্তন করতে পারবে।"</string>
<string name="write_settings_on" msgid="71675710746513956">"হ্যাঁ"</string>
<string name="write_settings_off" msgid="6730113471695092167">"না"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"সব ফাইলে অ্যাক্সেস"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"সব ফাইল ম্যানেজ করতে অ্যাক্সেস দিন"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"এই ডিভাইস অথবা এতে কানেক্ট রয়েছে এমন যেকোনও স্টোরেজের ভলিউমে থাকা সব ফাইল পড়তে, পরিবর্তন করতে এবং মুছতে এই অ্যাপকে অনুমতি দিন। অনুমতি দিলে এই অ্যাপ আপনাকে না জানিয়েই ফাইলগুলি অ্যাক্সেস করতে পারবে।"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"ছবির-মধ্যে-ছবি"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"ছবির-মধ্যে-ছবি তৈরির অনুমতি দিন"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"ইনস্টল করা কোনও অ্যাপ ছবির-মধ্যে-ছবি মোড সমর্থন করে না"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"অ্যাপটি খোলা থাকার সময় অথবা আপনি এটি ছেড়ে বেরিয়ে গেলে (যেমন, কোনও ভিডিও দেখার জন্য) এটিকে একটি ছবির-মধ্যে-ছবি সমেত উইন্ডো তৈরি করার অনুমতি দিন। চালু থাকা অন্যান্য অ্যাপের উপরে এই উইন্ডোটি দেখা যাবে।"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"অ্যালার্ম এবং সময়ের মধ্যে শেষ করতে হবে এমন অ্যাকশনের শিডিউল সেট করতে অ্যাপগুলিকে অনুমতি দিন। এর ফলে ব্যাকগ্রাউন্ডে অ্যাপগুলি চলে, যার জন্য আরও ব্যাটারির চার্জ খরচ হতে পারে।\n\nএই অনুমতি বন্ধ করা থাকলে, অ্যাপগুলির মাধ্যমে আগে থেকে শিডিউল করা অ্যালার্ম এবং সময়-ভিত্তিক ইভেন্টের রিমাইন্ডার কাজ করবে না।"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"স্ক্রিন চালু করুন"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"স্ক্রিন চালু করার অনুমতি দিন"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"অ্যাপকে স্ক্রিন চালু করার অনুমতি দিন। অনুমতি দেওয়া হলে, অ্যাপ আপনার এক্সপ্লিসিট ইনটেন্ট ছাড়াই যেকোনও সময় স্ক্রিন চালু করতে পারবে।"</string>
<string name="special_access" msgid="21806055758289916">"অ্যাপের বিশেষ অ্যাক্সেস"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"অডিও"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"ডেটা সেভার"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"কম মোবাইল ডেটা ব্যবহার করতে অটোমেটিক ভিডিও কোয়ালিটি অ্যাডজাস্ট করুন"</string>
<string name="title_data_alert" msgid="8262081890052682475">"ডেটার ব্যবহার এবং সতর্কতা"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"ওয়াই-ফাই, ইথারনেট বা আপনার ফোনের হটস্পট ব্যবহার করে আপনি ইন্টারনেটে কানেক্ট করতে পারেন। আরও সহায়তার জন্য, "<b>"g.co/network"</b>" লিঙ্কে যান।"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"ওয়াই-ফাই, ইথারনেট বা আপনার ফোনের হটস্পট ব্যবহার করে আপনি ইন্টারনেটে কানেক্ট করতে পারেন।"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"কাজটি অনুমোদিত নয়"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"ভলিউম পরিবর্তন করা যাবে না"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"পাওয়ার ও এনার্জি"</string>
<string name="power_on_behavior" msgid="927607372303160716">"চালু হওয়ার সময় যা যা হবে"</string>
<string name="reset_options_title" msgid="7632580482285108955">"রিসেট করুন"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"ইথারনেট পেয়ারিং কোড"</string>
</resources>
diff --git a/Settings/res/values-bs/strings.xml b/Settings/res/values-bs/strings.xml
index 6b1fe26..4ce1ecf 100644
--- a/Settings/res/values-bs/strings.xml
+++ b/Settings/res/values-bs/strings.xml
@@ -45,23 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Dodavanje računa"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Računi i prijava"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Nema računa"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> račun</item>
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> računa</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> računa</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# račun}one{# račun}few{# računa}other{# računa}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Medijske usluge, Asistent, Plaćanja"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Mreža i internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Zvuk"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplikacije"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Postavke uređaja"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Daljinski upravljači i dodaci"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Nema povezanih Bluetooth uređaja"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> periferni uređaj</item>
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> periferna uređaja</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> perifernih uređaja</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Ekran i zvuk"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Pomoć i povratne informacije"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privatnost"</string>
@@ -120,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Vraćanje na fabričke postavke"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibracija"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Ušteda energije"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Uređaji"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Odabir formata"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Okružujući zvuk"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -187,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"OMOGUĆENI FORMATI"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ONEMOGUĆENI FORMATI"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Da onemogućite, promijenite odabir formata na Ručno."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Rezolucija"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatski"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Rezolucija je promijenjena"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Odaberite Uredu da ubuduće koristite %1$s."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Otkaži"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Uredu"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Želite li obrisati keširane podatke?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Ovim će se obrisati keširani podaci za sve aplikacije."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Dodaj periferni uređaj"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Uparivanje…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Povezivanje…"</string>
@@ -226,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Periferni uređaji"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Daljinski upravljač"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Postavke daljinskog upravljača"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Postavite dugmad daljinskog upravljača"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Kontrolirajte jačinu zvuka, uključivanje, ulaz na TV-ima, prijemnicima i soundbar zvučnicima"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Poveži"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Povezivanje s uređajem %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Prekini vezu"</string>
@@ -264,11 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Nije dostupno"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Aplikacije administratora uređaja"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Nema aktivnih aplikacija"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> aktivna aplikacija</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aktivne aplikacije</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktivnih aplikacija</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Onemogućio administrator, pravila šifriranja ili pohrana akreditiva"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Podaci o upravljanom uređaju"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Promjene i postavke kojima upravlja vaša organizacija"</string>
@@ -286,20 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Nema"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Aplikacije su instalirane"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Broj aplikacija je samo procjena. Možda nisu obuhvaćene aplikacije koje su instalirane izvan Play trgovine."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="one">Minimalno <xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- <item quantity="few">Minimalno <xliff:g id="COUNT_1">%d</xliff:g> aplikacije</item>
- <item quantity="other">Minimalno <xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Najmanje # aplikacija}one{Najmanje # aplikacija}few{Najmanje # aplikacije}other{Najmanje # aplikacija}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Odobrenja za lokacije"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Odobrenja za mikrofon"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Odobrenja za kameru"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Zadane aplikacije"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aplikacije</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplikacija}one{# aplikacija}few{# aplikacije}other{# aplikacija}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Zadana tastatura"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Postavljeno kao <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Uključen je uvijek aktivni VPN"</string>
@@ -309,42 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Pouzdani akreditivi"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Pouzdani akreditivi na vašem ličnom profilu"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Pouzdani akreditivi na vašem radnom profilu"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Minimalno <xliff:g id="COUNT_1">%d</xliff:g> CA certifikat</item>
- <item quantity="few">Minimalno <xliff:g id="COUNT_1">%d</xliff:g> CA certifikata</item>
- <item quantity="other">Minimalno <xliff:g id="COUNT_1">%d</xliff:g> CA certifikata</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA certifikat}one{# CA certifikat}few{# CA certifikata}other{# CA certifikata}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administrator može zaključati uređaj i postaviti novu lozinku"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administrator može izbrisati sve podatke iz uređaja"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Neuspjeli pokušaji upisivanja lozinke prije brisanja svih podataka na uređaju"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Neuspjeli pokušaji upisivanja lozinke prije brisanja svih podataka radnog profila"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> pokušaj</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> pokušaja</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> pokušaja</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# pokušaj}one{# pokušaj}few{# pokušaja}other{# pokušaja}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Ovim uređajem upravlja vaša organizacija."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Ovim uređajem upravlja <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Saznajte više"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Aplikacije za kameru</item>
- <item quantity="few">Aplikacije za kameru</item>
- <item quantity="other">Aplikacije za kameru</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Aplikacija za kameru}one{Aplikacije za kameru}few{Aplikacije za kameru}other{Aplikacije za kameru}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Aplikacija za kalendar"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplikacija za kontakte"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Aplikacije klijenta za e-poštu</item>
- <item quantity="few">Aplikacije klijenta za e-poštu</item>
- <item quantity="other">Aplikacije klijenta za e-poštu</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Aplikacija klijenta za e-poštu}one{Aplikacije klijenta za e-poštu}few{Aplikacije klijenta za e-poštu}other{Aplikacije klijenta za e-poštu}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Aplikacija za mape"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Aplikacije za telefon</item>
- <item quantity="few">Aplikacije za telefon</item>
- <item quantity="other">Aplikacije za telefon</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Aplikacija za telefon}one{Aplikacije za telefon}few{Aplikacije za telefon}other{Aplikacije za telefon}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Aplikacija preglednika"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -363,11 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Verzija OS-a za Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Serijski broj"</string>
<string name="about_build" msgid="8467840394761634575">"Verzija OS-a za Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="one">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> korak vam treba da postanete programer</item>
- <item quantity="few">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka vam trebaju da postanete programer</item>
- <item quantity="other">Još <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> koraka vam treba da postanete programer</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Oglasi"</string>
<string name="ads_description" msgid="8081069475265061074">"Upravljajte postavkama oglasa, npr. poništite ID za oglašavanje."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Oglasi, Upravljajte postavkama oglasa, kao što je poništavanje ID-a za oglašavanje."</string>
@@ -381,27 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Dodatna ažuriranja sistema"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Mreža može biti nadzirana"</string>
<string name="done_button" msgid="616159688526431451">"Gotovo"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Označite certifikate kao pouzdane ili ih uklonite</item>
- <item quantity="few">Označite certifikate kao pouzdane ili ih uklonite</item>
- <item quantity="other">Označite certifikate kao pouzdane ili ih uklonite</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je instalirala CA certifikate na vaš uređaj, koji joj mogu omogućiti da prati aktivnosti na mreži uređaja, uključujući e-poštu, aplikacije i sigurne web lokacije.\n\nViše informacija o ovim certifikatima potražite od administratora.</item>
- <item quantity="few">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je instalirala CA certifikate na vaš uređaj, koji joj mogu omogućiti da prati aktivnosti na mreži uređaja, uključujući e-poštu, aplikacije i sigurne web lokacije.\n\nViše informacija o ovim certifikatima potražite od administratora.</item>
- <item quantity="other">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je instalirala CA certifikate na vaš uređaj, koji joj mogu omogućiti da prati aktivnosti na mreži uređaja, uključujući e-poštu, aplikacije i sigurne web lokacije.\n\nViše informacija o ovim certifikatima potražite od administratora.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je instalirala CA certifikate za vaš radni profil, koji joj mogu omogućiti da prati aktivnosti na poslovnoj mreži, uključujući e-poštu, aplikacije i sigurne web lokacije.\n\nViše informacija o ovim certifikatima potražite od administratora.</item>
- <item quantity="few">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je instalirala CA certifikate za vaš radni profil, koji joj mogu omogućiti da prati aktivnosti na poslovnoj mreži, uključujući e-poštu, aplikacije i sigurne web lokacije.\n\nViše informacija o ovim certifikatima potražite od administratora.</item>
- <item quantity="other">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je instalirala CA certifikate za vaš radni profil, koji joj mogu omogućiti da prati aktivnosti na poslovnoj mreži, uključujući e-poštu, aplikacije i sigurne web lokacije.\n\nViše informacija o ovim certifikatima potražite od administratora.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Treća strana je u stanju da prati vaše mrežne aktivnosti, uključujući e-poruke, aplikacije i sigurne web lokacije. \n\nPouzdani akreditiv instaliran na vašem uređaju to omogućava."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Provjerite certifikate</item>
- <item quantity="few">Provjerite certifikate</item>
- <item quantity="other">Provjerite certifikate</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Označite certifikat kao pouzdan ili ga uklonite}one{Označite certifikate kao pouzdane ili ih uklonite}few{Označite certifikate kao pouzdane ili ih uklonite}other{Označite certifikate kao pouzdane ili ih uklonite}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Mreža, serijski brojevi i druge informacije"</string>
<string name="manual" msgid="5683935624321864999">"Priručnik"</string>
@@ -493,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Povežite se"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Zaboravi mrežu"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Ovim se brišu informacije koje su korištene za povezivanje na ovu mrežu, uključujući i sačuvanu lozinku."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Pridružite se WiFi mreži skreniranjem QR koda s mobitela i slijedite uputstva."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Pridružite se WiFi mreži skeniranjem QR koda s mobilnog telefona i slijedite upute.\n \n Na "<b>"Android telefonu"</b>" idite u Postavke -> Mreža i internet -> WiFi -> Odaberi WiFi -> Napredno -> Dodaj uređaj, a zatim skenirajte QR kôd."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Pritisnite dugme za nazad da otkažete"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Uredu"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Nastavi"</string>
@@ -562,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Pohrana uređaja"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Uklonjiva pohrana"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Vraćanje na zadano"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Oslobodite prostor u pohrani"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Obrišite podatke iz keš memorije"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Oslobodite <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Briše privremene fajlove koji zauzimaju prostor. Neće uticati na sačuvane podatke kao što su postavke aplikacija ili offline videozapisi. Nećete se morati ni ponovo prijaviti u aplikacije."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Obrisati podatke iz keš memorije?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Ovim se brišu podaci iz keš memorije za sve aplik."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Deinstalirajte aplikacije"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Uređaj <xliff:g id="NAME">%1$s</xliff:g> je aktiviran"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Nije uspjelo aktiviranje uređaja <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB pohrana je ponovo povezana"</string>
@@ -639,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Pristup mikrofonu"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Pristup aplikacije mikrofonu"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Pristup mikrofonu je blokiran"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Da ga deblokirate, pomjerite prekidač za privatnost na uređaju u položaj za uključen mikrofon da dozvolite pristup mikrofonu."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Pristup kameri"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Pristup aplikacije kameri"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Pristup kameri je blokiran"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Da ga deblokirate, pomjerite prekidač za privatnost na uređaju u položaj za uključenu kameru da dozvolite pristup kameri."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Pristup mikrofonu: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Kada je uključeno, sve aplikacije i usluge koje imaju odobrenje mogu pristupiti bilo kojem mikrofonu na ovom uređaju.\n\nOva postavka neće uticati na periferne uređaje kamere s prilagođenim protokolom."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Pristup kameri: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -713,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cijan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Žuta"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Zvučni opis"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Slušajte opis dešavanja na ekranu u podržanim filmovima i serijama"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Omogući"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfiguracija"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Koristiti uslugu <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -733,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Praćenje"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplikacije"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Ostani aktivan"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Ekran nikada neće biti u stanju mirovanja"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP provjeravanje"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimizacija"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Ponovo pokrenuti sada?"</string>
@@ -853,21 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Isključivanje HDMI uređaja pomoću TV-a"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Automatsko uključivanje TV-a"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Uključi TV s HDMI uređajem"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">povezani ulaz</item>
- <item quantity="few">povezana ulaza</item>
- <item quantity="other">povezanih ulaza</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">ulaz u stanju mirovanja</item>
- <item quantity="few">ulaza u stanju mirovanja</item>
- <item quantity="other">ulaza u stanju mirovanja</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">ulaz koji nije povezan</item>
- <item quantity="few">ulaza koja nisu povezana</item>
- <item quantity="other">ulaza koji nisu povezani</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Povezani ulaz}one{Povezani ulazi}few{Povezani ulazi}other{Povezani ulazi}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Unos za stanje mirovanja}one{Unosi za stanje mirovanja}few{Unosi za stanje mirovanja}other{Unosi za stanje mirovanja}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Ulaz koji nije povezan}one{Ulazi koji nisu povezani}few{Ulazi koji nisu povezani}other{Ulazi koji nisu povezani}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Ograničite pristup aplikacijama i drugom sadržaju na svom računu"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Ograničeni profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Kontrolira aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -881,11 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Kreiraj ograničeni profil"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Postavke"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Dozvoljene aplikacije"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d aplikacija je odobrena</item>
- <item quantity="few">%d aplikacije su odobrene</item>
- <item quantity="other">%d aplikacija je odobreno</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Dozvoljeno"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Nije dozvoljeno"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Prilagodi ograničenja"</string>
@@ -930,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Izvor treće strane"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Odobrenja"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplikacija nije dostupna"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Nekorištene aplikacije"</string>
<string name="settings_ok" msgid="5950888975075541964">"UREDU"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Potvrdi"</string>
<string name="settings_cancel" msgid="576094334743686152">"Otkaži"</string>
@@ -1013,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Ovo odobrenje omogućava aplikaciji da izmijeni postavke sistema."</string>
<string name="write_settings_on" msgid="71675710746513956">"Da"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Ne"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Pristup svim fajlovima"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Dozvoli pristup za upravljanje svim fajlovima"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Dozvolite ovoj aplikaciji da čita, mijenja i briše sve fajlove na ovom uređaju ili svim povezanim uređajima za pohranu. Ako to dozvolite, aplikacija može pristupati fajlovima bez vašeg znanja."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Slika u slici"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Dozvoli način rada slike u slici"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Nijedna instalirana aplikacija ne podržava način rada slike u slici"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Dozvolite aplikacijama da kreiraju prozor u načinu rada Slika u slici dok je aplikacija otvorena ili nakon što je napustite (npr. da nastavite gledati videozapis). Ovaj prozor se prikazuje preko drugih aplikacija koje koristite."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Dozvolite aplikacijama da postavljaju alarme i zakazuju vremenski osjetljive radnje. Ovim će se omogućiti aplikacijama da rade u pozadini, čime se može povećati potrošnja energije.\n\nAko je ovo odobrenje isključeno, postojeći alarmi i događaji zasnovani na vremenu koje je aplikacija zakazala neće funkcionirati."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Uključivanje ekrana"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Dozvolite uključivanje ekrana"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Dozvolite aplikaciji da uključi ekran. Ako se odobri, aplikacija može uključiti ekran bilo kada bez vaše izričite namjere."</string>
<string name="special_access" msgid="21806055758289916">"Poseban pristup za aplikacije"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Zvučni zapis"</string>
@@ -1034,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Ušteda podataka"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Automatski podesite kvalitet videozapisa radi uštede mobilnih podataka"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Prijenos podataka i obavještenja"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Možete se povezati s internetom pomoću WiFi mreže, Etherneta ili pristupne tačke telefona. Da dobijete dodatnu pomoć posjetite "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Možete se povezati s internetom pomoću WiFi mreže, Etherneta ili pristupne tačke telefona."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Radnja nije dozvoljena"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Nije moguće promijeniti jačinu zvuka"</string>
@@ -1084,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Napajanje i energija"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Ponašanje prilikom uključivanja"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Vraćanje na zadano"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Kôd za uparivanje za Ethernet"</string>
</resources>
diff --git a/Settings/res/values-ca/strings.xml b/Settings/res/values-ca/strings.xml
index 37ee3ea..5e8f540 100644
--- a/Settings/res/values-ca/strings.xml
+++ b/Settings/res/values-ca/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Afegeix un compte"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Comptes i inici de sessió"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"No hi ha cap compte"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> comptes</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> compte</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# compte}other{# comptes}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Serveis multimèdia, Assistent, Pagaments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Xarxa i Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"So"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplicacions"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Preferències del dispositiu"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Comandaments i accessoris"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"No hi ha cap dispositiu Bluetooth connectat"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accessoris</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> accessori</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Pantalla i so"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Ajuda i suggeriments"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privadesa"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Restabliment de les dades de fàbrica"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibratge"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Estalvi d\'energia"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Dispositius"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Selecciona els formats"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"So envoltant"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMATS ACTIVATS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMATS DESACTIVATS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Per desactivar-lo, canvia la selecció de format a Manual."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolució"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automàtica"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"S\'ha canviat la resolució"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Selecciona D\'acord per utilitzar %1$s a partir d\'ara."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Cancel·la"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"D\'acord"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Vols esborrar dades emmagatzem. a memòria cau?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"S\'esborraran dades aplicacions a la memòria cau."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Afegeix un accessori"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"S\'està emparellant..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"S\'està connectant…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accessoris"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Comandament"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Configuració del comandament"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Configura els botons del comandament"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Controla el volum, l\'engegada i l\'entrada de televisors, receptors i barres de so"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Connecta"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Connecta\'t a %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Desconnecta"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"No disponible"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Aplicacions d\'administració del dispositiu"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"No hi ha aplicacions actives"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplicacions actives</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplicació activa</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Desact. per l\'admin., política d\'encrip. o emmagat. creden."</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informació del dispositiu gestionat"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"La teva organització gestiona els canvis i la configuració"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Cap"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Aplicacions instal·lades"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"El nombre d\'aplicacions és aproximat. És possible que no inclogui les aplicacions instal·lades que no provenen de Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplicacions com a mínim</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplicació com a mínim</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{# aplicació com a mínim}other{# aplicacions com a mínim}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Permisos d\'ubicació"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Permisos d\'accés al micròfon"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Permisos d\'accés a la càmera"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Aplicacions predeterminades"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplicacions</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplicació</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplicació}other{# aplicacions}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Teclat predeterminat"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Mètode definit: <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"S\'ha activat l\'opció VPN sempre activada"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Certificats de confiança"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Certificats de confiança al teu perfil personal"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Certificats de confiança al teu perfil de treball"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> certificats de CA com a mínim</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> certificat de CA com a mínim</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certificat de CA}other{# certificats de CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"L\'administrador pot bloquejar el dispositiu i restablir-ne la contrasenya"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"L\'administrador pot suprimir totes les dades del dispositiu"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Intents fallits d\'introduir la contrasenya abans que se suprimeixin totes les dades del dispositiu"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Intents fallits d\'introduir la contrasenya abans que se suprimeixin les dades del perfil de treball"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> intents</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> intent</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# intent}other{# intents}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"La teva organització gestiona aquest dispositiu."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> gestiona aquest dispositiu."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Més informació"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Aplicacions de càmera</item>
- <item quantity="one">Aplicació de càmera</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Aplicació de càmera}other{Aplicacions de càmera}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Aplicació de calendari"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplicació de contactes"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Apps client de correu electrònic</item>
- <item quantity="one">App client de correu electrònic</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Aplicació client de correu electrònic}other{Aplicacions client de correu electrònic}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Aplicació de mapes"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Aplicacions de telèfon</item>
- <item quantity="one">Aplicació de telèfon</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Aplicació de telèfon}other{Aplicacions de telèfon}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Aplicació de navegador"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Versió del sistema operatiu d\'Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Número de sèrie"</string>
<string name="about_build" msgid="8467840394761634575">"Compilació del sistema operatiu d\'Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">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">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="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Anuncis"</string>
<string name="ads_description" msgid="8081069475265061074">"Gestiona la configuració d\'anuncis; restableix id. de publicitat."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Google Ads, Gestiona la configuració d\'anuncis; per exemple, restableix l\'identificador de publicitat."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Actualitzac. addicionals"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"És possible que la xarxa estigui supervisada"</string>
<string name="done_button" msgid="616159688526431451">"Fet"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Confia en els certificats o suprimeix-los</item>
- <item quantity="one">Confia en el certificat o suprimeix-lo</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ha instal·lat unes autoritats de certificació al teu dispositiu, de manera que podran supervisar l\'activitat a la xarxa del teu dispositiu, com ara els correus electrònics, les aplicacions i els llocs web segurs.\n\nPer obtenir més informació sobre aquests certificats, contacta amb el teu administrador.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ha instal·lat una autoritat de certificació al teu dispositiu, de manera que podrà supervisar l\'activitat a la xarxa del teu dispositiu, com ara els correus electrònics, les aplicacions i els llocs web segurs.\n\nPer obtenir més informació sobre aquest certificat, contacta amb el teu administrador.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ha instal·lat unes autoritats de certificació per al teu perfil de treball, de manera que podran supervisar la teva activitat a la xarxa del perfil de treball, com ara els correus electrònics, les aplicacions i els llocs web segurs.\n\nPer obtenir més informació sobre aquests certificats, contacta amb el teu administrador.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ha instal·lat una autoritat de certificació per al teu perfil de treball, de manera que podrà supervisar la teva activitat a la xarxa del perfil de treball, com ara els correus electrònics, les aplicacions i els llocs web segurs.\n\nPer obtenir més informació sobre aquest certificat, contacta amb el teu administrador.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Un tercer pot supervisar la teva activitat de xarxa, inclosos els correus electrònics, les aplicacions i els llocs web segurs.\n\nHi ha una credencial de confiança instal·lada al teu dispositiu que ho fa possible."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Comprova els certificats</item>
- <item quantity="one">Comprova el certificat</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Confia en el certificat o suprimeix-lo}other{Confia en els certificats o suprimeix-los}}"</string>
<string name="device_status" msgid="8266002761193692207">"Estat"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Xarxa, números de sèrie i altres dades"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Connecta"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Oblida la xarxa"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"S\'esborra la informació utilitzada per connectar-se a la xarxa, així com les contrasenyes desades."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Escaneja el codi QR al teu telèfon mòbil i segueix les instruccions per unir-te a Wifi."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Uneix-te a una xarxa Wi‑Fi escanejant el codi QR des d\'un telèfon mòbil i seguint les instruccions.\n \n En un "<b>"telèfon Android"</b>", ves a Configuració -> Xarxa i Internet -> Wi‑Fi -> selecciona una xarxa Wi‑Fi -> Configuració avançada -> afegeix un dispositiu i escaneja el codi QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Prem el botó Enrere per cancel·lar"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"D\'acord"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continua"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Emmagatzematge del dispositiu"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Emmagatzematge extraïble"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Restablir"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Allibera emmagatzematge"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Esborra les dades desades a la memòria cau"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Allibera <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"S\'esborraran els fitxers temporals que ocupen espai. Les dades desades com ara les preferències de les aplicacions o els vídeos sense connexió no es veuran afectades, i no caldrà que iniciïs la sessió a les aplicacions una altra vegada."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Vols esborrar les dades desades a la memòria cau?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"S\'esborraran les dades per a totes les aplicacions."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Desinstal·la aplicacions"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"S\'ha activat <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"No s\'ha pogut activar <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"L\'emmagatzematge USB s\'ha tornat a connectar"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Micròfon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Accés al micròfon"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Accés de les aplicacions al micròfon"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Accés al micròfon bloquejat"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Per desbloquejar-lo, mou l\'interruptor de privadesa del dispositiu a la posició Micròfon activat per permetre l\'accés al micròfon."</string>
<string name="camera" msgid="1226671478936288283">"Càmera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Accés a la càmera"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Accés de les aplicacions a la càmera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Accés a la càmera bloquejat"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Per desbloquejar-lo, mou l\'interruptor de privadesa del dispositiu a la posició Càmera activada per permetre l\'accés a la càmera."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Accés al micròfon: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Quan s\'activa, tots els serveis i aplicacions amb permís poden accedir a qualsevol micròfon d\'aquest dispositiu.\n\nAquesta opció de configuració no afectarà els perifèrics d\'àudio que disposin d\'un protocol personalitzat."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Accés a la càmera: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cian"</string>
<string name="color_yellow" msgid="3519470952904560404">"Groc"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audiodescripció"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Escolta una descripció del que passa a la pantalla en pel·licules i sèries compatibles"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Activa"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuració"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Vols fer servir <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Supervisió"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplicacions"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Pantalla activa"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"La pantalla no s\'apagarà mai"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Comprovació d\'HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Optimització d\'HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Vols reiniciar ara el dispositiu?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Desconnecta els dispositius HDMI amb el televisor."</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Activa la connexió automàtica"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Connecta el televisor amb el dispositiu HDMI."</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Entrades connectades</item>
- <item quantity="one">Entrada connectada</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Entrades en espera</item>
- <item quantity="one">Entrada en espera</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Entrades no connectades</item>
- <item quantity="one">Entrada no connectada</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Entrada connectada}other{Entrades connectades}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Entrada en espera}other{Entrades en espera}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Entrada no connectada}other{Entrades no connectades}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Restringeix l\'accés a les aplicacions i a altres tipus de contingut del teu compte."</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Perfil restringit"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controlades per <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Crea un perfil restringit"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Configuració"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Aplicacions permeses"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d 1 aplicacions permeses</item>
- <item quantity="one">1 aplicació permesa</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Permès"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"No es permet"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Personalitza les restriccions"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Font de tercers"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Permisos"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"L\'aplicació no està disponible"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Aplicacions no utilitzades"</string>
<string name="settings_ok" msgid="5950888975075541964">"D\'acord"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirma"</string>
<string name="settings_cancel" msgid="576094334743686152">"Cancel·la"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Aquest permís permet que una aplicació modifiqui la configuració del sistema."</string>
<string name="write_settings_on" msgid="71675710746513956">"Sí"</string>
<string name="write_settings_off" msgid="6730113471695092167">"No"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Accés a tots els fitxers"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Permet l\'accés per gestionar tots els fitxers"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Permet que aquesta aplicació llegeixi, modifiqui i suprimeixi tots els fitxers d\'aquest dispositiu o de qualsevol volum d\'emmagatzematge connectat. L\'aplicació podrà accedir als fitxers sense el teu coneixement explícit."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Pantalla en pantalla"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Permet Pantalla en pantalla"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Cap de les aplicacions instal·lades no admet pantalla en pantalla"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Permet que les aplicacions creïn una finestra de pantalla en pantalla mentre estan obertes o després de sortir-ne (per exemple, per seguir veient un vídeo). Aquesta finestra es mostra sobre altres aplicacions que estàs utilitzant."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Permet que les aplicacions configurin alarmes i programin accions urgents. Això permet a les aplicacions executar-se en segon pla i, per tant, és possible que es consumeixi més bateria.\n\nSi aquest permís està desactivat, les alarmes i els esdeveniments urgents que ja hagin programat les aplicacions no funcionaran."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Activa la pantalla"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Permet que activi la pantalla"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Permet que una aplicació activi la pantalla. Si concedeixes aquest permís, pot ser que l\'aplicació activi la pantalla en qualsevol moment sense la teva intenció explícita."</string>
<string name="special_access" msgid="21806055758289916">"Accés especial d\'aplicacions"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Àudio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Economitzador de dades"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Ajusta la qualitat del vídeo automàticament per utilitzar menys dades mòbils"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Alertes i ús de dades"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Pots connectar-te a Internet per Wi‑Fi, Ethernet o mitjançant el punt d\'accés Wi‑Fi del teu telèfon. Per obtenir més ajuda, visita "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Pots connectar-te a Internet per Wi‑Fi, Ethernet o mitjançant el punt d\'accés Wi‑Fi del teu telèfon."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Acció no permesa"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"No es pot canviar el volum"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Potència i energia"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Activa el comportament"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Restableix"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Codi de sincronització d\'Ethernet"</string>
</resources>
diff --git a/Settings/res/values-cs/strings.xml b/Settings/res/values-cs/strings.xml
index 2957849..d041e32 100644
--- a/Settings/res/values-cs/strings.xml
+++ b/Settings/res/values-cs/strings.xml
@@ -45,25 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Přidání účtu"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Účty a přihlašování"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Žádné účty"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> účty</item>
- <item quantity="many"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> účtu</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> účtů</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> účet</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# účet}few{# účty}many{# účtu}other{# účtů}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Mediální služby, Asistent, platby"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Síť a internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Zvuk"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplikace"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Předvolby zařízení"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Dálkové ovládání a příslušenství"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Žádná připojená zařízení Bluetooth"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> příslušenství</item>
- <item quantity="many"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> příslušenství</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> příslušenství</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> příslušenství</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Obraz a zvuk"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Nápověda a zpětná vazba"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Ochrana soukromí"</string>
@@ -122,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Obnovení továrních dat"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrace"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Spořič energie"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Zařízení"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Vybrat formáty"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Prostorový zvuk"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -189,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"AKTIVOVANÉ FORMÁTY"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"DEAKTIVOVANÉ FORMÁTY"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Pokud chcete deaktivovat, změňte výběr formátu na ruční."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Rozlišení"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automaticky"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Rozlišení bylo změněno"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Pokud chcete od teď používat rozlišení %1$s, vyberte OK"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Zrušit"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Vymazat data uložená v mezipaměti?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Tímto vymažete z mezipaměti data všech aplikací."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Přidat příslušenství"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Párování..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Připojování…"</string>
@@ -228,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Příslušenství"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Dálkové ovládání"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Nastavení dálkového ovládání"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Nastavení vzdálených tlačítek"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Ovládání hlasitosti, vstupu a napájení televizorů, přijímačů a soundbarů"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Připojit"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Připojit k zařízení %s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Odpojit"</string>
@@ -266,12 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Nedostupné"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Aplikace pro správu zařízení"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Žádné aktivní aplikace"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aktivní aplikace</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> aktivní aplikace</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktivních aplikací</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aktivní aplikace</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Zakázáno administrátorem, zásadami šifrování nebo úložištěm pověření"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informace o spravovaném zařízení"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Změny a nastavení spravuje organizace"</string>
@@ -289,22 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Žádné"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Nainstalované aplikace"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Počet aplikací je odhad. Nemusí zahrnovat aplikace nainstalované mimo Obchod Play."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="few">Minimálně <xliff:g id="COUNT_1">%d</xliff:g> aplikace</item>
- <item quantity="many">Minimálně <xliff:g id="COUNT_1">%d</xliff:g> aplikace</item>
- <item quantity="other">Minimálně <xliff:g id="COUNT_1">%d</xliff:g> aplikací</item>
- <item quantity="one">Minimálně <xliff:g id="COUNT_0">%d</xliff:g> aplikace</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimálně # aplikace}few{Minimálně # aplikace}many{Minimálně # aplikace}other{Minimálně # aplikací}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Oprávnění přístupu k poloze"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Oprávnění přístupu k mikrofonu"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Oprávnění přístupu k fotoaparátu"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Výchozí aplikace"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aplikace</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> aplikace</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikací</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplikace</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplikace}few{# aplikace}many{# aplikace}other{# aplikací}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Výchozí klávesnice"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Nastaveno na <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Trvalá síť VPN je zapnutá"</string>
@@ -314,47 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Důvěryhodné identifikační údaje"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Důvěryhodné identifikační údaje ve vašem osobním profilu"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Důvěryhodné identifikační údaje ve vašem pracovním profilu"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="few">Minimálně <xliff:g id="COUNT_1">%d</xliff:g> certifikáty CA</item>
- <item quantity="many">Minimálně <xliff:g id="COUNT_1">%d</xliff:g> certifikátu CA</item>
- <item quantity="other">Minimálně <xliff:g id="COUNT_1">%d</xliff:g> certifikátů CA</item>
- <item quantity="one">Minimálně <xliff:g id="COUNT_0">%d</xliff:g> certifikát CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certifikát CA}few{# certifikáty CA}many{# certifikátu CA}other{# certifikátů CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administrátor může zařízení uzamknout a resetovat heslo"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administrátor může smazat všechna data v zařízení"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Nezdařené pokusy o zadání hesla před smazáním veškerých dat v zařízení"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Nezdařené pokusy o zadání hesla před smazáním dat z pracovního profilu"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> pokusy</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> pokusu</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> pokusů</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> pokus</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# pokus}few{# pokusy}many{# pokusu}other{# pokusů}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Toto zařízení spravuje vaše organizace."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Toto zařízení je spravováno organizací <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Další informace"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="few">Aplikace k focení a natáčení</item>
- <item quantity="many">Aplikace k focení a natáčení</item>
- <item quantity="other">Aplikace k focení a natáčení</item>
- <item quantity="one">Aplikace k focení a natáčení</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Aplikace k focení a natáčení}few{Aplikace k focení a natáčení}many{Aplikace k focení a natáčení}other{Aplikace k focení a natáčení}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Kalendářová aplikace"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplikace pro kontakty"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="few">Aplikace pro práci s e‑maily</item>
- <item quantity="many">Aplikace pro práci s e‑maily</item>
- <item quantity="other">Aplikace pro práci s e‑maily</item>
- <item quantity="one">Aplikace pro práci s e‑maily</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Aplikace pro práci s e‑maily}few{Aplikace pro práci s e‑maily}many{Aplikace pro práci s e‑maily}other{Aplikace pro práci s e‑maily}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Mapová aplikace"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="few">Aplikace k telefonování</item>
- <item quantity="many">Aplikace k telefonování</item>
- <item quantity="other">Aplikace k telefonování</item>
- <item quantity="one">Aplikace k telefonování</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Aplikace k telefonování}few{Aplikace k telefonování}many{Aplikace k telefonování}other{Aplikace k telefonování}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Prohlížeč"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -373,12 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Verze operačního systému Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Sériové číslo"</string>
<string name="about_build" msgid="8467840394761634575">"Sestavení operačního systému Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="few">Ještě <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kroky a budou z vás vývojáři</item>
- <item quantity="many">Ještě <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kroku a budou z vás vývojáři</item>
- <item quantity="other">Ještě <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kroků a budou z vás vývojáři</item>
- <item quantity="one">Ještě <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> krok a budou z vás vývojáři</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Ještě # krok a bude z vás vývojář.}few{Ještě # kroky a bude z vás vývojář.}many{Ještě # kroku a bude z vás vývojář.}other{Ještě # kroků a bude z vás vývojář.}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Reklamy"</string>
<string name="ads_description" msgid="8081069475265061074">"Spravujte nastavení reklam (např. inzertní ID)."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Reklamy: Spravujte nastavení reklam (např. inzertní ID)."</string>
@@ -392,31 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Další aktualizace systému"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Síť může být monitorována"</string>
<string name="done_button" msgid="616159688526431451">"Hotovo"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="few">Označit certifikáty jako důvěryhodné nebo je odstranit</item>
- <item quantity="many">Označit certifikáty jako důvěryhodné nebo je odstranit</item>
- <item quantity="other">Označit certifikáty jako důvěryhodné nebo je odstranit</item>
- <item quantity="one">Označit certifikát jako důvěryhodný nebo jej odstranit</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="few">Administrátor domény <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> do vašeho zařízení nainstaloval certifikační autority, které mu mohou umožňovat sledovat aktivitu zařízení v síti, včetně e‑mailů, aplikací a zabezpečených webů.\n\nDalší informace o těchto certifikátech vám sdělí váš administrátor.</item>
- <item quantity="many">Administrátor domény <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> do vašeho zařízení nainstaloval certifikační autority, které mu mohou umožňovat sledovat aktivitu zařízení v síti, včetně e‑mailů, aplikací a zabezpečených webů.\n\nDalší informace o těchto certifikátech vám sdělí váš administrátor.</item>
- <item quantity="other">Administrátor domény <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> do vašeho zařízení nainstaloval certifikační autority, které mu mohou umožňovat sledovat aktivitu zařízení v síti, včetně e‑mailů, aplikací a zabezpečených webů.\n\nDalší informace o těchto certifikátech vám sdělí váš administrátor.</item>
- <item quantity="one">Administrátor domény <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> do vašeho zařízení nainstaloval certifikační autoritu, která mu může umožňovat sledovat aktivitu zařízení v síti, včetně e‑mailů, aplikací a zabezpečených webů.\n\nDalší informace o tomto certifikátu vám sdělí váš administrátor.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="few">Administrátor domény <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> pro váš pracovní profil nainstaloval certifikační autority, které mu mohou umožňovat sledovat aktivitu v pracovní síti, včetně e‑mailů, aplikací a zabezpečených webů.\n\nDalší informace o těchto certifikátech vám sdělí váš administrátor.</item>
- <item quantity="many">Administrátor domény <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> pro váš pracovní profil nainstaloval certifikační autority, které mu mohou umožňovat sledovat aktivitu v pracovní síti, včetně e‑mailů, aplikací a zabezpečených webů.\n\nDalší informace o těchto certifikátech vám sdělí váš administrátor.</item>
- <item quantity="other">Administrátor domény <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> pro váš pracovní profil nainstaloval certifikační autority, které mu mohou umožňovat sledovat aktivitu v pracovní síti, včetně e‑mailů, aplikací a zabezpečených webů.\n\nDalší informace o těchto certifikátech vám sdělí váš administrátor.</item>
- <item quantity="one">Administrátor domény <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> pro váš pracovní profil nainstaloval certifikační autoritu, která mu může umožňovat sledovat aktivitu v pracovní síti, včetně e‑mailů, aplikací a zabezpečených webů.\n\nDalší informace o tomto certifikátu vám sdělí váš administrátor.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Vaše aktivita v síti, včetně e-mailů, aplikací a zabezpečených webových stránek může být monitorována třetí stranou.\n\nUmožňují to důvěryhodné identifikační údaje nainstalované ve vašem zařízení."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="few">Zkontrolovat certifikáty</item>
- <item quantity="many">Zkontrolovat certifikáty</item>
- <item quantity="other">Zkontrolovat certifikáty</item>
- <item quantity="one">Zkontrolovat certifikát</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Označit certifikát jako důvěryhodný nebo ho odstranit}few{Označit certifikáty jako důvěryhodné nebo je odstranit}many{Označit certifikáty jako důvěryhodné nebo je odstranit}other{Označit certifikáty jako důvěryhodné nebo je odstranit}}"</string>
<string name="device_status" msgid="8266002761193692207">"Stav"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Síť, sériová čísla a další údaje"</string>
<string name="manual" msgid="5683935624321864999">"Ručně"</string>
@@ -508,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Spojit"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Odstranit záznam sítě"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Tato akce vymaže údaje používané k připojení k této síti, včetně uloženého hesla."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Připojte se k Wi-Fi: naskenujte QR kód pomocí telefonu a postupujte podle pokynů."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Připojte se k Wi-Fi: naskenujte QR kód pomocí mobilního telefonu a postupujte podle pokynů.\n \n V "<b>"telefonu Android"</b>" přejděte do Nastavení -> Síť a internet -> Wi-Fi -> Vyberte síť Wi-Fi -> Rozšířená nastavení -> Přidat zařízení a potom naskenujte QR kód."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Akci zrušíte stisknutím tlačítka Zpět"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Pokračovat"</string>
@@ -577,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Úložiště zařízení"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Vyměnitelné úložiště"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Reset"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Uvolnění úložiště"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Vymazat data uložená v mezipaměti"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Uvolnit <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Vymaže dočasné soubory, které zabírají místo. Nebude mít vliv na uložená data, jako jsou předvolby aplikací nebo offline videa, a nebude nutné se do aplikací přihlašovat znovu."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Vymazat data uložená v mezipaměti?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Tímto vymažete z mezipaměti data všech aplikací."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Odinstalace aplikací"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Úložiště <xliff:g id="NAME">%1$s</xliff:g> je připojeno"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Připojení úložiště <xliff:g id="NAME">%1$s</xliff:g> se nezdařilo"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Úložiště USB bylo znovu připojeno"</string>
@@ -654,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Přístup k mikrofonu"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Přístup aplikací k mikrofonu"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Přístup k mikrofonu je blokován"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Pokud chcete blokování zrušit, přepněte přepínač soukromí na zařízení do pozice, která povoluje přístup k mikrofonu."</string>
<string name="camera" msgid="1226671478936288283">"Fotoaparát"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Přístup k fotoaparátu"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Přístup aplikací k fotoaparátu"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Přístup k fotoaparátu je blokován"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Pokud chcete blokování zrušit, přepněte přepínač soukromí na zařízení do pozice, která povoluje přístup k fotoaparátu."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Přístup k mikrofonu: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Když je toto nastavení zapnuté, všechny aplikace a služby s oprávněním mají přístup ke všem mikrofonům v tomto zařízení.\n\nToto nastavení nebude mít vliv na periferní zvuková zařízení s vlastním protokolem."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Přístup k fotoaparátu: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -728,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Tyrkysová"</string>
<string name="color_yellow" msgid="3519470952904560404">"Žlutá"</string>
<string name="color_magenta" msgid="2377854703399624607">"Purpurová"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Hlasový popis"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Poslouchejte popis dění na obrazovce u podporovaných filmů a pořadů"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Zapnuto"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfigurace"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Použít <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -748,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Sledování"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplikace"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Nezamykat obrazovku"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Obrazovka nikdy nepřejde do režimu spánku"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Kontrola HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Optimalizace HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Restartovat?"</string>
@@ -868,24 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Vypnutí zařízení HDMI společně s televizí"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Automatické zapínání televize"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Zapnutí televize společně se zařízením HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="few">Připojené vstupy</item>
- <item quantity="many">Připojené vstupy</item>
- <item quantity="other">Připojené vstupy</item>
- <item quantity="one">Připojený vstup</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="few">Vstupy v úsporném režimu</item>
- <item quantity="many">Vstupy v úsporném režimu</item>
- <item quantity="other">Vstupy v úsporném režimu</item>
- <item quantity="one">Vstup v úsporném režimu</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="few">Nepřipojené vstupy</item>
- <item quantity="many">Nepřipojené vstupy</item>
- <item quantity="other">Nepřipojené vstupy</item>
- <item quantity="one">Nepřipojený vstup</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Připojený vstup}few{Připojené vstupy}many{Připojené vstupy}other{Připojené vstupy}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Vstup v úsporném režimu}few{Vstupy v úsporném režimu}many{Vstupy v úsporném režimu}other{Vstupy v úsporném režimu}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Nepřipojený vstup}few{Nepřipojené vstupy}many{Nepřipojené vstupy}other{Nepřipojené vstupy}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Omezení přístupu k aplikacím a dalšímu obsahu v účtu"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Omezený profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Řízeno aplikací <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -899,12 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Vytvořit omezený profil"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Nastavení"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Povolené aplikace"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="few">%d povolené aplikace</item>
- <item quantity="many">%d povolené aplikace</item>
- <item quantity="other">%d povolených aplikací</item>
- <item quantity="one">1 povolená aplikace</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Povoleno"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Nepovoleno"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Přizpůsobit omezení"</string>
@@ -949,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Zdroj třetí strany"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Oprávnění"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplikace není k dispozici"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Nepoužívané aplikace"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Potvrdit"</string>
<string name="settings_cancel" msgid="576094334743686152">"Zrušit"</string>
@@ -1032,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Toto oprávnění umožňuje aplikaci měnit nastavení systému."</string>
<string name="write_settings_on" msgid="71675710746513956">"Ano"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Ne"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Přístup ke všem souborům"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Povolit přístup ke správě všech souborů"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Povolte aplikaci načítat, upravovat a mazat soubory v tomto zařízení a v připojených úložištích. Pokud aplikaci oprávnění udělíte, bude mít přístup k souborům i bez vašeho vědomí."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Obraz v obraze"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Povolit obraz v obraze"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Žádná nainstalovaná aplikace nepodporuje režim obraz v obraze"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Povolí aplikacím vytvořit okno v režimu obraz v obraze, když je aplikace otevřená nebo poté, co ji opustíte (například abyste mohli pokračovat ve sledování videa). Toto okno se zobrazuje nad ostatními aplikacemi, které používáte."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Povolte aplikacím nastavovat budíky a plánovat akce závislé na čase. Aplikace poběží na pozadí, což může vést k vyšší spotřebě energie.\n\nPokud je toto oprávnění vypnuté, stávající budíky a události závislé na čase naplánované aplikací nebudou fungovat."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Zapnout obrazovku"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Povolit zapínání obrazovky"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Povolte aplikaci zapínat obrazovku. Pokud aplikace bude mít toto oprávnění, může kdykoli zapnout obrazovku bez explicitního intentu."</string>
<string name="special_access" msgid="21806055758289916">"Zvláštní přístup aplikací"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Zvuk"</string>
@@ -1053,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Spořič dat"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Automaticky upravit kvalitu videa za účelem úspory mobilních dat"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Využití dat a upozornění"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"K internetu se můžete připojit přes Wi-Fi, ethernet nebo hotspot telefonu. Další informace naleznete na adrese "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"K internetu se můžete připojit přes Wi-Fi, ethernet nebo hotspot telefonu."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Akce není povolena"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Hlasitost nelze změnit"</string>
@@ -1103,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Výkon a energie"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Chování po zapnutí"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Obnovit"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Párovací kód pro ethernet"</string>
</resources>
diff --git a/Settings/res/values-da/strings.xml b/Settings/res/values-da/strings.xml
index 638f536..ed07993 100644
--- a/Settings/res/values-da/strings.xml
+++ b/Settings/res/values-da/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Tilføj en konto"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Konti og login"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Der er ingen konti"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> konto</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> konti</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# konto}one{# konto}other{# konti}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Medietjenester, assistent, betalinger"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Netværk og internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Lyd"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apps"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Enhedspræferencer"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Fjernbetjeninger og tilbehør"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Der er ingen tilsluttede Bluetooth-enheder"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> tilbehørsdel</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> tilbehørsdele</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Skærm og lyd"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Hjælp og feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privatliv"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Gendannelse af fabriksdata"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrering"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Energisparefunktion"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Enheder"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Vælg formater"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Surroundsound"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"AKTIVEREDE FORMATER"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"DEAKTIVEREDE FORMATER"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Du kan deaktivere dette ved at ændre formatvalget til Manuelt."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Opløsning"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatisk"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Opløsningen er ændret"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Vælg OK for at bruge %1$s fremover."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Annuller"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Vil du rydde cachelagrede data?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Dette vil rydde cachelagrede data for alle apps."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Tilføj tilbehør"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Parrer..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Forbinder..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Tilbehør"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Fjernbetjening"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Indstillinger for fjernbetjeningen"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Konfigurer fjernbetjeningsknapper"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Styr lydstyrke, afbryderknap og indgangskilde på fjernsyn, modtagere og soundbars"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Opret forbindelse"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Opret forbindelse til %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Afbryd"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Ikke tilgængelig"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Apps til enhedsadministration"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Ingen aktive apps"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> aktiv app</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktive apps</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Deaktiveret af administrator, krypteringspolitik eller Lager for loginoplysninger"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Oplysninger om administrerede enheder"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Ændringer og indstillinger, der administreres af din organisation"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Ingen"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Installerede apps"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Antallet af apps er et skøn. Apps, der er blevet installeret uden for Play Butik, er muligvis ikke medregnet."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="one">Mindst <xliff:g id="COUNT_1">%d</xliff:g> app</item>
- <item quantity="other">Mindst <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Mindst # app}one{Mindst # app}other{Mindst # apps}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Adgangstilladelser til lokation"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Adgangstilladelser til mikrofon"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Adgangstilladelser til kamera"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Standardapps"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> app</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}one{# app}other{# apps}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Standardtastatur"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Indstillet til <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"\"Konstant VPN\" er aktiveret"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Pålidelige loginoplysninger"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Pålidelige loginoplysninger på din personlige profil"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Pålidelige loginoplysninger på din arbejdsprofil"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Mindst <xliff:g id="COUNT_1">%d</xliff:g> CA-certifikat</item>
- <item quantity="other">Mindst <xliff:g id="COUNT_1">%d</xliff:g> CA-certifikater</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA-certifikat}one{# CA-certifikat}other{# CA-certifikater}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administratoren kan låse enheden og nulstille adgangskoden"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administratoren kan slette alle data på enheden"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Det maksimale antal mislykkede adgangskodeforsøg, inden alle data på enheden slettes"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Det maksimale antal mislykkede adgangskodeforsøg, inden data på arbejdsprofilen slettes"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> forsøg</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> forsøg</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# forsøg}one{# forsøg}other{# forsøg}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Denne enhed administreres af din organisation."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Denne enhed administreres af <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Få flere oplysninger"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Kameraapp</item>
- <item quantity="other">Kameraapps</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Kameraapp}one{Kameraapp}other{Kameraapps}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Kalenderapp"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"App til kontakter"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Mailklientapp</item>
- <item quantity="other">Mailklientapps</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Mailklientapp}one{Mailklientapp}other{Mailklientapps}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Kortapp"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Opkaldsapp</item>
- <item quantity="other">Opkaldsapps</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Opkaldsapp}one{Opkaldsapp}other{Opkaldsapps}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Browserapp"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS-version"</string>
<string name="about_serial" msgid="3432319328808745459">"Serienummer"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS-build"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Annoncer"</string>
<string name="ads_description" msgid="8081069475265061074">"Administrer annonceindstillinger, f.eks. nulstilling af annoncerings-id."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Annoncer, administrer dine annonceindstillinger, f.eks. nulstilling af dit annoncerings-id."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Flere systemopdateringer"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Netværket kan være overvåget"</string>
<string name="done_button" msgid="616159688526431451">"Luk"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Tillad eller fjern certifikat</item>
- <item quantity="other">Tillad eller fjern certifikater</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> har installeret en certifikatautoritet på din enhed, hvilket giver domænet mulighed for at overvåge netværksaktivitet på din enhed, herunder mails, apps og sikre websites.\n\nKontakt din administrator for at få flere oplysninger om dette certifikat.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> har installeret certifikatautoriteter på din enhed, hvilket giver domænet mulighed for at overvåge netværksaktivitet på din enhed, herunder mails, apps og sikre websites.\n\nKontakt din administrator for at få flere oplysninger om disse certifikater.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> har installeret en certifikatautoritet for din arbejdsprofil, hvilket giver domænet mulighed for at overvåge aktivitet på dit arbejdsnetværk, herunder mails, apps og sikre websites.\n\nKontakt din administrator for at få flere oplysninger om dette certifikat.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> har installeret certifikatautoriteter for din arbejdsprofil, hvilket giver domænet mulighed for at overvåge aktivitet på dit arbejdsnetværk, herunder mails, apps og sikre websites\n\nKontakt din administrator for at få flere oplysninger om disse certifikater.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"En tredjepart kan overvåge din netværksaktivitet, herunder e-mails, apps og sikre websites.\n\nPålidelige loginoplysninger, der er installeret på din enhed, gør dette muligt."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Tjek certifikatet</item>
- <item quantity="other">Tjek certifikaterne</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Tillad eller fjern certifikat}one{Tillad eller fjern certifikat}other{Tillad eller fjern certifikater}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Netværk, serienumre og andre oplysninger"</string>
<string name="manual" msgid="5683935624321864999">"Brugervejledning"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Tilslut"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Glem netværk"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Rydder oplysninger, som bruges til at oprette forbindelse til netværket, bl.a. eventuelle gemte adgangskoder."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Opret forbindelse til et Wi-Fi-netværk ved at scanne QR-koden på din mobiltelefon og følge vejledningen."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Opret forbindelse til et Wi-Fi-netværk ved at scanne QR-koden på en mobiltelefon og følge vejledningen.\n \n På en "<b>"Android-telefon"</b>" skal du gå til Indstillinger -> Netværk og internet -> Wi-Fi -> Vælg et Wi-Fi-netværk -> Avanceret -> Tilføj enhed, og scan derefter QR-koden."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Tryk på tilbageknappen for at annullere"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Fortsæt"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Lagerplads på enheden"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Flytbart lager"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Nulstil"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Frigør lagerplads"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Ryd cachelagrede data"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Frigør <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Dette rydder midlertidige filer, der optager plads. Denne handling påvirker ikke gemte data som f.eks. apppræferencer eller offlinevideoer, og du behøver ikke logge ind i dine apps igen."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Vil du rydde cachelagrede data?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Dette vil rydde cachelagrede data for alle apps."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Afinstaller apps"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> blev tilsluttet"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> kunne ikke tilsluttes"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB-lageret blev tilsluttet igen"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Mikrofonadgang"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Appadgang til mikrofon"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Adgang til mikrofonen er blokeret"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Du kan fjerne blokeringen ved at slå kontakten for privatliv til på din enhed, så mikrofonen får adgang."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Kameraadgang"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Appadgang til kamera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Adgang til kameraet er blokeret"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Du kan fjerne blokeringen ved at slå kontakten for privatliv til på din enhed, så kameraet får adgang."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Mikrofonadgang: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Når du har aktiveret denne indstilling, kan alle apps og tjenester, der har fået tilladelse til det, få adgang til enhver mikrofon på denne enhed.\n\nEksterne lydenheder med en tilpasset protokol påvirkes ikke af denne indstilling."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Kameraadgang: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Gul"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Synstolkning"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Få beskrevet, hvad der sker på skærmen i understøttede film og tv-serier"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Aktivér"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfiguration"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Vil du bruge <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Overvågning"</string>
<string name="system_apps" msgid="8481888654606868074">"Apps"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Lås ikke"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Skærmen går aldrig i dvale"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP-kontrol"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI-optimering"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Vil du genstarte nu?"</string>
@@ -839,18 +813,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Sluk HDMI-enheder med tv\'et"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Tænd tv automatisk"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Tænd tv\'et med HDMI-enhed"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Indgang er tilsluttet</item>
- <item quantity="other">Indgange er tilsluttet</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Standby indbang</item>
- <item quantity="other">Standby indgange</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Indgang er ikke tilsluttet</item>
- <item quantity="other">Indgange er ikke tilsluttet</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Tilsluttet inputenhed}one{Tilsluttet inputenhed}other{Tilsluttede inputenheder}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Afventende inputenhed}one{Afventende inputenhed}other{Afventende inputenheder}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Ikke-tilsluttet inputenhed}one{Ikke-tilsluttet inputenhed}other{Ikke-tilsluttede inputenheder}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Begræns adgangen til apps og andet indhold på din konto"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Begrænset profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Kontrolleret af <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -864,10 +829,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Opret en begrænset profil"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Indstillinger"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Tilladte apps"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d apps er tilladt</item>
- <item quantity="other">%d apps er tilladt</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Tilladt"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Ikke tilladt"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Tilpas begrænsninger"</string>
@@ -912,6 +873,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Tredjepartskilde"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Tilladelser"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Appen er ikke tilgængelig"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Apps, du ikke bruger"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Bekræft"</string>
<string name="settings_cancel" msgid="576094334743686152">"Annuller"</string>
@@ -995,11 +957,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Denne tilladelse giver en app lov til at ændre systemindstillingerne."</string>
<string name="write_settings_on" msgid="71675710746513956">"Ja"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Nej"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Adgang til alle filer"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Tillad administrationsadgang til alle filer"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Giv denne app tilladelse til at læse, ændre og slette alle filer på denne enhed eller andre tilsluttede lagringsløsninger. Hvis du giver tilladelse til dette, kan appen få adgang til dine filer, uden du specifikt bliver gjort opmærksom på det."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Integreret billede"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Tillad integreret billede"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Ingen af de installerede apps understøtter integreret billede"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Giv tilladelse til, at apps opretter et vindue med integreret billede, mens appen er åben, eller efter du lukker den (f.eks. for at fortsætte med at se en video). Dette vindue vises oven på andre apps, du bruger."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Giv apps tilladelse til at indstille alarmer og planlægge tidsbestemte handlinger. Disse apps vil køre i baggrunden, hvor de muligvis bruger mere batteri.\n\nHvis denne tilladelse er deaktiveret, vil eksisterende alarmer og tidsbestemte handlinger, der er planlagt af disse apps, ikke fungere."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Aktivér skærmen"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Tillad aktivering af skærmen"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Tillad, at en app aktiverer skærmen. Hvis du giver denne tilladelse, kan appen til enhver tid aktiverer skærmen, uden at du eksplicit har bedt om det."</string>
<string name="special_access" msgid="21806055758289916">"Særlig appadgang"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Lyd"</string>
@@ -1016,7 +984,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Datasparefunktion"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Juster automatisk videokvaliteten, så der bruges mindre mobildata"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Databrug og underretninger"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Du kan få internetforbindelse via Wi-Fi, Ethernet eller din telefons hotspot. Gå til "<b>"g.co/network"</b>" for at få mere hjælp."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Du kan få internetforbindelse via Wi-Fi, Ethernet eller din telefons hotspot."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Handlingen er ikke tilladt"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Lydstyrken kan ikke ændres"</string>
@@ -1066,4 +1034,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Strøm og energi"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Adfærd, når fjernsynet tændes"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Nulstil"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet-parringskode"</string>
</resources>
diff --git a/Settings/res/values-de/strings.xml b/Settings/res/values-de/strings.xml
index e8c2568..f0a804e 100644
--- a/Settings/res/values-de/strings.xml
+++ b/Settings/res/values-de/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Konto hinzufügen"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Konten & Anmeldung"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Keine Konten"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> Konten</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> Konto</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# Konto}other{# Konten}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Mediendienste, Assistant, Zahlungen"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Netzwerk & Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Ton"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apps"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Geräteeinstellungen"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Fernbedienungen & Zubehör"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Keine verbundenen Bluetooth-Geräte"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> Zubehörteile</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> Zubehörteil</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Display & Ton"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Hilfe und Feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Datenschutz"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Zurücksetzen auf Werkseinstellungen"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrierung"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Energiesparmodus"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Geräte"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Formate auswählen"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Surround-Sound"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"AKTIVIERTE FORMATE"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"DEAKTIVIERTE FORMATE"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Zum Deaktivieren muss der Formatauswahlmodus „Manuell“ aktiviert sein."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Auflösung"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatisch"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Auflösung wurde geändert"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Wähle „OK“ aus, um die neue Auflösung %1$s von jetzt an zu verwenden"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Abbrechen"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Daten im Cache löschen?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Daten im Cache werden für alle Apps gelöscht."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Zubehör hinzufügen"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Kopplung…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Verbinden…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Zubehör"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Fernbedienung"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Einstellungen für die Fernbedienung"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Tasten der Fernbedienung einrichten"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Lautstärke, Ein/Aus und Eingang auf Fernsehern, Receivern und Soundbars steuern"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Kontakt"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Mit %1$s verbinden"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Verbindung trennen"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Nicht verfügbar"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Apps zur Geräteverwaltung"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Keine aktiven Apps"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktive Apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aktive App</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Durch Administrator, Richtlinie oder Anmeldedatenspeicher deaktiviert"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Info zu verwalteten Geräten"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Änderungen und Einstellungen, die von deiner Organisation verwaltet werden"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Keine"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Installierte Apps"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Die Anzahl der Apps ist eine Schätzung. Installierte Apps, die nicht aus dem Play Store stammen, werden möglicherweise nicht berücksichtigt."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Mindestens <xliff:g id="COUNT_1">%d</xliff:g> Apps</item>
- <item quantity="one">Mindestens <xliff:g id="COUNT_0">%d</xliff:g> App</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Mindestens # App}other{Mindestens # Apps}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Standortberechtigungen"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mikrofonberechtigungen"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Kameraberechtigungen"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Standard-Apps"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> Apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> App</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# App}other{# Apps}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Standardtastatur"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Auf <xliff:g id="APP_LABEL">%s</xliff:g> eingestellt"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Durchgehend aktives VPN wurde aktiviert"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Vertrauenswürdige Anmeldedaten"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Vertrauenswürdige Anmeldedaten in deinem privaten Profil"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Vertrauenswürdige Anmeldedaten in deinem Arbeitsprofil"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Mindestens <xliff:g id="COUNT_1">%d</xliff:g> CA-Zertifikate</item>
- <item quantity="one">Mindestens <xliff:g id="COUNT_0">%d</xliff:g> CA-Zertifikat</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA-Zertifikat}other{# CA-Zertifikate}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Der Administrator kann das Gerät sperren und das Passwort zurücksetzen"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Der Administrator kann alle Gerätedaten löschen"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Anzahl falscher Passworteingaben, bevor alle Gerätedaten gelöscht werden"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Anzahl falscher Passworteingaben, bevor die Arbeitsprofildaten gelöscht werden"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> Versuche</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> Versuch</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# Versuch}other{# Versuche}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Dieses Gerät wird von deiner Organisation verwaltet."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Dieses Gerät wird von <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> verwaltet."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Weitere Informationen"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Kamera-Apps</item>
- <item quantity="one">Kamera-App</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Kamera-App}other{Kamera-Apps}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Kalender-App"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Kontakte App"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">E-Mail-Client-Apps</item>
- <item quantity="one">E-Mail-Client-App</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{E-Mail-Client-App}other{E-Mail-Client-Apps}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Karten-App"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Telefon-Apps</item>
- <item quantity="one">Telefon-App</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Telefon-App}other{Telefon-Apps}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Browser-App"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g> und <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g> und <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV-Betriebssystemversion"</string>
<string name="about_serial" msgid="3432319328808745459">"Seriennummer"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV-Betriebssystem-Build"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">In <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> Schritten bist du ein Entwickler.</item>
- <item quantity="one">In <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> Schritt bist du ein Entwickler.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Nur noch # Schritt und du bist Entwickler}other{Nur noch # Schritte und du bist Entwickler}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Anzeigen"</string>
<string name="ads_description" msgid="8081069475265061074">"Hier kannst du deine Einstellungen für Werbung verwalten, z. B. deine Werbe-ID zurücksetzen."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Ads – Hier kannst du deine Einstellungen für Werbung verwalten, z. B. deine Werbe-ID zurücksetzen."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Zusätzliche Systemupdates"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Das Netzwerk wird eventuell überwacht."</string>
<string name="done_button" msgid="616159688526431451">"Fertig"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Zertifikaten vertrauen oder sie entfernen</item>
- <item quantity="one">Zertifikat vertrauen oder es entfernen</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> hat Zertifizierungsstellen auf deinem Gerät installiert. Damit können die Netzwerkaktivitäten deines Geräts wie E-Mails, Apps und sichere Websites überwacht werden.\n\nWeitere Informationen zu diesen Zertifikaten erhältst du von deinem Administrator.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> hat eine Zertifizierungsstelle auf deinem Gerät installiert. Damit können die Netzwerkaktivitäten deines Geräts wie E-Mails, Apps und sichere Websites überwacht werden.\n\nWeitere Informationen zu diesem Zertifikat erhältst du von deinem Administrator.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> hat Zertifizierungsstellen für dein Arbeitsprofil installiert. Damit können deine geschäftlichen Netzwerkaktivitäten überwacht werden, einschließlich E-Mails, Apps und sicherer Websites.\n\nWeitere Informationen zu diesen Zertifikaten erhältst du von deinem Administrator.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> hat eine Zertifizierungsstelle für dein Arbeitsprofil installiert. Damit können deine geschäftlichen Netzwerkaktivitäten überwacht werden, einschließlich E-Mails, Apps und sicherer Websites.\n\nWeitere Informationen zu diesem Zertifikat erhältst du von deinem Administrator.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Dritte können deine Netzwerkaktivitäten überwachen, einschließlich E-Mails, Apps und sicherer Websites.\n\nDies wird durch vertrauenswürdige Anmeldedaten ermöglicht, die auf deinem Gerät installiert sind."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Zertifikate prüfen</item>
- <item quantity="one">Zertifikat prüfen</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Zertifikat vertrauen oder es entfernen}other{Zertifikaten vertrauen oder sie entfernen}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Netzwerk, Seriennummern und weitere Informationen"</string>
<string name="manual" msgid="5683935624321864999">"Handbuch"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Verbinden"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Netzwerk entfernen"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Löscht die Informationen für die Verbindung mit diesem Netzwerk, auch das gespeicherte Passwort"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"QR-Code mit Smartphone scannen und der Anleitung folgen, um Verbindung zu einem WLAN herzustellen."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Du kannst dich mit einem WLAN verbinden, indem du den QR-Code von einem Smartphone scannst und der Anleitung folgst.\n\nGeh auf einem "<b>"Android-Smartphone"</b>" zu den Einstellungen -> „Netzwerk & Internet“ -> „WLAN“ -> WLAN auswählen -> „Erweitert“ -> „Gerät hinzufügen“ und scann den QR-Code."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Schaltfläche „Zurück“ drücken, um abzubrechen"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Ok"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Weiter"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Gerätespeicher"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Wechselmedien"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Zurücksetzen"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Speicherplatz freigeben"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Daten im Cache löschen"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> freigeben"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Temporäre Dateien, die Speicherplatz belegen, werden gelöscht. Das betrifft keine gespeicherten Daten wie App-Einstellungen oder Offline-Videos. Du musst dich auch nicht noch einmal in Apps anmelden."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Daten im Cache löschen?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Daten im Cache werden für alle Apps gelöscht."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Apps deinstallieren"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> wurde bereitgestellt."</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> konnte nicht bereitgestellt werden."</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB-Speicher wieder angeschlossen"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Mikrofonzugriff"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"App-Zugriff auf das Mikrofon"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Mikrofonzugriff blockiert"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Um die Blockierung aufzuheben und den Zugriff zu erlauben, musst du den Schalter für den Datenschutz an deinem Gerät auf die Position zum Aktivieren des Mikrofons bringen."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Kamerazugriff"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"App-Zugriff auf die Kamera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Kamerazugriff blockiert"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Um die Blockierung aufzuheben und den Zugriff zu erlauben, musst du den Schalter für den Datenschutz an deinem Gerät auf die Position zum Aktivieren der Kamera bringen."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Mikrofonzugriff: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Wenn diese Funktion aktiviert ist, können alle Apps und Dienste mit entsprechender Berechtigung auf alle Mikrofone dieses Geräts zugreifen.\n\nAuf Audio-Peripheriegeräte mit benutzerdefiniertem Protokoll hat diese Einstellung keine Auswirkung."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Kamerazugriff: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Gelb"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audiobeschreibung"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Höre dir in unterstützten Filmen und Serien eine Beschreibung der Ereignisse auf dem Bildschirm an"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Aktivieren"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfiguration"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> verwenden?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Überwachen"</string>
<string name="system_apps" msgid="8481888654606868074">"Apps"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Bildschirm aktiv lassen"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Display geht nie in Ruhemodus"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP-Prüfung"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI-Optimierung"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Jetzt neu starten?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"HDMI-Geräte zusammen mit dem Fernseher ausschalten"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV automatisch einschalten"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Fernseher zusammen mit HDMI-Gerät einschalten"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Verbundene Eingänge</item>
- <item quantity="one">Verbundener Eingang</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Eingänge auf Stand-by</item>
- <item quantity="one">Eingang auf Stand-by</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Nicht verbundene Eingänge</item>
- <item quantity="one">Nicht verbundener Eingang</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Verbundener Eingang}other{Verbundene Eingänge}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Eingang auf Stand-by}other{Eingänge auf Stand-by}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Nicht verbundener Eingang}other{Nicht verbundene Eingänge}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Zugriff auf Apps und sonstige Inhalte in deinem Konto einschränken"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Eingeschränktes Profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Von <xliff:g id="APP">%1$s</xliff:g> festgelegt"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Eingeschränktes Profil erstellen"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Einstellungen"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Zugelassene Apps"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d Apps zugelassen</item>
- <item quantity="one">1 App zugelassen</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Zugelassen"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Nicht zugelassen"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Einschränkungen anpassen"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Drittanbieter"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Berechtigungen"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"App nicht verfügbar"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Nicht verwendete Apps"</string>
<string name="settings_ok" msgid="5950888975075541964">"Ok"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Bestätigen"</string>
<string name="settings_cancel" msgid="576094334743686152">"Abbrechen"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Durch diese Berechtigung darf die App Systemeinstellungen ändern."</string>
<string name="write_settings_on" msgid="71675710746513956">"Ja"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Nein"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Zugriff auf alle Dateien"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Zugriff zum Verwalten aller Dateien zulassen"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Du kannst dieser App erlauben, alle Dateien auf diesem Gerät und auf allen verbundenen Laufwerken zu lesen, zu ändern und zu löschen. Sie kann dann ohne deine explizite Zustimmung auf Dateien zugreifen."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Bild im Bild"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Bild im Bild zulassen"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Keine der installierten Apps unterstützt den Bild-im-Bild-Modus"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Während eine App geöffnet ist oder nachdem du sie schließt (z. B. um ein Video weiter anzusehen), öffnet sie ein Bild-im-Bild-Fenster. Dieses wird über anderen Apps eingeblendet, die du gerade verwendest."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Apps erlauben, Wecker zu stellen und zeitbasierte Aktionen zu planen. Dadurch laufen Apps im Hintergrund. Dies kann den Stromverbrauch erhöhen.\n\nWenn diese Berechtigung deaktiviert ist, funktionieren bereits gestellte Wecker und zeitbasierte Ereignisse, die von der entsprechenden App geplant sind, nicht wie erwartet."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Bildschirm einschalten"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Einschalten des Bildschirms erlauben"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Einer App erlauben, den Bildschirm einzuschalten. Wenn du diese Erlaubnis erteilst, kann die App jederzeit den Bildschirm einschalten – auch ohne dass du dies wirklich beabsichtigst."</string>
<string name="special_access" msgid="21806055758289916">"Spezieller App-Zugriff"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g> und <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Datensparmodus"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Videoqualität automatisch anpassen, um weniger mobile Daten zu verwenden"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Datennutzung und Warnmeldungen"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Du kannst dich über WLAN, Ethernet oder den Hotspot deines Smartphones mit dem Internet verbinden. Weitere Informationen findest du auf "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Du kannst dich über WLAN, Ethernet oder den Hotspot deines Smartphones mit dem Internet verbinden."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Aktion nicht zulässig"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Lautstärke nicht änderbar"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Stromversorgung & Energie"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Nach dem Einschalten"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Zurücksetzen"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet-Kopplungscode"</string>
</resources>
diff --git a/Settings/res/values-el/strings.xml b/Settings/res/values-el/strings.xml
index 88c6a63..bd64c64 100644
--- a/Settings/res/values-el/strings.xml
+++ b/Settings/res/values-el/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Προσθήκη λογαριασμού"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Λογαριασμοί και σύνδεση"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Δεν υπάρχουν λογαριασμοί"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> λογαριασμοί</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> λογαριασμός</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# λογαριασμός}other{# λογαριασμοί}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Υπηρεσίες μέσων, Βοηθός, πληρωμές"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Δίκτυο και διαδίκτυο"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Ήχος"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Εφαρμογές"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Προτιμήσεις συσκευής"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Τηλεχειριστήρια και αξεσουάρ"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Δεν υπάρχουν συνδεδεμένες συσκευές Bluetooth"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> αξεσουάρ</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> αξεσουάρ</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Οθόνη και ήχος"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Βοήθεια και σχόλια"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Απόρρητο"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Επαναφορά εργοστασιακών ρυθμίσεων"</string>
<string name="device_calibration" msgid="2907914144048739705">"Βαθμονόμηση"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Εξοικονόμηση ενέργειας"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Συσκευές"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Επιλέξτε μορφές"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Περιφερειακός ήχος"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ΕΝΕΡΓΟΠΟΙΗΜΕΝΕΣ ΜΟΡΦΕΣ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΕΣ ΜΟΡΦΕΣ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Για απενεργοποίηση, αλλάξτε την επιλογή μορφής σε Μη αυτόματη."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Ανάλυση"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Αυτόματα"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Η ανάλυση άλλαξε"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Επιλέξτε ΟΚ για να χρησιμοποιείτε στο εξής ανάλυση %1$s."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Ακύρωση"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ΟΚ"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Να διαγραφούν τα δεδομένα κρυφής μνήμης;"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Διαγραφή κρυφής μνήμης όλων των εφαρμογών."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Προσθήκη αξεσουάρ"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Σύζευξη…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Σύνδεση…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Αξεσουάρ"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Τηλεχειριστήριο"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Ρυθμίσεις τηλεχειριστηρίου"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Ρύθμιση κουμπιών τηλεχειριστηρίου"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Έλεγχος έντασης ήχου, έναρξης και τερματισμού λειτουργίας, πηγών εισόδου σε τηλεοράσεις, δέκτες και soundbar"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Σύνδεση"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Σύνδεση σε %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Αποσύνδεση"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Μη διαθέσιμη"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Εφαρμογές διαχείρισης συσκευής"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Δεν υπάρχουν ενεργές εφαρμογές"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Απενεργοποιήθηκε λόγω διαχειριστή, πολιτικής κρυπτογράφησης ή αποθηκευτικού χώρου διαπιστευτηρίων"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Πληροφορίες διαχειριζόμενης συσκευής"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Η διαχείριση των αλλαγών και των ρυθμίσεων γίνεται από τον οργανισμό σας"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Καμία"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Εγκατεστημένες εφαρμογές"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Γίνεται εκτίμηση του αριθμού των εφαρμογών. Μπορεί να μην περιλαμβάνει εφαρμογές που έχουν εγκατασταθεί εκτός του Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Τουλάχιστον # εφαρμογή}other{Τουλάχιστον # εφαρμογές}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Άδειες τοποθεσίας"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Άδειες μικροφώνου"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Άδειες κάμερας"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Προεπιλεγμένες εφαρμογές"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# εφαρμογή}other{# εφαρμογές}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Προεπιλεγμένο πληκτρολόγιο"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Ορίστηκε σε <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Η λειτουργία \"Μονίμως ενεργό VPN\" είναι ενεργοποιημένη"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Αξιόπιστα διαπιστευτήρια"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Αξιόπιστα διαπιστευτήρια στο προσωπικό προφίλ σας"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Αξιόπιστα διαπιστευτήρια στο προφίλ εργασίας σας"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Τουλάχιστον <xliff:g id="COUNT_1">%d</xliff:g> πιστοποιητικά CA</item>
- <item quantity="one">Τουλάχιστον <xliff:g id="COUNT_0">%d</xliff:g> πιστοποιητικό CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# πιστοποιητικό CA}other{# πιστοποιητικά CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Ο διαχειριστής μπορεί να κλειδώσει τη συσκευή και να επαναφέρει τον κωδικό πρόσβασης"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Ο διαχειριστής μπορεί να διαγράψει όλα τα δεδομένα της συσκευής"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Αποτυχημένες προσπάθειες εισαγωγής κωδικού πρόσβασης πριν από τη διαγραφή όλων των δεδομένων της συσκευής"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Αποτυχημένες προσπάθειες εισαγωγής κωδικού πρόσβασης πριν από τη διαγραφή των δεδομένων του προφίλ εργασίας"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# προσπάθεια}other{# προσπάθειες}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Αυτή η συσκευή είναι διαχειριζόμενη από τον οργανισμό σας."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Τη συσκευή διαχειρίζεται ο οργανισμός <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Μάθετε περισσότερα"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Εφαρμογές κάμερας</item>
- <item quantity="one">Εφαρμογή κάμερας</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Εφαρμογή κάμερας}other{Εφαρμογές κάμερας}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Εφαρμογή ημερολογίου"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Εφαρμογή Επαφές"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Εφαρμογές-πελάτες ηλ. ταχυδρ.</item>
- <item quantity="one">Εφαρμογή-πελάτης ηλ. ταχυδρ.</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Πρόγραμμα πελάτης ηλ. ταχ.}other{Προγράμματα πελάτες ηλ. ταχ.}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Εφαρμογή χάρτη"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Εφαρμογές τηλεφώνου</item>
- <item quantity="one">Εφαρμογή τηλεφώνου</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Εφαρμογή τηλεφώνου}other{Εφαρμογές τηλεφώνου}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Πρόγραμμα περιήγησης"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Έκδοση λειτουργικού συστήματος Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Σειριακός αριθμός"</string>
<string name="about_build" msgid="8467840394761634575">"Έκδοση λειτουργικού συστήματος Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{Απομένει # βήμα για να γίνετε προγραμματιστής}other{Απομένουν # βήματα για να γίνετε προγραμματιστής}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Διαφημίσεις"</string>
<string name="ads_description" msgid="8081069475265061074">"Διαχειριστείτε ρυθμίσεις διαφημίσεων (π.χ. επαναφορά αναγνωριστικού διαφήμισης)."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Διαφημίσεις, Διαχειριστείτε τις ρυθμίσεις των διαφημίσεών σας, όπως την επαναφορά του αναγνωριστικού διαφήμισης."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Πρόσθ. ενημερ. συστήματος"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Το δίκτυο ενδέχεται να παρακολουθείται"</string>
<string name="done_button" msgid="616159688526431451">"Τέλος"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Κατάργηση ή ορισμός των πιστοποιητικών ως αξιόπιστων</item>
- <item quantity="one">Κατάργηση ή ορισμός του πιστοποιητικού ως αξιόπιστου</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other">Ο τομέας <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> εγκατέστησε αρχές έκδοσης πιστοποιητικών στη συσκευή σας, που ενδέχεται να του επιτρέψουν να παρακολουθεί τη δραστηριότητα δικτύου της συσκευής, συμπεριλαμβανομένων των μηνυμάτων ηλεκτρονικού ταχυδρομείου, των εφαρμογών και των ασφαλών ιστοτόπων.\n\nΓια περισσότερες πληροφορίες σχετικά με αυτά τα πιστοποιητικά, επικοινωνήστε με τον διαχειριστή σας.</item>
- <item quantity="one">Ο τομέας <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> εγκατέστησε μια αρχή έκδοσης πιστοποιητικών στη συσκευή σας, που ενδέχεται να του επιτρέψει να παρακολουθεί τη δραστηριότητα δικτύου της συσκευής, συμπεριλαμβανομένων των μηνυμάτων ηλεκτρονικού ταχυδρομείου, των εφαρμογών και των ασφαλών ιστοτόπων.\n\nΓια περισσότερες πληροφορίες σχετικά με αυτό το πιστοποιητικό, επικοινωνήστε με τον διαχειριστή σας.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other">Ο τομέας <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> εγκατέστησε αρχές έκδοσης πιστοποιητικών για το προφίλ εργασίας σας, που ενδέχεται να του επιτρέψουν να παρακολουθεί τη δραστηριότητα του δικτύου εργασίας, συμπεριλαμβανομένων των μηνυμάτων ηλεκτρονικού ταχυδρομείου, των εφαρμογών και των ασφαλών ιστοτόπων.\n\nΓια περισσότερες πληροφορίες σχετικά με αυτά τα πιστοποιητικά, επικοινωνήστε με τον διαχειριστή σας.</item>
- <item quantity="one">Ο τομέας <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> εγκατέστησε μια αρχή έκδοσης πιστοποιητικών για το προφίλ εργασίας σας, που ενδέχεται να του επιτρέψει να παρακολουθεί τη δραστηριότητα του δικτύου εργασίας, συμπεριλαμβανομένων των μηνυμάτων ηλεκτρονικού ταχυδρομείου, των εφαρμογών και των ασφαλών ιστοτόπων.\n\nΓια περισσότερες πληροφορίες σχετικά με αυτό το πιστοποιητικό, επικοινωνήστε με τον διαχειριστή σας.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Ένα τρίτο μέρος έχει τη δυνατότητα να παρακολουθεί τη δραστηριότητα του δικτύου σας, όπως μηνύματα ηλεκτρονικού ταχυδρομείου, εφαρμογές και ασφαλείς ιστότοπους. \n\nΑυτό είναι δυνατό μέσω ενός έγκυρου διαπιστευτηρίου που έχει εγκατασταθεί στη συσκευή σας."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Έλεγχος πιστοποιητικών</item>
- <item quantity="one">Έλεγχος πιστοποιητικού</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Ορισμός ως αξιόπιστου ή κατάργηση του πιστοποιητικού}other{Ορισμός ως αξιόπιστων ή κατάργηση των πιστοποιητικών}}"</string>
<string name="device_status" msgid="8266002761193692207">"Κατάσταση"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Δίκτυο, σειριακοί αριθμοί και άλλες πληροφορίες"</string>
<string name="manual" msgid="5683935624321864999">"Εγχειρίδιο χρήσης"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Σύνδεση"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Διαγραφή δικτύου από τη μνήμη"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Διαγράφει τις πληροφορίες σύνδεσης σε αυτό το δίκτυο, όπως τον αποθηκευμένο κωδικό πρόσβασης"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Συνδεθείτε σε ένα δίκτυο Wi-Fi σαρώνοντας τον κωδικό QR από το κινητό σας τηλέφωνο και ακολουθήστε τις οδηγίες."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Συνδεθείτε σε ένα δίκτυο Wi-Fi σαρώνοντας τον κωδικό QR από ένα κινητό τηλέφωνο και ακολουθήστε τις οδηγίες.\n \n Από ένα "<b>"τηλέφωνο Android"</b>" μεταβείτε στις Ρυθμίσεις -> Δίκτυο και διαδίκτυο -> Wi-Fi -> Επιλογή Wi-Fi -> Σύνθετες -> Προσθέστε τη συσκευή και σαρώστε τον κωδικό QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Πατήστε το κουμπί πίσω για ακύρωση"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Συνέχεια"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Αποθηκευτικός χώρος συσκευής"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Αφαιρούμενος αποθηκευτικός χώρος"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Επαναφορά"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Αποδέσμευση αποθηκευτικού χώρου"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Διαγραφή δεδομένων αποθηκευμένων στην κρυφή μνήμη"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Αποδέσμευση <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Διαγράφει τα προσωρινά αρχεία που καταλαμβάνουν χώρο. Δεν θα επηρεάσει αποθηκευμένα δεδομένα όπως προτιμήσεις εφαρμογών ή βίντεο εκτός σύνδεσης και δεν θα χρειαστεί να συνδεθείτε ξανά σε εφαρμογές."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Διαγραφή δεδομένων αποθηκευμένων στην κρυφή μνήμη;"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Θα διαγραφούν τα δεδομένα κρυφής μνήμης για όλες τις εφαρμογές."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Απεγκατάσταση εφαρμογών"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Προσαρτήθηκε <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Δεν ήταν δυνατή η προσάρτηση <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Αποθήκευσης USB επανασυνδέονται"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Μικρόφωνο"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Πρόσβαση μικροφώνου"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Πρόσβαση εφαρμογής στο μικρόφωνο"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Η πρόσβαση στο μικρόφωνο είναι αποκλεισμένη"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Για την κατάργηση του αποκλεισμού, μετακινήστε τον διακόπτη απορρήτου για το μικρόφωνο στη θέση ενεργοποίησης, προκειμένου να επιτρέψετε την πρόσβαση στο μικρόφωνο."</string>
<string name="camera" msgid="1226671478936288283">"Κάμερα"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Πρόσβαση κάμερας"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Πρόσβαση εφαρμογής στην κάμερα"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Η πρόσβαση στην κάμερα είναι αποκλεισμένη"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Για την κατάργηση του αποκλεισμού, μετακινήστε τον διακόπτη απορρήτου για την κάμερα στη θέση ενεργοποίησης, προκειμένου να επιτρέψετε την πρόσβαση στην κάμερα."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Πρόσβαση μικροφώνου: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Όταν είναι ενεργή η ρύθμιση, όλες οι εφαρμογές και οι υπηρεσίες που έχουν λάβει τη σχετική άδεια θα μπορούν να έχουν πρόσβαση σε οποιοδήποτε μικρόφωνο αυτής της συσκευής.\n\nΤα περιφερειακά ήχου με προσαρμοσμένο πρωτόκολλο δεν θα επηρεαστούν από αυτήν τη ρύθμιση."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Πρόσβαση κάμερας: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Κυανό"</string>
<string name="color_yellow" msgid="3519470952904560404">"Κίτρινο"</string>
<string name="color_magenta" msgid="2377854703399624607">"Ματζέντα"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Περιγραφή ήχου"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Ακούστε μια περιγραφή για το τι συμβαίνει στην οθόνη σε υποστηριζόμενες ταινίες και εκπομπές"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Ενεργοποίηση"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Διαμόρφωση"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Χρήση - <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Παρακολούθηση"</string>
<string name="system_apps" msgid="8481888654606868074">"Εφαρμογές"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Παραμονή σε κανονική κατάσταση λειτουργίας"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Η οθόνη δεν θα μεταβαίνει ποτέ σε κατάσταση αδράνειας"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Έλεγχος HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Βελτιστοποίηση HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Επανεκκίνηση τώρα;"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Απενεργοποιήστε τις συσκευές HDMI με την τηλεόραση"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Αυτόματη ενεργοπ. τηλεόρασης"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Ενεργοποιήστε την τηλεόραση με τη συσκευή HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Συνδεδεμένες είσοδοι</item>
- <item quantity="one">Συνδεδεμένη είσοδος</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Είσοδοι σε αναμονή</item>
- <item quantity="one">Είσοδος σε αναμονή</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Καμία συνδεδεμένη είσοδος</item>
- <item quantity="one">Καμία συνδεδεμένη είσοδος</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Συνδεδεμένη είσοδος}other{Συνδεδεμένες είσοδοι}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Είσοδος σε αναμονή}other{Είσοδοι σε αναμονή}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Μη συνδεδεμένη είσοδος}other{Μη συνδεδεμένες είσοδοι}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Περιορίστε την πρόσβαση σε εφαρμογές και άλλο περιεχόμενο στο λογαριασμό σας"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Περιορισμένο προφίλ"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Ελέγχονται από την εφαρμογή <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Δημιουργία περιορισμένου προφίλ"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Ρυθμίσεις"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Επιτρεπόμενες εφαρμογές"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d επιτρεπόμενες εφαρμογές</item>
- <item quantity="one">1 επιτρεπόμενη εφαρμογή</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Επιτρέπεται"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Δεν επιτρέπεται"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Προσαρμογή περιορισμών"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Πηγή τρίτου μέρους"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Άδειες"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Η εφαρμογή δεν είναι διαθέσιμη"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Εφαρμογές που δεν χρησιμοποιούνται"</string>
<string name="settings_ok" msgid="5950888975075541964">"ΟΚ"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Επιβεβαίωση"</string>
<string name="settings_cancel" msgid="576094334743686152">"Ακύρωση"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Αυτή η άδεια επιτρέπει σε μια εφαρμογή την τροποποίηση των ρυθμίσεων συστήματος."</string>
<string name="write_settings_on" msgid="71675710746513956">"Ναι"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Όχι"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Πρόσβαση σε όλα τα αρχεία"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Να επιτρέπεται η πρόσβαση για τη διαχείριση όλων των αρχείων"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Να επιτρέπεται σε αυτήν την εφαρμογή η ανάγνωση, η τροποποίηση και η διαγραφή όλων των αρχείων σε αυτήν τη συσκευή και σε κάθε συνδεδεμένη μονάδα αποθήκευσης. Εάν εκχωρηθούν σχετικά δικαιώματα, η εφαρμογή μπορεί να έχει πρόσβαση σε αρχεία χωρίς να έχετε ενημερωθεί ρητά."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Να επιτρέπεται η λειτουργία picture-in-picture"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Καμία από τις εγκατεστημένες εφαρμογές δεν υποστηρίζει τη λειτουργία picture-in-picture"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Να επιτρέπεται στις εφαρμογές να δημιουργούν ένα παράθυρο picture-in-picture ενώ η εφαρμογή είναι ανοικτή ή αφού αποχωρήσετε από αυτήν (για παράδειγμα, για να συνεχίσετε να παρακολουθείτε κάποιο βίντεο). Αυτό το παράθυρο εμφανίζεται στην κορυφή άλλων εφαρμογών που χρησιμοποιείτε."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Να επιτρέπεται σε εφαρμογές να ρυθμίζουν ξυπνητήρια και να προγραμματίζουν ενέργειες που εξαρτώνται από την ώρα. Αυτό επιτρέπει στις εφαρμογές να εκτελούνται στο παρασκήνιο, το οποίο μπορεί να έχει ως αποτέλεσμα την κατανάλωση περισσότερης ενέργειας.\n\nΑν αυτή η άδεια είναι απενεργοποιημένη, τα υπάρχοντα ξυπνητήρια και τα συμβάντα που βασίζονται στην ώρα και έχουν προγραμματιστεί από την εφαρμογή δεν θα λειτουργούν."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Ενεργοποίηση οθόνης"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Να επιτρέπεται η ενεργοποίηση της οθόνης"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Επιτρέψτε σε μια εφαρμογή να ενεργοποιεί την οθόνη. Αν παραχωρήσετε την άδεια, η εφαρμογή ενδέχεται να ενεργοποιεί την οθόνη ανά πάσα στιγμή, χωρίς να εκφράσετε σαφή πρόθεση."</string>
<string name="special_access" msgid="21806055758289916">"Ειδική πρόσβαση εφαρμογής"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Ήχος"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Εξοικονόμηση δεδομένων"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Αυτόματη προσαρμογή ποιότητας βίντεο για οικονομία δεδομένων κινητής τηλεφωνίας"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Χρήση δεδομένων και ειδοποιήσεις"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Μπορείτε να συνδεθείτε στο διαδίκτυο μέσω Wi-Fi, Ethernet ή του σημείου πρόσβασης Wi-Fi του τηλεφώνου. Για βοήθεια, μεταβείτε στο "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Μπορείτε να συνδεθείτε στο διαδίκτυο μέσω Wi-Fi, Ethernet ή του σημείου πρόσβασης Wi-Fi του τηλεφώνου σας."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Δεν επιτρέπεται η ενέργεια"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Δεν είναι δυνατή η αλλαγή της έντασης του ήχου"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Τροφοδοσία και Πηγές ενέργειας"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Συμπεριφορά κατά την ενεργοποίηση"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Επαναφορά"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Κωδικός σύζευξης Ethernet"</string>
</resources>
diff --git a/Settings/res/values-en-rAU/strings.xml b/Settings/res/values-en-rAU/strings.xml
index 6ac2bba..3d46df3 100644
--- a/Settings/res/values-en-rAU/strings.xml
+++ b/Settings/res/values-en-rAU/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Add an account."</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Accounts and sign-in"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"No accounts"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> accounts</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> account</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# account}other{# accounts}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Media services, Assistant, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Network and internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Sound"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apps"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Device Preferences"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Remotes and accessories"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"No connected Bluetooth devices"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accessories</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> accessory</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Display & sound"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Help and feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacy"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Factory data reset"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibration"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Energy saver"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Devices"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Select formats"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Surround Sound"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ENABLED FORMATS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"DISABLED FORMATS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"To disable, change the format selection to manual."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolution"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatic"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Resolution has been changed"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Select OK to use %1$s from now on."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Cancel"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Clear cached data?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"This will clear cached data for all apps."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Add accessory"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Pairing…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Connecting…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accessories"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Remote control"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Remote control settings"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Set up remote buttons"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Control volume, power, input on TVs, receivers and soundbars"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Connect"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Connect to %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Disconnect"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Not available"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Device admin apps"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"No active apps"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> active apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> active app</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Disabled by admin, encryption policy or credential storage"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Managed device info"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Changes & settings managed by your organisation"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"None"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Apps installed"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Number of apps is estimated. It may not include apps installed outside of the Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum # app}other{Minimum # apps}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Location permissions"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Microphone permissions"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Camera permissions"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Default apps"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}other{# apps}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Default keyboard"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Set to <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Always-on VPN turned on"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Trusted credentials"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Trusted credentials in your personal profile"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Trusted credentials in your work profile"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> CA certificates</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> CA certificate</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA certificate}other{# CA certificates}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Admin can lock the device and reset password"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Admin can delete all device data"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Failed password attempts before deleting all device data"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Failed password attempts before deleting work profile data"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> attempts</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> attempt</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# attempt}other{# attempts}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"This device is managed by your organisation."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"This device is managed by <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Learn more"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Camera apps</item>
- <item quantity="one">Camera app</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Camera app}other{Camera apps}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Calendar app"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Contacts app"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Email client apps</item>
- <item quantity="one">Email client app</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Email client app}other{Email client apps}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Map app"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Phone apps</item>
- <item quantity="one">Phone app</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Phone app}other{Phone apps}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Browser app"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS version"</string>
<string name="about_serial" msgid="3432319328808745459">"Serial number"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS build"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Ads"</string>
<string name="ads_description" msgid="8081069475265061074">"Manage your ads settings, such as resetting your advertising ID."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Ads, Manage your ads settings, such as resetting your advertising ID."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Additional system updates"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Network may be monitored"</string>
<string name="done_button" msgid="616159688526431451">"Done"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Trust or remove certificates</item>
- <item quantity="one">Trust or remove certificate</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities on your device, which may allow them to monitor your device network activity, including emails, apps and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> has installed a certificate authority on your device, which may allow them to monitor your device network activity, including emails, apps and secure websites.\n\nFor more information about this certificate, contact your admin.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities for your work profile, which may allow them to monitor work network activity, including emails, apps and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> has installed a certificate authority for your work profile, which may allow them to monitor work network activity, including emails, apps and secure websites.\n\nFor more information about this certificate, contact your admin.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"A third party is capable of monitoring your network activity, including emails, apps and secure websites.\n\nA trusted credential installed on your device is making this possible."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Check certificates</item>
- <item quantity="one">Check certificate</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Trust or remove certificate}other{Trust or remove certificates}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Network, serial numbers and other information"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Connect"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Forget network"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"This clears information used to connect to this network, including a saved password"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Join a Wi-Fi by scanning the QR code from your mobile phone and follow the instruction."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Join a Wi-Fi by scanning the QR code from a mobile phone and follow the instructions.\n \n From an "<b>"Android Phone"</b>" go to Settings -> Network & Internet -> Wi-Fi -> Select a Wi-Fi -> Advanced -> Add device and then scan the QR code."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Press the back button to cancel"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continue"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Device storage"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Removable storage"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Reset"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Free up storage"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Clear cached data"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Free up <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Clears temporary files that take up space. Will not impact saved data like app preferences or offline videos, and you won\'t need to sign in to apps again."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Clear cached data?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"This will clear cached data for all apps."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Uninstall apps"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> is mounted"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Couldn\'t mount <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB storage reconnected"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Microphone"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Microphone access"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"App access to microphone"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Microphone access blocked"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"To unblock, move the privacy switch on your device to the microphone \'on position\' to allow microphone access."</string>
<string name="camera" msgid="1226671478936288283">"camera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Camera access"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"App access to camera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Camera access blocked"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"To unblock, move the privacy switch on your device to the camera\'s \'on position\' to allow camera access."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Microphone access: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"When turned on, all apps and services with permission can access any microphone on this device.\n\nAudio peripherals with a custom protocol will not be affected by this setting."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Camera access: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Yellow"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audio description"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Hear a description of what’s happening on screen in supported movies and shows"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Enable"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuration"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Use <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitoring"</string>
<string name="system_apps" msgid="8481888654606868074">"Apps"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Stay awake"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Screen will never sleep"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP checking"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimisation"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Restart now?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Power off HDMI devices with the TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV auto power on"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Power on the TV with HDMI device"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Connected Inputs</item>
- <item quantity="one">Connected Input</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Standby Inputs</item>
- <item quantity="one">Standby Input</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Unconnected Inputs</item>
- <item quantity="one">Unconnected Input</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Connected input}other{Connected inputs}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Standby input}other{Standby inputs}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Not connected input}other{Not connected inputs}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Restrict access to apps and other content in your account"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Restricted profile"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controlled by <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Create restricted profile"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Settings"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Allowed apps"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d apps allowed</item>
- <item quantity="one">1 app allowed</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Allowed"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Not allowed"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Customise restrictions"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Third-party source"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Permissions"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Application unavailable"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Unused apps"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirm"</string>
<string name="settings_cancel" msgid="576094334743686152">"Cancel"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"This permission allows an app to modify system settings."</string>
<string name="write_settings_on" msgid="71675710746513956">"Yes"</string>
<string name="write_settings_off" msgid="6730113471695092167">"No"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"All files access"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Allow access to manage all files"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Allow this app to read, modify and delete all files on this device or any connected storage volumes. If granted, app may access files without your explicit knowledge."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Allow picture-in-picture"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"No installed apps support picture-in-picture"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Allow apps to create a picture-in-picture window while the app is open or after you leave it (for example, to continue watching a video). This window displays on top of other apps that you\'re using."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Allow apps to set alarms and schedule time-sensitive actions. This lets the apps run in the background, which may use more power.\n\nIf this permission is off, existing alarms and time-based events scheduled by the app won’t work."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Turn screen on"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Allow turning the screen on"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Allow an app to turn the screen on. If granted, the app may turn on the screen at any time without your explicit intent."</string>
<string name="special_access" msgid="21806055758289916">"Special app access"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Data Saver"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Automatically adjust video quality to use less mobile data"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Data usage and alerts"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"You can connect to the Internet with Wi-Fi, Ethernet or your phone\'s hotspot. For more help, visit "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"You can connect to the Internet with Wi-Fi, Ethernet or your phone\'s hotspot."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Action not allowed"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Can’t change volume"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Power and energy"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Power-on behaviour"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Reset"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet pairing code"</string>
</resources>
diff --git a/Settings/res/values-en-rCA/strings.xml b/Settings/res/values-en-rCA/strings.xml
index cf37c32..7d66db3 100644
--- a/Settings/res/values-en-rCA/strings.xml
+++ b/Settings/res/values-en-rCA/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Add an account."</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Accounts and sign-in"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"No accounts"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> accounts</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> account</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# account}other{# accounts}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Media services, Assistant, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Network and Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Sound"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apps"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Device Preferences"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Remotes and accessories"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"No connected Bluetooth devices"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accessories</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> accessory</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Display & sound"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Help and feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacy"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Factory data reset"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibration"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Energy saver"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Devices"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Select formats"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Surround Sound"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ENABLED FORMATS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"DISABLED FORMATS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"To disable, change the format selection to manual."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolution"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatic"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Resolution has been changed"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Select OK to use %1$s from now on."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Cancel"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Clear cached data?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"This will clear cached data for all apps."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Add accessory"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Pairing…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Connecting…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accessories"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Remote control"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Remote control settings"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Set up remote buttons"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Control volume, power, input on TVs, receivers and soundbars"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Connect"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Connect to %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Disconnect"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Not available"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Device admin apps"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"No active apps"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> active apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> active app</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Disabled by admin, encryption policy or credential storage"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Managed device info"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Changes & settings managed by your organisation"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"None"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Apps installed"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Number of apps is estimated. It may not include apps installed outside of the Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum # app}other{Minimum # apps}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Location permissions"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Microphone permissions"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Camera permissions"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Default apps"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}other{# apps}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Default keyboard"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Set to <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Always-on VPN turned on"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Trusted credentials"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Trusted credentials in your personal profile"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Trusted credentials in your work profile"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> CA certificates</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> CA certificate</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA certificate}other{# CA certificates}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Admin can lock the device and reset password"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Admin can delete all device data"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Failed password attempts before deleting all device data"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Failed password attempts before deleting work profile data"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> attempts</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> attempt</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# attempt}other{# attempts}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"This device is managed by your organisation."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"This device is managed by <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Learn more"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Camera apps</item>
- <item quantity="one">Camera app</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Camera app}other{Camera apps}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Calendar app"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Contacts app"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Email client apps</item>
- <item quantity="one">Email client app</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Email client app}other{Email client apps}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Map app"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Phone apps</item>
- <item quantity="one">Phone app</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Phone app}other{Phone apps}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Browser app"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS version"</string>
<string name="about_serial" msgid="3432319328808745459">"Serial number"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS build"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Ads"</string>
<string name="ads_description" msgid="8081069475265061074">"Manage your ads settings, such as resetting your advertising ID."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Ads, Manage your ads settings, such as resetting your advertising ID."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Additional system updates"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Network may be monitored"</string>
<string name="done_button" msgid="616159688526431451">"Done"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Trust or remove certificates</item>
- <item quantity="one">Trust or remove certificate</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities on your device, which may allow them to monitor your device network activity, including emails, apps and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> has installed a certificate authority on your device, which may allow them to monitor your device network activity, including emails, apps and secure websites.\n\nFor more information about this certificate, contact your admin.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities for your work profile, which may allow them to monitor work network activity, including emails, apps and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> has installed a certificate authority for your work profile, which may allow them to monitor work network activity, including emails, apps and secure websites.\n\nFor more information about this certificate, contact your admin.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"A third party is capable of monitoring your network activity, including emails, apps and secure websites.\n\nA trusted credential installed on your device is making this possible."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Check certificates</item>
- <item quantity="one">Check certificate</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Trust or remove certificate}other{Trust or remove certificates}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Network, serial numbers and other information"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Connect"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Forget network"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"This clears information used to connect to this network, including a saved password"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Join a Wi-Fi by scanning the QR code from your mobile phone and follow the instruction."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Join a Wi-Fi by scanning the QR code from a mobile phone and follow the instructions.\n \n From an "<b>"Android Phone"</b>" go to Settings -> Network and Internet -> Wi-Fi -> Select a Wi-Fi -> Advanced -> Add device and then scan the QR code."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Press the back button to cancel"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continue"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Device storage"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Removable storage"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Reset"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Free up storage"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Clear cached data"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Free up <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Clears temporary files that take up space. Will not impact saved data like app preferences or offline videos, and you won\'t need to sign in to apps again."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Clear cached data?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"This will clear cached data for all apps."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Uninstall apps"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> is mounted"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Couldn\'t mount <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB storage reconnected"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Microphone"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Microphone access"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"App access to microphone"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Microphone access blocked"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"To unblock, move the privacy switch on your device to the microphone \'on position\' to allow microphone access."</string>
<string name="camera" msgid="1226671478936288283">"camera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Camera access"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"App access to camera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Camera access blocked"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"To unblock, move the privacy switch on your device to the camera\'s \'on position\' to allow camera access."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Microphone access: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"When turned on, all apps and services with permission can access any microphone on this device.\n\nAudio peripherals with a custom protocol will not be affected by this setting."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Camera access: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Yellow"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audio description"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Hear a description of what’s happening on screen in supported movies and shows"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Enable"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuration"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Use <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitoring"</string>
<string name="system_apps" msgid="8481888654606868074">"Apps"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Stay awake"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Screen will never sleep"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP checking"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimisation"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Restart now?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Power off HDMI devices with the TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV auto power on"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Power on the TV with HDMI device"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Connected Inputs</item>
- <item quantity="one">Connected Input</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Standby Inputs</item>
- <item quantity="one">Standby Input</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Unconnected Inputs</item>
- <item quantity="one">Unconnected Input</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Connected input}other{Connected inputs}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Standby input}other{Standby inputs}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Not connected input}other{Not connected inputs}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Restrict access to apps and other content in your account"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Restricted profile"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controlled by <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Create restricted profile"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Settings"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Allowed apps"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d apps allowed</item>
- <item quantity="one">1 app allowed</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Allowed"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Not allowed"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Customise restrictions"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Third-party source"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Permissions"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Application unavailable"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Unused apps"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirm"</string>
<string name="settings_cancel" msgid="576094334743686152">"Cancel"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"This permission allows an app to modify system settings."</string>
<string name="write_settings_on" msgid="71675710746513956">"Yes"</string>
<string name="write_settings_off" msgid="6730113471695092167">"No"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"All files access"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Allow access to manage all files"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Allow this app to read, modify and delete all files on this device or any connected storage volumes. If granted, app may access files without your explicit knowledge."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Allow picture-in-picture"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"No installed apps support picture-in-picture"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Allow apps to create a picture-in-picture window while the app is open or after you leave it (for example, to continue watching a video). This window displays on top of other apps that you\'re using."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Allow apps to set alarms and schedule time-sensitive actions. This lets the apps run in the background, which may use more power.\n\nIf this permission is off, existing alarms and time-based events scheduled by the app won’t work."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Turn screen on"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Allow turning the screen on"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Allow an app to turn the screen on. If granted, the app may turn on the screen at any time without your explicit intent."</string>
<string name="special_access" msgid="21806055758289916">"Special app access"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Data Saver"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Automatically adjust video quality to use less mobile data"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Data usage and alerts"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"You can connect to the Internet with Wi-Fi, Ethernet or your phone\'s hotspot. For more help, visit "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"You can connect to the Internet with Wi-Fi, Ethernet or your phone\'s hotspot."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Action not allowed"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Can’t change volume"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Power and energy"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Power-on behaviour"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Reset"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet pairing code"</string>
</resources>
diff --git a/Settings/res/values-en-rGB/strings.xml b/Settings/res/values-en-rGB/strings.xml
index 9f8ab3b..b92fc41 100644
--- a/Settings/res/values-en-rGB/strings.xml
+++ b/Settings/res/values-en-rGB/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Add an account."</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Accounts and sign-in"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"No accounts"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> accounts</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> account</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# account}other{# accounts}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Media services, Assistant, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Network and Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Sound"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apps"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Device Preferences"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Remotes and accessories"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"No connected Bluetooth devices"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accessories</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> accessory</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Display & sound"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Help and feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacy"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Factory data reset"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibration"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Energy saver"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Devices"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Select formats"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Surround Sound"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ENABLED FORMATS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"DISABLED FORMATS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"To disable, change the format selection to manual."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolution"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatic"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Resolution has been changed"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Select OK to use %1$s from now on."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Cancel"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Clear cached data?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"This will clear cached data for all apps."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Add accessory"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Pairing…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Connecting…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accessories"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Remote control"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Remote control settings"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Set up remote buttons"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Control volume, power, input on TVs, receivers and soundbars"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Connect"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Connect to %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Disconnect"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Not available"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Device admin apps"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"No active apps"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> active apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> active app</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Disabled by admin, encryption policy or credential storage"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Managed device info"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Changes & settings managed by your organisation"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"None"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Apps installed"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Number of apps is estimated. It may not include apps installed outside of the Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum # app}other{Minimum # apps}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Location permissions"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Microphone permissions"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Camera permissions"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Default apps"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}other{# apps}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Default keyboard"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Set to <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Always-on VPN turned on"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Trusted credentials"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Trusted credentials in your personal profile"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Trusted credentials in your work profile"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> CA certificates</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> CA certificate</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA certificate}other{# CA certificates}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Admin can lock the device and reset password"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Admin can delete all device data"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Failed password attempts before deleting all device data"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Failed password attempts before deleting work profile data"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> attempts</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> attempt</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# attempt}other{# attempts}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"This device is managed by your organisation."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"This device is managed by <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Learn more"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Camera apps</item>
- <item quantity="one">Camera app</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Camera app}other{Camera apps}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Calendar app"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Contacts app"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Email client apps</item>
- <item quantity="one">Email client app</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Email client app}other{Email client apps}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Map app"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Phone apps</item>
- <item quantity="one">Phone app</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Phone app}other{Phone apps}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Browser app"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS version"</string>
<string name="about_serial" msgid="3432319328808745459">"Serial number"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS build"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Ads"</string>
<string name="ads_description" msgid="8081069475265061074">"Manage your ads settings, such as resetting your advertising ID."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Ads, Manage your ads settings, such as resetting your advertising ID."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Additional system updates"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Network may be monitored"</string>
<string name="done_button" msgid="616159688526431451">"Done"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Trust or remove certificates</item>
- <item quantity="one">Trust or remove certificate</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities on your device, which may allow them to monitor your device network activity, including emails, apps and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> has installed a certificate authority on your device, which may allow them to monitor your device network activity, including emails, apps and secure websites.\n\nFor more information about this certificate, contact your admin.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities for your work profile, which may allow them to monitor work network activity, including emails, apps and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> has installed a certificate authority for your work profile, which may allow them to monitor work network activity, including emails, apps and secure websites.\n\nFor more information about this certificate, contact your admin.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"A third party is capable of monitoring your network activity, including emails, apps and secure websites.\n\nA trusted credential installed on your device is making this possible."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Check certificates</item>
- <item quantity="one">Check certificate</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Trust or remove certificate}other{Trust or remove certificates}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Network, serial numbers and other information"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Connect"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Forget network"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"This clears information used to connect to this network, including a saved password"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Join a Wi-Fi by scanning the QR code from your mobile phone and follow the instruction."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Join a Wi-Fi by scanning the QR code from a mobile phone and follow the instructions.\n \n From an "<b>"Android Phone"</b>" go to Settings -> Network & Internet -> Wi-Fi -> Select a Wi-Fi -> Advanced -> Add device and then scan the QR code."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Press the back button to cancel"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continue"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Device storage"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Removable storage"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Reset"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Free up storage"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Clear cached data"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Free up <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Clears temporary files that take up space. Will not impact saved data like app preferences or offline videos, and you won\'t need to sign in to apps again."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Clear cached data?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"This will clear cached data for all apps."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Uninstall apps"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> is mounted"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Couldn\'t mount <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB storage reconnected"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Microphone"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Microphone access"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"App access to microphone"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Microphone access blocked"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"To unblock, move the privacy switch on your device to the microphone \'on position\' to allow microphone access."</string>
<string name="camera" msgid="1226671478936288283">"camera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Camera access"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"App access to camera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Camera access blocked"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"To unblock, move the privacy switch on your device to the camera\'s \'on position\' to allow camera access."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Microphone access: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"When turned on, all apps and services with permission can access any microphone on this device.\n\nAudio peripherals with a custom protocol will not be affected by this setting."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Camera access: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Yellow"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audio description"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Hear a description of what’s happening on screen in supported movies and shows"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Enable"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuration"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Use <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitoring"</string>
<string name="system_apps" msgid="8481888654606868074">"Apps"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Stay awake"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Screen will never sleep"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP checking"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimisation"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Restart now?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Power off HDMI devices with the TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV auto power on"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Power on the TV with HDMI device"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Connected Inputs</item>
- <item quantity="one">Connected Input</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Standby Inputs</item>
- <item quantity="one">Standby Input</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Unconnected Inputs</item>
- <item quantity="one">Unconnected Input</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Connected input}other{Connected inputs}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Standby input}other{Standby inputs}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Not connected input}other{Not connected inputs}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Restrict access to apps and other content in your account"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Restricted profile"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controlled by <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Create restricted profile"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Settings"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Allowed apps"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d apps allowed</item>
- <item quantity="one">1 app allowed</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Allowed"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Not allowed"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Customise restrictions"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Third-party source"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Permissions"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Application unavailable"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Unused apps"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirm"</string>
<string name="settings_cancel" msgid="576094334743686152">"Cancel"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"This permission allows an app to modify system settings."</string>
<string name="write_settings_on" msgid="71675710746513956">"Yes"</string>
<string name="write_settings_off" msgid="6730113471695092167">"No"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"All files access"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Allow access to manage all files"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Allow this app to read, modify and delete all files on this device or any connected storage volumes. If granted, app may access files without your explicit knowledge."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Allow picture-in-picture"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"No installed apps support picture-in-picture"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Allow apps to create a picture-in-picture window while the app is open or after you leave it (for example, to continue watching a video). This window displays on top of other apps that you\'re using."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Allow apps to set alarms and schedule time-sensitive actions. This lets the apps run in the background, which may use more power.\n\nIf this permission is off, existing alarms and time-based events scheduled by the app won’t work."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Turn screen on"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Allow turning the screen on"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Allow an app to turn the screen on. If granted, the app may turn on the screen at any time without your explicit intent."</string>
<string name="special_access" msgid="21806055758289916">"Special app access"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Data Saver"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Automatically adjust video quality to use less mobile data"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Data usage and alerts"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"You can connect to the Internet with Wi-Fi, Ethernet or your phone\'s hotspot. For more help, visit "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"You can connect to the Internet with Wi-Fi, Ethernet or your phone\'s hotspot."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Action not allowed"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Can’t change volume"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Power and energy"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Power-on behaviour"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Reset"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet pairing code"</string>
</resources>
diff --git a/Settings/res/values-en-rIN/strings.xml b/Settings/res/values-en-rIN/strings.xml
index 9f8ab3b..b92fc41 100644
--- a/Settings/res/values-en-rIN/strings.xml
+++ b/Settings/res/values-en-rIN/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Add an account."</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Accounts and sign-in"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"No accounts"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> accounts</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> account</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# account}other{# accounts}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Media services, Assistant, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Network and Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Sound"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apps"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Device Preferences"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Remotes and accessories"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"No connected Bluetooth devices"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accessories</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> accessory</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Display & sound"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Help and feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacy"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Factory data reset"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibration"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Energy saver"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Devices"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Select formats"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Surround Sound"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ENABLED FORMATS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"DISABLED FORMATS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"To disable, change the format selection to manual."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolution"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatic"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Resolution has been changed"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Select OK to use %1$s from now on."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Cancel"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Clear cached data?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"This will clear cached data for all apps."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Add accessory"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Pairing…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Connecting…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accessories"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Remote control"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Remote control settings"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Set up remote buttons"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Control volume, power, input on TVs, receivers and soundbars"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Connect"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Connect to %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Disconnect"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Not available"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Device admin apps"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"No active apps"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> active apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> active app</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Disabled by admin, encryption policy or credential storage"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Managed device info"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Changes & settings managed by your organisation"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"None"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Apps installed"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Number of apps is estimated. It may not include apps installed outside of the Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum # app}other{Minimum # apps}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Location permissions"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Microphone permissions"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Camera permissions"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Default apps"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}other{# apps}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Default keyboard"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Set to <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Always-on VPN turned on"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Trusted credentials"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Trusted credentials in your personal profile"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Trusted credentials in your work profile"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> CA certificates</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> CA certificate</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA certificate}other{# CA certificates}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Admin can lock the device and reset password"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Admin can delete all device data"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Failed password attempts before deleting all device data"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Failed password attempts before deleting work profile data"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> attempts</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> attempt</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# attempt}other{# attempts}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"This device is managed by your organisation."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"This device is managed by <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Learn more"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Camera apps</item>
- <item quantity="one">Camera app</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Camera app}other{Camera apps}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Calendar app"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Contacts app"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Email client apps</item>
- <item quantity="one">Email client app</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Email client app}other{Email client apps}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Map app"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Phone apps</item>
- <item quantity="one">Phone app</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Phone app}other{Phone apps}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Browser app"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS version"</string>
<string name="about_serial" msgid="3432319328808745459">"Serial number"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS build"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Ads"</string>
<string name="ads_description" msgid="8081069475265061074">"Manage your ads settings, such as resetting your advertising ID."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Ads, Manage your ads settings, such as resetting your advertising ID."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Additional system updates"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Network may be monitored"</string>
<string name="done_button" msgid="616159688526431451">"Done"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Trust or remove certificates</item>
- <item quantity="one">Trust or remove certificate</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities on your device, which may allow them to monitor your device network activity, including emails, apps and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> has installed a certificate authority on your device, which may allow them to monitor your device network activity, including emails, apps and secure websites.\n\nFor more information about this certificate, contact your admin.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities for your work profile, which may allow them to monitor work network activity, including emails, apps and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> has installed a certificate authority for your work profile, which may allow them to monitor work network activity, including emails, apps and secure websites.\n\nFor more information about this certificate, contact your admin.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"A third party is capable of monitoring your network activity, including emails, apps and secure websites.\n\nA trusted credential installed on your device is making this possible."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Check certificates</item>
- <item quantity="one">Check certificate</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Trust or remove certificate}other{Trust or remove certificates}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Network, serial numbers and other information"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Connect"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Forget network"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"This clears information used to connect to this network, including a saved password"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Join a Wi-Fi by scanning the QR code from your mobile phone and follow the instruction."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Join a Wi-Fi by scanning the QR code from a mobile phone and follow the instructions.\n \n From an "<b>"Android Phone"</b>" go to Settings -> Network & Internet -> Wi-Fi -> Select a Wi-Fi -> Advanced -> Add device and then scan the QR code."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Press the back button to cancel"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continue"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Device storage"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Removable storage"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Reset"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Free up storage"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Clear cached data"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Free up <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Clears temporary files that take up space. Will not impact saved data like app preferences or offline videos, and you won\'t need to sign in to apps again."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Clear cached data?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"This will clear cached data for all apps."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Uninstall apps"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> is mounted"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Couldn\'t mount <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB storage reconnected"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Microphone"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Microphone access"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"App access to microphone"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Microphone access blocked"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"To unblock, move the privacy switch on your device to the microphone \'on position\' to allow microphone access."</string>
<string name="camera" msgid="1226671478936288283">"camera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Camera access"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"App access to camera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Camera access blocked"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"To unblock, move the privacy switch on your device to the camera\'s \'on position\' to allow camera access."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Microphone access: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"When turned on, all apps and services with permission can access any microphone on this device.\n\nAudio peripherals with a custom protocol will not be affected by this setting."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Camera access: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Yellow"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audio description"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Hear a description of what’s happening on screen in supported movies and shows"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Enable"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuration"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Use <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitoring"</string>
<string name="system_apps" msgid="8481888654606868074">"Apps"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Stay awake"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Screen will never sleep"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP checking"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimisation"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Restart now?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Power off HDMI devices with the TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV auto power on"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Power on the TV with HDMI device"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Connected Inputs</item>
- <item quantity="one">Connected Input</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Standby Inputs</item>
- <item quantity="one">Standby Input</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Unconnected Inputs</item>
- <item quantity="one">Unconnected Input</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Connected input}other{Connected inputs}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Standby input}other{Standby inputs}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Not connected input}other{Not connected inputs}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Restrict access to apps and other content in your account"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Restricted profile"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controlled by <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Create restricted profile"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Settings"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Allowed apps"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d apps allowed</item>
- <item quantity="one">1 app allowed</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Allowed"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Not allowed"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Customise restrictions"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Third-party source"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Permissions"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Application unavailable"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Unused apps"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirm"</string>
<string name="settings_cancel" msgid="576094334743686152">"Cancel"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"This permission allows an app to modify system settings."</string>
<string name="write_settings_on" msgid="71675710746513956">"Yes"</string>
<string name="write_settings_off" msgid="6730113471695092167">"No"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"All files access"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Allow access to manage all files"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Allow this app to read, modify and delete all files on this device or any connected storage volumes. If granted, app may access files without your explicit knowledge."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Allow picture-in-picture"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"No installed apps support picture-in-picture"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Allow apps to create a picture-in-picture window while the app is open or after you leave it (for example, to continue watching a video). This window displays on top of other apps that you\'re using."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Allow apps to set alarms and schedule time-sensitive actions. This lets the apps run in the background, which may use more power.\n\nIf this permission is off, existing alarms and time-based events scheduled by the app won’t work."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Turn screen on"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Allow turning the screen on"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Allow an app to turn the screen on. If granted, the app may turn on the screen at any time without your explicit intent."</string>
<string name="special_access" msgid="21806055758289916">"Special app access"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Data Saver"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Automatically adjust video quality to use less mobile data"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Data usage and alerts"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"You can connect to the Internet with Wi-Fi, Ethernet or your phone\'s hotspot. For more help, visit "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"You can connect to the Internet with Wi-Fi, Ethernet or your phone\'s hotspot."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Action not allowed"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Can’t change volume"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Power and energy"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Power-on behaviour"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Reset"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet pairing code"</string>
</resources>
diff --git a/Settings/res/values-en-rXC/strings.xml b/Settings/res/values-en-rXC/strings.xml
index eb54b1b..103a447 100644
--- a/Settings/res/values-en-rXC/strings.xml
+++ b/Settings/res/values-en-rXC/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Add an account"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Accounts & sign-in"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"No accounts"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> accounts</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> account</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# account}other{# accounts}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Media services, Assistant, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Network & Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Sound"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apps"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Device Preferences"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Remotes & accessories"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"No connected Bluetooth devices"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accessories</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> accessory</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Display & Sound"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Help & Feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacy"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Factory data reset"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibration"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Energy saver"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Devices"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Select formats"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Surround Sound"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ENABLED FORMATS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"DISABLED FORMATS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"To disable, change the format selection to Manual."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolution"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatic"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Resolution has been changed"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Select OK to use %1$s from now on."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Cancel"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Clear cached data?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"This will clear cached data for all apps."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Add accessory"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Pairing…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Connecting…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accessories"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Remote Control"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Remote control settings"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Set up remote buttons"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Control volume, power, input on TVs, receivers and soundbars"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Connect"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Connect to %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Disconnect"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Not available"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Device admin apps"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"No active apps"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> active apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> active app</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Disabled by admin, encryption policy, or credential storage"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Managed device info"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Changes & settings managed by your organization"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"None"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Apps installed"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Number of apps is estimated. It may not include apps installed outside of the Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum # app}other{Minimum # apps}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Location permissions"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Microphone permissions"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Camera permissions"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Default apps"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}other{# apps}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Default keyboard"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Set to <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Always-on VPN turned on"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Trusted credentials"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Trusted credentials in your personal profile"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Trusted credentials in your work profile"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> CA certificates</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> CA certificate</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA certificate}other{# CA certificates}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Admin can lock the device and reset password"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Admin can delete all device data"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Failed password attempts before deleting all device data"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Failed password attempts before deleting work profile data"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> attempts</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> attempt</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# attempt}other{# attempts}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"This device is managed by your organization."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"This device is managed by <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Learn more"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Camera apps</item>
- <item quantity="one">Camera app</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Camera app}other{Camera apps}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Calendar app"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Contacts app"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Email client apps</item>
- <item quantity="one">Email client app</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Email client app}other{Email client apps}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Map app"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Phone apps</item>
- <item quantity="one">Phone app</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Phone app}other{Phone apps}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Browser app"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS version"</string>
<string name="about_serial" msgid="3432319328808745459">"Serial number"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS build"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Ads"</string>
<string name="ads_description" msgid="8081069475265061074">"Manage your ads settings, such as resetting your advertising ID."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Ads, Manage your ads settings, such as resetting your advertising ID."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Additional system updates"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Network may be monitored"</string>
<string name="done_button" msgid="616159688526431451">"Done"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Trust or remove certificates</item>
- <item quantity="one">Trust or remove certificate</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities on your device, which may allow them to monitor your device network activity, including emails, apps, and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> has installed a certificate authority on your device, which may allow them to monitor your device network activity, including emails, apps, and secure websites.\n\nFor more information about this certificate, contact your admin.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> has installed certificate authorities for your work profile, which may allow them to monitor work network activity, including emails, apps, and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> has installed a certificate authority for your work profile, which may allow them to monitor work network activity, including emails, apps, and secure websites.\n\nFor more information about this certificate, contact your admin.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"A third party is capable of monitoring your network activity, including emails, apps, and secure websites.\n\nA trusted credential installed on your device is making this possible."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Check certificates</item>
- <item quantity="one">Check certificate</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Trust or remove certificate}other{Trust or remove certificates}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Network, serial numbers and other information"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Connect"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Forget network"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"This clears information used to connect to this network, including a saved password"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Join a Wifi by scanning the QR code from your mobile phone and follow the instruction."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Join a Wi-Fi by scanning the QR code from a mobile phone and follow the instructions.\n \n From an "<b>"Android Phone"</b>" go to Settings -> Network & internet -> Wi-Fi -> Select a Wi-Fi -> Advanced -> Add device and then scan the QR code."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Press the back button to cancel"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continue"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Device storage"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Removable storage"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Reset"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Free up storage"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Clear cached data"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Free up <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Clears temporary files that take up space. Will not impact saved data like app preferences or offline videos, and you won\'t need to sign in to apps again."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Clear cached data?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"This will clear cached data for all apps."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Uninstall apps"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> is mounted"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Couldn\'t mount <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB storage reconnected"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Microphone"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Microphone access"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"App access to microphone"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Microphone access blocked"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"To unblock, move the privacy switch on your device to the microphone on position to allow microphone access."</string>
<string name="camera" msgid="1226671478936288283">"Camera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Camera access"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"App access to camera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Camera access blocked"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"To unblock, move the privacy switch on your device to the camera on position to allow camera access."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Microphone Access: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"When turned on, all apps and services with permission can access any microphone on this device.\n\nAudio peripherals with a custom protocol will not be affected by this setting."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Camera Access: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Yellow"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audio description"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Hear a description of what’s happening on screen in supported movies and shows"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Enable"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuration"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Use <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitoring"</string>
<string name="system_apps" msgid="8481888654606868074">"Apps"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Stay awake"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Screen will never sleep"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP checking"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimization"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Restart now?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Power off HDMI devices with the TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV auto power on"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Power on the TV with HDMI device"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Connected Inputs</item>
- <item quantity="one">Connected Input</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Standby Inputs</item>
- <item quantity="one">Standby Input</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Not Connected Inputs</item>
- <item quantity="one">Not Connected Input</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Connected Input}other{Connected Inputs}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Standby Input}other{Standby Inputs}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Not Connected Input}other{Not Connected Inputs}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Restrict access to apps and other content in your account"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Restricted Profile"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controlled by <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Create restricted profile"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Settings"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Allowed apps"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d apps allowed</item>
- <item quantity="one">1 app allowed</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Allowed"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Not allowed"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Customize restrictions"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Third Party Source"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Permissions"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Application unavailable"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Unused apps"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirm"</string>
<string name="settings_cancel" msgid="576094334743686152">"Cancel"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"This permission allows an app to modify system settings."</string>
<string name="write_settings_on" msgid="71675710746513956">"Yes"</string>
<string name="write_settings_off" msgid="6730113471695092167">"No"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"All files access"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Allow access to manage all files"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Allow this app to read, modify and delete all files on this device or any connected storage volumes. If granted, app may access files without your explicit knowledge."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Allow picture-in-picture"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"No installed apps support Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Allow apps to create a picture-in-picture window while the app is open or after you leave it (for example, to continue watching a video). This window displays on top of other apps you\'re using."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Allow apps to set alarms and schedule time-sensitive actions. This lets the apps run in the background, which may use more power.\n\nIf this permission is off, existing alarms and time-based events scheduled by the app won’t work."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Turn screen on"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Allow turning the screen on"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Allow an app to turn the screen on. If granted, the app may turn on the screen at any time without your explicit intent."</string>
<string name="special_access" msgid="21806055758289916">"Special app access"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Data Saver"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Automatically adjust video quality to use less mobile data"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Data usage and alerts"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"You can connect to the internet with Wi-Fi, Ethernet, or your phone\'s hotspot. For more help, visit "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"You can connect to the internet with Wi-Fi, Ethernet, or your phone\'s hotspot."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Action not allowed"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Can’t change volume"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Power & Energy"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Power on behavior"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Reset"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet pairing code"</string>
</resources>
diff --git a/Settings/res/values-es-rUS/strings.xml b/Settings/res/values-es-rUS/strings.xml
index 47e6bbf..97def6c 100644
--- a/Settings/res/values-es-rUS/strings.xml
+++ b/Settings/res/values-es-rUS/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Agregar una cuenta"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Cuentas y acceso"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"No se accedió con ninguna cuenta"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> cuentas</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> cuenta</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# cuenta}other{# cuentas}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Servicios multimedia, Asistente, Pagos"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Internet y red"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Sonido"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apps"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Preferencias del dispositivo"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Control remoto y accesorios"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"No hay ningún dispositivo Bluetooth conectado"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accesorios</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> accesorio</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Pantalla y sonido"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Ayuda y comentarios"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacidad"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Restablecimiento de la configuración de fábrica"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibración"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Ahorro de batería"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Dispositivos"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Seleccionar formatos"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Sonido envolvente"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMATOS HABILITADOS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMATOS INHABILITADOS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Para inhabilitarlo, cambia la selección de formato a Manual."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolución"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automática"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Se cambió la resolución"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Seleccionar Aceptar para usar %1$s a partir de ahora."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Cancelar"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Aceptar"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"¿Deseas borrar los datos almacenados en caché?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Se borrarán los datos almacenados en caché de todas las aplicaciones."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Agregar accesorio"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Vinculando…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Conectando…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accesorios"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Control remoto"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Configuración del control remoto"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Configura botones de control remoto"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Controla el volumen, el encendido y la entrada en TVs, receptores y barras de sonido"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Conectar"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Conectar a %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Desconectar"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"No disponible"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Apps de administración"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"No hay apps activas"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps activas</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app activa</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Inhabilitada: admin, encriptación o credenciales"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Información del dispositivo administrado"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Cambios y opciones de configuración que administra tu organización"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"No se realizó ninguna acción"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Apps instaladas"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"La cantidad de apps es aproximada. Es posible que no se cuenten las apps que no hayas instalado desde Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Al menos <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one">Al menos <xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Al menos # app}other{Al menos # apps}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Permisos de ubicación"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Permisos de micrófono"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Permisos de cámara"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Apps predeterminadas"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}other{# apps}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Teclado predeterminado"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Se configuró en <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Se activó la función \"VPN siempre activada\""</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Credenciales de confianza"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Credenciales de confianza en tu perfil personal"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Credenciales de confianza en tu perfil de trabajo"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Al menos <xliff:g id="COUNT_1">%d</xliff:g> certificados de CA</item>
- <item quantity="one">Al menos <xliff:g id="COUNT_0">%d</xliff:g> certificado de CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certificado de CA}other{# certificado de CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"El administrador puede bloquear el dispositivo y reestablecer la contraseña"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"El administrador puede borrar todos los datos del dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Intentos fallidos para ingresar la contraseña antes de borrar los datos del dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Intentos fallidos para ingresar la contraseña antes de borrar los datos del perfil de trabajo"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> intentos</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> intento</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# intento}other{# intentos}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Tu organización administra este dispositivo."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> administra este dispositivo."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Más información"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Apps de Cámara</item>
- <item quantity="one">App de Cámara</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{App de cámara}other{Apps de cámara}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"App de calendario"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"App de contactos"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Apps de cliente de correo electrónico</item>
- <item quantity="one">App de cliente de correo electrónico</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{App de correo electrónico}other{Apps de correo electrónico}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"App de mapas"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Apps de Teléfono</item>
- <item quantity="one">App de Teléfono</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{App de teléfono}other{Apps de teléfono}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"App de navegador"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Versión del SO de Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Número de serie"</string>
<string name="about_build" msgid="8467840394761634575">"Compilación del SO de Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Ahora estás a <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> pasos de ser un programador.</item>
- <item quantity="one">Ahora estás a <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> paso de ser un programador.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Estás a # paso de convertirte en desarrollador.}other{Estás a # pasos de convertirte en desarrollador.}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Anuncios"</string>
<string name="ads_description" msgid="8081069475265061074">"Cambia ajustes de anuncios, como restablecer tu ID de publicidad."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Google Ads: Cambia la configuración de anuncios, como restablecer tu ID de publicidad."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Actualizaciones adicionales del sistema"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Es posible que la red esté supervisada"</string>
<string name="done_button" msgid="616159688526431451">"Listo"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Confiar en los certificados o quitarlos</item>
- <item quantity="one">Confiar en el certificado o quitarlo</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instaló certificados de autoridad en tu dispositivo, lo que les permitirá supervisar la actividad de la red del dispositivo, como los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre este certificado, comunícate con tu administrador.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> instaló un certificado de autoridad en tu dispositivo, lo que les permitirá supervisar la actividad de la red del dispositivo, como los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre este certificado, comunícate con tu administrador.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instaló certificados de autoridad para tu perfil de trabajo, lo que les permitirá supervisar la actividad de la red laboral, como los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre este certificado, comunícate con tu administrador.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> instaló un certificado de autoridad para tu perfil de trabajo, lo que les permitirá supervisar la actividad de la red laboral, como los correos electrónicos, las apps y los sitios web seguros.\n\nPara obtener más información sobre este certificado, comunícate con tu administrador.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Un tercero puede supervisar tu actividad en la red, incluido el correo electrónico, las aplicaciones y los sitios web seguros.\n\nEsto ocurre porque hay una credencial de confianza instalada en el dispositivo."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Revisar certificados</item>
- <item quantity="one">Revisar certificado</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Confiar en el certificado o quitarlo}other{Confiar en los certificados o quitarlos}}"</string>
<string name="device_status" msgid="8266002761193692207">"Estado"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Red, números de serie y otra información"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Conectar"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Borrar red"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Esto borrará los datos que se usan para conectarse a la red, incluida la contraseña guardada."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Únete a una red Wi-Fi escaneando el código QR en tu teléfono celular y siguiendo la instrucción."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Únete a una red Wi-Fi escaneando el código QR en tu teléfono celular y siguiendo las instrucciones.\n \n Desde un "<b>"teléfono Android"</b>" ve a Configuración -> Redes e Internet -> Wi-Fi -> Seleccionar red Wi-Fi -> Avanzada -> Agregar dispositivo y escanear código QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Presiona el botón Atrás para cancelar"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Aceptar"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continuar"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Almacenamiento del dispositivo"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Almacenamiento extraíble"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Restablecer"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Libera espacio de almacenamiento"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Borra los datos almacenados en caché"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Libera <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Borra temporalmente los archivos que ocupan espacio. Esta acción no tendrá impacto en los datos guardados, como preferencias de apps y videos sin conexión, y no tendrás que volver a acceder en las apps."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"¿Deseas borrar los datos almacenados en caché?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Se borrarán los datos en caché de todas las apps"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Desinstala apps"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Se activó <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"No se pudo activar <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Se volvió a conectar el almacenamiento USB"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Micrófono"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Acceso al micrófono"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Accesos de las apps al micrófono"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Acceso al micrófono bloqueado"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Para desbloquearlo, mueve el interruptor de privacidad del dispositivo a la posición de micrófono activado para permitir el acceso al micrófono."</string>
<string name="camera" msgid="1226671478936288283">"Cámara"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Acceso a la cámara"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Accesos de las apps a la cámara"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Acceso a la cámara bloqueado"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Para desbloquearlo, mueve el interruptor de privacidad del dispositivo a la posición de cámara activada para permitir el acceso a la cámara."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Acceso al micrófono: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Cuando se activa, todos los servicios y las apps con los permisos correspondientes pueden acceder a cualquiera de los micrófonos de este dispositivo.\n\nLos periféricos del audio con protocolo personalizado no se verán afectados por este parámetro de configuración."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Acceso a la cámara: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cian"</string>
<string name="color_yellow" msgid="3519470952904560404">"Amarillo"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audiodescripción"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Escucha una descripción de lo que ocurre en pantalla en películas y programas compatibles"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Habilitar"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuración"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"¿Usar <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Supervisión"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplicaciones"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Mantener activo"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Nunca se suspenderá la pantalla"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Comprobación HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Optimización HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"¿Reiniciar ahora?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Apagar dispositivos HDMI con el televisor"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Encendido autom. del televisor"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Encender el televisor con dispositivo HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Entradas conectadas</item>
- <item quantity="one">Entrada conectada</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Entradas en espera</item>
- <item quantity="one">Entrada en espera</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Entradas no conectadas</item>
- <item quantity="one">Entrada no conectada</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Entrada conectada}other{Entradas conectadas}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Entrada en espera}other{Entradas en espera}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Entrada no conectada}other{Entradas no conectadas}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Restringir el acceso a las aplicaciones y a otro contenido de la cuenta"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Perfil restringido"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controladas por <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Crear perfil restringido"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Configuración"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Aplicaciones permitidas"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d aplicaciones permitidas</item>
- <item quantity="one">1 aplicación permitida</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Permitido"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"No permitido"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Personalizar restricciones"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Fuente externa"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Permisos"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"La aplicación no está disponible"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Apps que no usas"</string>
<string name="settings_ok" msgid="5950888975075541964">"Aceptar"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirmar"</string>
<string name="settings_cancel" msgid="576094334743686152">"Cancelar"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Cuando se otorga este permiso, la app puede modificar la configuración del sistema."</string>
<string name="write_settings_on" msgid="71675710746513956">"Sí"</string>
<string name="write_settings_off" msgid="6730113471695092167">"No"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Acceso a todos los archivos"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Permitir administrar todos los archivos"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Permite que esta app lea, modifique y borre todos los archivos en el dispositivo o cualquier volumen de almacenamiento conectado. Si habilitas el permiso, es posible que la app acceda a archivos sin tu conocimiento explícito."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Pantalla en pantalla"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Permitir pantalla en pantalla"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Ninguna de las apps instaladas es compatible con el modo de imagen en imagen"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Permite que las apps creen una ventana de pantalla en pantalla mientras estén abiertas o después de que hayas salido de ellas (por ejemplo, para seguir viendo un video). Esta ventana se muestra sobre otras apps que estés usando."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Permite que las apps establezcan alarmas y programen acciones para horarios específicos. De esta manera, las apps pueden ejecutarse en segundo plano, lo que podría aumentar el consumo de batería.\n\nSi se desactiva este permiso, no funcionarán las alarmas ni los eventos basados en el tiempo existentes que programe esta app."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Activar pantalla"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Permitir activación de la pantalla"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Permiso para que una app active la pantalla. Si se otorga, la app podría activar la pantalla en cualquier momento sin que lo pidas de manera explícita."</string>
<string name="special_access" msgid="21806055758289916">"Acceso especial de apps"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Ahorro de datos"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Ajustar automáticamente la calidad de video para usar menos datos móviles"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Uso de datos y alertas"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Puedes conectarte a Internet mediante una red Wi-Fi, Ethernet o el hotspot del teléfono. Puedes obtener ayuda adicional en "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Puedes conectarte a Internet mediante una red Wi-Fi, Ethernet o el hotspot del teléfono."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Acción no permitida"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"No se puede cambiar el volumen"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Encendido y energía"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Comportamiento cuando se enciende la TV"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Restablecimiento"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Código de vinculación de Ethernet"</string>
</resources>
diff --git a/Settings/res/values-es/strings.xml b/Settings/res/values-es/strings.xml
index 337a8fe..4cdbe5c 100644
--- a/Settings/res/values-es/strings.xml
+++ b/Settings/res/values-es/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Añadir una cuenta"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Cuentas e inicio de sesión"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"No hay ninguna cuenta"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> cuentas</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> cuenta</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# cuenta}other{# cuentas}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Servicios multimedia, el Asistente y pagos"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Redes e Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Sonido"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplicaciones"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Preferencias del dispositivo"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Mandos y accesorios"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"No hay dispositivos Bluetooth conectados"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accesorios</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> accesorio</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Pantalla y sonido"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Ayuda y comentarios"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacidad"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Restablecer estado de fábrica"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibración"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Ahorro de energía"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Dispositivos"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Seleccionar formatos"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Sonido envolvente"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMATOS HABILITADOS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMATOS INHABILITADOS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Para poder inhabilitarlo, cambia la selección de formato para que sea manual."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolución"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automática"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Resolución cambiada"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Selecciona Aceptar para usar %1$s a partir de ahora."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Cancelar"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Aceptar"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"¿Borrar datos almacenados en caché?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Se borrarán datos en caché de las aplicaciones."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Añadir accesorio"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Vinculando…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Estableciendo conexión..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accesorios"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Mando"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Configuración del mando"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Configurar botones del mando"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Controla el volumen, el encendido y la fuente de entrada de televisiones, receptores AV y barras de sonido"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Conectar"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Conectarse a %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Desconectar"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"No disponible"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Aplicaciones del administrador de dispositivos"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"No hay aplicaciones activas"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplicaciones activas</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplicación activa</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Inhabilitada por admin., política cifrado o almac. creden."</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Información sobre el dispositivo administrado"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Cambios y ajustes administrados por tu organización"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Ninguno"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Aplicaciones instaladas"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"El número de aplicaciones es aproximado. Quizá no se incluyan aplicaciones instaladas que no sean de Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Al menos <xliff:g id="COUNT_1">%d</xliff:g> aplicaciones</item>
- <item quantity="one">Al menos <xliff:g id="COUNT_0">%d</xliff:g> aplicación</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Al menos # aplicación}other{Al menos # aplicaciones}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Permisos de acceso a la ubicación"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Permisos de acceso al micrófono"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Permisos de acceso a la cámara"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Aplicaciones predeterminadas"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplicaciones</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplicación</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplicación}other{# aplicaciones}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Teclado predeterminado"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Método seleccionado: <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Se ha activado el modo de VPN siempre activada"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Credenciales de confianza"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Credenciales de confianza en tu perfil personal"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Credenciales de confianza en tu perfil de trabajo"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Al menos <xliff:g id="COUNT_1">%d</xliff:g> certificados AC</item>
- <item quantity="one">Al menos <xliff:g id="COUNT_0">%d</xliff:g> certificado AC</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certificado AC}other{# certificados AC}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"El administrador puede bloquear el dispositivo y cambiar la contraseña"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"El administrador puede eliminar todos los datos del dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Intentos fallidos de introducir la contraseña antes de borrar todos los datos del dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Intentos fallidos de introducir la contraseña antes de borrar los datos del perfil de trabajo"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> intentos</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> intento</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# intento}other{# intentos}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Este dispositivo está administrado por tu organización."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> administra este dispositivo."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Más información"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Aplicaciones de cámara</item>
- <item quantity="one">Aplicación de cámara</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Aplicación de cámara}other{Aplicaciones de cámara}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Aplicación de calendario"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplicación de contactos"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Aplicaciones de cliente de correo</item>
- <item quantity="one">Aplicación de cliente de correo</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Aplicación de cliente de correo}other{Aplicaciones de cliente de correo}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Aplicación de mapas"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Aplicaciones de teléfono</item>
- <item quantity="one">Aplicación de teléfono</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Aplicación de teléfono}other{Aplicaciones de teléfono}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Aplicación de navegador"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g> y <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g> y <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Versión del SO de Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Número de serie"</string>
<string name="about_build" msgid="8467840394761634575">"Compilación del SO de Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Solo te quedan <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> pasos para ser un desarrollador</item>
- <item quantity="one">Solo te queda <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> paso para ser un desarrollador</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Estás a # paso de habilitar las opciones para desarrolladores}other{Estás a # pasos de habilitar las opciones para desarrolladores}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Anuncios"</string>
<string name="ads_description" msgid="8081069475265061074">"Gestiona los ajustes de anuncios, como el de restablecer tu ID de publicidad."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Anuncios, Gestiona la configuración de anuncios, como cambiar tu ID de publicidad."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Otras actualizac. sistem."</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Puede que la red esté supervisada"</string>
<string name="done_button" msgid="616159688526431451">"Hecho"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Confía en los certificados o quítalos</item>
- <item quantity="one">Confía en un certificado o quítalo</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ha instalado autoridades de certificación en tu dispositivo. Con ellas, quizá pueda monitorizar la actividad de red de tu dispositivo, incluidos correos, aplicaciones y sitios web seguros.\n\nPara obtener más información sobre estos certificados, contacta con tu administrador.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ha instalado una autoridad de certificación en tu dispositivo. Con ella, quizá pueda monitorizar la actividad de red de tu dispositivo, incluidos correos, aplicaciones y sitios web seguros.\n\nPara obtener más información sobre este certificado, contacta con tu administrador.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ha instalado autoridades de certificación en tu perfil de trabajo. Con ellas, quizá pueda monitorizar la actividad de red del perfil trabajo, incluidos correos, aplicaciones y sitios web seguros.\n\nPara obtener más información sobre estos certificados, contacta con tu administrador.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ha instalado una autoridad de certificación en tu perfil de trabajo. Con ella, quizá pueda monitorizar la actividad de red del perfil trabajo, incluidos correos, aplicaciones y sitios web seguros.\n\nPara obtener más información sobre este certificado, contacta con tu administrador.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Un tercero puede supervisar tu actividad de la red, incluidos los correos electrónicos, las aplicaciones y los sitios web seguros.\n\nEsto es posible por una credencial de confianza instalada en tu dispositivo."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Comprobar certificados</item>
- <item quantity="one">Comprobar certificado</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Confía en un certificado o quítalo}other{Confía en los certificados o quítalos}}"</string>
<string name="device_status" msgid="8266002761193692207">"Estado"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Red, números de serie y otra información"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Conectar"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Olvidar red"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Se borrará la información usada para conectarse a esta red (incluidas las contraseñas guardadas)."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Únete a una red Wi-Fi escaneando el código QR con tu teléfono móvil y siguiendo las instrucciones."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Únete a una red Wi-Fi escaneando el código QR con un teléfono móvil y siguiendo las instrucciones.\n \n Desde un "<b>"teléfono Android"</b>", ve a Ajustes -> Redes e internet -> Wi-Fi -> Selecciona una red Wi-Fi -> Avanzado -> Añadir dispositivo y escanea el código QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Pulsa el botón para volver si quieres cancelar"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Aceptar"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continuar"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Almacenamiento del dispositivo"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Almacenamiento extraíble"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Restablecer"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Liberar espacio de almacenamiento"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Borrar datos almacenados en caché"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Liberar <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Se borrarán archivos temporales que ocupan espacio. No se eliminarán datos guardados, como las preferencias de las aplicaciones o los vídeos descargados. No tendrás que iniciar sesión de nuevo en las aplicaciones."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"¿Borrar datos almacenados en caché?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Se borrarán datos en caché de las aplicaciones."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Desinstalar aplicaciones"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> se ha activado"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Error al montar <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Se ha vuelto a conectar el almacenamiento USB"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Micrófono"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Acceso al micrófono"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Acceso de las aplicaciones al micrófono"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Acceso al micrófono bloqueado"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Para desbloquearlo, mueve el interruptor de privacidad de tu dispositivo a la posición \"activado\" del micrófono para permitir el acceso al micrófono."</string>
<string name="camera" msgid="1226671478936288283">"Cámara"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Acceso a la cámara"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Acceso de las aplicaciones a la cámara"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Acceso a la cámara bloqueado"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Para desbloquearlo, mueve el interruptor de privacidad de tu dispositivo a la posición \"activado\" de la cámara para permitir el acceso a la cámara."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Acceso al micrófono: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Cuando este ajuste está activado, todas las aplicaciones y todos los servicios que tengan permiso podrán acceder a cualquier micrófono de este dispositivo.\n\nEste ajuste no afecta a los periféricos de audio que tienen un protocolo personalizado."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Acceso a la cámara: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cian"</string>
<string name="color_yellow" msgid="3519470952904560404">"Amarillo"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audiodescripción"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Escucha una descripción de lo que está ocurriendo en pantalla en las películas y series que lo permitan"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Habilitar"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Ajustes"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"¿Usar <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Supervisión"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplicaciones"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Pantalla siempre encendida al cargar"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"La pantalla nunca se apagará"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Comprobación de HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Optimización HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"¿Reiniciar ahora?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Apagar dispositivos HDMI con TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Encendido automático de TV"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Encender la TV con dispositivo HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Entradas conectadas</item>
- <item quantity="one">Entrada conectada</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Entradas en espera</item>
- <item quantity="one">Entrada en espera</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Entradas no conectadas</item>
- <item quantity="one">Entrada no conectada</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Entrada conectada}other{Entradas conectadas}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Entrada en espera}other{Entradas en espera}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Entrada no conectada}other{Entradas no conectadas}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Restringe el acceso a las aplicaciones y a otros contenidos de tu cuenta"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Perfil restringido"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controladas por <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Crear perfil restringido"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Ajustes"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Aplicaciones permitidas"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d aplicaciones permitidas</item>
- <item quantity="one">1 aplicación permitida</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Permitido"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"No permitido"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Personalizar restricciones"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Fuente externa"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Permisos"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplicación no disponible"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Aplicaciones no usadas"</string>
<string name="settings_ok" msgid="5950888975075541964">"Aceptar"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirmar"</string>
<string name="settings_cancel" msgid="576094334743686152">"Cancelar"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Este permiso permite que una aplicación modifique los ajustes del sistema."</string>
<string name="write_settings_on" msgid="71675710746513956">"Sí"</string>
<string name="write_settings_off" msgid="6730113471695092167">"No"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Acceso a todos los archivos"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Dar acceso para gestionar todos los archivos"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Permite que esta aplicación lea, modifique y elimine todos los archivos de este dispositivo o de cualquier volumen de almacenamiento conectado. Si le das permiso, podrá acceder a archivos sin avisarte expresamente."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Imagen en imagen"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Permitir imagen en imagen"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Las aplicaciones instaladas no admiten el modo imagen en imagen"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Permite que las aplicaciones creen una ventana imagen en imagen mientras estén abiertas o después de que hayas salido de ellas (por ejemplo, para seguir viendo un vídeo). La ventana se muestra sobre otras aplicaciones que estés utilizando."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Permite que las aplicaciones programen alarmas y otras acciones que se llevan a cabo a horas concretas. Esta función hace que las aplicaciones sigas activas en segundo plano, lo que puede usar más batería.\n\nSi este permiso está desactivado, no funcionarán las alarmas ni los eventos que se activan a una hora determinada programados por esta aplicación."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Encender pantalla"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Permitir encender la pantalla"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Permite que una aplicación encienda la pantalla. Si das este permiso, la aplicación puede encender la pantalla en cualquier momento sin que se lo pidas."</string>
<string name="special_access" msgid="21806055758289916">"Aplicaciones con accesos especiales"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Ahorro de datos"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Ajustar automáticamente la calidad de vídeo para usar menos datos móviles"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Uso de datos y alertas"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Puedes conectarte a Internet a través de una red Wi‑Fi, de Ethernet o del punto de acceso de tu teléfono. Consulta más información en "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Puedes conectarte a Internet a través de una red Wi‑Fi, de un cable Ethernet o del punto de acceso de tu teléfono."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Acción no permitida"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"No se puede cambiar el volumen"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Alimentación y energía"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Comportamiento al encenderse"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Restablecer"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Código de emparejamiento de Ethernet"</string>
</resources>
diff --git a/Settings/res/values-et/strings.xml b/Settings/res/values-et/strings.xml
index 4c28d29..4f72bc8 100644
--- a/Settings/res/values-et/strings.xml
+++ b/Settings/res/values-et/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Konto lisamine"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Kontod ja sisselogimine"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Kontod puuduvad"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> kontot</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> konto</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# konto}other{# kontot}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Meediateenused, assistent, maksed"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Võrk ja internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Heli"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Rakendused"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Seadme eelistused"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Kaugjuhtimisseadmed ja tarvikud"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Ühendatud Bluetoothi seadmed puuduvad"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> lisaseadet</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> lisaseade</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Ekraan ja heli"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Abi ja tagasiside"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privaatsus"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Tehase andmetele lähtestamine"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibreerimine"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Energiasäästja"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Seadmed"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Vormingute valimine"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Ruumiline heli"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"LUBATUD VORMINGUD"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"KEELATUD VORMINGUD"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Keelamiseks määrake vormingu valikuks Käsitsi."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Eraldusvõime"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automaatne"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Eraldusvõimet muudeti"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Valige OK, et edaspidi kasutada eraldusvõimet %1$s."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Tühista"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Kas soovite vahemälus olevad andmed kustutada?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Kustutab rakenduste vahemälus olevad andmed."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Tarviku lisamine"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Sidumine ..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Ühendamine ..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Lisatarvikud"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Kaugjuhtimispult"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Kaugjuhtimispuldi seaded"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Puldi nuppude seadistamine"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Helitugevuse, toite ja sisendi juhtimine telerites, vastuvõtjates ning heliribades"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Ühenda"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Ühenda seadmega %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Katkesta ühendus"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Pole saadaval"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Seadme admin. rakendused"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Aktiivseid rakendusi ei ole"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktiivset rakendust</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aktiivne rakendus</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Administraator, krüpteerimiseeskirjad või mandaatide salvestusruum on selle keelanud"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Hallatava seadme teave"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Teie organisatsiooni hallatavad muudatused ja seaded"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Pole"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Installitud rakendused"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Rakenduste arv on hinnanguline. See ei pruugi hõlmata muudest allikatest kui Play poest installitud rakendusi."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Vähemalt <xliff:g id="COUNT_1">%d</xliff:g> rakendust</item>
- <item quantity="one">Vähemalt <xliff:g id="COUNT_0">%d</xliff:g> rakendus</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Vähemalt # rakendus}other{Vähemalt # rakendust}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Asukohale juurdepääsu load"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mikrofoni load"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Kaamera load"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Vaikerakendused"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> rakendust</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> rakendus</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# rakendus}other{# rakendust}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Vaikeklaviatuur"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Määratud valikule <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Alati sees VPN on sisse lülitatud"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Usaldusväärsed mandaadid"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Usaldusväärsed mandaadid teie isiklikul profiilil"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Usaldusväärsed mandaadid teie tööprofiilil"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Vähemalt <xliff:g id="COUNT_1">%d</xliff:g> CA-sertifikaati</item>
- <item quantity="one">Vähemalt <xliff:g id="COUNT_0">%d</xliff:g> CA-sertifikaat</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA-sertifikaat}other{# CA-sertifikaati}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administraator saab seadme lukustada ja parooli lähtestada"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administraator saab kustutada kõik seadme andmed"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Parooli sisestamise ebaõnnestunud katsete arv enne seadmes olevate kõigi andmete kustutamist"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Parooli sisestamise ebaõnnestunud katsete arv enne tööprofiilil olevate andmete kustutamist"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> katset</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> katse</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# katse}other{# katset}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Seda seadet haldab teie organisatsioon."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Seda seadet haldab <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Lisateave"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Kaamerarakendused</item>
- <item quantity="one">Kaamerarakendus</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Kaamerarakendus}other{Kaamerarakendused}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Kalendrirakendus"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Rakendus Kontaktid"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">E-postikliendirakendus</item>
- <item quantity="one">E-postikliendirakendus</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{E-posti kliendi rakendus}other{E-posti kliendi rakendused}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Kaardirakendus"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Telefonirakendused</item>
- <item quantity="one">Telefonirakendus</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Telefonirakendus}other{Telefonirakendused}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Brauserirakendus"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS-i versioon"</string>
<string name="about_serial" msgid="3432319328808745459">"Seerianumber"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS-i järk"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{# toiming veel ja olete arendaja}other{# toimingut veel ja olete arendaja}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Reklaamid"</string>
<string name="ads_description" msgid="8081069475265061074">"Hallake oma reklaamiseadeid, lähtestades näiteks oma reklaami-ID."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Ads: hallake oma reklaamiseadeid, lähtestades näiteks oma reklaami-ID."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Süsteemi lisavärskendused"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Võrku võidakse jälgida"</string>
<string name="done_button" msgid="616159688526431451">"Valmis"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Sertifikaatide usaldamine või eemaldamine</item>
- <item quantity="one">Sertifikaadi usaldamine või eemaldamine</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> installis teie seadmesse sertifikaadi volitused, mis võivad lubada sellel jälgida tegevusi teie seadme võrgus (sh meilid, rakendused ja turvalised veebisaidid).\n\nNende sertifikaatide kohta lisateabe saamiseks võtke ühendust administraatoriga.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> installis teie seadmesse sertifikaadi volituse, mis võib lubada sellel jälgida tegevusi teie seadme võrgus (sh meilid, rakendused ja turvalised veebisaidid).\n\nSelle sertifikaadi kohta lisateabe saamiseks võtke ühendust administraatoriga.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> installis teie tööprofiilile sertifikaadi volitused, mis võivad lubada sellel jälgida tegevusi töökoha võrgus (sh meilid, rakendused ja turvalised veebisaidid).\n\nNende sertifikaatide kohta lisateabe saamiseks võtke ühendust administraatoriga.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> installis teie tööprofiilile sertifikaadi volituse, mis võib lubada sellel jälgida tegevusi töökoha võrgus (sh meilid, rakendused ja turvalised veebisaidid).\n\nSelle sertifikaadi kohta lisateabe saamiseks võtke ühendust administraatoriga.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Kolmas osapool saab jälgida teie tegevust võrgus, sh meile, rakendusi ja turvalisi veebisaite.\n\nSeda võimaldab teie seadmesse installitud usaldusväärne mandaat."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Kontrollige sertifikaate</item>
- <item quantity="one">Kontrollige sertifikaati</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Sertifikaadi usaldamine või eemaldamine}other{Sertifikaatide usaldamine või eemaldamine}}"</string>
<string name="device_status" msgid="8266002761193692207">"Olek"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Võrk, seerianumbrid ja muu teave"</string>
<string name="manual" msgid="5683935624321864999">"Juhend"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Ühenda"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Unusta võrk"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"See kustutab teabe, mida kasutatakse võrguga ühenduse loomiseks, sh salvestatud parooli"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Liituge WiFi-võrguga, skannides oma mobiilseadmega QR-koodi ja järgides juhiseid."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Liituge WiFi-võrguga, skannides oma mobiiltelefoniga QR-koodi ja järgides juhiseid.\n \n Tehke "<b>"Android-telefonis"</b>" valikud Seaded -> Võrk ja internet -> WiFi -> valige WiFi-võrk -> tehke valik Täpsemad -> lisage seade ja skannige siis QR-kood."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Tühistamiseks vajutage tagasiliikumise nuppu"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Jätka"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Seadme salvestusruum"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Irdmälu"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Lähtestamine"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Salvestusruumi vabastamine"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Vahemälus olevate andmete kustutamine"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Vabasta <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Kustutab ruumi võtvad ajutised failid. Ei mõjuta salvestatud andmeid, nagu rakenduse eelistused või offlainitud videod, ja te ei pea rakendustesse uuesti sisse logima."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Kas soovite vahemälus olevad andmed kustutada?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Kustutab rakenduste vahemälus olevad andmed."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Rakenduste desinstallimine"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Üksus <xliff:g id="NAME">%1$s</xliff:g> ühendati"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Üksust <xliff:g id="NAME">%1$s</xliff:g> ei saanud ühendada"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB-salvestusruum on uuesti ühendatud"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Juurdepääs mikrofonile"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Rakenduse juurdepääs mikrofonile"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Juurdepääs mikrofonile on blokeeritud"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Deblokeerimiseks lülitage oma seadme privaatsuse lüliti mikrofoni sisselülitatud asendisse, et mikrofonile juurdepääs lubada."</string>
<string name="camera" msgid="1226671478936288283">"Kaamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Juurdepääs kaamerale"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Rakenduse juurdepääs kaamerale"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Juurdepääs kaamerale on blokeeritud"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Deblokeerimiseks lülitage oma seadme privaatsuse lüliti kaamera sisselülitatud asendisse, et kaamerale juurdepääs lubada."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Juurdepääs mikrofonile: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Kui see on sisse lülitatud, pääsevad kõik luba omavad rakendused ja teenused juurde kõigile selle seadme mikrofonidele.\n\nKohandatud protokolliga helivälisseadmeid see seade ei mõjuta."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Juurdepääs kaamerale: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Tsüaan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Kollane"</string>
<string name="color_magenta" msgid="2377854703399624607">"Fuksia"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Häälkirjeldus"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Kuulete kirjeldust ekraanil kuvatavates toetatud filmides ja sarjades toimuvast"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Luba"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfiguratsioon"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Kas kasutada teenust <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Jälgimine"</string>
<string name="system_apps" msgid="8481888654606868074">"Rakendused"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Ära lukusta"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Ekraan ei lülitu kunagi unerežiimile"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP kontrollimine"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimeerimine"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Kas taaskäivitada nüüd?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"HDMI-seadmete väljalülitamine koos teleriga"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Teleri automaatne sisselülitus"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Teleri sisselülitamine HDMI-seadmega"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Ühendatud sisendid</item>
- <item quantity="one">Ühendatud sisend</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Ooterežiimis sisendid</item>
- <item quantity="one">Ooterežiimis sisend</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Ühendamata sisendid</item>
- <item quantity="one">Ühendamata sisend</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Ühendatud sisend}other{Ühendatud sisendid}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Ooterežiimis sisend}other{Ooterežiimis sisendid}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Ühendamata sisend}other{Ühendamata sisendid}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Juurdepääsu piiramine rakendustele ja muule konto sisule"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Piiratud profiil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Juhib: <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Piiratud profiili loomine"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Seaded"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Lubatud rakendused"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d rakendust on lubatud</item>
- <item quantity="one">1 rakendus on lubatud</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Lubatud"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Ei ole lubatud"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Piirangute kohandamine"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Kolmanda osapoole lähtekood"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Load"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Rakendus ei ole saadaval"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Kasutamata rakendused"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Kinnita"</string>
<string name="settings_cancel" msgid="576094334743686152">"Tühista"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Luba võimaldab rakendusel muuta süsteemiseadeid."</string>
<string name="write_settings_on" msgid="71675710746513956">"Jah"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Ei"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Juurdepääs kõikidele failidele"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Luba juurdepääs kõikide failide haldamisele"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Sellel rakendusel lubatakse lugeda, muuta ja kustutada kõiki selles seadmes ning ühendatud andmekandjatel olevaid faile. Loa andmisel võib rakendus failidele juurde pääseda ilma teie teadmata."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Pilt pildis"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Luba funktsioon pilt pildis"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Ükski installitud rakendus ei toeta funktsiooni Pilt pildis"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Lubage rakendustel luua pilt pildis aken ajal, mil rakendus on avatud, või pärast sellest väljumist (näiteks video vaatamise jätkamiseks). See aken kuvatakse muude kasutatavate rakenduste peal."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Lubage rakendustel määrata äratusi ja ajastada kiire tähtajaga toiminguid. See võimaldab rakendustel töötada taustal, mistõttu võib toitekasutus olla suurem.\n\nKui see luba on välja lülitatud, siis olemasolevad äratused ja rakenduste ajastatud ajapõhised sündmused ei tööta."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Ekraani sisselülitamine"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Luba ekraani sisselülitamine"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Lubage rakendusel ekraan sisse lülitada. Kui annate loa, võib rakendus ekraani igal ajal sisse lülitada ilma teie sõnaselge kavatsuseta."</string>
<string name="special_access" msgid="21806055758289916">"Rakenduse erijuurdepääs"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Heli"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Andmemahu säästja"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Videokvaliteedi automaatne kohandamine, et kasutada vähem mobiilset andmesidet"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Andmekasutus ja hoiatused"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Saate internetiga ühenduse luua WiFi-võrgu, Etherneti või telefoni kuumkoha kaudu. Lisaabi saamiseks külastage saiti "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Saate internetiga ühenduse luua WiFi-võrgu, Etherneti või telefoni kuumkoha kaudu."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Keelatud toiming"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Helitugevust ei saa muuta"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Toide ja energia"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Käitumine sisselülitamisel"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Lähtesta"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Etherneti sidumiskood"</string>
</resources>
diff --git a/Settings/res/values-eu/strings.xml b/Settings/res/values-eu/strings.xml
index 73289de..f06217d 100644
--- a/Settings/res/values-eu/strings.xml
+++ b/Settings/res/values-eu/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Gehitu kontu bat"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Kontuak eta saio-hasiera"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Ez dago konturik"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> kontu</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> kontu</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# kontu}other{# kontu}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Multimedia-zerbitzuak, Laguntzailea, ordainketak"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Sareak eta Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Soinua"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplikazioak"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Gailuaren hobespenak"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Urruneko kontrolagailuak eta osagarriak"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Ez dago konektatuta Bluetooth bidezko gailurik"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> osagarri</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> osagarri</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Pantaila eta soinua"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Laguntza eta iritziak"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Pribatutasuna"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Berrezarri jatorrizko datuak"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrazioa"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Energia-aurrezlea"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Gailuak"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Hautatu formatuak"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Soinu inguratzailea"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMATU GAITUAK"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMATU DESGAITUAK"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Desgaitzeko, ezarri formatu-hautapena \"Eskuzkoa\" gisa."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Bereizmena"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatikoa"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Aldatu da bereizmena"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Hemendik aurrera %1$s erabiltzeko, hautatu Ados."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Utzi"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Ados"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Cacheko datuak garbitu nahi dituzu?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Aplikazio guztien cacheko datuak garbituko dira."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Gehitu osagarria"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Parekatzen…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Konektatzen…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Osagarriak"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Urruneko kontrolagailua"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Urruneko kontrolagailuaren ezarpenak"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Konfiguratu urruneko kontrolagailuaren botoiak"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Kontrolatu telebista, hargailu eta soinu-barren bolumena, etengailua eta sarrera."</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Konektatu"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Konektatu %1$s gailura"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Deskonektatu"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Ez dago erabilgarri"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Gailua administratzeko aplikazioak"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Ez dago aplikaziorik aktibo"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikazio aktibo</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplikazio aktibo</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Administratzaileak, enkriptatze-gidalerroek edo kredentzialen biltegiak desgaituta"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Gailu kudeatuaren informazioa"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Erakundeak kudeatzen dituen aldaketak eta ezarpenak"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Bat ere ez"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Instalatutako aplikazioak"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Gutxi gorabeherakoa da aplikazio kopurua. Baliteke Play Store-tik instalatu ez diren aplikazioak kontuan ez izatea."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Gutxienez <xliff:g id="COUNT_1">%d</xliff:g> aplikazio</item>
- <item quantity="one">Gutxienez <xliff:g id="COUNT_0">%d</xliff:g> aplikazio</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Gutxienez # aplikazio}other{Gutxienez # aplikazio}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Kokapena hautemateko baimenak"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mikrofonoa erabiltzeko baimenak"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Kamera erabiltzeko baimenak"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Aplikazio lehenetsiak"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikazio</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplikazio</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplikazio}other{# aplikazio}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Teklatu lehenetsia"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Ezarri <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Beti aktibatuta egongo den VPN konexioa aktibatu da"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Kredentzial fidagarriak"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Profil pertsonaleko kredentzial fidagarriak"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Laneko profileko kredentzial fidagarriak"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Gutxienez <xliff:g id="COUNT_1">%d</xliff:g> CA ziurtagiri</item>
- <item quantity="one">Gutxienez <xliff:g id="COUNT_0">%d</xliff:g> CA ziurtagiri</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA ziurtagiri}other{# CA ziurtagiri}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administratzaileak gailua blokea eta pasahitza berrezar dezake"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administratzaileak gailuko datu guztiak ezaba ditzake"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Pasahitza idazteko egin daitezkeen saiakerak gailuko datu guztiak ezabatu aurretik"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Pasahitza idazteko egin daitezkeen saiakerak laneko profileko datuak ezabatu aurretik"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> saiakera</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> saiakera</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# saiakera}other{# saiakera}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Zure erakundeak kudeatzen du gailua."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> erakundeak kudeatzen du gailu hau."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Lortu informazio gehiago"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Kamera-aplikazioak</item>
- <item quantity="one">Kamera-aplikazioa</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Kamera-aplikazioa}other{Kamera-aplikazioak}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Egutegi-aplikazioa"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Kontaktu-aplikazioa"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Posta-bezeroaren aplikazioak</item>
- <item quantity="one">Posta-bezeroaren aplikazioa</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Posta-bezeroaren aplikazioa}other{Posta-bezeroaren aplikazioak}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Mapa-aplikazioa"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Telefono-aplikazioak</item>
- <item quantity="one">Telefono-aplikazioa</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Telefono-aplikazioa}other{Telefono-aplikazioak}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Arakatzailea"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV-ren sistema eragilearen bertsioa"</string>
<string name="about_serial" msgid="3432319328808745459">"Serie-zenbakia"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV-ren sistema eragilearen konpilazioa"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> urrats gelditzen zaizkizu garatzaile bihurtzeko</item>
- <item quantity="one"><xliff:g id="STEP_COUNT_0">%1$d</xliff:g> urrats gelditzen zaizu garatzaile bihurtzeko</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{# urrats falta zaizu garatzaile izateko}other{# urrats falta zaizkizu garatzaile izateko}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Iragarkiak"</string>
<string name="ads_description" msgid="8081069475265061074">"Kudeatu iragarkien ezarpenak; adibidez, berrezarri publizitate IDa."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Iragarkiak: kudeatu iragarkien ezarpenak; adibidez, berrezarri publizitate IDa."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Eguneratze gehiago"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Baliteke sarea kontrolatuta egotea"</string>
<string name="done_button" msgid="616159688526431451">"Eginda"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Jo fidagarritzat edo kendu ziurtagiriak</item>
- <item quantity="one">Jo fidagarritzat edo kendu ziurtagiria</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> domeinuak ziurtagiri-emaileak instalatu dizkizu gailuan. Hortaz, baliteke domeinuak gailuko sarean egiten duzuna gainbegiratu ahal izatea; besteak beste, posta elektronikoan, aplikazioetan eta webgune seguruetan egiten duzuna.\n\nZiurtagiri horiei buruzko informazio gehiago lortzeko, jarri harremanetan administratzailearekin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> domeinuak ziurtagiri-emaile bat instalatu dizu gailuan. Hortaz, baliteke domeinuak gailuko sarean egiten duzuna gainbegiratu ahal izatea; besteak beste, posta elektronikoan, aplikazioetan eta webgune seguruetan egiten duzuna.\n\nZiurtagiri horri buruzko informazio gehiago lortzeko, jarri harremanetan administratzailearekin.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> domeinuak ziurtagiri-emaileak instalatu dizkizu laneko profilean. Hortaz, baliteke domeinuak laneko sarean egiten duzuna gainbegiratu ahal izatea; besteak beste, posta elektronikoan, aplikazioetan eta webgune seguruetan egiten duzuna.\n\nZiurtagiri horiei buruzko informazio gehiago lortzeko, jarri harremanetan administratzailearekin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> domeinuak ziurtagiri-emaile bat instalatu dizu laneko profilean. Hortaz, baliteke domeinuak laneko sarean egiten duzuna gainbegiratu ahal izatea; besteak beste, posta elektronikoan, aplikazioetan eta webgune seguruetan egiten duzuna.\n\nZiurtagiri horri buruzko informazio gehiago lortzeko, jarri harremanetan administratzailearekin.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Hirugarren alderdi bat sarean bideratzen dituzun jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webgune seguruak barne.\n\nGailuan instalatu duzun kredentzial fidagarri batek egiten du hori posible."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Ikusi ziurtagiriak</item>
- <item quantity="one">Ikusi ziurtagiria</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Jo fidagarritzat edo kendu ziurtagiria}other{Jo fidagarritzat edo kendu ziurtagiriak}}"</string>
<string name="device_status" msgid="8266002761193692207">"Egoera"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Sarea, serie-zenbakiak eta bestelako informazioa"</string>
<string name="manual" msgid="5683935624321864999">"Eskuliburua"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Konektatu"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Ahaztu sarea"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Sarera konektatzeko erabilitako informazioa garbituko da, gordetako pasahitza barne"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Sartu wifi-sare batean telefono mugikorrarekin QR kodea eskaneatuz, eta jarraitu argibideak."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Konektatu wifi-sarera telefono mugikorrarekin QR kodea eskaneatuz, eta jarraitu argibideei.\n \n "<b>"Android telefono"</b>" batean, sakatu Ezarpenak -> Sareak eta Internet -> Wifia -> Hautatu wifi-sarea -> Aurreratuak -> Gehitu gailu bat, eta, ondoren, eskaneatu QR kodea."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Bertan behera uzteko, sakatu Atzera botoia"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Ados"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Egin aurrera"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Gailuaren memoria"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Memoria aldagarria"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Berrezarri"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Egin tokia"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Garbitu cacheko datuak"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Egin tokia (<xliff:g id="SPACE">%1$s</xliff:g>)"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Tokia hartzen duten aldi baterako fitxategiak garbitzen ditu. Ez du eraginik izango gordetako datuetan, hala nola aplikazioen hobespenetan edo konexiorik gabe ikusteko bideoetan. Gainera, ez duzu aplikazioetan berriro saioa hasi beharko."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Cacheko datuak garbitu nahi dituzu?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Aplikazio guztien cacheko datuak garbituko dira."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Desinstalatu aplikazioak"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Muntatu da <xliff:g id="NAME">%1$s</xliff:g> memoria-unitatea"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Ezin izan da instalatu <xliff:g id="NAME">%1$s</xliff:g> memoria-unitatea"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Berriro konektatu da USB bidezko memoria"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofonoa"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Mikrofonoa atzitzeko baimena"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Aplikazioen mikrofono-atzitzeak"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Mikrofonorako sarbidea blokeatuta dago"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Hura desblokeatzeko, ezarri gailuaren pribatutasun-etengailua mikrofonoa aktibatuta egon dadin, kamerarako sarbidea emateko."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Kamera atzitzeko baimena"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Aplikazioen kamera-atzitzeak"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Kamerarako sarbidea blokeatuta dago"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Hura desblokeatzeko, ezarri gailuaren pribatutasun-etengailua kamera aktibatuta egon dadin, kamerarako sarbidea emateko."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Mikrofonoa atzitzeko baimena: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Aktibatuta dagoenean, gailu honetako edozein mikrofono atzitu ahalko dute horretarako baimena daukaten aplikazio eta zerbitzu guztiek.\n\nEzarpen honek ez die eragingo protokolo pertsonalizatu bat daukaten audio-gailu periferikoei."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Kamera atzitzeko baimena: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Ziana"</string>
<string name="color_yellow" msgid="3519470952904560404">"Horia"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audio-azalpena"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Entzun pantailan agertzen denaren azalpen bat film eta saio bateragarriak ikusi bitartean"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Gaitu"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfigurazioa"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> erabili?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Kontrola"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplikazioak"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Mantendu aktibo"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Pantaila ez da inoiz itzaliko"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP egiaztapena"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimizazioa"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Berrabiarazi nahi duzu?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Itzali HDMI gailuak telebistaren bidez"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Piztu telebista automatikoki"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Piztu telebista HDMI gailuaren bidez"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Konektatutako gailuak</item>
- <item quantity="one">Konektatutako gailua</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Inaktibo dauden gailuak</item>
- <item quantity="one">Inaktibo dagoen gailua</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Konektatu gabeko gailuak</item>
- <item quantity="one">Konektatu gabeko gailua</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Konektatutako gailua}other{Konektatutako gailuak}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Inaktibo dagoen gailua}other{Inaktibo dauden gailuak}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Konektatu gabeko gailua}other{Konektatu gabeko gailuak}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Mugatu kontuko aplikazioetarako eta bestelako edukietarako sarbidea"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Profil murriztua"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> aplikazioak kontrolatua"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Sortu profil murriztua"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Ezarpenak"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Baimena duten aplikazioak"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d aplikaziok daukate baimena</item>
- <item quantity="one">Aplikazio batek dauka baimena</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Baimenduta"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Onartezina"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Murrizketa pertsonalizatuak"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Hirugarrenen kode irekiko lizentziak"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Baimenak"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplikazioa ez dago erabilgarri"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Erabiltzen ez diren aplikazioak"</string>
<string name="settings_ok" msgid="5950888975075541964">"Ados"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Berretsi"</string>
<string name="settings_cancel" msgid="576094334743686152">"Utzi"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Baimen honekin, sistemaren ezarpenak alda ditzakete aplikazioek."</string>
<string name="write_settings_on" msgid="71675710746513956">"Bai"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Ez"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Fitxategi guztietarako sarbidea"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Eman fitxategi guztiak kudeatzeko baimena"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Eman gailuko edo konektatutako biltegiratze-unitateetako fitxategiak irakurtzeko, aldatzeko eta ezabatzeko baimena aplikazioari. Baimena emanez gero, baliteke aplikazioak fitxategiak atzitzea zuk jakin ez arren."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Pantaila txiki gainjarria"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Eman pantaila txiki gainjarria erabiltzeko baimena"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Ez dago instalatuta pantaila txiki gainjarriarekin bateragarria den aplikaziorik"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Eman pantaila txiki gainjarri bat sortzeko baimena aplikazioei, aplikazioa irekita dagoenean nahiz hartatik irtetean (adibidez, bideoak ikusten jarraitzeko). Erabiltzen ari zaren beste aplikazioen gaienean erakutsiko da leiho hori."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Eman alarmak ezartzeko eta orduaren araberako beste ekintza batzuk programatzeko baimena aplikazioei. Hala, aplikazioek atzeko planoan funtzionatuko dute, eta litekeena da bateria gehiago kontsumitzea.\n\nEz baduzu ematen baimen hori, ez dute funtzionatuko aplikazio horien bidez programatutako alarmek eta orduaren araberako ekintzek."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Piztu pantaila"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Eman pantaila pizteko baimena"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Eman pantaila pizteko baimena aplikazioei. Baimena emanez gero, aplikazioek edonoiz piztu ahal izango dute pantaila, zuk halako asmorik izan ez arren."</string>
<string name="special_access" msgid="21806055758289916">"Aplikazio-baimen bereziak"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audioa"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Datu-aurrezlea"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Doitu automatikoki bideoen kalitatea datu-konexioa gutxiago erabiltzeko"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Datu-konexioaren erabilera eta alertak"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Wifia, Ethernet nahiz telefonoaren wifi-gunea erabilita konekta zaitezke Internetera. Laguntza behar baduzu, joan "<b>"g.co/network"</b>" helbidera."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Wifi edo Ethernet bidez, nahiz telefonoaren konexioa partekatuta konekta zaitezke Internetera."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Ezin da hori egin"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Ezin da aldatu bolumena"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Potentzia eta energia"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Piztean izan beharreko portaera"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Berrezarri"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet bidez parekatzeko kodea"</string>
</resources>
diff --git a/Settings/res/values-fa/strings.xml b/Settings/res/values-fa/strings.xml
index 76c298d..839e3cb 100644
--- a/Settings/res/values-fa/strings.xml
+++ b/Settings/res/values-fa/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"افزودن حساب"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"حسابها و ورود به سیستم"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"هیچ حسابی وجود ندارد"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> حساب</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> حساب</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# حساب}one{# حساب}other{# حساب}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"سرویسهای رسانهای، «دستیار»، «پرداختها»"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"شبکه و اینترنت"</string>
<string name="sound_category_title" msgid="7899816751041939518">"صدا"</string>
<string name="applications_category_title" msgid="7112019490898586223">"برنامهها"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"اولویتهای دستگاه"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"کنترل از راه دور و لوازم جانبی"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"دستگاه بلوتوث متصلی وجود ندارد"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> لوازم جانبی</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> لوازم جانبی</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"نمایش و صدا"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"راهنمایی و بازخورد"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"حریمخصوصی"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"بازنشانی دادههای کارخانه"</string>
<string name="device_calibration" msgid="2907914144048739705">"کالیبراسیون"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"بهینهسازی انرژی"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"دستگاهها"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"انتخاب قالب"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"صدای فراگیر"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"قالبهای فعال"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"قالبهای غیرفعال"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"برای غیرفعال کردن، انتخاب قالب را به «دستی» تغییر دهید."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"وضوح"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"خودکار"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"وضوح تغییر کرده است"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"«تأیید» را انتخاب کنید تا ازاینپس از %1$s استفاده شود."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"لغو"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"تأیید"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"هرتز"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"اطلاعات در حافظه پنهان پاک شود؟"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"اطلاعات در حافظه پنهان همه برنامهها پاک میشود."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"افزودن وسیله جانبی"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"در حال مرتبطسازی..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"در حال اتصال..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"لوازم جانبی"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"کنترل ازراهدور"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"تنظیمات کنترل ازراهدور"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"راهاندازی دکمههای ازراهدور"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"میزان صدا، ورودی، و روشن/خاموش شدن تلویزیونها، گیرندهها، و بلندگوهای ستونی را کنترل کنید"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"اتصال"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"اتصال به %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"قطع اتصال"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"دردسترس نیست"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"برنامههای سرپرست دستگاه"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"برنامه فعالی موجود نیست"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"توسط سرپرست غیرفعال شده، طبق خطمشی رمزگذاری یا حافظه اطلاعات کاربردی"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"اطلاعات دستگاه مدیریتشده"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"تغییرات و تنظیماتی که توسط سازمان شما مدیریت میشوند"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"هیچکدام"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"برنامهها نصب شدند"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"تعداد برنامهها تخمینی است و ممکن است شامل برنامههای نصبشده از خارج از «فروشگاه Play» نباشد."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{حداقل # برنامه}one{حداقل # برنامه}other{حداقل # برنامه}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"مجوزهای دسترسی به موقعیت مکانی"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"مجوزهای دسترسی به میکروفون"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"مجوزهای دسترسی به دوربین"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"برنامههای پیشفرض"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# برنامه}one{# برنامه}other{# برنامه}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"صفحهکلید پیشفرض"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"تنظیم روی <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"«VPN همیشه روشن» روشن شد"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"اطلاعات کاربری مطمئن"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"اطلاعات کاربری مطمئن در نمایه شخصی شما"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"اطلاعات کاربری مطمئن در نمایه کاری شما"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <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="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# گواهینامه مرکز صدور گواهی}one{# گواهینامه مرکز صدور گواهی}other{# گواهینامه مرکز صدور گواهی}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"سرپرست میتواند دستگاه را قفل و گذرواژه را بازنشانی کند"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"سرپرست میتواند همه دادههای دستگاه را پاک کند"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"ورود گذرواژه ناموفق، پیش از حذف همه اطلاعات دستگاه"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"ورود گذرواژه ناموفق، پیش از حذف دادههای نمایه کاری"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# تلاش}one{# تلاش}other{# تلاش}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"این دستگاه را سازمانتان مدیریت میکند."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"این دستگاه توسط <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> مدیریت میشود."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"بیشتر بدانید"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">برنامه دوربین</item>
- <item quantity="other">برنامههای دوربین</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{برنامه دوربین}one{برنامه دوربین}other{برنامههای دوربین}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"برنامه تقویم"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"برنامه مخاطبین"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">برنامه کارخواه ایمیل</item>
- <item quantity="other">برنامههای کارخواه ایمیل</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{برنامه کارخواه ایمیل}one{برنامه کارخواه ایمیل}other{برنامههای کارخواه ایمیل}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"برنامه نقشه"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">برنامه تلفن</item>
- <item quantity="other">برنامههای تلفن</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{برنامه تلفن}one{برنامه تلفن}other{برنامههای تلفن}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"برنامه مرورگر"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>، <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>، <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>، <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"نسخه «سیستمعامل Android TV»"</string>
<string name="about_serial" msgid="3432319328808745459">"شماره سریال"</string>
<string name="about_build" msgid="8467840394761634575">"ساخت «سیستمعامل Android TV»"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{اکنون # مرحله تا توسعهدهنده شدن فاصله دارید}one{اکنون # مرحله تا توسعهدهنده شدن فاصله دارید}other{اکنون # مرحله تا توسعهدهنده شدن فاصله دارید}}"</string>
<string name="about_ads" msgid="7662896442040086522">"آگهیها"</string>
<string name="ads_description" msgid="8081069475265061074">"تنظیمات آگهی را مدیریت کنید، مثلاً شناسه تبلیغاتی را بازنشانی کنید."</string>
<string name="ads_content_description" msgid="1006489792324920289">"آگهیها؛ تنظیمات آگهی را مدیریت کنید، مثلاً شناسه تبلیغاتی را بازنشانی کنید."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"بهروزرسانیهای دیگر سیستم"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"ممکن است شبکه پایش شود"</string>
<string name="done_button" msgid="616159688526431451">"تمام"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">به گواهینامه اعتماد کنید یا آن را بردارید</item>
- <item quantity="other">به گواهینامهها اعتماد کنید یا آنها را بردارید</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> مرجع صدور گواهینامهای در دستگاهتان نصب کرده است که ممکن است به او اجازه دهد فعالیتهای شبکه دستگاهتان، ازجمله ایمیلها، برنامهها، و وبسایتهای ایمن را کنترل کند.\n\nبرای اطلاعات بیشتر درباره این گواهینامه، با سرپرست تماس بگیرید.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> چند مرجع صدور گواهینامه در دستگاهتان نصب کرده است که ممکن است به او اجازه دهند فعالیتهای شبکه دستگاهتان، ازجمله ایمیلها، برنامهها، و وبسایتهای ایمن را کنترل کند.\n\nبرای اطلاعات بیشتر درباره این گواهینامهها، با سرپرست تماس بگیرید.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> مرجع صدور گواهینامهای برای نمایه کاری شما نصب کرده است که ممکن است به او اجازه دهد فعالیتهای شبکه کاری، ازجمله ایمیلها، برنامهها، و وبسایتهای ایمن را کنترل کند.\n\nبرای اطلاعات بیشتر درباره این گواهینامه، با سرپرست تماس بگیرید.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> چند مرجع صدور گواهینامه برای نمایه کاری شما نصب کرده است که ممکن است به او اجازه دهند فعالیتهای شبکه کاری، ازجمله ایمیلها، برنامهها، و وبسایتهای ایمن را کنترل کند.\n\nبرای اطلاعات بیشتر درباره این گواهینامهها، با سرپرست تماس بگیرید.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"شخص ثالتی میتواند روی فعالیتهای شبکه شما ازجمله ایمیلها، برنامهها و وبسایتهای ایمن نظارت داشته باشد.\n\nاعتبارنامه مطمئن نصبشده در دستگاهتان این کار را شدنی میکند."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">بررسی گواهینامه</item>
- <item quantity="other">بررسی گواهینامهها</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{به گواهینامه اعتماد کنید یا آن را بردارید}one{به گواهینامه اعتماد کنید یا آن را بردارید}other{به گواهینامهها اعتماد کنید یا آنها را بردارید}}"</string>
<string name="device_status" msgid="8266002761193692207">"وضعیت"</string>
<string name="device_status_summary" msgid="3270932829412434985">"شبکه، شماره سریال و اطلاعات دیگر"</string>
<string name="manual" msgid="5683935624321864999">"دفترچه راهنما"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"اتصال"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"فراموش کردن شبکه"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"این کار اطلاعات مورد استفاده برای اتصال به این شبکه، از جمله گذرواژه ذخیره شده را پاک میکند"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"با اسکن کردن رمزینه پاسخسریع از تلفن همراه، به Wi-Fi متصل شوید و دستورالعمل را دنبال کنید."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" با اسکن کردن رمزینه پاسخسریع ازطریق تلفن همراه و دنبال کردن دستورالعملها، به Wi-Fi وصل شوید.\n \n در "<b>"تلفن Android"</b>" به «تنظیمات» -> «شبکه» -> «اینترنت» -> «Wi-Fi» -> «انتخاب Wi-Fi» -> «پیشرفته» -> «افزودن دستگاه» بروید و سپس رمزینه پاسخسریع را اسکن کنید."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"دکمه برگشت را برای لغو کردن فشار دهید"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"قبول"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"ادامه"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"فضای ذخیرهسازی دستگاه"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"فضای ذخیرهسازی جداشدنی"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"بازنشانی"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"آزاد کردن فضای ذخیرهسازی"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"پاک کردن دادههای ذخیرهشده در حافظه پنهان"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"آزاد کردن <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"فایلهای موقتی را که فضا اشغال میکنند پاک میکند. بر دادههای ذخیرهشده (مثل اولویتهای برنامه یا ویدیوهای آفلاین) تأثیر نخواهد گذاشت و لازم نیست دوباره به سیستم برنامهها وارد شوید."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"دادههای ذخیرهشده در حافظه پنهان پاک شود؟"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"دادههای ذخیرهشده در حافظه پنهان همه برنامهها پاک میشود."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"حذف نصب برنامهها"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> جاگذاری شد"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> جاگذاری نشد"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"فضای ذخیرهسازی USB دوباره متصل شد"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"میکروفون"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"دسترسی میکروفون"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"دسترسی برنامه به میکروفون"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"دسترسی به میکروفون مسدود شده است"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"برای لغو انسداد، کلید حریمخصوصی روی دستگاهتان را روی موقعیت روشن برای میکروفون قرار دهید تا دسترسی به میکروفون مجاز شود."</string>
<string name="camera" msgid="1226671478936288283">"دوربین"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"دسترسی به دوربین"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"دسترسی برنامه به دوربین"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"دسترسی به دوربین مسدود شده است"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"برای لغو انسداد، کلید حریمخصوصی روی دستگاهتان را روی موقعیت روشن برای دوربین قرار دهید تا دسترسی به دوربین مجاز شود."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"دسترسی به میکروفون: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"وقتی روشن باشد، همه برنامهها و سرویسهایی که اجازه دارند میتوانند به هر میکروفونی در این دستگاه دسترسی داشته باشند.\n\nلوازم جانبی صوتی که پروتکلی سفارشی دارند تحتتأثیر این تنظیم قرار نمیگیرند."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"دسترسی به دوربین: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"فیروزهای"</string>
<string name="color_yellow" msgid="3519470952904560404">"زرد"</string>
<string name="color_magenta" msgid="2377854703399624607">"سرخابی"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"شرح صوتی"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"شنیدن شرح اتفاقاتی که روی صفحه در فیلمها و نمایشهای پشتیبانیشده رخ میدهد"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"فعال کردن"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"پیکربندی"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"از <xliff:g id="SERVICE">%1$s</xliff:g> استفاده شود؟"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"نظارت"</string>
<string name="system_apps" msgid="8481888654606868074">"برنامهها"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"بیدار ماندن"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"صفحهنمایش هرگز خاموش نمیشود"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"بررسی HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"بهینه سازی HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"اکنون بازراهاندازی شود؟"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"خاموش کردن دستگاههای HDMI با تلویزیون"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"روشن شدن خودکار تلویزیون"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"روشن کردن تلویزیون با دستگاه HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">ورودیهای متصل</item>
- <item quantity="other">ورودیهای متصل</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">ورودیهای آمادهبهکار</item>
- <item quantity="other">ورودیهای آمادهبهکار</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">ورودیهای غیرمتصل</item>
- <item quantity="other">ورودیهای غیرمتصل</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{ورودی متصل}one{ورودی متصل}other{ورودیهای متصل}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{ورودی آمادهبهکار}one{ورودی آمادهبهکار}other{ورودیهای آمادهبهکار}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{ورودی غیرمتصل}one{ورودی غیرمتصل}other{ورودیهای غیرمتصل}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"دسترسی به برنامهها و سایر محتوای موجود در حسابتان را محدود کنید"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"نمایه محدود شده"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"کنترل شده توسط <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"ایجاد نمایه محدودشده"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"تنظیمات"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"برنامههای مجاز شده"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d برنامه مجاز شد</item>
- <item quantity="other">%d برنامه مجاز شدند</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"مجاز شد"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"مجاز نیست"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"سفارشی کردن محدودیتها"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"منبع شخص ثالث"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"مجوزها"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"برنامه دردسترس نیست"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"برنامههای استفادهنشده"</string>
<string name="settings_ok" msgid="5950888975075541964">"تأیید"</string>
<string name="settings_confirm" msgid="4489126458677153411">"تأیید"</string>
<string name="settings_cancel" msgid="576094334743686152">"لغو"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"این مجوز به برنامه امکان میدهد تنظیمات سیستم را تغییر دهد."</string>
<string name="write_settings_on" msgid="71675710746513956">"بله"</string>
<string name="write_settings_off" msgid="6730113471695092167">"نه"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"دسترسی به همه فایلها"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"دسترسی دادن برای مدیریت همه فایلها"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"به این برنامه اجازه میدهد همه فایلهای موجود در این دستگاه یا فضاهای ذخیرهسازی متصلشده به آن را بخواند، تغییر دهد، و حذف کند. اگر این مجوز به برنامه داده شود، ممکن است بدون اطلاع صریح شما به فایلها دسترسی یابد."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"تصویردرتصویر"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"مجاز کردن تصویردرتصویر"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"هیچ برنامه نصبشدهای از تصویردرتصویر پشتیبانی نمیکند"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"به برنامهها اجازه دهید هنگامی که این برنامه باز است یا پس از اینکه از آن خارج شدید (مثلاً برای ادامه تماشای ویدیو)، پنجره تصویردرتصویر ایجاد کند. این پنجره روی سایر برنامههایی که درحال استفادهاید نمایش داده میشود."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"به برنامهها اجازه میدهد زنگ ساعت تنظیم کنند و کنشهای حساس به زمان زمانبندی کنند. این تنظیم به برنامهها اجازه میدهد در پسزمینه اجرا شوند که میتواند مصرف باتری را افزایش دهد.\n\nاگر این اجازه خاموش باشد، زنگهای ساعت موجود و رویدادهای زمانمحوری که این برنامه زمانبندی کرده است، کار نخواهند کرد."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"روشن کردن صفحهنمایش"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"مجاز کردن روشن کردن صفحهنمایش"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"به برنامه اجازه میدهد صفحهنمایش را روشن کند. اگر اجازه داده شود، برنامه ممکن است در هر زمانی بدون هدف صریح شما صفحهنمایش را روشن کند."</string>
<string name="special_access" msgid="21806055758289916">"دسترسی ویژه به برنامه"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>، <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"صدا"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"صرفهجویی داده"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"کیفیت ویدیو بهطور خودکار تنظیم شود تا داده تلفن همراه کمتری مصرف شود"</string>
<string name="title_data_alert" msgid="8262081890052682475">"مصرف داده و هشدارها"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"میتوانید بااستفاده از Wi-Fi، اترنت، یا نقطه اتصال تلفنتان به اینترنت متصل شوید. برای راهنمایی بیشتر، به "<b>"g.co/network"</b>" بروید."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"میتوانید بااستفاده از Wi-Fi، اترنت، یا نقطه اتصال تلفنتان به اینترنت متصل شوید."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"کنش مجاز نیست"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"نمیتوان بلندی صدا را تغییر داد"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"برق و انرژی"</string>
<string name="power_on_behavior" msgid="927607372303160716">"عملکرد تلویزیون هنگام روشن بودن"</string>
<string name="reset_options_title" msgid="7632580482285108955">"بازنشاندن"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"کد مرتبطسازی اترنت"</string>
</resources>
diff --git a/Settings/res/values-fi/strings.xml b/Settings/res/values-fi/strings.xml
index 2d30d8b..70e17df 100644
--- a/Settings/res/values-fi/strings.xml
+++ b/Settings/res/values-fi/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Lisää tili"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Tilit ja sisäänkirjautuminen"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Ei tilejä"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> tiliä</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> tili</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# tili}other{# tiliä}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Mediapalvelut, Assistant, maksut"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Verkko ja internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Ääni"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Sovellukset"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Laitteen asetukset"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Kaukosäätimet ja lisävarusteet"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Ei liitettyjä Bluetooth-laitteita"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> lisävarustetta</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> lisävaruste</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Näyttö ja ääni"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Ohje ja palaute"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Yksityisyys"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Tehdasasetuksien palauttaminen"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrointi"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Virransäästö"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Laitteet"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Valitse muodot"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Surround-ääni"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"KÄYTÖSSÄ OLEVAT MUODOT"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"KÄYTÖSTÄ POISTETUT MUODOT"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Vaihda muodon valinta manuaaliseksi, jotta voit poistaa tämän käytöstä."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resoluutio"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automaattinen"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Resoluutio on vaihdettu"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Valitse OK, jos haluat, että %1$s on käytössä tästä lähtien."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Peru"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Tyhjennetäänkö välimuistitiedot?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Sovellusten välimuistit tyhjennetään."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Lisää lisälaite"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Laiteparia muodostetaan…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Yhdistetään…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Lisälaitteet"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Kaukosäädin"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Kaukosäätimen asetukset"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Valitse kaukosäätimen painikkeet"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Ohjaa äänenvoimakkuutta, virtaa, TV:n tuloja, vastaanottimia ja soundbar-kaiuttimia"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Yhdistä"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Yhdistä %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Katkaise yhteys"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Ei käytössä"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Laitteenhallintasovellukset"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Ei aktiivisia sovelluksia"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktiivista sovellusta</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aktiivinen sovellus</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Järj.valvojan, salauskäyt. tai tunnuksien tall.tilan estämä"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Hallinnoidun laitteen tiedot"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Organisaatiosi hallitsemat valinnat ja asetukset"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"–"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Asennetut sovellukset"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Sovellusten lukumäärä on arvio. Luku ei välttämättä sisällä sovelluksia, jotka on asennettu muualta kuin Play Kaupasta."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Vähintään <xliff:g id="COUNT_1">%d</xliff:g> sovellusta</item>
- <item quantity="one">Vähintään <xliff:g id="COUNT_0">%d</xliff:g> sovellus</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Vähintään # sovellus}other{Vähintään # sovellusta}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Sijainnin käyttöoikeudet"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mikrofonin käyttöoikeudet"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Kameran käyttöoikeudet"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Oletussovellukset"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> sovellusta</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> sovellus</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# sovellus}other{# sovellus}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Oletusnäppäimistö"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Asetettu: <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Aina käytössä oleva VPN päällä"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Luotetut kirjautumistiedot"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Henkilökohtaisen profiilin luotetut kirjautumistiedot"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Työprofiilin luotetut kirjautumistiedot"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Vähintään <xliff:g id="COUNT_1">%d</xliff:g> CA-varmennetta</item>
- <item quantity="one">Vähintään <xliff:g id="COUNT_0">%d</xliff:g> CA-varmenne</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA-varmenne}other{# CA-varmennetta}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Järjestelmänvalvoja voi lukita laitteen ja vaihtaa salasanan"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Järjestelmänvalvoja voi poistaa kaikki laitteen tiedot."</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Epäonnistuneet salasanan kirjoitusyritykset ennen kaikkien laitteen tietojen poistamista"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Epäonnistuneet salasanan kirjoitusyritykset ennen kaikkien työprofiilin tietojen poistamista"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> yritystä</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> yritys</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# yritys}other{# yritystä}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Organisaatiosi hallinnoi tätä laitetta."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Tätä laitetta hallitsee <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Lue lisää"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Kamera-sovellukset</item>
- <item quantity="one">Kamera-sovellus</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Kamerasovellus}other{Kamerasovellukset}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Kalenterisovellus"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Yhteystietosovellus"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Sähköpostisovellukset</item>
- <item quantity="one">Sähköpostisovellus</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Sähköpostisovellus}other{Sähköpostisovellukset}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Karttasovellus"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Puhelin-sovellukset</item>
- <item quantity="one">Puhelin-sovellus</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Puhelinsovellus}other{Puhelinsovellukset}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Selainsovellus"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV ‑käyttöjärjestelmän versio"</string>
<string name="about_serial" msgid="3432319328808745459">"Sarjanumero"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV ‑käyttöjärjestelmän koontiversio"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> vaiheen jälkeen sinusta tulee kehittäjä</item>
- <item quantity="one"><xliff:g id="STEP_COUNT_0">%1$d</xliff:g> vaiheen jälkeen sinusta tulee kehittäjä</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Enää # vaihe, niin sinusta tulee kehittäjä}other{Enää # vaihetta, niin sinusta tulee kehittäjä}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Mainokset"</string>
<string name="ads_description" msgid="8081069475265061074">"Muuta mainosasetuksia, esim. nollaa mainostunnus."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Mainokset. Muuta mainosasetuksia, esim. nollaa mainostunnus."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Järjestelmän lisäpäivitykset"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Verkkoa saatetaan valvoa"</string>
<string name="done_button" msgid="616159688526431451">"Valmis"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Luota varmenteisiin tai poista niitä</item>
- <item quantity="one">Luota varmenteeseen tai poista se</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> on asentanut laitteellesi varmenteen myöntäjiä, mikä mahdollistaa laitteen verkkotoiminnan (esim. sähköpostin, sovellusten ja suojattujen verkkosivustojen käytön) seuraamisen.\n\nSaat lisätietoja varmenteista järjestelmänvalvojaltasi.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> on asentanut laitteellesi varmenteen myöntäjän, mikä mahdollistaa laitteen verkkotoiminnan (esim. sähköpostin, sovellusten ja suojattujen verkkosivustojen käytön) seuraamisen.\n\nSaat lisätietoja varmenteesta järjestelmänvalvojaltasi.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> on asentanut työprofiiliisi varmenteen myöntäjiä, mikä mahdollistaa toimintasi (esim. sähköpostin, sovellusten ja suojattujen verkkosivustojen käytön) seuraamisen työverkossa.\n\nSaat lisätietoja varmenteista järjestelmänvalvojaltasi.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> on asentanut työprofiiliisi varmenteen myöntäjän, mikä mahdollistaa toimintasi (esim. sähköpostin, sovellusten ja suojattujen verkkosivustojen käytön) seuraamisen työverkossa.\n\nSaat lisätietoja varmenteesta järjestelmänvalvojaltasi.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Kolmas osapuoli pystyy seuraamaan toimiasi verkossa, esimerkiksi sähköpostiviestien, sovellusten ja turvallisten verkkosivustojen käyttöä.\n\nLaitteeseesi asennettu luotettu varmenne tekee tämän mahdolliseksi."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Tarkista varmenteet</item>
- <item quantity="one">Tarkista varmenne</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Luota varmenteeseen tai poista se}other{Luota varmenteisiin tai poista niitä}}"</string>
<string name="device_status" msgid="8266002761193692207">"Tila"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Verkko, sarjanumerot ja muut tiedot"</string>
<string name="manual" msgid="5683935624321864999">"Käyttöopas"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Yhdistä"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Unohda verkko"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Tämä valinta tyhjentää kaikki tämän verkon kirjautumistiedot, myös tallennetun salasanan"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Liity Wi-Fi-verkkoon skannaamalla QR-koodi puhelimella ja seuraamalla ohjeita."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Liity Wi-Fi-verkkoon skannaamalla QR-koodi puhelimella ja seuraamalla ohjeita.\n \n "<b>"Android-puhelimella:"</b>" Valitse Asetukset -> Verkko ja internet -> Wi-Fi -> valitse Wi-Fi-verkko -> Lisäasetukset -> lisää laite ja skannaa QR-koodi."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Peru painamalla Takaisin-painiketta"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Jatka"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Laitteen tallennustila"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Siirrettävä tallennustila"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Tyhjennä"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Vapauta tallennustilaa"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Tyhjennä välimuistidata"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Vapauta <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Poistaa väliaikaiset tiedostot, jotka vievät tilaa. Tällä ei ole vaikutusta tallennettuun dataan, esim. sovellusasetuksiin tai offline-videoihin, eikä sinun tarvitse kirjautua sovelluksiin uudelleen."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Tyhjennetäänkö välimuistidata?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Kaikkien sovellusten välimuistidata tyhjennetään."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Poista sovelluksia"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> on otettu käyttöön."</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Käyttöönotto epäonnistui: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB-tallennustila yhdistetty"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofoni"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Pääsy mikrofoniin"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Sovelluksen pääsy mikrofoniin"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Pääsy mikrofoniin estetty"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Jos haluat poistaa eston, salli pääsy mikrofoniin siirtämällä laitteen yksityisyysvalitsinta."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Pääsy kameraan"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Sovelluksen pääsy kameraan"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Pääsy kameraan estetty"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Jos haluat poistaa eston, salli pääsy kameraan siirtämällä laitteen yksityisyysvalitsinta."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Pääsy mikrofoniin: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Kun lupa on päällä, kaikki sovellukset ja palvelut, joilla se on, saavat pääsyoikeuden kaikkiin laitteen mikrofoneihin.\n\nTämä asetus ei vaikuta audiolisälaitteisiin, joilla on oma protokolla."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Pääsy kameraan: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Turkoosi"</string>
<string name="color_yellow" msgid="3519470952904560404">"Keltainen"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audiokuvaus"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Kuule kuvaus tapahtumista näytöllä"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Ota käyttöön"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Määritykset"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Käytetäänkö: <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Valvonta"</string>
<string name="system_apps" msgid="8481888654606868074">"Sovellukset"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Pysy käynnissä"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Näyttö ei koskaan sammu"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP-tarkistus"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI-optimointi"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Käynnistetäänkö uudelleen?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"HDMI-laitteiden ja TV:n sammutus"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV päälle automaattisesti"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"TV:n ja HDMI-laitteiden käynnistys"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Liitetyt tuloliitännät</item>
- <item quantity="one">Liitetty tuloliitäntä</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Tuloliitännät valmiustilassa</item>
- <item quantity="one">Tuloliitäntä valmiustilassa</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Liittämättömät tuloliitännät</item>
- <item quantity="one">Liittämätön tuloliitäntä</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Liitetty tulo}other{Liitetyt tulot}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Tuloliitäntä valmiustilassa}other{Tuloliitännät valmiustilassa}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Tuloa ei liitetty}other{Tuloja ei liitetty}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Rajoita tilisi sovelluksien ja muun sisällön käyttöä"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Rajoitettu profiili"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Ohjaaja: <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Luo rajoitettu profiili"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Asetukset"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Sallitut sovellukset"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d sovellusta sallittu</item>
- <item quantity="one">1 sovellus sallittu</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Sallittu"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Ei sallittu"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Muokkaa rajoituksia"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Kolmannen osapuolen lähde"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Luvat"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Sovellus ei käytettävissä"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Käyttämättömät sovellukset"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Vahvista"</string>
<string name="settings_cancel" msgid="576094334743686152">"Peru"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Tämä käyttöoikeus antaa sovelluksen muokata järjestelmäasetuksia."</string>
<string name="write_settings_on" msgid="71675710746513956">"Kyllä"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Ei"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Pääsy kaikkiin tiedostoihin"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Salli pääsy tiedostojen ylläpitoa varten"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Salli sovelluksen lukea, muokata ja poistaa kaikkia tiedostoja tällä laitteella ja yhdistetyillä tallennuslaitteilla. Jos sallit tämän, sovelluksella on pääsy tiedostoihin ilman, että sinulle ilmoitetaan asiasta erikseen."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Kuva kuvassa"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Salli kuva kuvassa"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Mikään asennettu sovellus ei tue kuva kuvassa ‑toimintoa."</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Anna sovelluksille lupa luoda Kuva kuvassa ‑ikkuna, kun sovellus on auki tai kun olet poistunut siitä (esimerkiksi takaisin katsomaan videota). Tämä ikkuna näytetään muiden sovellusten ikkunoiden päällä."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Anna sovellusten lisätä herätyksiä ja ajoittaa kiireellisiä tapahtumia. Näin sovellukset voivat toimia taustalla, mikä voi kuluttaa enemmän virtaa.\n\nIlman tätä lupaa sovellusten ajoittamat herätykset ja aikaan perustuvat tapahtumat eivät toimi."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Käynnistä näyttö"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Salli näytön käynnistäminen"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Salli sovelluksen käynnistää näyttö. Jos sovellus saa luvan, se voi käynnistää näytön itsenäisesti milloin tahansa."</string>
<string name="special_access" msgid="21806055758289916">"Erityisoikeudet"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Ääni"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Data Saver"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Säädä videoiden laatua automaattisesti mobiilidatan käytön vähentämiseksi"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Datan käyttö ja ilmoitukset"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Voit yhdistää verkkoon langattomasti, Ethernetillä tai puhelimesi hotspotilla. Katso lisäohjeita osoitteesta "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Voit yhdistää verkkoon langattomasti, Ethernetillä tai puhelimesi hotspotilla."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Toiminto ei ole sallittu"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Äänenvoimakkuutta ei voi muuttaa"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Virta ja energia"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Käynnistymistoiminta"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Nollaa"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernetin yhdistämiskoodi"</string>
</resources>
diff --git a/Settings/res/values-fr-rCA/strings.xml b/Settings/res/values-fr-rCA/strings.xml
index 8c5d78b..a69fc67 100644
--- a/Settings/res/values-fr-rCA/strings.xml
+++ b/Settings/res/values-fr-rCA/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Ajouter un compte"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Comptes et connexion"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Aucun compte"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> compte</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> comptes</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# compte}one{# compte}other{# comptes}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Services multimédias, Assistant et Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Réseau et Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Son"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Applications"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Préférences de l\'appareil"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Télécommandes et accessoires"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Aucun appareil Bluetooth connecté"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accessoire</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accessoires</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Écran et son"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Aide et commentaires"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Confidentialité"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Rétablir la configuration par défaut"</string>
<string name="device_calibration" msgid="2907914144048739705">"Étalonnage"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Économiseur d\'énergie"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Appareils"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Sélectionner les options"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Son ambiophonique"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMATS ACTIVÉS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMATS DÉSACTIVÉS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Pour désactiver ce format, modifiez la sélection du format en la faisant passer à Manuel."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Résolution"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatique"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"La résolution a été modifiée"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Sélectionnez OK pour utiliser %1$s à partir de maintenant."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Annuler"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Effacer les données mises en cache?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Les données en cache des applis seront effacées."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Ajouter un accessoire"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Association en cours…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Connexion en cours…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accessoires"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Télécommande"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Paramètres de la télécommande"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Configurer les boutons de la télécommande"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Contrôlez le volume, l\'alimentation, les entrées sur les téléviseurs, les récepteurs et les barres de son"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Connecter"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Connecter à %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Déconnecter"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Non accessible"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Applications d\'administration d\'appareils"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Aucune application active"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> application active</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> applications actives</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Désactivé par admin., politique cryptage, stock. authentifiants"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Renseignements sur l\'appareil géré"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Changements et paramètres gérés par votre organisation"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Aucun"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Applications installées"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Le nombre d\'applications est estimé. Il peut exclure les applications installées à partir d\'une source autre que la boutique Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="one">Minimum de <xliff:g id="COUNT_1">%d</xliff:g> application</item>
- <item quantity="other">Minimum de <xliff:g id="COUNT_1">%d</xliff:g> applications</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum de # application}one{Minimum de # application}other{Minimum de # applications}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Autorisations de localisation"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Autorisations du microphone"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Autorisations de l\'appareil photo"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Applications par défaut"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> application</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> applications</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# application}one{# application}other{# applications}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Clavier par défaut"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Valeur définie : <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Le RPV permanent est activé"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Certificats de confiance"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Certificats de confiance installés dans votre profil personnel"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Certificats de confiance installés dans votre profil professionnel"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Minimum de <xliff:g id="COUNT_1">%d</xliff:g> certificat CA</item>
- <item quantity="other">Minimum de <xliff:g id="COUNT_1">%d</xliff:g> certificats CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certificat CA}one{# certificat CA}other{# certificats CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"L\'administrateur peut verrouiller l\'appareil et réinitialiser le mot de passe"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"L\'administrateur peut supprimer toutes les données de l\'appareil"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Nombre maximal de tentatives d\'entrée du mot de passe avant de supprimer toutes les données de l\'appareil"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Nombre maximal de tentatives d\'entrée du mot de passe avant de supprimer les données du profil professionnel"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> tentative</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tentatives</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# tentative}one{# tentative}other{# tentatives}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Cet appareil est géré par votre organisation."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Cet appareil est géré par <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"En savoir plus"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Application d\'appareil photo</item>
- <item quantity="other">Applications d\'appareil photo</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Application d\'appareil photo}one{Application d\'appareil photo}other{Applications d\'appareil photo}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Application d\'agenda"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Application de contacts"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Application de client de courriel</item>
- <item quantity="other">Applications de client de courriel</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Application de client de messagerie}one{Application de client de messagerie}other{Applications de client de messagerie}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Application de carte"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Application de téléphonie</item>
- <item quantity="other">Applications de téléphonie</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Application de téléphonie}one{Application de téléphonie}other{Applications de téléphonie}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Application du navigateur"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g> et <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g> et <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Version du SE d\'Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Numéro de série"</string>
<string name="about_build" msgid="8467840394761634575">"Version d\'Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Annonces"</string>
<string name="ads_description" msgid="8081069475265061074">"Gérez paramètres annonces, modifiez identifiant publicitaire."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Google Ads : gérez vos paramètres des annonces, modifiez votre identifiant publicitaire."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"M. à j. système supplém."</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Le réseau peut être surveillé"</string>
<string name="done_button" msgid="616159688526431451">"Terminé"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Faire confiance au certificat ou le retirer</item>
- <item quantity="other">Faire confiance aux certificats ou les retirer</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé une autorité de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applications et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé des autorités de certification sur votre appareil, ce qui peut lui permettre de surveiller l\'activité de votre appareil sur le réseau, y compris les courriels, les applications et les sites Web sécurisés.\n\nPour en savoir plus sur ces certificats, communiquez avec votre administrateur.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé une autorité de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applications et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, communiquez avec votre administrateur.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé des autorités de certification pour votre profil professionnel, ce qui peut lui permettre de surveiller l\'activité professionnelle sur le réseau, y compris les courriels, les applications et les sites Web sécurisés.\n\nPour en savoir plus sur ces certificats, communiquez avec votre administrateur.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Un tiers peut surveiller votre activité réseau, y compris les courriels, les applications et les sites Web sécurisés. \n\nUn certificat de confiance installé sur votre appareil rend cela possible."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Vérifier le certificat</item>
- <item quantity="other">Vérifier les certificats</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Faire confiance au certificat ou le retirer}one{Faire confiance au certificat ou le retirer}other{Faire confiance aux certificats ou les retirer}}"</string>
<string name="device_status" msgid="8266002761193692207">"État"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Réseau, numéros de série et autres renseignements"</string>
<string name="manual" msgid="5683935624321864999">"Manuelle"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Connecter"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Supprimer le réseau"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Supprimer les données utilisées pour se connect. au réseau, y compris tout mot de passe enregistré."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Joignez un réseau Wifi en numérisant le code QR à partir de votre téléphone cellulaire, puis suivez l\'instruction."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Pour vous connecter à un réseau Wi-Fi, numérisez le code QR sur un téléphone et suivez les instructions.\n \n Sur un "<b>"téléphone Android"</b>", sélectionnez Paramètres > Réseau et Internet > Wi-Fi > sélectionnez un réseau Wi-Fi > Paramètres avancés > ajoutez un appareil, puis numérisez le code QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Appuyez sur le bouton Retour pour annuler"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continuer"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Mémoire interne de l\'appareil"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Stockage amovible"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Réinitialiser"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Libérer de l\'espace de stockage"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Effacer les données mises en cache"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Libérer <xliff:g id="SPACE">%1$s</xliff:g> d\'espace de stockage"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Efface les fichiers temporaires qui prennent de l\'espace de stockage. Cela n\'aura aucune incidence sur les données enregistrées, comme les préférences de l\'application ou les vidéos hors ligne, et vous n\'aurez pas à vous reconnecter aux applications."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Effacer les données mises en cache?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Les données en cache des applis seront effacées."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Désinstaller des applications"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> est monté"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Impossible de monter <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Mémoire de stockage USB reconnectée"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Microphone"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Accès au microphone"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Accès des applications au microphone"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Accès au microphone bloqué"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Pour le débloquer, autorisez l\'accès en basculant le commutateur de confidentialité de votre appareil à la position Activé."</string>
<string name="camera" msgid="1226671478936288283">"Caméra"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Accès à la caméra"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Accès des applications à la caméra"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Accès à l\'appareil photo bloqué"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Pour le débloquer, autorisez l\'accès en basculant le commutateur de confidentialité de votre appareil à la position Activé."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Accès au microphone : <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Si vous activez cette option, l\'ensemble des applications et des services autorisés pourront accéder à tout microphone de cet appareil.\n\nCe paramètre n\'a aucune incidence sur les périphériques audio qui utilisent un protocole personnalisé."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Accès à la caméra : <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Jaune"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audiodescription"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Écoutez une description de ce qui se passe à l\'écran dans les émissions et les films pris en charge"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Activer"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuration"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Utiliser <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Surveillance"</string>
<string name="system_apps" msgid="8481888654606868074">"Applications"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Rester activé"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"L\'écran ne se mettra jamais en veille"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Vérification HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Optimisation HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Redémarrer maintenant?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Éteindre les appareils HDMI avec le téléviseur"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Allumer automatiquement la télé"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Allumer le téléviseur avec l\'appareil HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Entrée connectée</item>
- <item quantity="other">Entrées connectées</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Entrée en veille</item>
- <item quantity="other">Entrées en veille</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Entrée non connectée</item>
- <item quantity="other">Entrées non connectées</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Entrée connectée}one{Entrée connectée}other{Entrées connectées}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Entrée en veille}one{Entrée en veille}other{Entrées en veille}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Entrée non connectée}one{Entrée non connectée}other{Entrées non connectées}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Limiter l\'accès aux applications et autres contenus de votre compte"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Profil limité"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Dépend de <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Créer un profil limité"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Paramètres"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Applications autorisées"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d application autorisée</item>
- <item quantity="other">%d applications autorisées</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Autorisée"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Non autorisé"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Personnaliser les restrictions"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Source tierce"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Autorisations"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"L\'application n\'est pas disponible"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Applications non utilisées"</string>
<string name="settings_ok" msgid="5950888975075541964">"Ok"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirmer"</string>
<string name="settings_cancel" msgid="576094334743686152">"Annuler"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Cette autorisation permet à une application de modifier les paramètres du système."</string>
<string name="write_settings_on" msgid="71675710746513956">"Oui"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Non"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Accès à tous les fichiers"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Autorisez l\'accès pour gérer tous les fichiers"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Autoriser cette application à lire, à modifier et à supprimer tous les fichiers qui se trouvent sur cet appareil ou sur des volumes de stockage connectés. Si vous accordez cette autorisation, l\'application pourra accéder à des fichiers sans que vous le sachiez."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Incrustation d\'image"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Autoriser l\'incrustation d\'image"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Aucune application installée n\'est compatible avec le mode d\'incrustation d\'image"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Autorisez les applications à créer une fenêtre d\'incrustation d\'image lorsqu\'elles sont ouvertes ou après les avoir quittées (par exemple, pour continuer de regarder une vidéo). Cette fenêtre se superpose aux autres applications en cours d\'utilisation."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Autorisez les applications à créer des alarmes et à programmer des actions urgentes. Cela permet aux applications de s\'exécuter en arrière-plan, ce qui peut demander plus d\'alimentation.\n\nSi cette autorisation est désactivée, les alarmes existantes et les événements en temps réel programmés par l\'application ne fonctionneront pas."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Activation de l\'écran"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Autoriser l\'activation de l\'écran"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Autorisez une application à activer l\'écran. Lorsque vous accordez cette autorisation, l\'application peut activer l\'écran à tout moment sans votre volonté explicite."</string>
<string name="special_access" msgid="21806055758289916">"Accès spécial des applications"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Économiseur de données"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Ajuster automatiquement la qualité vidéo pour utiliser moins de données cellulaires"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Consommation des données et alertes"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Connectez-vous à Internet par Wi-Fi, Ethernet ou le point d\'accès sans fil de votre téléphone. Pour obtenir de l\'aide, consultez la page "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Connectez-vous à Internet par Wi-Fi ou Ethernet, ou au moyen du point d\'accès sans fil de votre téléphone."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Action interdite"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Impossible de modifier le volume"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Alimentation et énergie"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Comportement lorsque le téléviseur est allumé"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Réinitialiser"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Code d\'association Ethernet"</string>
</resources>
diff --git a/Settings/res/values-fr/strings.xml b/Settings/res/values-fr/strings.xml
index 746af9a..9836c0f 100644
--- a/Settings/res/values-fr/strings.xml
+++ b/Settings/res/values-fr/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Ajouter un compte"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Comptes et connexion"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Aucun compte"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> compte</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> comptes</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# compte}one{# compte}other{# comptes}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Services multimédias, Assistant, paiements"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Réseau et Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Son"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Applications"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Préférences relatives à l\'appareil"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Télécommandes et accessoires"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Aucun appareil Bluetooth connecté"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accessoire</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accessoires</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Affichage et son"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Aide et commentaires"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Confidentialité"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Rétablissement de la configuration d\'usine"</string>
<string name="device_calibration" msgid="2907914144048739705">"Étalonnage"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Économie d\'énergie"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Appareils"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Sélectionner des formats"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Son surround"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMATS ACTIVÉS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMATS DÉSACTIVÉS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Pour désactiver ce format, définissez la sélection sur \"Manuelle\"."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Résolution"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatique"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"La résolution a été modifiée"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Sélectionnez \"OK\" pour utiliser %1$s à partir de maintenant."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Annuler"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Effacer les données mises en cache ?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Les données en cache des applis seront effacées."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Ajouter un accessoire"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Association en cours…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Connexion en cours…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accessoires"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Télécommande"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Paramètres de la télécommande"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Configurer la télécommande"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Contrôlez le volume, l\'alimentation et le mode d\'entrée sur vos téléviseurs, vos récepteurs et vos barres de son"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Connecter"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Connecter à %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Déconnecter"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Non disponible"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Applis d\'administration"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Aucune application active"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> appli active</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> applis actives</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Désactivé par l\'admin, règles chiffrement, stockage ID"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Infos sur l\'appareil géré"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Modifications et paramètres gérés par votre entreprise"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Aucune"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Applications installées"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Le nombre d\'applis est une estimation. Il est possible qu\'il n\'inclue pas celles installées sans passer par le Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="one">Au moins <xliff:g id="COUNT_1">%d</xliff:g> appli</item>
- <item quantity="other">Au moins <xliff:g id="COUNT_1">%d</xliff:g> applis</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Au moins # appli}one{Au moins # appli}other{Au moins # applis}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Autorisations d\'accéder à la position"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Autorisations d\'accès au micro"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Autorisations d\'accès à l\'appareil photo"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Applications par défaut"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> appli</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> applis</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# appli}one{# appli}other{# applis}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Clavier par défaut"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Défini sur \"<xliff:g id="APP_LABEL">%s</xliff:g>\""</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"VPN permanent activé"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Identifiants de confiance"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Identifiants de confiance dans votre profil personnel"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Identifiants de confiance dans votre profil professionnel"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Au moins <xliff:g id="COUNT_1">%d</xliff:g> certificat CA</item>
- <item quantity="other">Au moins <xliff:g id="COUNT_1">%d</xliff:g> certificats CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certificat CA}one{# certificat CA}other{# certificats CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"L\'administrateur peut verrouiller l\'appareil et réinitialiser le mot de passe"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"L\'administrateur peut supprimer toutes les données de l\'appareil"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Tentatives de saisie du mot de passe avant la suppression de toutes les données de l\'appareil"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Tentatives de saisie du mot de passe avant la suppression des données du profil professionnel"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> tentative</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tentatives</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# tentative}one{# tentative}other{# tentatives}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Cet appareil est géré par votre organisation."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Cet appareil est géré par <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"En savoir plus"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Appli d\'appareil photo</item>
- <item quantity="other">Applis d\'appareil photo</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Appli d\'appareil photo}one{Appli d\'appareil photo}other{Applis d\'appareil photo}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Agenda"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Contacts"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Appli de client de messagerie</item>
- <item quantity="other">Applis de client de messagerie</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Appli de client de messagerie}one{Appli de client de messagerie}other{Applis de client de messagerie}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Cartes"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Appli de téléphone</item>
- <item quantity="other">Applis de téléphone</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Appli de téléphone}one{Appli de téléphone}other{Applis de téléphone}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Appli de navigateur"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Version d\'Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Numéro de série"</string>
<string name="about_build" msgid="8467840394761634575">"Build Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="one">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étape pour devenir développeur</item>
- <item quantity="other">Plus que <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> étapes pour devenir développeur</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Plus que # étape pour devenir développeur}one{Plus que # étape pour devenir développeur}other{Plus que # étapes pour devenir développeur}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Annonces"</string>
<string name="ads_description" msgid="8081069475265061074">"Gérez paramètres annonces, modifiez identifiant publicitaire."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Annonces, Gérez les paramètres des annonces, modifiez par exemple votre identifiant publicitaire."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Mises à jour système suppl."</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Il est possible que le réseau soit surveillé."</string>
<string name="done_button" msgid="616159688526431451">"OK"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Faire confiance au certificat ou le supprimer</item>
- <item quantity="other">Faire confiance aux certificats ou les supprimer</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé un certificat CA sur votre appareil afin de contrôler l\'activité sur le réseau, y compris les e-mails, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, contactez votre administrateur.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé des certificats CA sur votre appareil afin de contrôler l\'activité sur le réseau, y compris les e-mails, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ces certificats, contactez votre administrateur.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé un certificat CA pour votre profil professionnel afin de contrôler l\'activité sur le réseau, y compris les e-mails, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ce certificat, contactez votre administrateur.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a installé des certificats CA pour votre profil professionnel afin de contrôler l\'activité sur le réseau, y compris les e-mails, les applis et les sites Web sécurisés.\n\nPour en savoir plus sur ces certificats, contactez votre administrateur.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Des tiers ont la possibilité de surveiller votre activité sur le réseau, y compris en ce qui concerne les e-mails, les applications et les sites Web sécurisés.\n\nUn certificat de confiance installé sur votre appareil rend cela possible."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Vérifier le certificat</item>
- <item quantity="other">Vérifier les certificats</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Faire confiance au certificat ou le supprimer}one{Faire confiance au certificat ou le supprimer}other{Faire confiance aux certificats ou les supprimer}}"</string>
<string name="device_status" msgid="8266002761193692207">"État"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Réseau, numéros de série et autres informations"</string>
<string name="manual" msgid="5683935624321864999">"Manuel"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Se connecter"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Supprimer le réseau"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Supprimer les infos utilisées pour se connecter à ce réseau, y compris tout mot de passe enregistré."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Pour rejoindre un réseau Wi-Fi, scannez le code QR via votre téléphone mobile, puis suivez les instructions."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Pour rejoindre un réseau Wi-Fi, scannez le code QR depuis un téléphone mobile et suivez les instructions.\n \n Sur un "<b>"téléphone Android"</b>", accédez à Paramètres -> Réseau et Internet -> Wi-Fi -> sélectionnez un réseau Wi-Fi -> Paramètres avancés -> ajoutez un appareil et scannez le code QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Appuyer sur le bouton \"Retour\" pour annuler"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continuer"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Espace de stockage de l\'appareil"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Mémoire de stockage amovible"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Réinitialiser"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Libérer de l\'espace de stockage"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Effacer les données en cache"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Libérer <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Efface les fichiers temporaires qui prennent de la place. N\'aura pas d\'impact sur les données enregistrées, comme les préférences d\'applis ou les vidéos hors connexion, et vous n\'aurez pas besoin de vous reconnecter aux applis."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Effacer les données en cache ?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Les données en cache des applis seront effacées."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Désinstaller des applis"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"La mémoire de stockage \"<xliff:g id="NAME">%1$s</xliff:g>\" a bien été installée."</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Impossible d\'installer la mémoire de stockage \"<xliff:g id="NAME">%1$s</xliff:g>\"."</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Mémoire de stockage USB reconnectée."</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Micro"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Accès au micro"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Accès des applis au micro"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Accès au microphone bloqué"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Pour débloquer le micro et autoriser l\'accès à celui-ci, placez le bouton de désactivation qui se trouve sur votre appareil en position \"micro activé\"."</string>
<string name="camera" msgid="1226671478936288283">"Caméra"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Accès à la caméra"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Accès des applis à la caméra"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Accès à la caméra bloqué"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Pour débloquer la caméra et autoriser l\'accès à celle-ci, placez le bouton de désactivation qui se trouve sur votre appareil en position \"caméra activée\"."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Accès au micro : <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Si ce paramètre est activé, tous les services et applis autorisés peuvent accéder aux micros de cet appareil.\n\nLes périphériques audio ayant un protocole personnalisé ne sont pas affectés par ce paramètre."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Accès à la caméra : <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Jaune"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audiodescription"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Écoutez une description des scènes dans les films et séries compatibles"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Activer"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuration"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Utiliser <xliff:g id="SERVICE">%1$s</xliff:g> ?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Surveillance"</string>
<string name="system_apps" msgid="8481888654606868074">"Applications"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Laisser activé"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"L\'écran ne se met jamais en veille"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Vérification HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Optimisation HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Redémarrer maintenant ?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Éteindre les appareils HDMI avec la TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Allumer automatiquement la TV"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Allumer la TV avec l\'appareil HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Entrée connectée</item>
- <item quantity="other">Entrées connectées</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Entrée en veille</item>
- <item quantity="other">Entrées en veille</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Entrée déconnectée</item>
- <item quantity="other">Entrées déconnectées</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Entrée connectée}one{Entrée connectée}other{Entrées connectées}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Entrée en veille}one{Entrée en veille}other{Entrées en veille}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Entrée déconnectée}one{Entrée déconnectée}other{Entrées déconnectées}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Limiter l\'accès aux applications et autres contenus de votre compte"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Profil limité"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Contrôlées par <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Créer un profil limité"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Paramètres"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Applications autorisées"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d application autorisée</item>
- <item quantity="other">%d applications autorisées</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Autorisé"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Non autorisé"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Personnaliser les restrictions"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Code tiers"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Autorisations"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Application indisponible"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Applis inutilisées"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirmer"</string>
<string name="settings_cancel" msgid="576094334743686152">"Annuler"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Cette autorisation permet à une application de modifier les paramètres système."</string>
<string name="write_settings_on" msgid="71675710746513956">"Oui"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Non"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Accès à tous les fichiers"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Autoriser l\'accès pour gérer tous les fichiers"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Autoriser cette appli à lire, modifier et supprimer tous les fichiers sur cet appareil ou sur n\'importe quel volume de stockage connecté. Si cette option est activée, l\'appli pourra accéder à des fichiers à votre insu."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Autoriser le Picture-in-picture"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Aucune application installée n\'est compatible avec le mode Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Autorisez les applications à créer une fenêtre Picture-in-picture lorsqu\'elles sont ouvertes ou après les avoir quittées (par exemple, pour continuer de regarder une vidéo). Cette fenêtre se superpose aux autres applications en cours d\'utilisation."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Autoriser les applis à définir des alarmes et à programmer des actions à certaines heures. Elle s\'exécutera alors en arrière-plan, ce qui peut solliciter davantage la batterie.\n\nSi l\'autorisation est désactivée, les alarmes existantes et les événements programmés par l\'appli ne fonctionneront pas."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Activer l\'écran"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Autoriser l\'activation de l\'écran"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Autoriser une appli à activer l\'écran. Si l\'autorisation est accordée, l\'appli peut activer l\'écran à tout moment sans votre intention explicite."</string>
<string name="special_access" msgid="21806055758289916">"Accès spéciaux des applis"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Économiseur de données"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Ajuster automatiquement la qualité vidéo pour utiliser moins de données mobiles"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Consommation des données et alertes"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Vous pouvez vous connecter à Internet via le Wi-Fi, Ethernet ou le point d\'accès du téléphone. Pour obtenir de l\'aide, rendez-vous sur "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Vous pouvez vous connecter à Internet via le Wi-Fi, Ethernet ou le point d\'accès du téléphone."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Action interdite"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Impossible de modifier le volume"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Alimentation et énergie"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Comportement au démarrage"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Réinitialiser"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Code d\'association Ethernet"</string>
</resources>
diff --git a/Settings/res/values-gl/strings.xml b/Settings/res/values-gl/strings.xml
index 49e16da..b5e1a35 100644
--- a/Settings/res/values-gl/strings.xml
+++ b/Settings/res/values-gl/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Engadir unha conta"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Contas e inicio de sesión"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Ningunha conta"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> contas</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> conta</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# conta}other{# contas}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Servizos multimedia, Asistente, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Rede e Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Son"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplicacións"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Preferencias do dispositivo"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Mandos a distancia e accesorios"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Non hai dispositivos Bluetooth conectados"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accesorios</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> accesorio</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Pantalla e son"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Axuda e comentarios"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacidade"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Restablecemento dos datos de fábrica"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibración"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Aforrador de enerxía"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Dispositivos"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Seleccionar formatos"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Son envolvente"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMATOS ACTIVADOS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMATOS DESACTIVADOS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Para desactivar a opción, cambia a selección de formato a Manual."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolución"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automática"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Modificouse a resolución"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Se queres utilizar %1$s a partir de agora, selecciona Aceptar."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Cancelar"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Aceptar"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Queres borrar os datos da caché?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Isto borrará datos da caché para as aplicacións"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Engadir accesorio"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Sincronizando..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Conectando…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accesorios"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Mando a distancia"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Configuración do mando a distancia"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Configurar botóns do mando a distancia"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Controla o volume, o acendido e a entrada nos receptores, barras de son e televisións"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Conectar"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Conectar a este dispositivo: %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Desconectar"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Non dispoñible"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Aplicacións de administración de dispositivos"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Non hai aplicacións activas"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplicacións activas</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplicación activa</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Desactivado por admin., encriptación ou almac. credenciais"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Información sobre o dispositivo xestionado"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Os cambios e a configuración están xestionados pola túa organización"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Ningunha acción"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Aplicacións instaladas"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"O número de aplicacións é unha estimación. É posible que non inclúa as instaladas fóra de Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Como mínimo, <xliff:g id="COUNT_1">%d</xliff:g> aplicacións</item>
- <item quantity="one">Como mínimo, <xliff:g id="COUNT_0">%d</xliff:g> aplicación</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Polo menos # aplicación}other{Polo menos # aplicacións}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Permisos de localización"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Permisos do micrófono"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Permisos da cámara"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Aplicacións predeterminadas"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplicacións</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplicación</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplicación}other{# aplicacións}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Teclado predeterminado"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Definido como: <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Activouse a VPN sempre activada"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Credenciais de confianza"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Credencias de confianza no teu perfil persoal"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Credencias de confianza no teu perfil de traballo"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Como mínimo, <xliff:g id="COUNT_1">%d</xliff:g> certificados de CA</item>
- <item quantity="one">Como mínimo, <xliff:g id="COUNT_0">%d</xliff:g> certificado de CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certificado de CA}other{# certificados de CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"O administrador pode bloquear o dispositivo e restablecer o contrasinal"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"O administrador pode eliminar todos os datos do dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Intentos errados de introdución do contrasinal antes de eliminar todos os datos do dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Intentos errados de introdución do contrasinal antes de eliminar os datos do perfil de traballo"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> intentos</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> intento</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# intento}other{# intentos}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Este dispositivo está xestionado pola túa organización."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Este dispositivo está xestionado por <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Máis información"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Aplicacións da cámara</item>
- <item quantity="one">Aplicación da cámara</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Aplicación de cámara}other{Aplicacións de cámara}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Aplicación do calendario"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplicación de contactos"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Aplicacións cliente de correo</item>
- <item quantity="one">Aplicación cliente de correo</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{App cliente correo electrónico}other{Apps cliente correo electr.}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Aplicación de mapas"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Aplicacións do teléfono</item>
- <item quantity="one">Aplicación do teléfono</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Aplicación de teléfono}other{Aplicacións de teléfono}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Aplicación do navegador"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Versión do sistema operativo de Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Número de serie"</string>
<string name="about_build" msgid="8467840394761634575">"Compilación do sistema operativo de Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Fáltanche <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> pasos para ser programador</item>
- <item quantity="one">Fáltache <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> paso para ser programador</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Agora estás a # paso de converterte na persoa encargada de programar}other{Agora estás a # pasos de converterte na persoa encargada de programar}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Anuncios"</string>
<string name="ads_description" msgid="8081069475265061074">"Xestiona a túa configuración de anuncios. Aquí poderás, por exemplo, restablecer o teu código de identificación de publicidade."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Anuncios. Xestiona a túa configuración de anuncios. Aquí poderás, por exemplo, restablecer o teu código de identificación de publicidade."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Actualizacións do sistema"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"É posible que se supervise a rede"</string>
<string name="done_button" msgid="616159688526431451">"Feito"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Confiar nos certificados ou eliminalos</item>
- <item quantity="one">Confiar no certificado ou eliminalo</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalou no teu dispositivo autoridades de certificación que poden permitirlle supervisar a actividade da rede do dispositivo, (por exemplo, os correos electrónicos, as aplicacións e os sitios web seguros).\n\nPara obter máis información sobre estes certificados, ponte en contacto co teu administrador.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> instalou no teu dispositivo unha autoridade de certificación que pode permitirlle supervisar a actividade da rede do dispositivo, (por exemplo, os correos electrónicos, as aplicacións e os sitios web seguros).\n\nPara obter máis información sobre este certificado, ponte en contacto co teu administrador.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalou para o teu perfil de traballo autoridades de certificación que poden permitirlle supervisar a actividade da rede do traballo, (por exemplo, os correos electrónicos, as aplicacións e os sitios web seguros).\n\nPara obter máis información sobre estes certificados, ponte en contacto co teu administrador.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> instalou para o teu perfil de traballo unha autoridade de certificación que pode permitirlle supervisar a actividade da rede do traballo, (por exemplo, os correos electrónicos, as aplicacións e os sitios web seguros).\n\nPara obter máis información sobre este certificado, ponte en contacto co teu administrador.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Un terceiro pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web seguros.\n\nUnha credencial de confianza instalada no teu dispositivo fai que isto sexa posible."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Comprobar certificados</item>
- <item quantity="one">Comprobar certificado</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Confiar no certificado ou eliminalo}other{Confiar nos certificados ou eliminalos}}"</string>
<string name="device_status" msgid="8266002761193692207">"Estado"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Rede, números de serie e outra información"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Conectar"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Esquecer rede"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Borrarase a información usada para conectarse a esta rede, incluídos os contrasinais gardados"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Para conectarte a unha rede wifi, escanea o código QR usando o teu teléfono móbil e sigue as instrucións."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Para conectarte a unha rede wifi, escanea o código QR cun teléfono móbil e sigue as instrucións.\n \n Se tes un "<b>"teléfono Android"</b>", vai a Configuración -> Rede e Internet -> Wifi -> Seleccionar wifi -> Configuración avanzada -> Engadir dispositivo e, a continuación, escanea o código QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Para cancelar a acción, preme o botón Atrás"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Aceptar"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continuar"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Almacenamento do dispositivo"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Almacenamento extraíble"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Restablecer"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Liberar espazo de almacenamento"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Borrar datos da caché"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Liberar <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Borra os ficheiros temporais que ocupan espazo. Esta acción non afecta aos datos gardados, como as preferencias das aplicacións ou os vídeos sen conexión, nin terás que iniciar sesión nas aplicacións de novo."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Queres borrar os datos da caché?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Isto borrará datos da caché para as aplicacións."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Desinstalar aplicacións"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Inseriuse <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Non se puido inserir <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Volveuse conectar o almacenamento USB"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Micrófono"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Acceso ao micrófono"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Acceso das aplicacións ao micrófono"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"O acceso ao micrófono está bloqueado"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Para desbloquear o acceso ao micrófono, despraza o interruptor de privacidade do dispositivo á posición de micrófono activado."</string>
<string name="camera" msgid="1226671478936288283">"Cámara"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Acceso á cámara"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Acceso das aplicacións á cámara"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"O acceso á cámara está bloqueado"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Para desbloquear o acceso á cámara, despraza o interruptor de privacidade do dispositivo á posición de cámara activada."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Acceso ao micrófono: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Cando este interruptor está activado, todos os servizos e aplicacións con permiso poden acceder a calquera micrófono deste dispositivo.\n\nOs periféricos de audio que teñan protocolos personalizados non se verán afectados por esta opción de configuración."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Acceso á cámara: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Ciano"</string>
<string name="color_yellow" msgid="3519470952904560404">"Amarelo"</string>
<string name="color_magenta" msgid="2377854703399624607">"Maxenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audiodescrición"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Escoita unha descrición do que ocorre na pantalla en películas e programas"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Activar"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuración"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Usar <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Supervisión"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplicacións"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Pantalla activa"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"A pantalla nunca estará en modo de suspensión"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Comprobación HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Optimización HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Reiniciar agora?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Apagar os dispositivos HDMI co televisor"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Acendido autom. do televisor"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Acender o televisor co dispositivo HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Entradas conectadas</item>
- <item quantity="one">Entrada conectada</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Entradas en espera</item>
- <item quantity="one">Entrada en espera</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Entradas desconectadas</item>
- <item quantity="one">Entrada desconectada</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Entrada conectada}other{Entradas conectadas}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Entrada en espera}other{Entradas en espera}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Entrada desconectada}other{Entradas desconectadas}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Restrinxe o acceso a aplicacións e a outro tipo de contido da túa conta"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Perfil restrinxido"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controladas por <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Crear perfil restrinxido"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Configuración"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Aplicacións permitidas"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d aplicacións permitidas</item>
- <item quantity="one">1 aplicación permitida</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Con permiso"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Sen permiso"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Personalizar restricións"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Fonte externa"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Permisos"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"A aplicación non está dispoñible"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Aplicacións que non se usan"</string>
<string name="settings_ok" msgid="5950888975075541964">"ACEPTAR"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirmar"</string>
<string name="settings_cancel" msgid="576094334743686152">"Cancelar"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Con este permiso unha aplicación pode modificar a configuración do sistema."</string>
<string name="write_settings_on" msgid="71675710746513956">"Si"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Non"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Acceso a todos os ficheiros"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Permitir xestionar todos os ficheiros"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Permite que esta aplicación lea, modifique e elimine todos os ficheiros deste dispositivo ou de calquera unidade de almacenamento conectada. Se lle dás permiso, a aplicación poderá acceder aos ficheiros sen que se che notifique explicitamente."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Pantalla superposta"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Permitir pantalla superposta"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Ningunha das aplicacións instaladas é compatible coa función da pantalla superposta"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Permite que esta aplicación cree unha ventá de pantalla superposta mentres estea aberta ou despois de saír dela (por exemplo, para continuar visualizando un vídeo). A ventá móstrase sobre as demais aplicacións que esteas utilizando."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Permite que as aplicacións definan alarmas e planifiquen accións que dependan da hora. Con este permiso, as aplicacións poden executarse en segundo plano, o que pode provocar un maior consumo de batería.\n\nSe este permiso está desactivado, non funcionarán as alarmas que xa se definisen nin os eventos que dependan da hora planificados polas aplicacións."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Activar a pantalla"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Permitir activación da pantalla"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Permite que unha aplicación active a pantalla. Se lle dás permiso, a aplicación poderá activar a pantalla en calquera momento sen que teñas que facer nada."</string>
<string name="special_access" msgid="21806055758289916">"Acceso especial das apps"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Aforro de datos"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Axusta automaticamente a calidade dos vídeos para utilizar menos datos móbiles"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Alertas e uso de datos"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Podes conectarte a Internet utilizando unha rede wifi, Ethernet ou a zona wifi do teu teléfono. Para obter máis axuda, visita "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Podes conectarte a Internet utilizando unha rede wifi, un cable Ethernet ou a zona wifi do teu teléfono."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Acción non permitida"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Non se pode cambiar o volume"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Acendido e enerxía"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Comportamento do acendido"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Restablecemento"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Código de vinculación de Ethernet"</string>
</resources>
diff --git a/Settings/res/values-gu/strings.xml b/Settings/res/values-gu/strings.xml
index 2284a31..3c9841e 100644
--- a/Settings/res/values-gu/strings.xml
+++ b/Settings/res/values-gu/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"એકાઉન્ટ ઉમેરો"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"એકાઉન્ટ અને સાઇન ઇન"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"કોઈ એકાઉન્ટ નથી"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> એકાઉન્ટ</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> એકાઉન્ટ</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# એકાઉન્ટ}one{# એકાઉન્ટ}other{# એકાઉન્ટ}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"મીડિયા સેવાઓ, Assistant, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"નેટવર્ક અને ઇન્ટરનેટ"</string>
<string name="sound_category_title" msgid="7899816751041939518">"સાઉન્ડ"</string>
<string name="applications_category_title" msgid="7112019490898586223">"ઍપ"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"ડિવાઇસની પસંદગીઓ"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"રિમોટ અને ઍક્સેસરી"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"કોઈ કનેક્ટેડ બ્લૂટૂથ ઉપકરણો નથી"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ઍક્સેસરી</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ઍક્સેસરી</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ડિસ્પ્લે અને સાઉન્ડ"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"સહાય અને પ્રતિસાદ"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"પ્રાઇવસી"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"ફેક્ટરી ડેટા રીસેટ"</string>
<string name="device_calibration" msgid="2907914144048739705">"કેલિબ્રેશન"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"એનર્જી સેવર"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"ડિવાઇસ"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ફૉર્મેટ પસંદ કરો"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"સરાઉન્ડ સાઉન્ડ"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ચાલુ કરેલા ફોર્મેટ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"બંધ કરેલા ફોર્મેટ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"બંધ કરવા માટે, ફોર્મેટની પસંદગીને બદલીને મેન્યુઅલ કરો."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"રિઝોલ્યુશન"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"ઑટોમૅટિક"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"રિઝોલ્યુશન બદલવામાં આવ્યું છે"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"હવેથી %1$sનો ઉપયોગ કરવા માટે \'ઓકે\' પસંદ કરો."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"રદ કરો"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ઓકે"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"કૅશ કરેલ ડેટા સાફ કરીએ?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"આ તમામ ઍપ્લિકેશનોનો કેશ્ડ ડેટા સાફ કરશે."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"ઍક્સેસરી ઉમેરો"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"જોડી કરી રહ્યું છે…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"કનેક્ટ થઈ રહ્યું છે…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"ઍક્સેસરી"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"રિમોટ કન્ટ્રોલ"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"રિમોટ કન્ટ્રોલ સેટિંગ"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"રિમોટ બટનનું સેટઅપ કરો"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"ટીવી, રિસીવર અને સાઉન્ડબાર પર વૉલ્યૂમ, પાવર અને ઇનપુટને નિયંત્રિત કરો"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"કનેક્ટ કરો"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$sની સાથે કનેક્ટ કરો"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"ડિસ્કનેક્ટ કરો"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"ઉપલબ્ધ નથી"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"ડિવાઇસ ઍડમિન ઍપ"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"કોઈ સક્રિય ઍપ્લિકેશન નથી"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"વ્યવસ્થાપક, એન્ક્રિપ્શન પૉલિસી કે ઓળખપત્ર સ્ટોરેજ દ્વારા બંધ કરાયેલ"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"સંચાલિત ઉપકરણની માહિતી"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"ફેરફારો અને સેટિંગ તમારી સંસ્થા દ્વારા મેનેજ કરવામાં આવે છે"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"કંઈ નહીં"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"ઍપ્લિકેશનો ઇન્સ્ટૉલ કરી છે"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"ઍપની સંખ્યા અંદાજિત છે. તેમાં Play સ્ટોરની બહારથી ઇન્સ્ટૉલ કરેલી ઍપનો કદાચ સમાવેશ ન હોય."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{ઓછામાં ઓછી # ઍપ}one{ઓછામાં ઓછી # ઍપ}other{ઓછામાં ઓછી # ઍપ}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"સ્થાન માટેની પરવાનગીઓ"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"માઇક્રોફોન માટેની પરવાનગીઓ"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"કૅમેરા માટેની પરવાનગીઓ"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"ડિફૉલ્ટ ઍપ"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# ઍપ}one{# ઍપ}other{# ઍપ}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"ડિફૉલ્ટ કીબોર્ડ"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> પર સેટ કરેલ"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"હંમેશાં ચાલુ VPN ચાલુ કર્યું"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"વિશ્વસનીય ઓળખપત્રો"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"તમારી વ્યક્તિગત પ્રોફાઇલમાંનાં વિશ્વસનીય ઓળખપત્રો"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"તમારા કાર્યાલયની પ્રોફાઇલમાંનાં વિશ્વસનીય ઓળખપત્રો"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">ઓછામાં ઓછું <xliff:g id="COUNT_1">%d</xliff:g> CA પ્રમાણપત્ર</item>
- <item quantity="other">ઓછામાં ઓછા <xliff:g id="COUNT_1">%d</xliff:g> CA પ્રમાણપત્ર</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA પ્રમાણપત્ર}one{# CA પ્રમાણપત્ર}other{# CA પ્રમાણપત્ર}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"વ્યવસ્થાપક ઉપકરણને લૉક કરી શકે છે અને પાસવર્ડ ફરીથી સેટ કરી શકે છે"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"વ્યવસ્થાપક ડિવાઇસમાંનો બધો ડેટા કાઢી નાખી શકે છે"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"ઉપકરણમાંનો બધો ડેટા કાઢી નાખતા પહેલાં, પાસવર્ડના પ્રયાસો નિષ્ફળ થયા"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"કાર્ય પ્રોફાઇલનો ડેટા કાઢી નાખતા પહેલાં, પાસવર્ડના પ્રયાસો નિષ્ફળ થયા"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# પ્રયાસ}one{# પ્રયાસ}other{# પ્રયાસ}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"આ ડિવાઇસ તમારી સંસ્થા દ્વારા સંચાલિત થાય છે."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"આ ઉપકરણનું સંચાલન <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> દ્વારા થાય છે"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"વધુ જાણો"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Camera ઍપ</item>
- <item quantity="other">Camera ઍપ</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{કૅમેરા ઍપ}one{કૅમેરા ઍપ}other{કૅમેરા ઍપ}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"કૅલેન્ડર ઍપ્લિકેશન"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"સંપર્ક ઍપ્લિકેશન"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">ઇમેઇલ ક્લાયન્ટ ઍપ</item>
- <item quantity="other">ઇમેઇલ ક્લાયન્ટ ઍપ</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ઇમેઇલ ક્લાયન્ટ ઍપ}one{ઇમેઇલ ક્લાયન્ટ ઍપ}other{ઇમેઇલ ક્લાયન્ટ ઍપ}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"નકશા ઍપ્લિકેશન"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">ફોન ઍપ</item>
- <item quantity="other">ફોન ઍપ</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{ફોન ઍપ}one{ફોન ઍપ}other{ફોન ઍપ}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"બ્રાઉઝર ઍપ"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS વર્ઝન"</string>
<string name="about_serial" msgid="3432319328808745459">"અનુક્રમ ક્રમાંક"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS બિલ્ડ"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{તમે હવે ડેવલપર બનવાથી # પગલું દૂર છો}one{તમે હવે ડેવલપર બનવાથી # પગલું દૂર છો}other{તમે હવે ડેવલપર બનવાથી # પગલું દૂર છો}}"</string>
<string name="about_ads" msgid="7662896442040086522">"જાહેરાતો"</string>
<string name="ads_description" msgid="8081069475265061074">"જાહેરાત ID રીસેટ કરવા જેવા જાહેરાત સેટિંગ મેનેજ કરો."</string>
<string name="ads_content_description" msgid="1006489792324920289">"જાહેરાતો, જાહેરાત ID રીસેટ કરવા જેવા જાહેરાત સેટિંગ મેનેજ કરો."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"વધારાના સિસ્ટમ અપડેટ્સ"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"નેટવર્ક મૉનિટર કરી શકાય છે"</string>
<string name="done_button" msgid="616159688526431451">"થઈ ગયું"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">પ્રમાણપત્ર પર વિશ્વાસ કરો અથવા કાઢી નાખો</item>
- <item quantity="other">પ્રમાણપત્રો પર વિશ્વાસ કરો અથવા કાઢી નાખો</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> દ્વારા તમારા ડિવાઇસ પર પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કરવામાં આવ્યું છે, જે તેમને ઇમેઇલ, ઍપ અને સુરક્ષિત વેબસાઇટ સહિત તમારા ડિવાઇસની નેટવર્ક પ્રવૃત્તિનું નિરીક્ષણ કરવાની મંજૂરી આપી શકે છે.\n\nઆ પ્રમાણપત્ર વિશે વધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> દ્વારા તમારા ડિવાઇસ પર પ્રમાણપત્ર સત્તાધિકારીઓ ઇન્સ્ટૉલ કરવામાં આવ્યા છે, જે તેમને ઇમેઇલ, ઍપ અને સુરક્ષિત વેબસાઇટ સહિત તમારા ડિવાઇસની નેટવર્ક પ્રવૃત્તિનું નિરીક્ષણ કરવાની મંજૂરી આપી શકે છે.\n\nઆ પ્રમાણપત્રો વિશે વધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> દ્વારા તમારી ઑફિસની પ્રોફાઇલ માટે, પ્રમાણપત્ર સત્તાધિકારી ઇન્સ્ટૉલ કરવામાં આવ્યું છે, જે તેમને ઇમેઇલ, ઍપ અને સુરક્ષિત વેબસાઇટ સહિત ઑફિસના નેટવર્કની પ્રવૃત્તિનું નિરીક્ષણ કરવાની મંજૂરી આપી શકે છે.\n\nઆ પ્રમાણપત્ર વિશે વધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> દ્વારા તમારી ઑફિસની પ્રોફાઇલ માટે, પ્રમાણપત્ર સત્તાધિકારીઓ ઇન્સ્ટૉલ કરવામાં આવ્યા છે, જે તેમને ઇમેઇલ, ઍપ અને સુરક્ષિત વેબસાઇટ સહિત ઑફિસના નેટવર્કની પ્રવૃત્તિનું નિરીક્ષણ કરવાની મંજૂરી આપી શકે છે.\n\nઆ પ્રમાણપત્રો વિશે વધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"તૃતીય પક્ષ ઇમેઇલ્સ, ઍપ્લિકેશનો અને સુરક્ષિત વેબસાઇટ્સ સહિત, તમારી નેટવર્ક પ્રવૃત્તિનું નિરીક્ષણ કરવામાં સક્ષમ હોય છે.\n\nતમારા ઉપકરણ પર ઇન્સ્ટોલ કરેલ વિશ્વસનીય ઓળખપત્ર આ કરવાનું શક્ય બનાવી રહ્યું છે."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">પ્રમાણપત્ર ચેક કરો</item>
- <item quantity="other">પ્રમાણપત્રો ચેક કરો</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{પ્રમાણપત્ર પર વિશ્વાસ કરો અથવા કાઢી નાખો}one{પ્રમાણપત્ર પર વિશ્વાસ કરો અથવા કાઢી નાખો}other{પ્રમાણપત્રો પર વિશ્વાસ કરો અથવા કાઢી નાખો}}"</string>
<string name="device_status" msgid="8266002761193692207">"સ્થિતિ"</string>
<string name="device_status_summary" msgid="3270932829412434985">"નેટવર્ક, અનુક્રમ નંબર અને અન્ય માહિતી"</string>
<string name="manual" msgid="5683935624321864999">"મેન્યુઅલ"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"કનેક્ટ કરો"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"નેટવર્કને ભૂલી જાઓ"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"આ સાચવેલ પાસવર્ડ સહિત આ નેટવર્કથી કનેક્ટ કરવા માટે ઉપયોગમાં લેવાયેલ માહિતીને સાફ કરી દે છે"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"તમારા મોબાઇલ ફોનથી QR કોડ સ્કૅન કરીને વાઇ-ફાઇથી જોડાઓ અને સૂચના ફૉલો કરો."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" મોબાઇલ ફોનથી QR કોડ સ્કૅન કરીને વાઇ-ફાઇથી જોડાઓ અને સૂચના ફૉલો કરો.\n \n "<b>"Android ફોન"</b>"માં સેટિંગ -> નેટવર્ક અને ઇન્ટરનેટ -> વાઇ-ફાઇ -> વાઇ-ફાઇ નેટવર્ક -> પસંદ કરો, વિગતવાર -> ડિવાઇસ ઉમેરો અને પછી QR કોડ સ્કૅન કરો."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"રદ કરવા માટે, \'પાછળ\' જવા માટેનું બટન દબાવો"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ઓકે"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"આગળ વધો"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"ઉપકરણ સ્ટોરેજ"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"દૂર કરવા યોગ્ય સ્ટોરેજ"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"રીસેટ કરો"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"સ્ટોરેજ ખાલી કરો"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"કૅશ મેમરીનો ડેટા સાફ કરો"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> ખાલી કરો"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"સ્પેસ રોકતી હંગામી ફાઇલો સાફ કરે છે. ઍપની પસંદગીઓ કે ઑફલાઇન વીડિયો જેવા સાચવેલા ડેટાને આની કોઈ અસર થતી નથી તેમજ તમારે ઍપમાં ફરીથી સાઇન ઇન કરવાની પણ જરૂર રહેશે નહીં."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"શું કૅશ મેમરીનો ડેટા સાફ કરીએ?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"આમ કરવાથી બધી ઍપનો કૅશ મેમરીનો ડેટા સાફ થઈ જશે."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"ઍપ અનઇન્સ્ટૉલ કરો"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> માઉન્ટ થયેલ છે"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> માઉન્ટ કરી શકાયું નહીં"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB સ્ટોરેજ ફરીથી કનેક્ટ કર્યું"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"માઇક્રોફોન"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"માઇક્રોફોનનો ઍક્સેસ"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"ઍપ દ્વારા માઇક્રોફોનનો ઍક્સેસ"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"માઇક્રોફોનનો ઍક્સેસ બ્લૉક કરવામાં આવ્યો છે"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"અનબ્લૉક કરવા માટે, માઇક્રોફોનના ઍક્સેસની મંજૂરી આપવા, તમારા ડિવાઇસ પરના પ્રાઇવસી સ્વિચને \'માઇક્રોફોન ચાલુ છે\' ધરાવતી સ્થિતિ પર ખસેડો."</string>
<string name="camera" msgid="1226671478936288283">"કૅમેરા"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"કૅમેરાનો ઍક્સેસ"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"ઍપ દ્વારા કૅમેરાનો ઍક્સેસ"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"કૅમેરાનો ઍક્સેસ બ્લૉક કરવામાં આવ્યો છે"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"અનબ્લૉક કરવા માટે, કૅમેરાના ઍક્સેસની મંજૂરી આપવા, તમારા ડિવાઇસ પરના પ્રાઇવસી સ્વિચને \'કૅમેરા ચાલુ છે\' ધરાવતી સ્થિતિ પર ખસેડો."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"માઇક્રોફોનનો ઍક્સેસ: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"જ્યારે ચાલુ કરવામાં આવે, ત્યારે પરવાનગી ધરાવતી બધી ઍપ અને સેવાઓ આ ડિવાઇસ પરના કોઈપણ માઇક્રોફોનને ઍક્સેસ કરી શકે છે.\n\nકસ્ટમ પ્રોટોકૉલવાળા ઑડિયો પેરિફેરલ પર આ સેટિંગની કોઈ અસર નહીં થાય."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"કૅમેરાનો ઍક્સેસ: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"વાદળી"</string>
<string name="color_yellow" msgid="3519470952904560404">"પીળો"</string>
<string name="color_magenta" msgid="2377854703399624607">"મજેન્ટા"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"ઑડિયો વર્ણન"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"સપોર્ટ કરતી મૂવી અને શોમાં સ્ક્રીન પર શું થઈ રહ્યું છે તેનું વર્ણન સાંભળો"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"સક્ષમ કરો"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"ગોઠવણી"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> નો ઉપયોગ કરીએ?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"નિરિક્ષણ કરી રહ્યું છે"</string>
<string name="system_apps" msgid="8481888654606868074">"ઍપ્લિકેશનો"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"જાગૃત રહો"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"સ્ક્રીન ક્યારેય નિષ્ક્રિય થશે નહીં"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP તપાસણી"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI ઓપ્ટિમાઇઝેશન"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"હવે ફરીથી પ્રારંભ કરીએ?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"ટીવી સાથે HDMI ઉપકરણોને બંધ કરો"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"ટીવી ઑટો પાવર ચાલુ"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI ઉપકરણ સાથે TV ચાલુ કરો"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">કનેક્ટ થયેલ ઇનપુટ</item>
- <item quantity="other">કનેક્ટ થયેલ ઇનપુટ</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">સ્ટેન્ડબાય ઇનપુટ</item>
- <item quantity="other">સ્ટેન્ડબાય ઇનપુટ</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">કનેક્ટ ન થયેલ ઇનપુટ</item>
- <item quantity="other">કનેક્ટ ન થયેલ ઇનપુટ</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{કનેક્ટેડ ઇનપુટ}one{કનેક્ટેડ ઇનપુટ}other{કનેક્ટેડ ઇનપુટ}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{સ્ટેન્ડબાય ઇનપુટ}one{સ્ટેન્ડબાય ઇનપુટ}other{સ્ટેન્ડબાય ઇનપુટ}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{કનેક્ટ કર્યા વિનાના ઇનપુટ}one{કનેક્ટ કર્યા વિનાના ઇનપુટ}other{કનેક્ટ કર્યા વિનાના ઇનપુટ}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"તમારા એકાઉન્ટમાં ઍપ્લિકેશનો અને અન્ય સામગ્રીની ઍક્સેસને પ્રતિબંધિત કરો"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"પ્રતિબંધિત પ્રોફાઇલ"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> દ્વારા નિયંત્રિત"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"પ્રતિબંધિત પ્રોફાઇલ બનાવો"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"સેટિંગ"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"મંજૂર ઍપ્લિકેશનો"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d ઍપ્લિકેશન મંંજૂર કરી</item>
- <item quantity="other">%d ઍપ્લિકેશન મંંજૂર કરી</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"મંજૂરી છે"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"મંજૂરી નથી"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"પ્રતિબંધોને કસ્ટમાઇઝ કરો"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"ત્રીજા પક્ષ તરફથી સૉર્સ કોડ"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"પરવાનગીઓ"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"ઍપ્લિકેશન અનુપલબ્ધ છે"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"બિનવપરાયેલી ઍપ"</string>
<string name="settings_ok" msgid="5950888975075541964">"ઓકે"</string>
<string name="settings_confirm" msgid="4489126458677153411">"કન્ફર્મ કરો"</string>
<string name="settings_cancel" msgid="576094334743686152">"રદ કરો"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"આ પરવાનગી એક ઍપને સિસ્ટમ સેટિંગમાં ફેરફાર કરવાની મંજૂરી આપે છે."</string>
<string name="write_settings_on" msgid="71675710746513956">"હા"</string>
<string name="write_settings_off" msgid="6730113471695092167">"ના"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"બધી ફાઇલોનો ઍક્સેસ"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"બધી ફાઇલોને મેનેજ કરવા ઍક્સેસની મંજૂરી આપો"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"આ ઍપને આ ડિવાઇસ અથવા કોઈપણ કનેક્ટેડ સ્ટોરેજ વૉલ્યૂમ પરની બધી ફાઇલો વાંચવા, ફેરફાર કરવા અને ડિલીટ કરવાની મંજૂરી આપો. જો મંજૂરી આપવામાં આવે, તો ઍપ તમને જાણ કર્યા વિના ફાઇલોને ઍક્સેસ કરી શકે છે."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"ચિત્ર-માં-ચિત્ર"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"ચિત્રમાં-ચિત્રને મંજૂરી આપો"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"ઇન્સ્ટૉલ કરેલી કોઈપણ ઍપ ચિત્ર-માં-ચિત્રને સપોર્ટ કરતી નથી"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"જ્યારે ઍપ ખુલ્લી હોય અથવા તમે તેમાંથી બહાર આવી ગયા હોય (ઉદાહરણ તરીકે, વીડિઓ જોવાનું ચાલુ રાખવા માટે), ત્યારે ઍપને ચિત્ર-માં-ચિત્ર વિંડો બનાવવાની મંજૂરી આપો. આ વિંડો તમે ઉપયોગ કરતા હોય તે અન્ય ઍપની સૌથી ઉપર પ્રદર્શિત થાય છે."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"ઍપને અલાર્મ સેટ કરવાની અને સમય આધારિત ઍક્શન શેડ્યૂલ કરવાની મંજૂરી આપો. આ ઍપને બૅકગ્રાઉન્ડમાં ચાલવા દે છે, જેને કારણે પાવરનો વધુ વપરાશ થઈ શકે છે.\n\nજો આ પરવાનગી બંધ હોય, તો આ ઍપ દ્વારા શેડ્યૂલ કરવામાં આવેલા હાલના અલાર્મ અને સમય આધારિત ઇવેન્ટ કામ કરશે નહીં."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"સ્ક્રીન ચાલુ કરો"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"સ્ક્રીન ચાલુ કરવાની મંજૂરી આપો"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"ઍપને સ્ક્રીન ચાલુ કરવાની મંજૂરી આપો. જો મંજૂરી આપી હોય, તો ઍપ તમારા સ્પષ્ટ હેતુ વિના કોઈપણ સમયે સ્ક્રીન ચાલુ કરી શકશે."</string>
<string name="special_access" msgid="21806055758289916">"ઍપનો વિશિષ્ટ ઍક્સેસ"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"ઑડિયો"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"ડેટા સેવર"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"મોબાઇલ ડેટાનો ઓછો ઉપયોગ કરવા માટે વીડિયો ક્વૉલિટી ઑટોમૅટિક રીતે ગોઠવો"</string>
<string name="title_data_alert" msgid="8262081890052682475">"ડેટા વપરાશ અને અલર્ટ"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"તમે વાઇ-ફાઇ, ઇથરનેટ અથવા તમારા ફોનના હૉટસ્પૉટ વડે ઇન્ટરનેટ સાથે કનેક્ટ કરી શકો છો. વધુ સહાય માટે, "<b>"g.co/network"</b>"ની મુલાકાત લો."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"તમે વાઇ-ફાઇ, ઇથરનેટ કેબલ અથવા તમારા ફોનના હૉટસ્પૉટ વડે ઇન્ટરનેટ સાથે કનેક્ટ કરી શકો છો."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"ક્રિયાને મંજૂરી નથી"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"વૉલ્યૂમ બદલી શકાતું નથી"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"પાવર અને ઊર્જા"</string>
<string name="power_on_behavior" msgid="927607372303160716">"પાવર ચાલુ હોય ત્યારની વર્તણૂક"</string>
<string name="reset_options_title" msgid="7632580482285108955">"રીસેટ કરો"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"ઇથરનેટનો જોડાણ કરવાનો કોડ"</string>
</resources>
diff --git a/Settings/res/values-hi/strings.xml b/Settings/res/values-hi/strings.xml
index 24fa665..870ab89 100644
--- a/Settings/res/values-hi/strings.xml
+++ b/Settings/res/values-hi/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"कोई खाता जोड़ें"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"खाते और साइन-इन"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"कोई खाता नहीं है"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> खाते</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> खाते</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# खाता}one{# खाता}other{# खाते}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"मीडिया सेवाएं, Assistant, Google Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"नेटवर्क और इंटरनेट"</string>
<string name="sound_category_title" msgid="7899816751041939518">"आवाज़"</string>
<string name="applications_category_title" msgid="7112019490898586223">"ऐप्लिकेशन"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"डिवाइस से जुड़ी पसंद"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"रिमोट और एक्सेसरी"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"कोई ब्लूटूथ डिवाइस नहीं जुड़ा है"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one">डिवाइस के साथ काम करने वाली <xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> चीज़ें</item>
- <item quantity="other">डिवाइस के साथ काम करने वाली <xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> चीज़ें</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"डिसप्ले और आवाज़"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"सहायता और सुझाव"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"निजता"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"फ़ैक्ट्री डेटा रीसेट"</string>
<string name="device_calibration" msgid="2907914144048739705">"अंशांकन"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"ऊर्जा बचाने की सेटिंग"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"डिवाइस"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"फ़ॉर्मैट चुनें"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"आस-पास की आवाज़"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"चालू किए गए फ़ॉर्मैट"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"बंद किए गए फ़ॉर्मैट"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"चालू किए गए फ़ॉर्मैट को बंद करने के लिए, फ़ॉर्मैट चुनने की सेटिंग को मैन्युअल पर सेट करें."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"रिज़ॉल्यूशन"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"अपने-आप"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"रिज़ॉल्यूशन बदल दिया गया है"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"अब से %1$s रिज़ॉल्यूशन का इस्तेमाल करने के लिए, \'ठीक है\' चुनें."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"अभी नहीं"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ठीक है"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"हर्ट्ज़"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"संचित डेटा साफ़ करें?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"इससे सभी ऐप्स का संचित डेटा साफ़ हो जाएगा."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"एक्सेसरी जोड़ें"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"युग्मित हो रहा है…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"कनेक्ट हो रहा है..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"कनेक्ट की गई ऐक्सेसरी"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"रिमोट कंट्रोल"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"रिमोट कंट्रोल की सेटिंग"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"रिमोट के बटन सेट अप करें"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"आवाज़, पावर बटन, और इनपुट के विकल्पों को टीवी, AV रिसीवर, और साउंडबार पर कंट्रोल करें"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"कनेक्ट करें"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s से कनेक्ट करना चाहते हैं?"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"डिसकनेक्ट करें"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"उपलब्ध नहीं है"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"डिवाइस के एडमिन ऐप्लिकेशन का ऐक्सेस"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"कोई भी सक्रिय ऐप्लिकेशन नहीं है"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"एडमिन, सुरक्षित करने की नीति या क्रेडेंशियल स्टोरेज ने बंद किया है"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"प्रबंधित डिवाइस की जानकारी"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"आपके संगठन की ओर से प्रबंधित किए जाने वाले बदलाव और सेटिंग"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"कोई नहीं"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"इंस्टॉल किए गए ऐप्लिकेशन"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"ऐप्लिकेशन की संख्या अनुमानित है. हो सकता है कि इसमें Play Store के बाहर से इंस्टॉल किए गए ऐप्लिकेशन शामिल न हों."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{कम से कम # ऐप्लिकेशन}one{कम से कम # ऐप्लिकेशन}other{कम से कम # ऐप्लिकेशन}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"जगह की अनुमतियां"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"माइक्रोफ़ोन अनुमतियां"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"कैमरा अनुमतियां"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"डिफ़ॉल्ट ऐप्लिकेशन"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# ऐप्लिकेशन}one{# ऐप्लिकेशन}other{# ऐप्लिकेशन}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"डिफ़ॉल्ट कीबोर्ड"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> पर सेट किया गया है"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"हमेशा-चालू VPN चालू है"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"भरोसेमंद क्रेडेंशियल"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"आपकी निजी प्रोफ़ाइल में मौजूद भरोसेमंद क्रेडेंशियल"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"आपकी वर्क प्रोफ़ाइल में मौजूद भरोसेमंद क्रेडेंशियल"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">कम से कम <xliff:g id="COUNT_1">%d</xliff:g> CA प्रमाणपत्र</item>
- <item quantity="other">कम से कम <xliff:g id="COUNT_1">%d</xliff:g> CA प्रमाणपत्र</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA सर्टिफ़िकेट}one{# CA सर्टिफ़िकेट}other{# CA सर्टिफ़िकेट}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"एडमिन डिवाइस को लॉक कर सकते हैं और पासवर्ड रीसेट कर सकते हैं"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"एडमिन डिवाइस का सभी डेटा मिटा सकता है"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"डिवाइस का सभी डेटा हटाने से पहले विफल रही पासवर्ड की कोशिशें"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"वर्क प्रोफ़ाइल डेटा हटाने से पहले विफल रही पासवर्ड की कोशिशें"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# बार गलत पासवर्ड डाला गया}one{# बार गलत पासवर्ड डाला गया}other{# बार गलत पासवर्ड डाला गया}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"इस डिवाइस का प्रबंधन आपका संगठन करता है."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> इस डिवाइस को प्रबंधित करता है."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"ज़्यादा जानें"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">कैमरा ऐप्लिकेशन</item>
- <item quantity="other">कैमरा ऐप्लिकेशन</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{कैमरा ऐप्लिकेशन}one{कैमरा ऐप्लिकेशन}other{कैमरा ऐप्लिकेशन}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"कैलेंडर ऐप्लिकेशन"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"संपर्क ऐप्लिकेशन"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">ईमेल क्लाइंट ऐप्लिकेशन</item>
- <item quantity="other">ईमेल क्लाइंट ऐप्लिकेशन</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ईमेल क्लाइंट वाला ऐप्लिकेशन}one{ईमेल क्लाइंट वाला ऐप्लिकेशन}other{ईमेल क्लाइंट वाले ऐप्लिकेशन}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"मैप ऐप्लिकेशन"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">फ़ोन ऐप्लिकेशन</item>
- <item quantity="other">फ़ोन ऐप्लिकेशन</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{फ़ोन ऐप्लिकेशन}one{फ़ोन ऐप्लिकेशन}other{फ़ोन ऐप्लिकेशन}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"ब्राउज़र ऐप्लिकेशन"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV का ओएस वर्शन"</string>
<string name="about_serial" msgid="3432319328808745459">"सीरियल नंबर"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV के ओएस बिल्ड का वर्शन"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{अब आप डेवलपर बनने से # कदम दूर हैं}one{अब आप डेवलपर बनने से # कदम दूर हैं}other{अब आप डेवलपर बनने से # कदम दूर हैं}}"</string>
<string name="about_ads" msgid="7662896442040086522">"विज्ञापन"</string>
<string name="ads_description" msgid="8081069475265061074">"विज्ञापन की सेटिंग प्रबंधित करें, जैसे कि विज्ञापन आईडी रीसेट करना."</string>
<string name="ads_content_description" msgid="1006489792324920289">"विज्ञापन, विज्ञापन की सेटिंग प्रबंधित करें, जैसे कि विज्ञापन आईडी रीसेट करना."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"अतिरिक्त सिस्टम अपडेट"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"नेटवर्क को मॉनीटर किया जा सकता है"</string>
<string name="done_button" msgid="616159688526431451">"हो गया"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">प्रमाणपत्र पर भरोसा करें या हटाएं</item>
- <item quantity="other">प्रमाणपत्रों पर भरोसा करें या हटाएं</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ने आपके डिवाइस पर प्रमाणपत्र अनुमति को इंस्टॉल किया है. इससे उन्हें ईमेल, ऐप्लिकेशन, और सुरक्षित वेबसाइटों के साथ-साथ आपके डिवाइस पर नेटवर्क की गतिविधि की निगरानी करने की अनुमति मिल सकती है.\n\nइस प्रमाणपत्र के बारे में ज़्यादा जानने के लिए, अपने एडमिन से संपर्क करें.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ने आपके डिवाइस पर प्रमाणपत्र अनुमतियां इंस्टॉल की हैं. इनसे उन्हें ईमेल, ऐप्लिकेशन, और सुरक्षित वेबसाइटों के साथ-साथ आपके डिवाइस पर नेटवर्क की गतिविधि की निगरानी करने की अनुमति मिल सकती है.\n\nइन प्रमाणपत्रों के बारे में ज़्यादा जानने के लिए, अपने एडमिन से संपर्क करें.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ने आपकी वर्क प्रोफ़ाइल के लिए प्रमाणपत्र अनुमति को इंस्टॉल किया है. इससे उन्हें ईमेल, ऐप्लिकेशन, और सुरक्षित वेबसाइटों के साथ-साथ वर्क नेटवर्क की गतिविधि की निगरानी करने की अनुमति मिल सकती है.\n\nइस प्रमाणपत्र के बारे में ज़्यादा जानने के लिए, अपने एडमिन से संपर्क करें.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ने आपकी वर्क प्रोफ़ाइल के लिए प्रमाणपत्र अनुमतियां इंस्टॉल की हैं. इनसे उन्हें ईमेल, ऐप्लिकेशन, और सुरक्षित वेबसाइटों के साथ-साथ वर्क नेटवर्क की गतिविधि की निगरानी करने की अनुमति मिल सकती है.\n\nइन प्रमाणपत्रों के बारे में ज़्यादा जानने के लिए, अपने एडमिन से संपर्क करें.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"एक तृतीय पक्ष ईमेल, ऐप्लिकेशन और सुरक्षित वेबसाइटों सहित आपकी नेटवर्क गतिविधि को मॉनीटर करने में सक्षम है.\n\nआपके डिवाइस पर इंस्टॉल किए गए एक विश्वसनीय क्रेंडेशियल के कारण ऐसा संभव हो रहा है."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">प्रमाणपत्र की जांच करें</item>
- <item quantity="other">प्रमाणपत्रों की जांच करें</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{सर्टिफ़िकेट पर भरोसा करें या हटाएं}one{सर्टिफ़िकेट पर भरोसा करें या हटाएं}other{सर्टिफ़िकेट पर भरोसा करें या हटाएं}}"</string>
<string name="device_status" msgid="8266002761193692207">"स्थिति"</string>
<string name="device_status_summary" msgid="3270932829412434985">"नेटवर्क, सीरियल नंबर और अन्य जानकारी"</string>
<string name="manual" msgid="5683935624321864999">"मैन्युअल"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"जोड़ दें"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"नेटवर्क भूलें"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"इससे सहेजे गए पासवर्ड सहित, इस नेटवर्क से कनेक्ट होने में उपयोग होने वाली जानकारी साफ़ हो जाती है"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"अपने मोबाइल फ़ोन से क्यूआर कोड स्कैन करके, वाई-फ़ाई से जुड़ें और निर्देशों के मुताबिक आगे बढ़ें."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" मोबाइल फ़ोन से क्यूआर कोड स्कैन करके, वाई-फ़ाई से जुड़ें और दिए गए निर्देशों का पालन करें.\n \n "<b>"Android फ़ोन"</b>" में, सेटिंग -> नेटवर्क और इंटरनेट -> वाई-फ़ाई -> वाई-फ़ाई नेटवर्क चुनें -> बेहतर -> डिवाइस जोड़ें और \'क्यूआर कोड स्कैन करें\' पर जाएं."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"इस कार्रवाई को रद्द करने के लिए, \'वापस जाएं\' बटन दबाएं"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ठीक"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"जारी रखें"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"डिवाइस मेमोरी"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"निकाले जाने योग्य मेमोरी"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"रीसेट करें"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"डिवाइस का स्टोरेज खाली करें"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"कैश मेमोरी में सेव किया गया डेटा मिटाएं"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"डिवाइस के स्टोरेज में <xliff:g id="SPACE">%1$s</xliff:g> जगह खाली करें"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"इससे, आपके डिवाइस पर कुछ समय के लिए सेव की गई फ़ाइलें मिटा दी जाएंगी. आपके सेव किए गए डेटा, जैसे कि पसंदीदा ऐप्लिकेशन या ऑफ़लाइन वीडियो पर इसका कोई असर नहीं पड़ता है. इसके अलावा, आपको ऐप्लिकेशन में फिर से साइन इन करने की ज़रूरत नहीं होगी."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"कैश मेमोरी में सेव किया गया डेटा मिटाएं?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"इससे, कैश मेमोरी में सेव किया गया सभी ऐप्लिकेशन का डेटा मिट जाएगा."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"ऐप्लिकेशन अनइंस्टॉल करें"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> को माउंट किया गया है"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> को माउंट नहीं किया जा सका"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB मेमोरी फिर से कनेक्ट की गई"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"माइक्रोफ़ोन"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"माइक्रोफ़ोन का ऐक्सेस"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"ऐप्लिकेशन के लिए माइक्रोफ़ोन ऐक्सेस करने की अनुमति"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"माइक्रोफ़ोन का ऐक्सेस ब्लॉक किया गया है"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"अनब्लॉक करने के लिए, आपको माइक्रोफ़ोन का ऐक्सेस देना होगा. इसके लिए, अपने डिवाइस के प्राइवसी स्विच से \'माइक्रोफ़ोन चालू है\' वाली पोज़िशन पर ले जाएं."</string>
<string name="camera" msgid="1226671478936288283">"कैमरा"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"कैमरे का ऐक्सेस"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"ऐप्लिकेशन के लिए कैमरा ऐक्सेस करने की अनुमति"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"कैमरे का ऐक्सेस ब्लॉक किया गया है"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"अनब्लॉक करने के लिए, आपको कैमरे का ऐक्सेस देना होगा. इसके लिए, डिवाइस के प्राइवसी स्विच को \'कैमरे चालू है\' वाली पोज़िशन पर ले जाएं."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"माइक्रोफ़ोन का ऐक्सेस: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"माइक्रोफ़ोन ऐक्सेस करने की सेटिंग चालू होने पर, वे सभी ऐप्लिकेशन और सेवाएं इस डिवाइस का कोई भी माइक्रोफ़ोन ऐक्सेस कर पाएंगी जिन्हें आपने ऐसा करने की अनुमति दी है.\n\nहालांकि, इस सेटिंग को चालू करने से, उन सहायक ऑडियो डिवाइसों पर कोई असर नहीं होगा जो कस्टम प्रोटोकॉल का पालन करते हैं."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"कैमरे का ऐक्सेस: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"हरिताभ नीला"</string>
<string name="color_yellow" msgid="3519470952904560404">"पीला"</string>
<string name="color_magenta" msgid="2377854703399624607">"मैजेंटा"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"जानकारी सुनने की सुविधा"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"स्क्रीन पर चल रही उन फ़िल्मों और शो की जानकारी सुनें जिनमें जानकारी सुनने की सुविधा मौजूद है"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"चालू करें"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"कॉन्फ़िगरेशन"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> का उपयोग करें?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"निगरानी करना"</string>
<string name="system_apps" msgid="8481888654606868074">"ऐप्स"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"सचेत रहें"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"स्क्रीन कभी भी स्लीप मोड (कम बैटरी मोड) में नहीं जाएगी"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP जाँच"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI ऑप्टिमाइज़ेशन"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"अभी फिर से चालू करें?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"TV के साथ HDMI डिवाइस बंद करें"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TVअपने-आपचालू करें"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI डिवाइस के साथ TV चालू करें"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">कनेक्ट किए गए इनपुट</item>
- <item quantity="other">कनेक्ट किए गए इनपुट</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">स्टैंडबाय इनपुट</item>
- <item quantity="other">स्टैंडबाय इनपुट</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">कनेक्ट नहीं किए गए इनपुट</item>
- <item quantity="other">कनेक्ट नहीं किए गए इनपुट</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{कनेक्ट किया गया इनपुट}one{कनेक्ट किया गया इनपुट}other{कनेक्ट किए गए इनपुट}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{स्टैंडबाय इनपुट}one{स्टैंडबाय इनपुट}other{स्टैंडबाय इनपुट}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{कनेक्ट नहीं किया गया इनपुट}one{कनेक्ट नहीं किया गया इनपुट}other{कनेक्ट नहीं किए गए इनपुट}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"अपने खाते में ऐप्स और अन्य सामग्री की ऐक्सेस प्रतिबंधित करें"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"प्रतिबंधित प्रोफ़ाइल"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> द्वारा नियंत्रित"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"प्रतिबंधित प्रोफ़ाइल बनाएं"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"सेटिंग"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"अनुमत ऐप्स"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d ऐप्स की अनुमति है</item>
- <item quantity="other">%d ऐप्स की अनुमति है</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"अनुमति है"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"अनुमति नहीं"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"प्रतिबंधों को कस्टमाइज़ करें"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"तीसरे पक्ष के स्रोत"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"अनुमतियां"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"ऐप्लिकेशन अनुपलब्ध है"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"इस्तेमाल न किए जाने वाले ऐप्लिकेशन"</string>
<string name="settings_ok" msgid="5950888975075541964">"ठीक"</string>
<string name="settings_confirm" msgid="4489126458677153411">"पुष्टि करें"</string>
<string name="settings_cancel" msgid="576094334743686152">"अभी नहीं"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"यह मंज़ूरी मिलने के बाद कोई ऐप्लिकेशन, सिस्टम सेटिंग में बदलाव कर सकता है."</string>
<string name="write_settings_on" msgid="71675710746513956">"हां"</string>
<string name="write_settings_off" msgid="6730113471695092167">"नहीं"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"सभी फ़ाइलों का ऐक्सेस है"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"सभी फ़ाइलों को मैनेज करने की अनुमति दें"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"इस ऐप्लिकेशन को अनुमति दें, ताकि वह इस डिवाइस और इससे जुड़े स्टोरेज पर मौजूद फ़ाइलों को पढ़ सके, उनमें बदलाव कर सके, और उन्हें मिटा सके. अगर आप अनुमति देते हैं, तो यह ऐप्लिकेशन आपको सूचना दिए बिना फ़ाइलों को ऐक्सेस कर सकता है."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"\'पिक्चर में पिक्चर\' की सेटिंग"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"\'पिक्चर में पिक्चर\' को मंज़ूरी दें"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"डिवाइस में इंस्टॉल किया गया कोई भी ऐप्लिकेशन पिक्चर में पिक्चर सुविधा के साथ काम नहीं करता"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"किसी ऐप्लिकेशन के खुले रहने पर या जब आप उसका इस्तेमाल करना बंद कर चुके हों (जैसे, कोई वीडियो देखते रहने के लिए), इसके दौरान ऐप्लिकेशन को पिक्चर में पिक्चर विंडो बनाने की मंज़ूरी दें. जब आप किसी और ऐप्लिकेशन का इस्तेमाल कर रहे होंगे, तब उसके ऊपर एक विंडो बन जाएगी जिसमें आप पहले वाले ऐप्लिकेशन का इस्तेमाल कर सकेंगे."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"ऐप्लिकेशन को अलार्म और तय समय पर होने वाली कार्रवाइयों के रिमाइंडर सेट करने की अनुमति दें. ऐसा करने से, ऐप्लिकेशन को बैकग्राउंड में चलने की अनुमति मिलती है. इससे, बैटरी ज़्यादा खर्च हो सकती है.\n\nअगर आप यह अनुमति नहीं देते हैं, तो ऐप्लिकेशन की मदद से सेट किए गए अलार्म और तय समय पर होने वाली कार्रवाइयों के रिमाइंडर काम नहीं करेंगे."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"स्क्रीन चालू करें"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"स्क्रीन चालू करने की अनुमति दें"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"ऐप्लिकेशन को स्क्रीन चालू करने की अनुमति दें. ऐसा करने पर, ऐप्लिकेशन आपके एक्सप्लिसिट इंटेंट के बिना भी जब चाहे स्क्रीन चालू कर सकता है."</string>
<string name="special_access" msgid="21806055758289916">"ऐप्लिकेशन को खास अनुमति दें"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"ऑडियो"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"डेटा बचाने की सेटिंग"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"मोबाइल डेटा बचाने के लिए, वीडियो क्वालिटी को अपने-आप एडजस्ट होने दें"</string>
<string name="title_data_alert" msgid="8262081890052682475">"डेटा खर्च और सूचनाएं"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"आप वाई-फ़ाई, ईथरनेट या फ़ोन के हॉटस्पॉट का इस्तेमाल करके, इंटरनेट से कनेक्ट हो सकते हैं. ज़्यादा जानकारी के लिए "<b>"g.co/network"</b>" पर जाएं."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"वाई-फ़ाई, ईथरनेट या फ़ोन के हॉटस्पॉट का इस्तेमाल करके, इंटरनेट से कनेक्ट किया जा सकता है."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"कार्रवाई की अनुमति नहीं"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"कॉल की आवाज़ कम या ज़्यादा नहीं की जा सकती"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"पावर और ऊर्जा"</string>
<string name="power_on_behavior" msgid="927607372303160716">"टीवी के चालू होने पर दिखने वाली स्क्रीन"</string>
<string name="reset_options_title" msgid="7632580482285108955">"रीसेट करें"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"ईथरनेट से जोड़ने का कोड"</string>
</resources>
diff --git a/Settings/res/values-hr/strings.xml b/Settings/res/values-hr/strings.xml
index 6b63b2a..df8a20a 100644
--- a/Settings/res/values-hr/strings.xml
+++ b/Settings/res/values-hr/strings.xml
@@ -45,23 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Dodavanje računa"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Računi i prijava"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Nema računa"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> račun</item>
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> računa</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> računa</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# račun}one{# račun}few{# računa}other{# računa}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Medijske usluge, Asistent, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Mreža i internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Zvuk"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplikacije"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Postavke uređaja"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Daljinski upravljači i dodaci"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Nije povezan nijedan Bluetooth uređaj"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> dodatak</item>
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> dodatka</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> dodataka</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Zaslon i zvuk"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Pomoć i povratne informacije"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privatnost"</string>
@@ -120,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Vraćanje na tvorničko stanje"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibracija"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Ušteda energije"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Uređaji"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Odaberite formate"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Okružujući zvuk"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -187,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"OMOGUĆENI FORMATI"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ONEMOGUĆENI FORMATI"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Da biste onemogućili format, promijenite odabir formata u Ručno."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Razlučivost"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatski"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Razlučivost je promijenjena"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Odaberite U redu da biste odsad upotrebljavali %1$s."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Odustani"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"U redu"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Želite li izbrisati podatke iz predmemorije?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Obrisat ćete predmemorirane podatke svih aplikacija."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Dodaj pribor"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Uparivanje…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Povezivanje…"</string>
@@ -226,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Dodaci"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Daljinski upravljač"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Postavke daljinskog upravljača"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Postavite gumbe na daljinskom upravljaču"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Upravljanje glasnoćom, uključivanjem, isključivanjem, ulazom na televizorima, prijemnicima i soundbarovima"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Poveži"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Povežite se s uređajem %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Prekini vezu"</string>
@@ -264,11 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Nije dostupno"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Aplikacije administratora uređaja"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Nema aktivnih aplikacija"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> aktivna aplikacija</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aktivne aplikacije</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktivnih aplikacija</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Onemogućio administrator, pravila enkripcije ili pohrana vjerodajnica"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informacije o upravljanom uređaju"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Promjene i postavke kojima upravlja vaša organizacija"</string>
@@ -286,20 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Nema"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Aplikacije su instalirane"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Broj aplikacija procijenjen je i možda ne uključuje aplikacije koje su instalirane izvan Trgovine Play."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="one">Najmanje <xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- <item quantity="few">Najmanje <xliff:g id="COUNT_1">%d</xliff:g> aplikacije</item>
- <item quantity="other">Najmanje <xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Najmanje # aplikacija}one{Najmanje # aplikacija}few{Najmanje # aplikacije}other{Najmanje # aplikacija}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Dopuštenja za lokaciju"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Dopuštenja za mikrofon"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Dopuštenja za fotoaparat"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Zadane aplikacije"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aplikacije</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplikacija}one{# aplikacija}few{# aplikacije}other{# aplikacija}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Zadana tipkovnica"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Postavljeno na <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Aktiviran je uvijek uključeni VPN"</string>
@@ -309,42 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Pouzdane vjerodajnice"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Pouzdane vjerodajnice na vašem osobnom profilu"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Pouzdane vjerodajnice na vašem radnom profilu"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Najmanje <xliff:g id="COUNT_1">%d</xliff:g> CA certifikat</item>
- <item quantity="few">Najmanje <xliff:g id="COUNT_1">%d</xliff:g> CA certifikata</item>
- <item quantity="other">Najmanje <xliff:g id="COUNT_1">%d</xliff:g> CA certifikata</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA certifikat}one{# CA certifikat}few{# CA certifikata}other{# CA certifikata}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administrator može zaključati uređaj i poništiti zaporku"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administrator može izbrisati sve podatke na uređaju"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Broj neuspjelih pokušaja unosa zaporke prije brisanja svih podataka s uređaja"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Broj neuspjelih pokušaja unosa zaporke prije brisanja podataka s radnog profila"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> pokušaj</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> pokušaja</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> pokušaja</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# pokušaj}one{# pokušaj}few{# pokušaja}other{# pokušaja}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Ovim uređajem upravlja vaša organizacija."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Ovim uređajem upravlja <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Saznajte više"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Aplikacije kamere</item>
- <item quantity="few">Aplikacije kamere</item>
- <item quantity="other">Aplikacije kamere</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Aplikacija fotoaparata}one{Aplikacije fotoaparata}few{Aplikacije fotoaparata}other{Aplikacije fotoaparata}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Aplikacija Kalendar"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplikacija Kontakti"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Aplikacije klijenta e-pošte</item>
- <item quantity="few">Aplikacije klijenta e-pošte</item>
- <item quantity="other">Aplikacije klijenta e-pošte</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Aplikacija klijenta e-pošte}one{Aplikacije klijenta e-pošte}few{Aplikacije klijenta e-pošte}other{Aplikacije klijenta e-pošte}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Aplikacija Karta"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Aplikacije telefona</item>
- <item quantity="few">Aplikacije telefona</item>
- <item quantity="other">Aplikacije telefona</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Aplikacija telefona}one{Aplikacije telefona}few{Aplikacije telefona}other{Aplikacije telefona}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Aplikacija preglednika"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -363,11 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Verzija OS-a Android TV-a"</string>
<string name="about_serial" msgid="3432319328808745459">"Serijski broj"</string>
<string name="about_build" msgid="8467840394761634575">"Međuverzija OS-a Android TV-a"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Oglasi"</string>
<string name="ads_description" msgid="8081069475265061074">"Upravljajte postavkama oglasa, npr. poništite ID za oglašavanje."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Oglasi, Upravljajte postavkama oglasa, npr. poništite ID za oglašavanje."</string>
@@ -381,27 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Još ažuriranja sustava"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Mreža se možda nadzire"</string>
<string name="done_button" msgid="616159688526431451">"Završeno"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Označite certifikate kao pouzdane ili ih uklonite</item>
- <item quantity="few">Označite certifikate kao pouzdane ili ih uklonite</item>
- <item quantity="other">Označite certifikate kao pouzdane ili ih uklonite</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalirala je izdavače certifikata na vašem uređaju, što joj može omogućiti nadzor nad aktivnostima vašeg uređaja na mreži, uključujući e-poruke, aplikacije i zaštićene web-lokacije.\n\nViše informacija o tim certifikatima zatražite od administratora.</item>
- <item quantity="few">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalirala je izdavače certifikata na vašem uređaju, što joj može omogućiti nadzor nad aktivnostima vašeg uređaja na mreži, uključujući e-poruke, aplikacije i zaštićene web-lokacije.\n\nViše informacija o tim certifikatima zatražite od administratora.</item>
- <item quantity="other">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalirala je izdavače certifikata na vašem uređaju, što joj može omogućiti nadzor nad aktivnostima vašeg uređaja na mreži, uključujući e-poruke, aplikacije i zaštićene web-lokacije.\n\nViše informacija o tim certifikatima zatražite od administratora.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalirala je izdavače certifikata za vaš poslovni profil, što joj može omogućiti nadzor nad aktivnostima poslovne mreže, uključujući e-poruke, aplikacije i zaštićene web-lokacije.\n\nViše informacija o tim certifikatima zatražite od administratora.</item>
- <item quantity="few">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalirala je izdavače certifikata za vaš poslovni profil, što joj može omogućiti nadzor nad aktivnostima poslovne mreže, uključujući e-poruke, aplikacije i zaštićene web-lokacije.\n\nViše informacija o tim certifikatima zatražite od administratora.</item>
- <item quantity="other">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalirala je izdavače certifikata za vaš poslovni profil, što joj može omogućiti nadzor nad aktivnostima poslovne mreže, uključujući e-poruke, aplikacije i zaštićene web-lokacije.\n\nViše informacija o tim certifikatima zatražite od administratora.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Treća je strana u mogućnosti pratiti vašu mrežnu aktivnost, uključujući e-poštu, aplikacije i sigurne web-lokacije.\n\nTo omogućuje pouzdana vjerodajnica koja je instalirana na vašem uređaju."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Provjeri certifikate</item>
- <item quantity="few">Provjeri certifikate</item>
- <item quantity="other">Provjeri certifikate</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Označite certifikat kao pouzdan ili ga uklonite}one{Označite certifikate kao pouzdane ili ih uklonite}few{Označite certifikate kao pouzdane ili ih uklonite}other{Označite certifikate kao pouzdane ili ih uklonite}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Mreža, serijski brojevi i druge informacije"</string>
<string name="manual" msgid="5683935624321864999">"Priručnik"</string>
@@ -493,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Povezivanje"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Zaboravi mrežu"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Time se brišu podaci potrebni za povezivanje s mrežom, uključujući spremljenu zaporku"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Priključite se na Wi-Fi skeniranjem QR koda s mobitela i slijedite upute."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Priključite se na Wi-Fi skeniranjem QR koda s mobilnog telefona i slijedite upute.\n \n Na "<b>"Android telefonu"</b>" otvorite Postavke -> Mreža i internet -> Wi-Fi -> Odaberite Wi-Fi -> Napredno -> Dodajte uređaj, a zatim skenirajte QR kôd."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Pritisnite gumb za natrag da biste odustali"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"U redu"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Nastavi"</string>
@@ -562,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Pohrana na uređaju"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Prijenosna pohrana"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Vraćanje na zadano"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Oslobodite pohranu"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Brisanje podataka iz predmemorije"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Oslobodi <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Briše privremene datoteke koje zauzimaju prostor. Neće utjecati na spremljene podatke kao što su postavke aplikacija ili offline videozapisi i nećete se više trebati prijaviti u aplikacije."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Brisati podatke iz predmemorije?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Obrisat ćete predmemorirane podatke svih aplikacija."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Deinstaliraj aplikacije"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Učitano: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Učitavanje nije uspjelo: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB pohrana ponovo povezana"</string>
@@ -639,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Pristup mikrofonu"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Pristup aplikacije mikrofonu"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Blokiran je pristup mikrofonu"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Da biste deblokirali pristup, uključite mikrofon pomoću prekidača privatnosti na uređaju, čime se dopušta pristup mikrofonu."</string>
<string name="camera" msgid="1226671478936288283">"Fotoaparat"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Pristup fotoaparatu"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Pristup aplikacije fotoaparatu"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Blokiran je pristup kameri"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Da biste deblokirali pristup, uključite kameru pomoću prekidača privatnosti na uređaju, čime se dopušta pristup kameri."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Pristup mikrofonu: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Kad je ta opcija uključena, sve aplikacije i usluge s dopuštenjem mogu pristupati svim mikrofonima na ovom uređaju.\n\nTa postavka neće utjecati na periferne audiouređaje s prilagođenim protokolom."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Pristup fotoaparatu: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -713,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cijan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Žuta"</string>
<string name="color_magenta" msgid="2377854703399624607">"Grimizna"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audioopis"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Slušajte opis događaja na zaslonu u podržanim filmovima i emisijama"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Omogući"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfiguracija"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Želite li upotrijebiti uslugu <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -733,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Nadzor"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplikacije"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Ne pokreći mirovanje"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Zaslon nikad neće ući u način mirovanja"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP provjera"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimizacija"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Pokrenuti ponovo odmah?"</string>
@@ -853,21 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Isključivanje HDMI uređaja s televizorom"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Automatski uključi televizor"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Uključivanje televizora s HDMI uređajem"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Povezan ulaz</item>
- <item quantity="few">Povezani ulazi</item>
- <item quantity="other">Povezani ulazi</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Ulaz na čekanju</item>
- <item quantity="few">Ulazi na čekanju</item>
- <item quantity="other">Ulazi na čekanju</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Nepovezan ulaz</item>
- <item quantity="few">Nepovezani ulazi</item>
- <item quantity="other">Nepovezani ulazi</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Povezan ulaz}one{Povezani ulazi}few{Povezani ulazi}other{Povezani ulazi}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Ulaz na čekanju}one{Ulazi na čekanju}few{Ulazi na čekanju}other{Ulazi na čekanju}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Nepovezan ulaz}one{Nepovezani ulazi}few{Nepovezani ulazi}other{Nepovezani ulazi}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Ograničavanje pristupa aplikacijama i ostalom sadržaju na vašem računu"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Ograničeni profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Kontrolira aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -881,11 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Izrada ograničenog profila"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Postavke"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Dopuštene aplikacije"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">Dopuštena je %d aplikacija</item>
- <item quantity="few">Dopuštene su %d aplikacije</item>
- <item quantity="other">Dopušteno je %d aplikacija</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Dopušteno"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Nije dopušteno"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Prilagodi ograničenja"</string>
@@ -930,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Izvor treće strane"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Dopuštenja"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplikacija nije dostupna"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Nekorištene aplikacije"</string>
<string name="settings_ok" msgid="5950888975075541964">"U redu"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Potvrdi"</string>
<string name="settings_cancel" msgid="576094334743686152">"Odustani"</string>
@@ -1013,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"To dopuštenje omogućuje aplikaciji izmjenu postavki sustava."</string>
<string name="write_settings_on" msgid="71675710746513956">"Da"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Ne"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Pristup svim datotekama"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Dopusti pristup za upravljanje svim datot."</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Dopustite toj aplikaciji čitanje, izmjenu i brisanje svih datoteka na ovom uređaju ili drugim povezanim uređajima za pohranu. Ako date to dopuštenje, aplikacija može pristupati datotekama bez vašeg znanja."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Slika u slici"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Dopusti sliku u slici"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Nijedna instalirana aplikacija ne podržava način slike u slici"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Omogućuje aplikacijama izradu prozora sa slikom u slici dok je aplikacija otvorena ili kad izađete iz nje (na primjer da biste nastavili gledati videozapis). Taj se prozor prikazuje iznad drugih aplikacija koje upotrebljavate."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Aplikacijama omogućuje da postavljaju alarme i zakazuju vremenski osjetljive radnje. To aplikacijama omogućuje da se izvode u pozadini, pa je moguće dodatno trošenje baterije.\n\nAko je to dopuštenje isključeno, postojeći alarmi i događaji temeljeni na vremenu koji su zakazani putem aplikacije neće funkcionirati."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Uključivanje zaslona"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Dopusti uključivanje zaslona"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Dopustite aplikaciji da uključuje zaslon. Ako date to dopuštenje, aplikacija može uključiti zaslon u bilo kojem trenutku bez vaše izričite namjere."</string>
<string name="special_access" msgid="21806055758289916">"Poseban pristup za aplikacije"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Zvuk"</string>
@@ -1034,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Štednja podatkovnog prometa"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Automatski prilagodi kvalitetu videozapisa radi uštede mobilnih podataka"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Potrošnja podatakovnog prometa i upozorenja"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"S internetom se možete povezati putem Wi-Fija, etherneta ili žarišne točke telefona. Dodatnu pomoć potražite na "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"S internetom se možete povezati putem Wi-Fija, etherneta ili žarišne točke telefona."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Radnja nije dopuštena"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Glasnoća se ne može promijeniti"</string>
@@ -1084,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Napajanje i energija"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Ponašanje prilikom uključivanja"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Poništi"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Kôd za uparivanje etherneta"</string>
</resources>
diff --git a/Settings/res/values-hu/strings.xml b/Settings/res/values-hu/strings.xml
index 96375d0..a069733 100644
--- a/Settings/res/values-hu/strings.xml
+++ b/Settings/res/values-hu/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Fiók felvétele"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Fiókok és bejelentkezés"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Nincs fiók"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> fiók</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> fiók</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# fiók}other{# fiók}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Médiaszolgáltatások, Segéd, Kifizetések"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Hálózat és internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Hang"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Alkalmazások"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Eszközbeállítások"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Távvezérlők és tartozékok"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Nincsenek csatlakoztatott Bluetooth-eszközök"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> tartozék</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> tartozék</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Hang és kijelző"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Súgó és visszajelzés"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Adatvédelem"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Gyári adatok visszaállítása"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrálás"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Akkumulátorkímélő"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Eszközök"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Formátumok kiválasztása"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Térhatású hangzás"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ENGEDÉLYEZETT FORMÁTUMOK"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"LETILTOTT FORMÁTUMOK"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"A letiltáshoz állítsa a formátumot Kézi beállításra."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Felbontás"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatikus"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"A felbontás megváltozott"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Válassza az OK gombot, ha mostantól a(z) %1$s felbontást szeretné használni."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Mégse"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Törli a gyorsítótárban tárolt adatokat?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Ez törli minden alkalmazás gyorsítótárban tárolt adatait"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Tartozék hozzáadása"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Párosítás..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Csatlakozás…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Tartozékok"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Távirányító"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Távirányító beállításai"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Távirányító gombjainak beállítása"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Hangerő, bekapcsológomb és bemenet kezelése tévén, vevőeszközön és hangprojektoron"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Csatlakozás"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Csatlakozás a következőhöz: %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Leválasztás"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Nem áll rendelkezésre"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Eszközrendszergazdai alkalmazások"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Nincsenek aktív alkalmazások"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktív alkalmazás</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aktív alkalmazás</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Rendszergazda, szabályzat vagy adattár letiltotta"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Felügyelt eszköz adatai"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"A szervezet által kezelt módosítások és beállítások"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Nincs"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Telepített alkalmazások"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Az alkalmazások száma becsült érték. Elképzelhető, hogy nem tartalmazza a Play Áruházon kívülről származó alkalmazásokat."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Legalább <xliff:g id="COUNT_1">%d</xliff:g> alkalmazás</item>
- <item quantity="one">Legalább <xliff:g id="COUNT_0">%d</xliff:g> alkalmazás</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Legalább # alkalmazás}other{Legalább # alkalmazás}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Helymeghatározási jogosultságok"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mikrofonhasználati engedélyek"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Kamerahasználati engedélyek"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Alapértelmezett alkalmazások"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> alkalmazás</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> alkalmazás</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# alkalmazás}other{# alkalmazás}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Alapértelmezett billentyűzet"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Beállítva: <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"A „mindig bekapcsolt VPN” lehetőség be van kapcsolva"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Megbízható hitelesítési adatok"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Megbízható hitelesítési adatok a személyes profilban"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Megbízható hitelesítési adatok a munkaprofilban"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Legalább <xliff:g id="COUNT_1">%d</xliff:g> CA-tanúsítvány</item>
- <item quantity="one">Legalább <xliff:g id="COUNT_0">%d</xliff:g> CA-tanúsítvány</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA-tanúsítvány}other{# CA-tanúsítvány}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"A rendszergazda zárolhatja az eszközt, és új jelszót állíthat be"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"A rendszergazda törölheti az összes adatot az eszközről"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Sikertelen jelszómegadási próbálkozások száma az összes eszközadat törlése előtt"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Sikertelen jelszómegadási próbálkozások száma a munkaprofilhoz tartozó adatok törlése előtt"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> próbálkozás</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> próbálkozás</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# próbálkozás}other{# próbálkozás}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Az eszközt az Ön szervezete kezeli."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Az eszközt a következő szervezet kezeli: <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"További információ"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Kameraalkalmazások</item>
- <item quantity="one">Kameraalkalmazás</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Kameraalkalmazás}other{Kameraalkalmazások}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Naptáralkalmazás"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Címtáralkalmazás"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">E-mail-alkalmazások</item>
- <item quantity="one">E-mail-alkalmazás</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Levelezőprogram-alkalmazás}other{Levelezőprogram-alkalmazások}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Térképalkalmazás"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Telefonalkalmazások</item>
- <item quantity="one">Telefonalkalmazás</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Telefonalkalmazás}other{Telefonalkalmazások}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Böngészőalkalmazás"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS-verzió"</string>
<string name="about_serial" msgid="3432319328808745459">"Sorozatszám"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS-build"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Már csak <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> lépésre van attól, hogy fejlesztő legyen</item>
- <item quantity="one">Már csak <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="4064986225625409361">"{count,plural, =1{# lépésre van a fejlesztővé válástól}other{# lépésre van a fejlesztővé válástól}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Hirdetések"</string>
<string name="ads_description" msgid="8081069475265061074">"Kezelheti a hirdetésbeállításokat, például újra beállíthatja a hirdetésazonosítót."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Hirdetések, Kezelheti a hirdetésbeállításokat, például újra beállíthatja a hirdetésazonosítót."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Rendszerfrissítések"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Lehet, hogy a hálózat felügyelt"</string>
<string name="done_button" msgid="616159688526431451">"Kész"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Tanúsítványok eltávolítása, illetve elfogadása megbízhatóként</item>
- <item quantity="one">Tanúsítvány eltávolítása, illetve elfogadása megbízhatóként</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> tanúsítványkibocsátókat telepített az Ön eszközére, ami lehetővé teheti az eszköz hálózati tevékenységeinek, beleértve az e-maileknek, az alkalmazásoknak és a biztonságos webhelyeknek a megfigyelését.\n\nHa többet szeretne megtudni ezekről a tanúsítványokról, forduljon a rendszergazdájához.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> tanúsítványkibocsátót telepített az Ön eszközére, ami lehetővé teheti az eszköz hálózati tevékenységeinek, beleértve az e-maileknek, az alkalmazásoknak és a biztonságos webhelyeknek a megfigyelését.\n\nHa többet szeretne megtudni erről a tanúsítványról, forduljon a rendszergazdájához.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> tanúsítványkibocsátókat telepített az Ön munkaprofiljához, ami lehetővé teheti a munkahelyi hálózati tevékenységek, beleértve az e-mailek, alkalmazások és biztonságos webhelyek megfigyelését.\n\nHa többet szeretne megtudni ezekről a tanúsítványokról, forduljon a rendszergazdájához.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> tanúsítványkibocsátót telepített az Ön munkaprofiljához, ami lehetővé teheti a munkahelyi hálózati tevékenységek, beleértve az e-mailek, alkalmazások és biztonságos webhelyek megfigyelését.\n\nHa többet szeretne megtudni erről a tanúsítványról, forduljon a rendszergazdájához.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Egy harmadik fél képes az Ön hálózati tevékenységének figyelésére, beleértve az e-maileket, az alkalmazásokat és a biztonságos webhelyeket is.\n\nEzt az Ön eszközére telepített megbízható hitelesítési adatok teszik lehetővé."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Tanúsítványok ellenőrzése</item>
- <item quantity="one">Tanúsítvány ellenőrzése</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Tanúsítvány elfogadása megbízhatóként vagy eltávolítása}other{Tanúsítványok elfogadása megbízhatóként vagy eltávolításuk}}"</string>
<string name="device_status" msgid="8266002761193692207">"Állapot"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Hálózat, sorozatszámok és egyéb adatok"</string>
<string name="manual" msgid="5683935624321864999">"Útmutató"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Csatlakozás"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Hálózat elfelejtése"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Ezzel törli a hálózathoz való kapcsolódás során használt adatokat, beleértve a mentett jelszót is"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"A Wi-Fi-hez való csatlakozáshoz olvassa be a QR-kódot a mobiltelefonjáról, majd kövesse az utasításokat."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" A Wi-Fi-hez való csatlakozáshoz olvassa be a QR-kódot mobiltelefonról, majd kövesse az utasításokat.\n\n "<b>"Android-telefon"</b>" esetén lépjen a Beállítások > Hálózat és internet > Wi-Fi ponthoz > válassza ki a kívánt Wi-Fi-hálózatot > a Speciális > Eszköz hozzáadása elemet, majd olvassa be a QR-kódot."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"A megszakításhoz nyomja meg a vissza gombot"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Tovább"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Az eszköz tárhelye"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Cserélhető tárhely"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Visszaállítás"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Tárhely felszabadítása"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Törli a gyorsítótárban tárolt adatokat?"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> felszabadítása"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Törli a helyet foglaló ideiglenes fájlokat. Nem befolyásolja a mentett adatokat, például az alkalmazásbeállításokat vagy az offline videókat, és nem kell újra bejelentkeznie az alkalmazásokba."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Törli a gyorsítótárban tárolt adatokat?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Ez törli az alkalmazások gyorsítótárbeli adatait."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Alkalmazások eltávolítása"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"A(z) <xliff:g id="NAME">%1$s</xliff:g> csatlakoztatva"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"A(z) <xliff:g id="NAME">%1$s</xliff:g> csatlakoztatása sikertelen"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB-tár újracsatlakoztatva"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Mikrofon-hozzáférés"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Alkalmazások mikrofon-hozzáférése"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Mikrofonhoz való hozzáférés letiltva"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"A letiltás feloldásához kapcsolja át az eszközén található adatvédelmi kapcsolót Mikrofon bekapcsolva pozícióba, így engedélyezheti a mikrofonhoz való hozzáférést."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Kamera-hozzáférés"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Alkalmazások kamera-hozzáférése"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"A kamerához való hozzáférés letiltva"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"A letiltás feloldásához kapcsolja át az eszközén található adatvédelmi kapcsolót Kamera bekapcsolva pozícióba, így engedélyezheti a kamerához való hozzáférést."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Mikrofon-hozzáférés: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Ha be van kapcsolva, minden engedéllyel rendelkező alkalmazás és szolgáltatás hozzáférhet az eszköz összes mikrofonjához.\n\nAz egyéni protokollal rendelkező hangperifériákat ez a beállítás nem érinti."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Kamera-hozzáférés: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Zöldeskék"</string>
<string name="color_yellow" msgid="3519470952904560404">"Sárga"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audionarráció"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Leírást hallhat a támogatott filmek és sorozatok cselekményéről"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Engedélyezés"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Beállítások"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Használja: <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Felügyelet"</string>
<string name="system_apps" msgid="8481888654606868074">"Alkalmazások"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Nem kapcsol ki"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"A képernyő soha nem lép alvó üzemmódba"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP ellenőrzés"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI-optimalizáció"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Újraindítja az eszközt most?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"HDMI-eszközök kikapcsolása a tévével együtt"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Tévé automatikus bekapcsolása"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"A tévé bekapcsolása a HDMI-eszközzel együtt"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Csatlakoztatott bemenetek</item>
- <item quantity="one">Csatlakoztatott bemenet</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Készenléti bemenetek</item>
- <item quantity="one">Készenléti bemenet</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Nem csatlakoztatott bemenetek</item>
- <item quantity="one">Nem csatlakoztatott bemenet</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Csatlakoztatott bemenet}other{Csatlakoztatott bemenetek}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Készenléti bemenet}other{Készenléti bemenetek}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Nem csatlakoztatott bemenet}other{Nem csatlakoztatott bemenetek}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Alkalmazásokhoz és egyéb tartalmakhoz való hozzáférés korlátozása saját fiókjában"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Korlátozott profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"A(z) <xliff:g id="APP">%1$s</xliff:g> vezérli"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Korlátozott profil létrehozása"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Beállítások"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Engedélyezett alkalmazások"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d alkalmazás engedélyezve</item>
- <item quantity="one">1 alkalmazás engedélyezve</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Engedélyezett"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Nem engedélyezett"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Korlátozások személyre szabása"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Harmadik félhez tartozó forrás"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Engedélyek"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Az alkalmazást nem lehet elindítani"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Nem használt alkalmazások"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Megerősítés"</string>
<string name="settings_cancel" msgid="576094334743686152">"Mégse"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Ez az engedély lehetővé teszi az alkalmazás számára a rendszerbeállítások módosítását."</string>
<string name="write_settings_on" msgid="71675710746513956">"Igen"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Nem"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Hozzáférés minden fájlhoz"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Hozzáférés megadása minden fájl kezeléséhez"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Engedélyezi ennek az alkalmazásnak az eszközön és a csatlakoztatott tárolóköteteken található összes fájl olvasását, módosítását és törlését. Ha engedélyezve van, az alkalmazás anélkül férhet hozzá a fájlokhoz, hogy Önt külön tájékoztatná róla."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Kép a képben"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Kép a képben engedélyezése"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"A telepített alkalmazások nem támogatják a kép a képben funkciót"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Engedélyezi, hogy az alkalmazások kép a képben ablakot hozzanak létre, amikor meg vannak nyitva, vagy miután Ön kilépett belőlük (például azért, hogy tovább nézzen egy videót). Az említett ablak az Ön által használt többi alkalmazás fölött jelenik meg."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Lehetővé teszi az alkalmazásoknak, hogy ébresztéseket állítsanak be, valamint időérzékeny feladatokat ütemezzenek. Ezzel engedélyezi az alkalmazásoknak, hogy a háttérben fussanak, ami megnövekedett akkumulátorhasználattal járhat.\n\nHa ez az engedély ki van kapcsolva, az alkalmazás által beállított ébresztések és ütemezett időérzékeny események nem fognak működni."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Képernyő bekapcsolása"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"A képernyő bekapcsolásának engedélyezése"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"A képernyő bekapcsolásának engedélyezése az adott alkalmazás számára. Ha megadja az engedélyt, az alkalmazás az Ön kifejezett szándéka nélkül, bármikor bekapcsolhatja a képernyőt."</string>
<string name="special_access" msgid="21806055758289916">"Különleges alkalmazás-hozzáférés"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Hanganyag"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Adatforgalom-csökkentő"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Videó minőségének automatikus beállítása a kevesebb mobiladat-használathoz"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Adathasználat és értesítések"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Csatlakozhat az internethez Wi-Fi, Ethernet vagy telefonja hotspotja segítségével. További segítségért keresse fel a(z) "<b>"g.co/network"</b>" webhelyet."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Az internethez Wi-Fi, Ethernet-kábel vagy telefonja hotspotja segítségével csatlakozhat."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Nem engedélyezett művelet"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"A hangerő nem módosítható"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Áramellátás és energia"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Bekapcsolási viselkedés"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Visszaállítás"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet-hálózat párosítókódja"</string>
</resources>
diff --git a/Settings/res/values-hy/strings.xml b/Settings/res/values-hy/strings.xml
index 36eac20..78c8414 100644
--- a/Settings/res/values-hy/strings.xml
+++ b/Settings/res/values-hy/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Ավելացրեք հաշիվ"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Հաշիվներ և մուտք"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Հաշիվներ չկան"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> հաշիվ</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> հաշիվ</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# հաշիվ}one{# հաշիվ}other{# հաշիվ}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Մեդիա ծառայություններ, Օգնական, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Ցանց և ինտերնետ"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Ձայներանգ"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Հավելվածներ"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Սարքի կարգավորումներ"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Հեռակառավարման վահանակներ և լրասարքեր"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Միացված Bluetooth սարքեր չկան"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> լրասարք</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> լրասարք</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Էկրան և ձայն"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Օգնություն և հետադարձ կապ"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Գաղտնիություն"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Վերակայել բոլոր տվյալները"</string>
<string name="device_calibration" msgid="2907914144048739705">"Չափաբերում"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Էներգիայի տնտեսում"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Սարքեր"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Ընտրեք ձևաչափերը"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Ծավալային ձայն"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ՄԻԱՑՎԱԾ ՁԵՎԱՉԱՓԵՐ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ԱՆՋԱՏՎԱԾ ՁԵՎԱՉԱՓԵՐ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Անջատելու համար ձևաչափի ընտրությունը դարձրեք «Ձեռքով»։"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Լուծաչափ"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Ավտոմատ"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Լուծաչափը փոխվել է"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Սեղմեք «Եղավ»՝ %1$s լուծաչափն այս պահից սկսած օգտագործելու համար։"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Չեղարկել"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Եղավ"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Հց"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Ջնջե՞լ քեշավորված տվյալները:"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Սա կմաքրի բոլոր ծրագրերի քեշավորված տվյալները:"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Ավելացնել լրասարք"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Զուգակցում…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Միացում…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Լրասարքեր"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Հեռակառավարման վահանակ"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Հեռակառավարման վահանակի կարգավորումներ"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Հեռակառավարման վահանակի կոճակների կարգավորում"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Միացրեք/անջատեք հեռուստացույցը, ընդունիչները և բարձրախոս-վահանակները, ինչպես նաև կառավարեք դրանց ձայնի ուժգնությունն ու մուտքի աղբյուրները"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Միացնել"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Միացնել %1$s սարքին"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Անջատել"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Հասանելի չէ"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Սարքի ադմինիստրատորի հավելվածներ"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Ակտիվ հավելվածներ չկան"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Անջատված է ադմինիստրատորի, գաղտնագրման քաղաքականության կամ հավատարմագրային պահոցի կողմից"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Կառավարվող սարքի տվյալները"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Ձեր կազմակերպության կողմից կառավարվող փոփոխություններ և կարգավորումներ"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Չկա"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Տեղադրված հավելվածներ"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Հավելվածների թիվը մոտավոր է։ Հնարավոր է, որ այն չի ներառում կողմնակի աղբյուրներից տեղադրված հավելվածները։"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Նվազագույնը # հավելված}one{Նվազագույնը # հավելված}other{Նվազագույնը # հավելված}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Տեղորոշման թույլտվությունները"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Խոսափողի թույլտվությունները"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Տեսախցիկի թույլտվությունները"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Կանխադրված հավելվածները"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# հավելված}one{# հավելված}other{# հավելված}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Կանխադրված ստեղնաշար"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"«Միշտ միացված VPN» կարգավորումը միացված է"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Վստահելի ՀԿ հավաստագրեր"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Վստահելի ՀԿ հավաստագրեր ձեր անձնական պրոֆիլում"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Վստահելի ՀԿ հավաստագրեր ձեր աշխատանքային պրոֆիլում"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Նվազագույնը <xliff:g id="COUNT_1">%d</xliff:g> CA հավաստագիր</item>
- <item quantity="other">Նվազագույնը <xliff:g id="COUNT_1">%d</xliff:g> CA հավաստագիր</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA հավաստագիր}one{# CA հավաստագիր}other{# CA հավաստագիր}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Ադմինիստրատորը կարող է կողպել սարքը և վերակայել գաղտնաբառը"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Ադմինիստրատորը կարող է ջնջել սարքի բոլոր տվյալները"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Գաղտնաբառ մուտքագրելու անհաջող փորձերի քանակը, որից հետո սարքի բոլոր տվյալները կջնջվեն"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Գաղտնաբառ մուտքագրելու անհաջող փորձերի քանակը, որից հետո աշխատանքային պրոֆիլի տվյալները կջնջվեն"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# փորձ}one{# փորձ}other{# փորձ}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Այս սարքի կառավարիչը ձեր կազմակերպությունն է։"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Այս սարքի կառավարիչն է <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> կազմակերպությունը։"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Մանրամասն"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Տեսախցիկի հավելվածներ</item>
- <item quantity="other">Տեսախցիկի հավելվածներ</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Տեսախցիկի հավելված}one{Տեսախցիկի հավելված}other{Տեսախցիկի հավելվածներ}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Օրացույցի հավելված"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Կոնտակտների հավելված"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Փոստային հավելվածներ</item>
- <item quantity="other">Փոստային հավելվածներ</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Փոստային հավելված}one{Փոստային հավելված}other{Փոստային հավելվածներ}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Քարտեզի հավելված"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Հեռախոսի հավելվածներ</item>
- <item quantity="other">Հեռախոսի հավելվածներ</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Հեռախոսի հավելված}one{Հեռախոսի հավելված}other{Հեռախոսի հավելվածներ}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Դիտարկիչ"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV-ի օպերացիոն համակարգի տարբերակ"</string>
<string name="about_serial" msgid="3432319328808745459">"Սերիական համարը"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV-ի օպերացիոն համակարգի կառուցում"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{Մշակող դառնալու համար ձեզ մնացել է # քայլ}one{Մշակող դառնալու համար ձեզ մնացել է # քայլ}other{Մշակող դառնալու համար ձեզ մնացել է # քայլ}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Գովազդ"</string>
<string name="ads_description" msgid="8081069475265061074">"Կառավարեք գովազդի կարգավորումները (օր․՝ վերակայեք գովազդային նույնացուցիչը)։"</string>
<string name="ads_content_description" msgid="1006489792324920289">"Գովազդ․ կառավարեք գովազդի կարգավորումները (օր․՝ զրոյացրեք գովազդային նույնացուցիչը)։"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Հավելյալ թարմացումներ"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Ցանցը կարող է վերահսկվել"</string>
<string name="done_button" msgid="616159688526431451">"Պատրաստ է"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Հաստատեք կամ հեռացրեք հավաստագրերը</item>
- <item quantity="other">Հաստատեք կամ հեռացրեք հավաստագրերը</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> տիրույթի ադմինիստրատորը ձեր սարքում տեղադրել է CA հավաստագրեր։ Դա նրան թույլ է տալիս վերահսկել ձեր գործողությունները ցանցում, այդ թվում՝ էլփոստի և հավելվածների օգտագործումը, ինչպես նաև պաշտպանված կայքերի դիտումը։\n\nԼրացուցիչ տեղեկությունների համար դիմեք ձեր ադմինիստրատորին։</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> տիրույթի ադմինիստրատորը ձեր սարքում տեղադրել է CA հավաստագրեր։ Դա նրան թույլ է տալիս վերահսկել ձեր գործողությունները ցանցում, այդ թվում՝ էլփոստի և հավելվածների օգտագործումը, ինչպես նաև պաշտպանված կայքերի դիտումը։\n\nԼրացուցիչ տեղեկությունների համար դիմեք ձեր ադմինիստրատորին։</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> տիրույթի ադմինիստրատորը ձեր աշխատանքային պրոֆիլի համար տեղադրել է CA հավաստագրեր։ Դա նրան թույլ է տալիս վերահսկել ձեր գործողությունները աշխատանքային ցանցում, այդ թվում՝ էլփոստի և հավելվածների օգտագործումը, ինչպես նաև պաշտպանված կայքերի դիտումը։\n\nԼրացուցիչ տեղեկությունների համար դիմեք ձեր ադմինիստրատորին։</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> տիրույթի ադմինիստրատորը ձեր աշխատանքային պրոֆիլի համար տեղադրել է CA հավաստագրեր։ Դա նրան թույլ է տալիս վերահսկել ձեր գործողությունները աշխատանքային ցանցում, այդ թվում՝ էլփոստի և հավելվածների օգտագործումը, ինչպես նաև պաշտպանված կայքերի դիտումը։\n\nԼրացուցիչ տեղեկությունների համար դիմեք ձեր ադմինիստրատորին։</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Երրորդ կողմն ի վիճակի է վերահսկել ձեր ցանցային գործունեությունը, այդ թվում՝ նամակները, ծրագրերը և անվտանգ կայքերը:\n\nՁեր սարքում տեղադրված վստահելի հավատարմագիրն է դա հնարավոր դարձնում:"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Ստուգել հավաստագրերը</item>
- <item quantity="other">Ստուգել հավաստագրերը</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Հաստատեք կամ հեռացրեք հավաստագիրը}one{Հաստատեք կամ հեռացրեք հավաստագիրը}other{Հաստատեք կամ հեռացրեք հավաստագրերը}}"</string>
<string name="device_status" msgid="8266002761193692207">"Կարգավիճակ"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Ցանցի կարգավիճակ, հերթական համարներ և այլ տվյալներ"</string>
<string name="manual" msgid="5683935624321864999">"Ձեռքով"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Միանալ"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Մոռանալ ցանցը"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Այս ցանցին միանալու համար օգտագործվող տվյալները, ներառյալ պահված գաղտնաբառը, կջնջվեն:"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Wi-Fi-ին միանալու համար ձեր հեռախոսով սկանավորեք QR կոդը և հետևեք հրահանգներին։"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Wi-Fi-ին միանալու համար հեռախոսով սկանավորեք QR կոդը և հետևեք հրահանգներին։\n \n "<b>"Android հեռախոսում"</b>" անցեք Կարգավորումներ -> Ցանց և ինտերնետ -> Wi-Fi -> Ընտրել Wi-Fi ցանց -> Լրացուցիչ -> Ավելացնել սարք, այնուհետև սկանավորեք QR կոդը։"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Չեղարկելու համար սեղմեք «Հետ» կոճակը"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Լավ"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Շարունակել"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Սարքի հիշողություն"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Շարժական կրիչ"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Վերակայում"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Ազատեք տարածք"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Ջնջեք քեշավորված տվյալները"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Ազատեք <xliff:g id="SPACE">%1$s</xliff:g> տարածք"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Կջնջվեն ժամանակավոր ֆայլերը, որոնք տարածք են զբաղեցնում։ Գործողությունը չի ազդի պահված տվյալների, օրինակ՝ հավելվածների կարգավորումների և անցանց տեսանյութերի վրա, և դուք ստիպված չեք լինի նորից մուտք գործել հավելվածներ։"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Ջնջե՞լ քեշավորված տվյալները"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Բոլոր հավելվածների քեշավորված տվյալները կջնջվեն"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Ապատեղադրեք որոշ հավելվածներ"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> կրիչը միացվեց"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Չհաջողվեց միացնել <xliff:g id="NAME">%1$s</xliff:g> կրիչը"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB կրիչը նորից միացված է"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Խոսափող"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Խոսափողի հասանելիություն"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Խոսափողի հասանելիությունը հավելվածներին"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Խոսափողի օգտագործումն արգելափակված է"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Արգելահանելու համար սարքում գաղտնիության փոխանջատիչը տեղափոխեք խոսափողի օգտագործման թույլտվության դիրք։"</string>
<string name="camera" msgid="1226671478936288283">"Տեսախցիկ"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Տեսախցիկի հասանելիություն"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Տեսախցիկի հասանելիությունը հավելվածներին"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Տեսախցիկի օգտագործումն արգելափակված է"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Արգելահանելու համար սարքում գաղտնիության փոխանջատիչը տեղափոխեք տեսախցիկի օգտագործման թույլտվության դիրք։"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Խոսափողի հասանելիություն՝ <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Երբ այս կարգավորումը միացված է, բոլոր հավելվածերն ու ծառայությունները, որոնք ունեն թույլտվություն, կարող են օգտագործել խոսափողն այս սարքում։\n\nԱյս կարգավորումը չի ազդում անհատականացված հաղորդակարգով արտաքին աուդիո սարքերի վրա։"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Տեսախցիկի հասանելիություն՝ <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Երկնագույն"</string>
<string name="color_yellow" msgid="3519470952904560404">"Դեղին"</string>
<string name="color_magenta" msgid="2377854703399624607">"Մանուշակագույն"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Աուդիո նկարագրություն"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Ինչ է կատարվում էկրանին"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Ակտիվ"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Կարգավորում"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Օգտագործե՞լ <xliff:g id="SERVICE">%1$s</xliff:g> ծառայությունը:"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Մոնիտորինգ"</string>
<string name="system_apps" msgid="8481888654606868074">"Հավելվածներ"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Մնալ արթուն"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Էկրանն այս ընթացքում չի անջատվի"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP ստուգում"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI լավարկում"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Վերագործարկե՞լ հիմա"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Անջատել HDMI սարքերը հեռուստացույցի հետ"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Ավտոմատ միացնել հեռուստացույցը"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Միացնել հեռուստացույցը HDMI սարքի հետ"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Կապակցված մուտքեր</item>
- <item quantity="other">Կապակցված մուտքեր</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Պահուստային մուտքեր</item>
- <item quantity="other">Պահուստային մուտքեր</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Չկապակցված մուտքեր</item>
- <item quantity="other">Չկապակցված մուտքեր</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Միացված մուտք}one{Միացված մուտք}other{Միացված մուտքեր}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Պահեստային մուտք}one{Պահեստային մուտք}other{Պահեստային մուտքեր}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Անջատված մուտք}one{Անջատված մուտք}other{Անջատված մուտքեր}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Սահմանափակել մուտքը ձեր հաշվի ծրագրերին և այլ բովանդակությանը"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Սահմանափակված պրոֆիլ"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Վերահսկվում է <xliff:g id="APP">%1$s</xliff:g>-ի կողմից"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Ստեղծել սահմանափակված պրոֆիլ"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Կարգավորումներ"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Թույլատրված ծրագրեր"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">Թույլատրված է %d հավելված</item>
- <item quantity="other">Թույլատրված է %d հավելված</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Թույլատրված է"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Արգելված"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Հարմարացնել սահմանափակումները"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Կողմնակի աղբյուր"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Թույլտվություններ"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Հավելվածն անհասանելի է"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Չօգտագործվող հավելվածներ"</string>
<string name="settings_ok" msgid="5950888975075541964">"Հաստատել"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Հաստատել"</string>
<string name="settings_cancel" msgid="576094334743686152">"Չեղարկել"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Միացնելով այս թույլտվությունը՝ թույլ եք տալիս հավելվածին փոփոխել համակարգի կարգավորումները:"</string>
<string name="write_settings_on" msgid="71675710746513956">"Այո"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Ոչ"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Բոլոր ֆայլերի հասանելիություն"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Բոլոր ֆայլերը կառավարելու թույլտվություն տալ"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Դուք կարող եք թույլատրել այս հավելվածին կարդալ, փոփոխել և ջնջել այս սարքի կամ միացված կրիչների բոլոր ֆայլերը։ Եթե թույլատրեք, հավելվածը կկարողանա օգտվել ֆայյլերից առանց ձեր իմացության։"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"«Նկար նկարի մեջ» ռեժիմ"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Թույլատրել «նկար նկարի մեջ» ռեժիմը"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Տեղադրված հավելվածները չեն աջակցում «նկար նկարի մեջ» ռեժիմը"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Թույլատրել հավելվածներին ստեղծել «նկար նկարի մեջ» պատուհան` հավելվածն օգտագործելիս կամ փակելուց հետո (օրինակ՝ տեսանյութի դիտումը շարունակելու համար): Այս պատուհանը ցուցադրվում է ձեր կողմից օգտագործվող այլ հավելվածների վրայից:"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Թույլատրեք հավելվածներին կարգավորել զարթուցիչներ և ստեղծել գործողությունների կատարման ժամանակացույցներ։ Այդպես հավելվածները կկարողանան աշխատել ֆոնային ռեժիմում, ինչի արդյունքում ավելի շատ էներգիա կսպառվի։\n\nԵթե այս թույլտվությունն անջատված է, հավելվածի կողմից կարգավորված զարթուցիչները և միջոցառումների ժամանակացույցները չեն աշխատի։"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Էկրանի միացում"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Թույլատրել հավելվածին միացնել էկրանը"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Եթե թույլ տաք, հավելվածը ցանկացած ժամանակ կկարողանա միացնել էկրանը՝ առանց ձեր բացահայտ համաձայնության։"</string>
<string name="special_access" msgid="21806055758289916">"Հատուկ հասանելիություն"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Աուդիո"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Թրաֆիկի տնտեսում"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Ավտոմատ կարգավորել տեսանյութի որակը՝ թրաֆիկը տնտեսելու համար"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Թրաֆիկի օգտագործում և ծանուցումներ"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Դուք կարող եք միանալ ինտերնետին Wi-Fi-ի, Ethernet ցանցի կամ հեռախոսի թեժ կետի միջոցով։ Լրացուցիչ օգնության համար անցեք "<b>"g.co/network"</b>" էջ։"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Դուք կարող եք միանալ ինտերնետին Wi-Fi-ի, Ethernet-ի կամ հեռախոսի թեժ կետի միջոցով։"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Գործողությունն արգելված է"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Հնարավոր չէ փոխել ձայնի ուժգնությունը"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Սնուցում և էներգիա"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Կարգավիճակը միացման ժամանակ"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Վերակայել"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet-ի զուգակցման կոդ"</string>
</resources>
diff --git a/Settings/res/values-in/strings.xml b/Settings/res/values-in/strings.xml
index 7c613c9..6a20e00 100644
--- a/Settings/res/values-in/strings.xml
+++ b/Settings/res/values-in/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Tambahkan akun"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Akun & login"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Tidak ada akun"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> akun</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> akun</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# akun}other{# akun}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Layanan media, Asisten, Pembayaran"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Jaringan & Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Suara"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplikasi"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Preferensi Perangkat"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Remote & aksesori"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Tidak ada perangkat Bluetooth yang terhubung"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> aksesori</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> aksesori</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Tampilan & Suara"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Bantuan & Masukan"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privasi"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Reset ke setelan pabrik"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrasi"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Penghemat energi"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Perangkat"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Pilih format"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Suara Surround"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMAT YANG DIAKTIFKAN"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMAT YANG DINONAKTIFKAN"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Untuk menonaktifkan, ubah pemilihan format ke Manual."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolusi"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Otomatis"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Resolusi telah diubah"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Pilih Oke untuk menggunakan %1$s mulai sekarang."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Batal"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Oke"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Hapus data dalam cache?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Ini akan menghapus data cache untuk semua apl."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Tambahkan aksesori"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Menyandingkan..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Menghubungkan…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Aksesori"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Remote Control"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Setelan remote control"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Siapkan tombol remote"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Mengontrol volume, daya, input di TV, penerima, dan soundbar"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Hubungkan"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Hubungkan ke %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Putuskan koneksi"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Tidak tersedia"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Aplikasi admin perangkat"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Tidak ada aplikasi aktif"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikasi aktif</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplikasi aktif</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Dinonaktifkan oleh admin, kebijakan enkripsi, atau penyimpanan kredensial"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Info perangkat yang dikelola"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Perubahan & setelan yang dikelola oleh organisasi"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Tidak ada"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Aplikasi diinstal"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Jumlah aplikasi merupakan hasil perkiraan. Hal ini tidak termasuk aplikasi yang diinstal selain dari Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> aplikasi</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> aplikasi</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum # aplikasi}other{Minimum # aplikasi}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Izin akses lokasi"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Izin akses mikrofon"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Izin akses kamera"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Aplikasi default"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikasi</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplikasi</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplikasi}other{# aplikasi}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Keyboard default"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Setel ke <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"VPN yang selalu aktif telah diaktifkan"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Kredensial tepercaya"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Kredensial tepercaya di profil pribadi Anda"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Kredensial tepercaya di profil kerja Anda"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> sertifikat CA</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> sertifikat CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# sertifikat CA}other{# sertifikat CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Admin dapat mengunci perangkat dan menyetel ulang sandi"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Admin dapat menghapus semua data perangkat"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Kesalahan sandi sebelum menghapus semua data perangkat"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Kesalahan sandi sebelum menghapus data profil kerja"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> kesempatan</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> kesempatan</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# kali percobaan}other{# kali percobaan}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Perangkat ini dikelola oleh organisasi."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Perangkat ini dikelola oleh <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Pelajari lebih lanjut"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Aplikasi kamera</item>
- <item quantity="one">Aplikasi kamera</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Aplikasi kamera}other{Aplikasi kamera}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"aplikasi Kalender"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplikasi kontak"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Aplikasi program email</item>
- <item quantity="one">Aplikasi program email</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Aplikasi program email}other{Aplikasi program email}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Aplikasi peta"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Aplikasi telepon</item>
- <item quantity="one">Aplikasi telepon</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Aplikasi telepon}other{Aplikasi telepon}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Aplikasi browser"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Versi OS Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Nomor seri"</string>
<string name="about_build" msgid="8467840394761634575">"Versi OS Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> langkah lagi untuk menjadi pengembang</item>
- <item quantity="one"><xliff:g id="STEP_COUNT_0">%1$d</xliff:g> langkah lagi untuk menjadi pengembang</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Anda perlu menyelesaikan # langkah lagi untuk menjadi developer}other{Anda perlu menyelesaikan # langkah lagi untuk menjadi developer}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Iklan"</string>
<string name="ads_description" msgid="8081069475265061074">"Kelola setelan iklan, seperti mereset ID iklan."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Iklan, Kelola setelan iklan, seperti mereset ID iklan."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Pembaruan sistem tambahan"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Jaringan mungkin dipantau"</string>
<string name="done_button" msgid="616159688526431451">"Selesai"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Percayai atau hapus sertifikat</item>
- <item quantity="one">Percayai atau hapus sertifikat</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> telah menginstal certificate authority di perangkat Anda, yang dapat memungkinkan mereka memantau aktivitas jaringan perangkat, termasuk email, aplikasi, dan situs aman.\n\nUntuk informasi selengkapnya tentang sertifikat ini, hubungi admin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> telah menginstal certificate authority di perangkat Anda, yang dapat memungkinkan mereka memantau aktivitas jaringan perangkat, termasuk email, aplikasi, dan situs aman.\n\nUntuk informasi selengkapnya tentang sertifikat ini, hubungi admin.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> telah menginstal certificate authority untuk profil kerja Anda, yang dapat memungkinkan mereka memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs aman.\n\nUntuk informasi selengkapnya tentang sertifikat ini, hubungi admin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> telah menginstal certificate authority untuk profil kerja Anda, yang dapat memungkinkan mereka memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs aman.\n\nUntuk informasi selengkapnya tentang sertifikat ini, hubungi admin.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Pihak ketiga dapat memantau aktivitas jaringan Anda, termasuk email, aplikasi, dan situs web aman.\n\nKredensial terpercaya yang dipasang pada perangkat Anda memungkinkan hal ini."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Periksa sertifikat</item>
- <item quantity="one">Periksa sertifikat</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Percayai atau hapus sertifikat}other{Percayai atau hapus sertifikat}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Jaringan, nomor seri, dan informasi lainnya"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Sambungkan"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Lupakan jaringan"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Tindakan ini menghapus informasi yang digunakan untuk terhubung ke jaringan ini, termasuk sandi yang disimpan"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Bergabung ke Wi-Fi dengan memindai kode QR dari ponsel dan ikuti petunjuknya."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Bergabung ke Wi-Fi dengan memindai kode QR dari ponsel dan ikuti petunjuknya.\n \n Dari "<b>"Ponsel Android"</b>", buka Setelan -> Jaringan & internet -> Wi-Fi -> Pilih Wi-Fi -> Lanjutan -> Tambahkan perangkat lalu pindai kode QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Tekan tombol kembali untuk membatalkan"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Oke"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Lanjutkan"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Penyimpanan perangkat"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Penyimpanan yang dapat dicopot"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Reset"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Mengosongkan penyimpanan"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Menghapus data dalam cache"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Mengosongkan <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Menghapus file sementara yang menggunakan ruang penyimpanan. Tindakan ini tidak akan memengaruhi data tersimpan seperti preferensi aplikasi atau video offline, dan Anda tidak perlu login ke aplikasi lagi."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Hapus data dalam cache?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Ini akan menghapus data di cache untuk semua apl."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Meng-uninstal aplikasi"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> telah dipasang"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Tidak dapat memasang <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Penyimpanan USB telah disambungkan kembali"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Akses mikrofon"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Akses aplikasi ke mikrofon"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Akses mikrofon diblokir"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Untuk berhenti memblokir, alihkan tombol privasi di perangkat ke posisi mikrofon aktif untuk mengizinkan akses mikrofon."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Akses kamera"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Akses aplikasi ke kamera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Akses kamera diblokir"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Untuk berhenti memblokir, alihkan tombol privasi di perangkat ke posisi kamera aktif untuk mengizinkan akses kamera."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Akses Mikrofon: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Jika diaktifkan, semua aplikasi dan layanan yang memiliki izin dapat mengakses mikrofon di perangkat ini.\n\nPeriferal audio dengan protokol khusus tidak akan terpengaruh oleh setelan ini."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Akses Kamera: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Biru kehijauan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Kuning"</string>
<string name="color_magenta" msgid="2377854703399624607">"Merah keunguan"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Deskripsi audio"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Dengarkan deskripsi tentang hal yang sedang terjadi di layar pada film dan acara TV yang didukung"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Aktifkan"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfigurasi"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Gunakan <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Pemantauan"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplikasi"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Tetap terjaga"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Layar tidak akan masuk mode tidur"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Pemeriksaan HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Pengoptimalan HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Mulai ulang sekarang?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Mematikan perangkat HDMI bersama TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Otomatis nyalakan TV"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Menyalakan TV bersama perangkat HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Input yang Terhubung</item>
- <item quantity="one">Input yang Terhubung</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Input Siaga</item>
- <item quantity="one">Input Siaga</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Input yang Tidak Terhubung</item>
- <item quantity="one">Input yang Tidak Terhubung</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Input yang Terhubung}other{Input yang Terhubung}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Input Standby}other{Input Standby}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Input yang Tidak Terhubung}other{Input yang Tidak Terhubung}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Batasi akses ke aplikasi dan konten lain di akun Anda"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Profil Dibatasi"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Dikontrol oleh <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Buat profil yang dibatasi"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Setelan"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Aplikasi yang diizinkan"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d aplikasi diizinkan</item>
- <item quantity="one">1 aplikasi diizinkan</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Diizinkan"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Tidak diizinkan"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Sesuaikan pembatasan"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Sumber Pihak Ketiga"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Izin"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplikasi tidak tersedia"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Aplikasi tidak digunakan"</string>
<string name="settings_ok" msgid="5950888975075541964">"Oke"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Konfirmasi"</string>
<string name="settings_cancel" msgid="576094334743686152">"Batal"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Izin ini memungkinkan aplikasi mengubah setelan sistem."</string>
<string name="write_settings_on" msgid="71675710746513956">"Ya"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Tidak"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Akses semua file"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Izinkan akses untuk mengelola semua file"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Mengizinkan aplikasi ini untuk membaca, mengubah, dan menghapus semua file di perangkat ini atau media penyimpanan yang terpasang. Jika diberikan, aplikasi dapat mengakses file tanpa sepengetahuan Anda."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Izinkan picture-in-picture"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Tidak ada aplikasi terinstal yang mendukung Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Mengizinkan aplikasi membuat jendela picture-in-picture saat aplikasi terbuka atau setelah Anda membiarkannya terbuka (misalnya, untuk melanjutkan aktivitas menonton video). Jendela ini ditampilkan di atas aplikasi lain yang sedang digunakan."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Izinkan aplikasi menyetel alarm dan menjadwalkan tindakan berjangka waktu. Hal ini memungkinkan aplikasi berjalan di latar belakang, yang dapat menggunakan lebih banyak daya.\n\nJika izin ini nonaktif, alarm dan acara berbasis waktu yang dijadwalkan oleh aplikasi tidak akan berfungsi."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Aktifkan layar"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Izinkan pengaktifan layar"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Mengizinkan aplikasi mengaktifkan layar. Jika diizinkan, aplikasi dapat mengaktifkan layar kapan saja tanpa izin eksplisit dari Anda."</string>
<string name="special_access" msgid="21806055758289916">"Akses aplikasi khusus"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Penghemat Data"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Otomatis menyesuaikan kualitas video agar menggunakan lebih sedikit data seluler"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Penggunaan data dan notifikasi"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Anda dapat terhubung ke internet menggunakan Wi-Fi, Ethernet, atau hotspot ponsel Anda. Untuk mendapatkan bantuan lebih lanjut, buka "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Anda dapat terhubung ke internet menggunakan Wi-Fi, Ethernet, atau hotspot ponsel Anda."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Tindakan tidak diizinkan"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Volume tidak dapat diubah"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Daya & Energi"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Tampilan saat menyala"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Reset"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Kode penyambungan ethernet"</string>
</resources>
diff --git a/Settings/res/values-is/strings.xml b/Settings/res/values-is/strings.xml
index 0211f8b..b04cfe3 100644
--- a/Settings/res/values-is/strings.xml
+++ b/Settings/res/values-is/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Bæta reikningi við"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Reikningar og innskráning"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Engir reikningar"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> reikningur</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> reikningar</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# reikningur}one{# reikningur}other{# reikningar}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Spilunarþjónusta, hjálpari, greiðslur"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Netkerfi og internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Hljóð"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Forrit"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Kjörstillingar tækis"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Fjarstýringar og fylgihlutir"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Engin Bluetooth-tæki eru tengd"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> fylgihlutur</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> fylgihlutir</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Skjár og hljóð"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Hjálp og ábendingar"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Persónuvernd"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Núllstilling"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kvörðun"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Orkusparnaður"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Tæki"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Velja snið"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Víðóma hljóð"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"VIRK SNIÐ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ÓVIRK SNIÐ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Til að slökkva á þessu skaltu breyta sniðsvalinu í „Handvirkt“."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Upplausn"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Sjálfvirkt"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Upplausn var breytt"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Veldu „Í lagi“ til að nota %1$s framvegis."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Hætta við"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Í lagi"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Hreinsa gögn í skyndiminni?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Þetta eyðir gögnum allra forrita úr skyndiminni."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Bæta aukabúnaði við"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Parar…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Tengist…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Fylgihlutir"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Fjarstýring"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Stillingar fjarstýringar"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Setja upp hnappa fyrir fjarstýringu"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Stjórnaðu hljóðstyrk, afli, sjónvarpsinntaki, mögnurum og soundbar-tækjum"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Tengja"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Tengja við %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Aftengja"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Ekki í boði"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Forrit tækjastjóra"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Engin virk forrit"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> virkt forrit</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> virk forrit</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Stjórnandi, dulkóðunarstefna eða skilríkjageymsla hefur gert óvirkt"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Upplýsingar um stjórnað tæki"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Breytingar og stillingar stýrðar af fyrirtækinu þínu"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Engin"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Uppsett forrit"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Fjöldi forrita er áætlaður. Forrit sem eru sett upp utan Play Store eru hugsanlega ekki talin með."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="one">Að lágmarki <xliff:g id="COUNT_1">%d</xliff:g> forrit</item>
- <item quantity="other">Að lágmarki <xliff:g id="COUNT_1">%d</xliff:g> forrit</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Að lágmarki # forrit}one{Að lágmarki # forrit}other{Að lágmarki # forrit}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Heimildir staðsetningar"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Heimildir hljóðnema"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Heimildir myndavélar"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Sjálfgefin forrit"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> forrit</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> forrit</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# forrit}one{# forrit}other{# forrit}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Sjálfgefið lyklaborð"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Stilla á <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Kveikt á sívirku VPN"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Traust skilríki"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Traust skilríki á eigin sniði"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Traust skilríki á vinnusniði"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Að lágmarki <xliff:g id="COUNT_1">%d</xliff:g> CA-vottorð</item>
- <item quantity="other">Að lágmarki <xliff:g id="COUNT_1">%d</xliff:g> CA-vottorð</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA-vottorð}one{# CA-vottorð}other{# CA-vottorð}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Kerfisstjóri getur læst tækinu og endurstillt aðgangsorðið"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Kerfisstjóri getur eytt öllum gögnum á tækinu"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Fjöldi rangra tilrauna fyrir aðgangsorð áður en öllum gögnum á tækinu verður eytt"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Fjöldi rangra tilrauna fyrir aðgangsorð áður en öllum gögnum vinnusniðs verður eytt"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> tilraun</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tilraunir</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# tilraun}one{# tilraun}other{# tilraunir}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Þessu tæki er stýrt af fyrirtækinu þínu."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Þessu tæki er stýrt af <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Frekari upplýsingar"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Myndavélarforrit</item>
- <item quantity="other">Myndavélarforrit</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Myndavélarforrit}one{Myndavélarforrit}other{Myndavélarforrit}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Dagatalsforrit"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Tengiliðaforrit"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Póstforrit</item>
- <item quantity="other">Póstforrit</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Póstforrit}one{Póstforrit}other{Póstforrit}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Kortaforrit"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Símaforrit</item>
- <item quantity="other">Símaforrit</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Símaforrit}one{Símaforrit}other{Símaforrit}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Vafraforrit"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Útgáfa stýrikerfis Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Raðnúmer"</string>
<string name="about_build" msgid="8467840394761634575">"Smíði stýrikerfis Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="one">Þú ert nú <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> skrefi frá því að gerast þróunaraðili</item>
- <item quantity="other">Þú ert nú <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> skrefum frá því að gerast þróunaraðili</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Nú ertu # skrefi frá því að verða þróunaraðili}one{Nú ertu # skrefi frá því að verða þróunaraðili}other{Nú ertu # skrefum frá því að verða þróunaraðili}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Auglýsingar"</string>
<string name="ads_description" msgid="8081069475265061074">"Stjórnaðu auglýsingastillingum, t.d. endurstillingu auglýsingakennis."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Auglýsingar, stjórnaðu auglýsingastillingum, t.d. endurstillingu auglýsingakennis."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Viðbótarkerfisuppfærslur"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Hugsanlega er fylgst með netinu"</string>
<string name="done_button" msgid="616159688526431451">"Lokið"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Treysta vottorði eða fjarlægja það</item>
- <item quantity="other">Treysta vottorðum eða fjarlægja þau</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> hefur sett upp CA-vottorð í tækinu þínu, sem getur gert viðkomandi kleift að fylgjast með netnotkun tækisins, þar á meðal tölvupósti, forritum og öruggum vefsvæðum.\n\nHafðu samband við stjórnandann til að fá frekari upplýsingar um þessi vottorð.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> hefur sett upp CA-vottorð í tækinu þínu, sem getur gert viðkomandi kleift að fylgjast með netnotkun tækisins, þar á meðal tölvupósti, forritum og öruggum vefsvæðum.\n\nHafðu samband við stjórnandann til að fá frekari upplýsingar um þessi vottorð.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> hefur sett upp CA-vottorð fyrir vinnusniðið þitt, sem getur gert viðkomandi kleift að fylgjast með netnotkuninni á vinnusniðinu, þar á meðal tölvupósti, forritum og öruggum vefsvæðum.\n\nHafðu samband við stjórnandann til að fá frekari upplýsingar um þessi vottorð.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> hefur sett upp CA-vottorð fyrir vinnusniðið þitt, sem getur gert viðkomandi kleift að fylgjast með netnotkuninni á vinnusniðinu, þar á meðal tölvupósti, forritum og öruggum vefsvæðum.\n\nHafðu samband við stjórnandann til að fá frekari upplýsingar um þessi vottorð.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Þriðji aðili getur fylgst með netvirkni þinni, þ. á m. tölvupósti, forritum og öruggum vefsvæðum.\n\nTraust vottorð sem uppsett er á tækinu þínu gerir þetta kleift."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Athuga vottorð</item>
- <item quantity="other">Athuga vottorð</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Treysta vottorði eða fjarlægja það}one{Treysta vottorðum eða fjarlægja þau}other{Treysta vottorðum eða fjarlægja þau}}"</string>
<string name="device_status" msgid="8266002761193692207">"Staða"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Net, raðnúmer og aðrar upplýsingar"</string>
<string name="manual" msgid="5683935624321864999">"Handbók"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Tengjast"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Gleyma neti"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Þetta hreinsar upplýsingar sem notaðar eru til að tengjast þessu neti, þar á meðal vistað aðgangsorð"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Tengstu Wi-Fi með því að skanna QR-kóðann í snjallsímanum og fylgja leiðbeiningunum."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Tengstu Wi-Fi með því að skanna QR-kóðann í snjallsímanum og fylgja leiðbeiningunum.\n \n Í "<b>"Android síma"</b>" skaltu opna „Stillingar -> Netkerfi og internet -> Wi-Fi -> Velja Wi-Fi -> Ítarlegt -> Bæta við tæki“ og skanna svo QR-kóðann."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Ýttu á bakkhnappinn til að hætta við"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Í lagi"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Áfram"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Geymsla tækis"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Tengd geymsla"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Endurstilla"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Losa um pláss"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Hreinsa gögn í skyndiminni"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Losaðu um <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Hreinsar tímabundnar skrár sem taka pláss. Hefur ekki áhrif á vistuð gögn eins og kjörstillingar forrita eða myndskeið án nettengingar og þú þarft ekki að skrá þig aftur inn í forrit."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Hreinsa gögn í skyndiminni?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Þetta eyðir gögnum allra forrita úr skyndiminni."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Fjarlægja forrit"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> var tengt"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Ekki var hægt að tengja <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB-geymsla tengd aftur"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Hljóðnemi"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Aðgangur að hljóðnema"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Aðgangur forrits að hljóðnema"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Lokað fyrir aðgang að hljóðnema"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Þú getur opnað með því að færa persónuverndarrofann á tækinu svo að kveikt sé á hljóðnemanum til að veita aðgang að hljóðnemanum."</string>
<string name="camera" msgid="1226671478936288283">"Myndavél"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Aðgangur að myndavél"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Aðgangur forrits að myndavél"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Lokað fyrir aðgang að myndavél"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Þú getur opnað með því að færa persónuverndarrofann á tækinu svo að kveikt sé á myndavélinni til að veita aðgang að myndavélinni."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Aðgangur að hljóðnema: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Þegar kveikt er á þessu hafa öll forrit og allar þjónustur með heimild aðgang að öllum hljóðnemum þessa tækis.\n\nÞessi stilling hefur ekki áhrif á jaðartæki hljóðs með sérsniðna samskiptareglu."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Aðgangur að myndavél: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Blágrænn"</string>
<string name="color_yellow" msgid="3519470952904560404">"Gulur"</string>
<string name="color_magenta" msgid="2377854703399624607">"Blárauður"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Lesin lýsing"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Heyra lýsingu á því sem gerist á skjánum í studdum kvikmyndum og þáttum"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Virkja"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Grunnstilling"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Nota <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Eftirlit"</string>
<string name="system_apps" msgid="8481888654606868074">"Forrit"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Vaka"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Skjárinn fer aldrei í svefnstöðu"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP-athugun"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI-fínstilling"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Endurræsa núna?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Slökkva á HDMI-tækjum ásamt sjónvarpinu"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Kveikja sjálfkrafa á sjónvarpi"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Kveikja á sjónvarpinu með HDMI-tæki"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Tengd inntök</item>
- <item quantity="other">Tengd inntök</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Inntök í biðstöðu</item>
- <item quantity="other">Inntök í biðstöðu</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Ótengd inntök</item>
- <item quantity="other">Ótengd inntök</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Tengt inntak}one{Tengt inntak}other{Tengt inntak}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Inntak í biðstöðu}one{Inntak í biðstöðu}other{Inntak í biðstöðu}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Ótengt inntak}one{Ótengt inntak}other{Ótengt inntak}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Takmarka aðgang að forritum og öðru efni á reikningnum þínum"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Takmarkaður prófíll"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Stjórnað af <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Búa til takmarkað snið"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Stillingar"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Leyfð forrit"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d forrit leyft</item>
- <item quantity="other">%d forrit leyfð</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Leyft"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Ekki leyft"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Sérsníða takmarkanir"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Uppruni þriðja aðila"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Heimildir"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Forrit ekki tiltækt"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Ónotuð forrit"</string>
<string name="settings_ok" msgid="5950888975075541964">"Í lagi"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Staðfesta"</string>
<string name="settings_cancel" msgid="576094334743686152">"Hætta við"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Þessi heimild leyfir forriti að breyta kerfisstillingum."</string>
<string name="write_settings_on" msgid="71675710746513956">"Já"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Nei"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Aðgangur að öllum skrám"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Leyfa aðgang til að stjórna öllum skrám"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Leyfa þessu forriti að lesa, breyta og eyða öllum skrám í þessu tæki eða tengdum geymsludrifum. Ef heimild er veitt fær forritið aðgang að skránum þínum án þess að þér sé tilkynnt sérstaklega um það."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Mynd í mynd"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Leyfa mynd í mynd"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Engin uppsett forrit styðja mynd í mynd"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Leyfa forritum að opna mynd í mynd þegar forritið er opið eða hætt er að nota það (t.d. til að halda áfram að horfa á myndskeið). Þessi gluggi birtist ofan á öðrum opnum forritum."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Leyfa forritum að stilla vekjara og áætla aðgerðir sem þurfa að eiga sér stað innan ákveðins tímaramma. Þetta leyfir forritunum að keyra í bakgrunninum sem getur notað meiri rafhlöðuorku.\n\nEf slökkt er á þessari heimild munu núverandi vekjarar og tímasettir viðburðir sem forritið stillir ekki virka."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Kveikja á skjánum"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Leyfa að kveikt sé á skjánum"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Leyfa forriti að kveikja á skjánum. Ef þetta er leyft getur forritið kveikt á skjánum hvenær sem er án þess að þú samþykkir það sérstaklega."</string>
<string name="special_access" msgid="21806055758289916">"Sérstakur forritaaðgangur"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Hljóð"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Gagnasparnaður"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Stilla myndgæði sjálfkrafa til að nota minna af farsímagögnum"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Gagnanotkun og tilkynningar"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Þú getur tengst við internetið um Wi-Fi, Ethernet eða heitan reit símans. Frekari upplýsingar má finna á "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Þú getur tengst við internetið um Wi-Fi, Ethernet eða heitan reit símans."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Aðgerð ekki leyfileg"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Ekki er hægt að breyta hljóðstyrk"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Afl og orka"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Hegðun þegar kveikt er"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Endurstilla"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet-pörunarkóði"</string>
</resources>
diff --git a/Settings/res/values-it/strings.xml b/Settings/res/values-it/strings.xml
index 8771b3b..910cf9b 100644
--- a/Settings/res/values-it/strings.xml
+++ b/Settings/res/values-it/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Aggiungi un account"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Account e accesso"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Nessun account"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> account</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> account</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# account}other{# account}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Servizi multimediali, Assistente, Pagamenti"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Rete e Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Suono"</string>
<string name="applications_category_title" msgid="7112019490898586223">"App"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Preferenze del dispositivo"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Telecomandi e accessori"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Nessun dispositivo Bluetooth connesso"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accessori</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> accessorio</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Display e audio"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Guida e feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacy"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Ripristino dati di fabbrica"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibrazione"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Risparmio energetico"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Dispositivi"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Seleziona i formati"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Audio surround"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMATI ATTIVI"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMATI DISATTIVATI"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Per disattivare i formati, imposta la selezione del formato su Manuale."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Risoluzione"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatica"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"La risoluzione è stata modificata"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Seleziona OK per usare %1$s d\'ora in poi."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Annulla"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Cancellare i dati memorizzati nella cache?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Ciò cancella tutti i dati delle app nella cache."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Aggiungi accessorio"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Accoppiamento..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Connessione…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accessori"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Telecomando"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Impostazioni telecomando"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Configura tasti telecomando"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Controlla volume, accensione/spegnimento e ingresso su TV, ricevitori e soundbar"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Connetti"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Connetti a %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Disconnetti"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Non disponibile"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"App di amministrazione del dispositivo"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Nessuna app attiva"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> app attive</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app attiva</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Disattivata da amministratore, norma crittografia o archivio credenziali"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informazioni sul dispositivo gestito"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Impostazioni e modifiche sono gestite dalla tua organizzazione"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Nessuna azione"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"App installate"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Il numero di app è una stima che potrebbe non includere le app installate da fonti diverse dal Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Almeno <xliff:g id="COUNT_1">%d</xliff:g> app</item>
- <item quantity="one">Almeno <xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Almeno # app}other{Almeno # app}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Autorizzazioni di accesso alla posizione"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Autorizzazioni microfono"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Autorizzazioni fotocamera"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"App predefinite"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> app</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}other{# app}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Tastiera predefinita"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Metodo impostato: <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Opzione VPN sempre attiva attivata"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Credenziali attendibili"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Credenziali attendibili nel profilo personale"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Credenziali attendibili nel profilo di lavoro"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Almeno <xliff:g id="COUNT_1">%d</xliff:g> certificati CA</item>
- <item quantity="one">Almeno <xliff:g id="COUNT_0">%d</xliff:g> certificato CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certificato CA}other{# certificati CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"L\'amministratore può bloccare il dispositivo e reimpostare la password"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"L\'amministratore può eliminare tutti i dati del dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Tentativi di inserimento della password non riusciti prima dell\'eliminazione di tutti i dati del dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Tentativi di inserimento della password non riusciti prima dell\'eliminazione dei dati del profilo di lavoro"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tentativi</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> tentativo</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# tentativo}other{# tentativi}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Questo dispositivo è gestito dalla tua organizzazione."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Questo dispositivo è gestito da <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Ulteriori informazioni"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">App Fotocamera</item>
- <item quantity="one">App Fotocamera</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{App fotocamera}other{App fotocamera}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"App di calendario"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"App di contatti"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">App client di posta</item>
- <item quantity="one">App client di posta</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{App client di posta}other{App client di posta}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"App di mappe"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">App Telefono</item>
- <item quantity="one">App Telefono</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{App telefono}other{App telefono}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"App browser"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Versione sistema operativo Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Numero di serie"</string>
<string name="about_build" msgid="8467840394761634575">"Build sistema operativo Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Ora ti mancano <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> passaggi per diventare uno sviluppatore</item>
- <item quantity="one">Ora ti manca <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> passaggio per diventare uno sviluppatore</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Ti manca # passaggio per diventare sviluppatore}other{Ti mancano # passaggi per diventare sviluppatore}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Annunci"</string>
<string name="ads_description" msgid="8081069475265061074">"Gestisci le impostazioni degli annunci, ad esempio reimpostando il tuo ID pubblicità."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Annunci, Gestisci le impostazioni degli annunci, ad esempio reimpostando il tuo ID pubblicità."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Ulteriori aggiornamenti di sistema"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"La rete potrebbe essere monitorata"</string>
<string name="done_button" msgid="616159688526431451">"Fine"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Considera attendibili i certificati o rimuovili</item>
- <item quantity="one">Considera attendibile il certificato o rimuovilo</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ha installato autorità di certificazione sul tuo dispositivo. L\'amministratore potrebbe monitorare l\'attività di rete del dispositivo, inclusi siti web protetti, email e app.\n\nContatta l\'amministratore per avere ulteriori informazioni su questi certificati.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ha installato un\'autorità di certificazione sul tuo dispositivo. L\'amministratore potrebbe monitorare l\'attività di rete del dispositivo, inclusi siti web protetti, email e app.\n\nContatta l\'amministratore per avere ulteriori informazioni su questo certificato.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ha installato autorità di certificazione per il tuo profilo di lavoro. L\'amministratore potrebbe monitorare l\'attività di rete lavorativa, inclusi siti web protetti, email e app.\n\nContatta l\'amministratore per avere ulteriori informazioni su questi certificati.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ha installato un\'autorità di certificazione per il tuo profilo di lavoro. L\'amministratore potrebbe monitorare l\'attività di rete lavorativa, inclusi siti web protetti, email e app.\n\nContatta l\'amministratore per avere ulteriori informazioni su questo certificato.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Una terza parte può monitorare la tua attività di rete, inclusi siti web protetti, email e applicazioni.\n\nQuesto è reso possibile da credenziali attendibili installate sul tuo dispositivo."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Controlla i certificati</item>
- <item quantity="one">Controlla il certificato</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Considera attendibile il certificato o rimuovilo}other{Considera attendibili i certificati o rimuovili}}"</string>
<string name="device_status" msgid="8266002761193692207">"Stato"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Rete, numeri di serie e altre informazioni"</string>
<string name="manual" msgid="5683935624321864999">"Manuale"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Collega"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Elimina rete"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Verranno cancellate le informazioni utilizzate per connettersi alla rete, inclusa la password salvata"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Collegati a una rete Wi-Fi scansionando il codice QR dal tuo telefono cellulare e segui le istruzioni."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Collegati a una rete Wi-Fi scansionando il codice QR da un telefono cellulare e segui le istruzioni.\n \n Su un "<b>"telefono Android"</b>", vai a Impostazioni -> Rete e Internet -> Wi-Fi -> seleziona una rete Wi-Fi -> Avanzate -> Aggiungi dispositivo e scansiona il codice QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Premi il pulsante Indietro per annullare"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continua"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Memoria dispositivo"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Dispositivo di archiviazione rimovibile"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Reimpostazione"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Libera spazio di archiviazione"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Cancella i dati memorizzati nella cache"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Libera <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Vengono cancellati i file temporanei che occupano spazio. Questa operazione non incide sui dati salvati quali le preferenze delle app o i video offline e non dovrai accedere di nuovo alle app."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Vuoi cancellare i dati memorizzati nella cache?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Verranno cancellati i dati delle app nella cache."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Disinstalla app"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> montata"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Impossibile montare <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Archivio USB riconnesso"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Microfono"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Accesso al microfono"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Accesso delle app al microfono"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Accesso al microfono bloccato"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Per sbloccarlo, sposta l\'interruttore per la privacy del dispositivo sulla posizione del microfono attivo."</string>
<string name="camera" msgid="1226671478936288283">"Videocamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Accesso alla videocamera"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Accesso delle app alla videocamera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Accesso alla fotocamera bloccato"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Per sbloccarlo, sposta l\'interruttore per la privacy del dispositivo sulla posizione della fotocamera attiva."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Accesso al microfono: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Se attivi questa opzione, tutte le app e tutti i servizi autorizzati possono accedere a qualsiasi microfono su questo dispositivo.\n\nQuesta impostazione non verrà applicata per periferiche audio con un protocollo personalizzato."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Accesso alla videocamera: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Ciano"</string>
<string name="color_yellow" msgid="3519470952904560404">"Giallo"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Descrizione audio"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Ascolta la descrizione di ciò che accade sullo schermo in film e programmi supportati"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Attiva"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configurazione"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Utilizzare <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitoraggio"</string>
<string name="system_apps" msgid="8481888654606868074">"App"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Rimani attivo"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Non verrà mai attivata la sospensione dello schermo"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Verifica HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Ottimizzazione HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Riavviare ora?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Scollega dispositivi HDMI dalla TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Alimentaz. automat. TV attiva"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Collega la TV al dispositivo HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Ingressi collegati</item>
- <item quantity="one">Ingresso collegato</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Ingressi in standby</item>
- <item quantity="one">Ingresso in standby</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Ingressi non collegati</item>
- <item quantity="one">Ingresso non collegato</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Ingresso collegato}other{Ingressi collegati}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Ingresso in standby}other{Ingressi in standby}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Ingresso non collegato}other{Ingressi non collegati}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Limita l\'accesso ad app e altri contenuti nel tuo account"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Profilo con limitazioni"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controllata da <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Crea profilo con limitazioni"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Impostazioni"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"App consentite"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d app consentite</item>
- <item quantity="one">1 app consentita</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Consentito"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Non consentito"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Personalizza limitazioni"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Licenze open source di terze parti"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Autorizzazioni"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"App non disponibile"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"App inutilizzate"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Conferma"</string>
<string name="settings_cancel" msgid="576094334743686152">"Annulla"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Questa autorizzazione consente a un\'app di modificare le impostazioni di sistema."</string>
<string name="write_settings_on" msgid="71675710746513956">"Sì"</string>
<string name="write_settings_off" msgid="6730113471695092167">"No"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Accesso a tutti i file"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Consenti accesso per gestione di tutti i file"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Consenti a questa app di leggere, modificare ed eliminare tutti i file memorizzati su questo dispositivo o su qualsiasi volume di archiviazione collegato. Se concedi l\'autorizzazione, l\'app potrà accedere ai file senza informarti."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture in picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Consenti Picture in picture"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Nessuna app installata supporta la modalità Picture in picture"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Consenti alle app di creare una finestra Picture in picture quando l\'app è aperta o dopo l\'uscita (ad esempio, per continuare a guardare un video). Questa finestra viene visualizzata sopra le altre app in uso."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Consenti alle app di impostare sveglie e programmare azioni per le quali il fattore temporale è decisivo. Le app potranno così essere eseguite in background, comportando un consumo maggiore della batteria.\n\nSe questa autorizzazione viene disattivata, le sveglie esistenti e gli eventi basati sull\'orario programmati dalle app non funzioneranno."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Attiva lo schermo"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Consenti l\'attivazione dello schermo"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Consenti a un\'app di attivare lo schermo. Se la autorizzi, l\'app può attivare lo schermo in qualsiasi momento senza la tua autorizzazione esplicita."</string>
<string name="special_access" msgid="21806055758289916">"Accesso speciale per le app"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Risparmio dati"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Regola automaticamente la qualità video per usare meno dati mobili"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Utilizzo dei dati e avvisi"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Puoi connetterti a Internet tramite una rete Wi-Fi, un cavo Ethernet o l\'hotspot del telefono. Per ulteriore assistenza, visita il sito "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Puoi connetterti a Internet tramite una rete Wi-Fi, un cavo Ethernet o l\'hotspot del telefono."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Azione non consentita"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Impossibile modificare il volume"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Alimentazione ed energia"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Comportamento all\'accensione"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Reimposta"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Codice di accoppiamento Ethernet"</string>
</resources>
diff --git a/Settings/res/values-iw/strings.xml b/Settings/res/values-iw/strings.xml
index 520bf1c..71f163e 100644
--- a/Settings/res/values-iw/strings.xml
+++ b/Settings/res/values-iw/strings.xml
@@ -45,25 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"הוספת חשבון"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"חשבונות וכניסה"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"אין חשבונות"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="two"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> חשבונות</item>
- <item quantity="many"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> חשבונות</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> חשבונות</item>
- <item quantity="one">חשבון אחד (<xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g>)</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{חשבון אחד}two{# חשבונות}many{# חשבונות}other{# חשבונות}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"שירותי מדיה, Assistant, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"רשת ואינטרנט"</string>
<string name="sound_category_title" msgid="7899816751041939518">"צליל"</string>
<string name="applications_category_title" msgid="7112019490898586223">"אפליקציות"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"העדפות מכשיר"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"מכשירי שלט רחוק ואביזרים"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"אין מכשירי Bluetooth מחוברים"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="two"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> אביזרים</item>
- <item quantity="many"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> אביזרים</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> אביזרים</item>
- <item quantity="one">אביזר אחד (<xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g>)</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"תצוגה וצליל"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"עזרה ומשוב"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"פרטיות"</string>
@@ -122,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"איפוס לנתוני היצרן"</string>
<string name="device_calibration" msgid="2907914144048739705">"כיול"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"חיסכון באנרגיה"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"מכשירים"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"בחירת פורמטים"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"סראונד"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -189,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"פורמטים מופעלים"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"פורמטים מושבתים"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"להשבתה יש לשנות את בחירת הפורמט למצב \'ידני\'."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"רזולוציה"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"אוטומטית"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"הרזולוציה שונתה"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"בוחרים באפשרות \'אישור\' כדי להשתמש ברזולוציה %1$s מעכשיו והלאה."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"ביטול"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"אישור"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"הרץ (Hz)"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"האם לנקות נתונים בקובץ שמור?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"פעולה זו תנקה נתונים בקובץ שמור, לכל האפליקציות."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"הוספת ציוד היקפי"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"מבצע התאמה…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"מתחבר..."</string>
@@ -228,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"אביזרים"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"שלט רחוק"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"הגדרות לשלט רחוק"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"הגדרת הלחצנים בשלט הרחוק"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"שליטה בעוצמת הקול, בהפעלה, בקלט של טלוויזיות, ברסיברים ובמקרני קול."</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"התחברות"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"חיבור אל %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"ניתוק"</string>
@@ -266,12 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"הפריט לא זמין"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"אפליקציות לניהול המכשיר"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"אין אפליקציות פעילות"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"הושבת על ידי מדיניות ההצפנה של מנהל המכשיר, או אחסון פרטי כניסה"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"פרטי מכשיר מנוהל"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"שינויים והגדרות שהארגון שלך מנהל"</string>
@@ -289,22 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"ללא"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"אפליקציות מותקנות"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"זוהי הערכה של מספר האפליקציות. ייתכן שהמספר לא כולל אפליקציות שהותקנו מחוץ לחנות Play."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{אפליקציה אחת לפחות}two{לפחות # אפליקציות}many{לפחות # אפליקציות}other{לפחות # אפליקציות}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"הרשאות מיקום"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"הרשאות מיקרופון"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"הרשאות מצלמה"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"אפליקציות ברירת מחדל"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{אפליקציה אחת}two{# אפליקציות}many{# אפליקציות}other{# אפליקציות}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"מקלדת המוגדרת כברירת מחדל"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> הוגדרה"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"האפשרות \'חיבור תמידי ל-VPN\' פועלת"</string>
@@ -314,47 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"פרטי כניסה מהימנים"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"פרטי כניסה מהימנים בפרופיל האישי שלך"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"פרטי כניסה מהימנים בפרופיל העבודה שלך"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="two">לפחות <xliff:g id="COUNT_1">%d</xliff:g> אישורי CA</item>
- <item quantity="many">לפחות <xliff:g id="COUNT_1">%d</xliff:g> אישורי CA</item>
- <item quantity="other">לפחות <xliff:g id="COUNT_1">%d</xliff:g> אישורי CA</item>
- <item quantity="one">לפחות אישור CA אחד (<xliff:g id="COUNT_0">%d</xliff:g>)</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{אישור CA אחד}two{# אישורי CA}many{# אישורי CA}other{# אישורי CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"מנהל המערכת יכול לנעול את המכשיר ולאפס את הסיסמה"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"מנהל המערכת יכול למחוק את כל הנתונים מהמכשיר"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"מספר הזנות של סיסמה שגויה לפני מחיקה של כל הנתונים מהמכשיר"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"מספר הזנות של סיסמה שגויה לפני מחיקה של כל הנתונים של פרופיל העבודה"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{ניסיון אחד}two{# ניסיונות}many{# ניסיונות}other{# ניסיונות}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"מכשיר זה מנוהל על ידי הארגון שלך."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"מכשיר זה מנוהל על ידי <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"מידע נוסף"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="two">אפליקציות מצלמה</item>
- <item quantity="many">אפליקציות מצלמה</item>
- <item quantity="other">אפליקציות מצלמה</item>
- <item quantity="one">אפליקציית מצלמה אחת</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{אפליקציית מצלמה}two{אפליקציות מצלמה}many{אפליקציות מצלמה}other{אפליקציות מצלמה}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"אפליקציית יומן"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"אפליקציית אנשי קשר"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="two">אפליקציות של תוכנות אימייל</item>
- <item quantity="many">אפליקציות של תוכנות אימייל</item>
- <item quantity="other">אפליקציות של תוכנות אימייל</item>
- <item quantity="one">אפליקציה אחת של תוכנת אימייל</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{אפליקציה של תוכנת אימייל}two{אפליקציות של תוכנת אימייל}many{אפליקציות של תוכנת אימייל}other{אפליקציות של תוכנת אימייל}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"אפליקציית מפה"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="two">אפליקציות טלפון</item>
- <item quantity="many">אפליקציות טלפון</item>
- <item quantity="other">אפליקציות טלפון</item>
- <item quantity="one">אפליקציית טלפון אחת</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{אפליקציית טלפון}two{אפליקציות טלפון}many{אפליקציות טלפון}other{אפליקציות טלפון}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"אפליקציית דפדפן"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -373,12 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"גרסת מערכת הפעלה של Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"מספר סידורי"</string>
<string name="about_build" msgid="8467840394761634575">"Build של מערכת הפעלה של Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{נותר עוד שלב אחד להגדרתך כמפתח}two{נותרו עוד # שלבים להגדרתך כמפתח}many{נותרו עוד # שלבים להגדרתך כמפתח}other{נותרו עוד # שלבים להגדרתך כמפתח}}"</string>
<string name="about_ads" msgid="7662896442040086522">"מודעות"</string>
<string name="ads_description" msgid="8081069475265061074">"ניהול הגדרות המודעות, למשל איפוס של מזהה הפרסום."</string>
<string name="ads_content_description" msgid="1006489792324920289">"מודעות, ניהול הגדרות המודעות כגון איפוס של מזהה הפרסום."</string>
@@ -392,31 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"עדכוני מערכת נוספים"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"ייתכן שהרשת מנוטרת"</string>
<string name="done_button" msgid="616159688526431451">"בוצע"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="two">קבלת מהימנות או הסרה של אישורים</item>
- <item quantity="many">קבלת מהימנות או הסרה של אישורים</item>
- <item quantity="other">קבלת מהימנות או הסרה של אישורים</item>
- <item quantity="one">קבלת מהימנות או הסרה של אישור</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="two"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> התקין רשויות אישורים במכשיר שלך. ייתכן שהרשויות יאפשרו לו לנהל מעקב אחר פעילות רשת בעבודה, כולל אימיילים, אפליקציות ואתרים מאובטחים.\n\nלמידע נוסף לגבי האישורים, יש ליצור קשר עם מנהל המערכת.</item>
- <item quantity="many"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> התקין רשויות אישורים במכשיר שלך. ייתכן שהרשויות יאפשרו לו לנהל מעקב אחר פעילות רשת בעבודה, כולל אימיילים, אפליקציות ואתרים מאובטחים.\n\nלמידע נוסף לגבי האישורים, יש ליצור קשר עם מנהל המערכת.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> התקין רשויות אישורים במכשיר שלך. ייתכן שהרשויות יאפשרו לו לנהל מעקב אחר פעילות רשת בעבודה, כולל אימיילים, אפליקציות ואתרים מאובטחים.\n\nלמידע נוסף לגבי האישורים, יש ליצור קשר עם מנהל המערכת.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> התקין רשות אישורים אחת במכשיר שלך. ייתכן שהרשות תאפשר לו לנהל מעקב אחר פעילות רשת בעבודה, כולל אימיילים, אפליקציות ואתרים מאובטחים.\n\nלמידע נוסף לגבי האישור, יש ליצור קשר עם מנהל המערכת.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="two"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> התקין רשויות אישורים לפרופיל העבודה שלך. ייתכן שהרשויות יאפשרו לו לנהל מעקב אחר פעילות רשת בעבודה, כולל אימיילים, אפליקציות ואתרים מאובטחים.\n\nלמידע נוסף לגבי האישורים, יש ליצור קשר עם מנהל המערכת.</item>
- <item quantity="many"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> התקין רשויות אישורים לפרופיל העבודה שלך. ייתכן שהרשויות יאפשרו לו לנהל מעקב אחר פעילות רשת בעבודה, כולל אימיילים, אפליקציות ואתרים מאובטחים.\n\nלמידע נוסף לגבי האישורים, יש ליצור קשר עם מנהל המערכת.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> התקין רשויות אישורים לפרופיל העבודה שלך. ייתכן שהרשויות יאפשרו לו לנהל מעקב אחר פעילות רשת בעבודה, כולל אימיילים, אפליקציות ואתרים מאובטחים.\n\nלמידע נוסף לגבי האישורים, יש ליצור קשר עם מנהל המערכת.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> התקין רשות אישורים אחת לפרופיל העבודה שלך. ייתכן שהרשות תאפשר לו לנהל מעקב אחר פעילות רשת בעבודה, כולל אימיילים, אפליקציות ואתרים מאובטחים.\n\nלמידע נוסף לגבי האישור, יש ליצור קשר עם מנהל המערכת.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"צד שלישי מסוגל לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים מאובטחים.\n\nאישור מהימן המותקן במכשיר מאפשר זאת."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="two">בדיקת אישורים</item>
- <item quantity="many">בדיקת אישורים</item>
- <item quantity="other">בדיקת אישורים</item>
- <item quantity="one">בדיקת אישור אחד</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{קבלת מהימנות או הסרה של אישור}two{קבלת מהימנות או הסרה של אישורים}many{קבלת מהימנות או הסרה של אישורים}other{קבלת מהימנות או הסרה של אישורים}}"</string>
<string name="device_status" msgid="8266002761193692207">"סטטוס"</string>
<string name="device_status_summary" msgid="3270932829412434985">"רשת, מספרים סידוריים ומידע נוסף"</string>
<string name="manual" msgid="5683935624321864999">"ידני"</string>
@@ -508,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"התחבר"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"שכח רשת"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"פעולה זו מנקה מידע המשמש להתחבר אל הרשת הזו, כולל סיסמה שמורה"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"כדי להצטרף לרשת Wi-Fi, ניתן לסרוק קוד QR באמצעות הטלפון הנייד ואז לפעול לפי ההוראות."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" כדי להצטרף לרשת Wi-Fi, ניתן לסרוק קוד QR באמצעות טלפון נייד ואז לפעול לפי ההוראות.\n \n ב"<b>"טלפון Android"</b>", עוברים אל \'הגדרות\' -> \'רשת\' ואינטרנט -> Wi-Fi -> בוחרים רשת Wi-Fi -> מתקדם -> מוסיפים מכשיר ואז סורקים את קוד ה-QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"יש ללחוץ על הלחצן \'הקודם\' כדי לבטל"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"אישור"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"המשך"</string>
@@ -577,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"אחסון במכשיר"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"אחסון נשלף"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"איפוס"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"פינוי נפח אחסון"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"ניקוי נתונים שנשמרו במטמון"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"פינוי <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"ניקוי קבצים זמניים שתופסים מקום. לא תהיה השפעה על נתונים שמורים כמו העדפות באפליקציות או סרטוני אופליין, ולא יהיה צורך להיכנס שוב לאפליקציות"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"לנקות נתונים שנשמרו במטמון?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"ינוקו נתונים שנשמרו במטמון מכל האפליקציות."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"הסרת אפליקציות"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"הטעינה של <xliff:g id="NAME">%1$s</xliff:g> בוצעה"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"לא ניתן היה לטעון את <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"אחסון USB מחובר מחדש"</string>
@@ -654,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"מיקרופון"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"גישה למיקרופון"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"גישה של אפליקציות למיקרופון"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"הגישה למיקרופון חסומה"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"כדי לבטל את החסימה ולאפשר גישה למיקרופון, צריך להעביר את מתג הפרטיות במכשיר למצב \'המיקרופון פועל\'."</string>
<string name="camera" msgid="1226671478936288283">"מצלמה"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"גישה למצלמה"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"גישה של אפליקציות למצלמה"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"הגישה למצלמה חסומה"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"כדי לבטל את החסימה ולאפשר גישה למצלמה, צריך להעביר את מתג הפרטיות במכשיר למצב \'המצלמה פועלת\'."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"סטטוס הגישה למיקרופון: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"כשההגדרה מופעלת, לכל האפליקציות והשירותים יש גישה לכל מיקרופון במכשיר הזה.\n\nההגדרה לא תשפיע על ציוד אודיו היקפי של עם פרוטוקול בהתאמה אישית."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"סטטוס הגישה למצלמה: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -728,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"ציאן"</string>
<string name="color_yellow" msgid="3519470952904560404">"צהוב"</string>
<string name="color_magenta" msgid="2377854703399624607">"מגנטה"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"תיאור האודיו"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"מה שקורה בתוכניות ובסרטים נתמכים"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"הפעלה"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"תצורה"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"האם להשתמש ב-<xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -748,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"מעקב"</string>
<string name="system_apps" msgid="8481888654606868074">"אפליקציות"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"הישאר ער"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"המסך אף פעם לא יעבור למצב שינה"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"בדיקת HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"אופטימיזציית HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"להפעיל מחדש עכשיו?"</string>
@@ -868,24 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"כבה מכשירי HDNI עם הטלוויזיה"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"הפעלה אוטומטית של הטלוויזיה"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"הפעל את הטלוויזיה עם מכשיר HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="two">ערוצי קלט מחוברים</item>
- <item quantity="many">ערוצי קלט מחוברים</item>
- <item quantity="other">ערוצי קלט מחוברים</item>
- <item quantity="one">ערוץ קלט מחובר</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="two">ערוצי קלט בהמתנה</item>
- <item quantity="many">ערוצי קלט בהמתנה</item>
- <item quantity="other">ערוצי קלט בהמתנה</item>
- <item quantity="one">ערוץ קלט בהמתנה</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="two">ערוצי קלט לא מחוברים</item>
- <item quantity="many">ערוצי קלט לא מחוברים</item>
- <item quantity="other">ערוצי קלט לא מחוברים</item>
- <item quantity="one">ערוץ קלט לא מחובר</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{כניסת קלט מחוברת}two{כניסות קלט מחוברות}many{כניסות קלט מחוברות}other{כניסות קלט מחוברות}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{כניסת קלט בהמתנה}two{כניסות קלט בהמתנה}many{כניסות קלט בהמתנה}other{כניסות קלט בהמתנה}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{כניסת קלט לא מחוברת}two{כניסות קלט לא מחוברות}many{כניסות קלט לא מחוברות}other{כניסות קלט לא מחוברות}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"הגבל גישה אל אפליקציות ותוכן אחר בחשבון שלך"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"פרופיל מוגבל"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"בשליטת <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -899,12 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"יצירת פרופיל מוגבל"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"הגדרות"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"אפליקציות מותרות"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="two">%d אפליקציות מותרות</item>
- <item quantity="many">%d אפליקציות מותרות</item>
- <item quantity="other">%d אפליקציות מותרות</item>
- <item quantity="one">אפליקציה אחת מותרת</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"מותרת"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"אסורה"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"התאם אישית את ההגבלות"</string>
@@ -949,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"מקור של צד שלישי"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"אישורים"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"האפליקציה אינה זמינה"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"אפליקציות שמזמן לא השתמשת בהן"</string>
<string name="settings_ok" msgid="5950888975075541964">"אישור"</string>
<string name="settings_confirm" msgid="4489126458677153411">"אישור"</string>
<string name="settings_cancel" msgid="576094334743686152">"ביטול"</string>
@@ -1032,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"ההרשאה הזו מתירה לאפליקציה לשנות את הגדרות המערכת."</string>
<string name="write_settings_on" msgid="71675710746513956">"כן"</string>
<string name="write_settings_off" msgid="6730113471695092167">"לא"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"גישה לכל הקבצים"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"הרשאת גישה לניהול כל הקבצים"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"לאפליקציה הזו תהיה הרשאה לקרוא, לשנות ולמחוק את כל הקבצים במכשיר הזה או בכל אחסון שמחובר אליו. אם ההרשאה ניתנת, האפליקציה תורשה לגשת לקבצים מבלי ליידע אותך במפורש."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"תמונה בתוך תמונה"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"תמונה בתוך תמונה"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"אין אפליקציות מותקנות שתומכות ב\'תמונה בתוך תמונה\'"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"אפליקציה זו תוכל ליצור חלון מסוג תמונה בתוך תמונה בזמן שהיא תהיה פתוחה או לאחר היציאה ממנה (למשל, כדי להמשיך לצפות בסרטון). חלון זה מוצג מעל אפליקציות אחרות שנמצאות בשימוש."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"ההגדרה הזו מתירה לאפליקציות להגדיר התראות ולתזמן פעולות בלוח זמנים. האפליקציות יוכלו לפעול ברקע ובכך להגביר את צריכת הסוללה.\n\nאם ההרשאה מושבתת, ההתראות והאירועים שתוזמנו בלוח זמנים על ידי האפליקציה לא יפעלו."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"הפעלת המסך"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"הרשאה להפעלת המסך"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"הרשאה לאפליקציה להפעיל את המסך. אם נתת את ההרשאה האפליקציה תוכל תמיד להפעיל את המסך, גם ללא פעולה כלשהי מצידך שמצביעה על כוונה כזאת."</string>
<string name="special_access" msgid="21806055758289916">"גישה מיוחדת לאפליקציה"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"אודיו"</string>
@@ -1053,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"חוסך הנתונים (Data Saver)"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"התאמה אוטומטית של איכות וידאו לשימוש מופחת בחבילת גלישה"</string>
<string name="title_data_alert" msgid="8262081890052682475">"שימוש בחבילת הגלישה והתראות"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"אפשר להתחבר לאינטרנט באמצעות Wi-Fi, Ethernet או נקודה לשיתוף אינטרנט בטלפון. ניתן לקבל עזרה נוספת בכתובת "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"אפשר להתחבר לאינטרנט באמצעות Wi-Fi, אתרנט או נקודה לשיתוף אינטרנט בטלפון."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"הפעולה אינה מותרת"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"לא ניתן לשנות את הנפח"</string>
@@ -1103,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"עוצמה ואנרגיה"</string>
<string name="power_on_behavior" msgid="927607372303160716">"התנהגות בהפעלה"</string>
<string name="reset_options_title" msgid="7632580482285108955">"איפוס"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"קוד התאמה לאתרנט"</string>
</resources>
diff --git a/Settings/res/values-ja/strings.xml b/Settings/res/values-ja/strings.xml
index 78feace..123fb02 100644
--- a/Settings/res/values-ja/strings.xml
+++ b/Settings/res/values-ja/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"アカウントの追加"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"アカウントとログイン"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"アカウントなし"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> 件のアカウント</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> 件のアカウント</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# 個のアカウント}other{# 個のアカウント}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"メディア サービス、アシスタント、お支払い"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"ネットワークとインターネット"</string>
<string name="sound_category_title" msgid="7899816751041939518">"サウンド"</string>
<string name="applications_category_title" msgid="7112019490898586223">"アプリ"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"デバイス設定"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"リモコンとアクセサリ"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Bluetooth デバイスの接続なし"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> 個のアクセサリ</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> 個のアクセサリ</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ディスプレイと音"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"ヘルプとフィードバック"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"プライバシー"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"データの初期化"</string>
<string name="device_calibration" msgid="2907914144048739705">"キャリブレーション"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"省エネツール"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"デバイス"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"形式の選択"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"サラウンド サウンド"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"ドルビー デジタル"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"有効な形式"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"無効な形式"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"無効にするには、[形式の選択] を [手動] に切り替えてください。"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"解像度"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"自動"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"解像度を変更しました"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"これから %1$s を使用するには、[OK] を選択してください。"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"キャンセル"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"キャッシュデータを削除しますか?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"すべてのアプリのキャッシュデータが削除されます。"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"アクセサリを追加"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"ペアに設定しています…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"接続しています…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"アクセサリ"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"リモコン"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"リモコンの設定"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"リモコンボタンのセットアップ"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"テレビ、レシーバー、サウンドバーの音量、電源の操作や、入力の切り替えを行えます"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"接続"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s に接続"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"接続を解除"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"利用できません"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"デバイス管理アプリ"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"アクティブなアプリはありません"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"管理者、暗号化ポリシー、または認証情報ストレージにより無効化"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"管理対象デバイスの情報"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"変更と設定は組織によって管理されています"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"なし"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"アプリがインストールされています"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"アプリの数は推定値です。Play ストア以外からインストールしたアプリが含まれていないことがあります。"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{# 個以上のアプリ}other{# 個以上のアプリ}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"位置情報の権限"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"マイクの権限"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"カメラの権限"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"デフォルト アプリ"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# 個のアプリ}other{# 個のアプリ}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"デフォルト キーボード"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> に設定済み"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"常時接続 VPN は ON です"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"信頼できる認証情報"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"個人用プロファイル内の信頼できる認証情報"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"仕事用プロファイル内の信頼できる認証情報"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">CA 証明書: <xliff:g id="COUNT_1">%d</xliff:g> 件以上</item>
- <item quantity="one">CA 証明書: <xliff:g id="COUNT_0">%d</xliff:g> 件以上</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# 件のCA 証明書}other{# 件のCA 証明書}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"管理者はデバイスをロックしてパスワードを再設定できます"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"管理者はデバイスのすべてのデータを削除できます"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"すべてのデバイスデータが削除されるまでのパスワード入力回数"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"仕事用プロファイルのデータが削除されるまでのパスワード入力回数"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{入力回数 # 回}other{入力回数 # 回}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"このデバイスは組織によって管理されています。"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"このデバイスは <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> により管理されています。"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"詳細"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">カメラアプリ</item>
- <item quantity="one">カメラアプリ</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{カメラアプリ}other{カメラアプリ}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"カレンダー アプリ"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"連絡帳アプリ"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">メール クライアント アプリ</item>
- <item quantity="one">メール クライアント アプリ</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{メール クライアント アプリ}other{メール クライアント アプリ}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"地図アプリ"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">電話アプリ</item>
- <item quantity="one">電話アプリ</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{電話アプリ}other{電話アプリ}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"ブラウザアプリ"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>、<xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>、<xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>、<xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV の OS バージョン"</string>
<string name="about_serial" msgid="3432319328808745459">"シリアル番号"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV の OS ビルド"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{あと # ステップでデベロッパー設定が有効になります}other{あと # ステップでデベロッパー設定が有効になります}}"</string>
<string name="about_ads" msgid="7662896442040086522">"広告"</string>
<string name="ads_description" msgid="8081069475265061074">"広告設定(広告 ID のリセットなど)を管理します。"</string>
<string name="ads_content_description" msgid="1006489792324920289">"広告。広告設定(広告 ID のリセットなど)を管理します。"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"その他のシステム アップデート"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"ネットワークが監視されている可能性があります"</string>
<string name="done_button" msgid="616159688526431451">"完了"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">証明書の信頼または削除</item>
- <item quantity="one">証明書の信頼または削除</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> が、あなたのデバイスに認証局をインストールしました。これにより、デバイスのネットワーク アクティビティ(メール、アプリ、保護されたウェブサイトなど)が管理される可能性があります。\n\nこれらの証明書について詳しくは、管理者にお問い合わせください。</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> が、あなたのデバイスに認証局をインストールしました。これにより、デバイスのネットワーク アクティビティ(メール、アプリ、保護されたウェブサイトなど)が管理される可能性があります。\n\nこの証明書について詳しくは、管理者にお問い合わせください。</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> が、あなたの仕事用プロファイルに認証局をインストールしました。これにより、仕事のネットワーク アクティビティ(メール、アプリ、保護されたウェブサイトなど)が管理される可能性があります。\n\nこれらの証明書について詳しくは、管理者にお問い合わせください。</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> が、あなたの仕事用プロファイルに認証局をインストールしました。これにより、仕事のネットワーク アクティビティ(メール、アプリ、保護されたウェブサイトなど)が管理される可能性があります。\n\nこの証明書について詳しくは、管理者にお問い合わせください。</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"第三者があなたのネットワークアクティビティ(メール、アプリ、保護されたウェブサイトなど)を監視できます。\n\nこれは、信頼できる認証情報がデバイスにインストールされているためです。"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">証明書を確認</item>
- <item quantity="one">証明書を確認</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{証明書を信頼または削除する}other{証明書を信頼または削除する}}"</string>
<string name="device_status" msgid="8266002761193692207">"ステータス"</string>
<string name="device_status_summary" msgid="3270932829412434985">"ネットワーク、シリアル番号などの情報"</string>
<string name="manual" msgid="5683935624321864999">"マニュアル"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"接続"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"ネットワークから切断"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"これにより、このネットワークへの接続に使用されている情報(保存したパスワードなど)が消去されます"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"スマートフォンで QR コードをスキャンして Wi-Fi に接続し、手順に沿って操作してください。"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" スマートフォンで QR コードをスキャンして Wi-Fi に接続し、手順に沿って操作してください。\n \n "<b>"Android スマートフォン"</b>"で [設定] -> [ネットワークとインターネット] -> [Wi-Fi] -> [Wi-Fi を選択] -> [詳細設定] -> [デバイスを追加] に移動し、QR コードをスキャンします。"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"キャンセルするには戻るボタンを押します"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"次へ"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"デバイスのストレージ"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"リムーバブルストレージ"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"リセット"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"空き容量を増やす"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"キャッシュに保存されたデータの削除"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"空き容量が <xliff:g id="SPACE">%1$s</xliff:g> 増えます"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"容量を使用する一時ファイルを削除します。保存済みのデータ(アプリの設定、オフライン動画など)は削除されません。アプリにログインし直す必要もありません。"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"キャッシュに保存されたデータを削除しますか?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"すべてのアプリのキャッシュデータが削除されます。"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"アプリのアンインストール"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g>をマウントしました"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g>をマウントできませんでした"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USBストレージを再接続しました"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"マイク"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"マイクへのアクセス"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"マイクへのアプリのアクセス"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"マイクへのアクセスがブロックされています"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"ブロックを解除するには、デバイスのプライバシー スイッチをマイクオンの位置に移動し、マイクへのアクセスを許可してください。"</string>
<string name="camera" msgid="1226671478936288283">"カメラ"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"カメラへのアクセス"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"カメラへのアプリのアクセス"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"カメラへのアクセスがブロックされています"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"ブロックを解除するには、デバイスのプライバシー スイッチをカメラオンの位置に移動し、カメラへのアクセスを許可してください。"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"マイクへのアクセス: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"ON にすると、権限を持つすべてのアプリとサービスがこのデバイスのマイクにアクセスできるようになります。\n\nカスタムのプロトコルが設定されたオーディオ周辺機器はこの設定の影響を受けません。"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"カメラへのアクセス: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"シアン"</string>
<string name="color_yellow" msgid="3519470952904560404">"黄"</string>
<string name="color_magenta" msgid="2377854703399624607">"マゼンタ"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"音声による説明"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"対応する映画や番組で画面に表示されている内容の説明が読み上げられます"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"有効にする"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"設定"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g>を利用しますか?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"監視"</string>
<string name="system_apps" msgid="8481888654606868074">"アプリ"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"スリープモードにしない"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"画面をスリープ状態にしない"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP チェック"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI最適化"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"今すぐ再起動しますか?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"テレビでHDMIデバイスの電源をオフにします"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"テレビの自動電源オン"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMIデバイスでテレビの電源をオンにします"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">接続済みの入力</item>
- <item quantity="one">接続済みの入力</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">スタンバイ入力</item>
- <item quantity="one">スタンバイ入力</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">未接続の入力</item>
- <item quantity="one">未接続の入力</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{接続済みの入力}other{接続済みの入力}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{スタンバイ入力}other{スタンバイ入力}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{未接続の入力}other{未接続の入力}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"あなたのアカウントでアプリやその他のコンテンツへのアクセスを制限します"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"制限付きプロファイル"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g>によって制御"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"制限付きプロファイルの作成"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"設定"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"許可されたアプリ"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d個のアプリを許可</item>
- <item quantity="one">1個のアプリを許可</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"許可済み"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"許可しない"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"制限をカスタマイズ"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"サードパーティのソース"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"権限"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"アプリを利用できません"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"使用されていないアプリ"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"確認"</string>
<string name="settings_cancel" msgid="576094334743686152">"キャンセル"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"この権限により、アプリはシステム設定を変更できます。"</string>
<string name="write_settings_on" msgid="71675710746513956">"変更可能"</string>
<string name="write_settings_off" msgid="6730113471695092167">"変更不可"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"すべてのファイルへのアクセス"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"全ファイルの管理権を付与"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"このアプリに対して、デバイス内または接続されているストレージ ボリューム内のファイルすべての参照、変更、削除を許可します。許可されている場合、アプリがユーザーの事前の承認なしにファイルにアクセスすることもあります。"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"ピクチャー イン ピクチャー"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"ピクチャー イン ピクチャーを許可"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"ピクチャー イン ピクチャーに対応したアプリはインストールされていません"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"このアプリを開いている間や、アプリを離れた後にピクチャー イン ピクチャー ウィンドウを表示させることを許可します。このウィンドウにより、再生中の動画などを、使用中の他のアプリの上に重ねて表示できます。"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"アラームの設定や日時が決まっているアクションのスケジュールをアプリに許可します。これによりアプリがバックグラウンドで実行できるようになるため、消費電力が増えることがあります。\n\nこの権限が OFF の場合、アプリで設定された既存のアラームと時間ベースのイベントは機能しなくなります。"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"画面を ON にする"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"画面を ON にすることを許可する"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"画面を ON にすることをアプリに許可します。許可すると、ユーザーからの明示的インテントを必要とせずに、アプリがいつでも画面を ON にできるようになります。"</string>
<string name="special_access" msgid="21806055758289916">"特別なアプリアクセス"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>、<xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"音声"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"データセーバー"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"モバイルデータ使用量を節約するため、動画の画質を自動的に調整します"</string>
<string name="title_data_alert" msgid="8262081890052682475">"データ使用量と通知"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Wi-Fi、イーサネット、またはスマートフォンのアクセス ポイントを介してインターネットに接続できます。詳しくは、"<b>"g.co/network"</b>" をご覧ください。"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Wi-Fi、イーサネット、またはスマートフォンのアクセス ポイントを介してインターネットに接続できます。"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"操作が許可されていません"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"音量を変更することはできません"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"電源と省エネ設定"</string>
<string name="power_on_behavior" msgid="927607372303160716">"電源オン時の画面"</string>
<string name="reset_options_title" msgid="7632580482285108955">"リセット"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"イーサネット ペア設定コード"</string>
</resources>
diff --git a/Settings/res/values-ka/strings.xml b/Settings/res/values-ka/strings.xml
index ef18dd8..2db4a98 100644
--- a/Settings/res/values-ka/strings.xml
+++ b/Settings/res/values-ka/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"ანგარიშის დამატება"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"ანგარიშები და სისტემაში შესვლა"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"ანგარიშები არ არის"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> ანგარიში</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> ანგარიში</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# ანგარიში}other{# ანგარიში}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"მედიასერვისები, ასისტენტი, გადახდები"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"ქსელი და ინტერნეტი"</string>
<string name="sound_category_title" msgid="7899816751041939518">"ხმა"</string>
<string name="applications_category_title" msgid="7112019490898586223">"აპები"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"მოწყობილობის პარამეტრები"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"დისტანციური მართვის საშუალებები და აქსესუარები"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"დაკავშირებული Bluetooth-მოწყობილობები არ არის"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> აქსესუარი</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> აქსესუარი</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ჩვენება და ხმა"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"დახმარება და გამოხმაურება"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"კონფიდენციალურობა"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"ქარხნული მონაცემების აღდგენა"</string>
<string name="device_calibration" msgid="2907914144048739705">"კალიბრაცია"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"ენერგიის დამზოგი"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"მოწყობილობები"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"აირჩიეთ ფორმატები"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"მოცულობითი ჟღერადობა"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ჩართული ფორმატები"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"გათიშული ფორმატები"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"გასათიშად აირჩიეთ ფორმატი „ხელით“."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"გარჩევადობა"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"ავტომატური"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"გარჩევადობა შეიცვალა"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"ამიერიდან %1$s-ის გამოსაყენებლად აირჩიეთ „კარგი“."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"გაუქმება"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"კარგი"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"ჰც"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"წაიშალოს ქეშირებული მონაცემები?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"წაიშლება ქეშირებული მონაცემები ყველა აპისთვის."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"აქსესუარის დამატება"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"დაწყვილება…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"მიმდინარეობს დაკავშირება…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"აქსესუარები"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"დისტანციური მართვა"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"დისტანციური მართვის პარამეტრები"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"დისტანციური მართვის ღილაკების დაყენება"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"ტელევიზორებზე, მიმღებებსა და ხმოვან პანელებზე ხმის, ელკვების და შეყვანის მართვა"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"დაკავშირება"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"დაკავშირება %1$s-თან"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"გათიშვა"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"მიუწვდომელია"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"მოწყობილობის ადმინისტრატორების აპები"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"აქტიური აპები არ არის"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"გათიშულია ადმინისტრატორის მიერ დაშიფვრის წესების ან სამომხმარებლო მონაცემების საცავის გამო"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"მართული მოწყობილობის ინფორმაცია"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"ცვლილებებსა და პარამეტრებს მართავს თქვენი ორგანიზაცია"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"არცერთი"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"დაინსტალირებული აპები"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"აპების რაოდენობა მიახლოებითია. ის შეიძლება არ მოიცავდეს იმ აპებს, რომლებიც დაინსტალირდა Play Store-ისგან განსხვავებული წყაროებიდან."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{მინიმუმ # აპი}other{მინიმუმ # აპი}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"მდებარეობის ნებართვები"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"მიკროფონის ნებართვები"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"კამერის ნებართვები"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"ნაგულისხმევი აპები"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# აპი}other{# აპი}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"ნაგულისხმევი კლავიატურა"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"დაყენებულია <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"მუდმივად ჩართული VPN ჩაირთო"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"სანდო სერტიფიკატები"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"სანდო სერტიფიკატები თქვენს პირად პროფილში"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"სანდო სერტიფიკატები თქვენს სამსახურის პროფილში"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">მინიმუმ <xliff:g id="COUNT_1">%d</xliff:g> CA სერტიფიკატი</item>
- <item quantity="one">მინიმუმ <xliff:g id="COUNT_0">%d</xliff:g> CA სერტიფიკატი</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA სერტიფიკატი}other{# CA სერტიფიკატი}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"ადმინისტრატორს მოწყობილობის ჩაკეტვა და პაროლის გადაყენება შეუძლია"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"ადმინისტრატორს მოწყობილობაზე არსებული ყველა მონაცემის წაშლა შეუძლია"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"პაროლის არასწორად შეყვანის მცდელობების რაოდენობა, სანამ მოწყობილობაზე არსებული ყველა მონაცემი წაიშლება"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"პაროლის არასწორად შეყვანის მცდელობების რაოდენობა, სანამ სამსახურის პროფილის მონაცემები წაიშლება"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# მცდელობა}other{# მცდელობა}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"ამ მოწყობილობას მართავს თქვენი ორგანიზაცია."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"ამ მოწყობილობას მართავს <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"შეიტყვეთ მეტი"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">კამერის აპები</item>
- <item quantity="one">კამერის აპი</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{კამერის აპი}other{კამერის აპები}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"კალენდრის აპი"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"კონტაქტების აპი"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">ელფოსტის კლიენტის აპები</item>
- <item quantity="one">ელფოსტის კლიენტის აპი</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ელფოსტის კლიენტის აპი}other{ელფოსტის კლიენტის აპები}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"რუკის აპი"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">ტელეფონის აპები</item>
- <item quantity="one">ტელეფონის აპი</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{ტელეფონის აპი}other{ტელეფონის აპები}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"ბრაუზერის აპი"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS-ის ვერსია"</string>
<string name="about_serial" msgid="3432319328808745459">"სერიული ნომერი"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS build"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{ახლა უკვე # ნაბიჯი გაშორებთ დეველოპერობამდე}other{ახლა უკვე # ნაბიჯი გაშორებთ დეველოპერობამდე}}"</string>
<string name="about_ads" msgid="7662896442040086522">"რეკლამები"</string>
<string name="ads_description" msgid="8081069475265061074">"მართეთ რეკლამის პარამეტრები, მაგალითად, რეკლამის ID-ს გადაყენება."</string>
<string name="ads_content_description" msgid="1006489792324920289">"რეკლამები, მართეთ რეკლამის პარამეტრები, მაგალითად, რეკლამის ID-ს გადაყენება."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"სისტემის სხვა განახლებები"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"შესაძლოა ქსელზე ხორციელდება მონიტორინგი"</string>
<string name="done_button" msgid="616159688526431451">"დასრულება"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">სერტიფიკატების ნდობით აღჭურვა ან ამოშლა</item>
- <item quantity="one">სერტიფიკატის ნდობით აღჭურვა ან ამოშლა</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> თქვენს მოწყობილობაზე სერტიფიცირების ორგანოს ინსტალაცია მოახდინა, რომლის მეშვეობითაც ის თქვენი მოწყობილობის ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და დაცული ვებსაიტების) მონიტორინგს შეძლებს.\n\nამ სერტიფიკატებზე დამატებითი ინფორმაციის მისაღებად დაუკავშირდით თქვენს ადმინისტრატორს.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> თქვენს მოწყობილობაზე სერტიფიცირების ორგანოს ინსტალაცია მოახდინა, რომლის მეშვეობითაც ის თქვენი მოწყობილობის ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და დაცული ვებსაიტების) მონიტორინგს შეძლებს.\n\nამ სერტიფიკატზე დამატებითი ინფორმაციის მისაღებად დაუკავშირდით თქვენს ადმინისტრატორს.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> თქვენი სამსახურის პროფილისთვის სერტიფიცირების ორგანოების ინსტალაცია მოახდინა, რომელთა მეშვეობითაც ის თქვენი სამსახურის ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და დაცული ვებსაიტების) მონიტორინგს შეძლებს.\n\nამ სერტიფიკატებზე დამატებითი ინფორმაციის მისაღებად დაუკავშირდით თქვენს ადმინისტრატორს.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> თქვენი სამსახურის პროფილისთვის სერტიფიცირების ორგანოს ინსტალაცია მოახდინა, რომლის მეშვეობითაც ის თქვენი სამსახურის ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და დაცული ვებსაიტების) მონიტორინგს შეძლებს.\n\nამ სერტიფიკატზე დამატებითი ინფორმაციის მისაღებად დაუკავშირდით თქვენს ადმინისტრატორს.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"მესამე მხარეს თქვენი ქსელის აქტივობის მონიტორინგი შეუძლია, მათ შორის ელფოსტების, აპების და უსაფრთხო საიტების.\n\nეს შესაძლებელი ხდება თქვენს მოწყობილობაზე დაყენებული სანდო აუთენტიფიკაციის მონაცემების საშუალებით."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">სერტიფიკატების შემოწმება</item>
- <item quantity="one">სერტიფიკატების შემოწმება</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{სერტიფიკატის ნდობით აღჭურვა ან ამოშლა}other{სერტიფიკატების ნდობით აღჭურვა ან ამოშლა}}"</string>
<string name="device_status" msgid="8266002761193692207">"სტატუსი"</string>
<string name="device_status_summary" msgid="3270932829412434985">"ქსელი, სერიული ნომრები და სხვა ინფორმაცია"</string>
<string name="manual" msgid="5683935624321864999">"სახელმძღვანელო"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"დაკავშირება"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"ქსელის დავიწყება"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"ეს წაშლის ამ ქსელთან დასაკავშირებლად გამოყენებულ მთელ ინფორმაციას, მათ შორის, შენახულ პაროლს."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"დაუკავშირდით Wi-Fi-ს თქვენი მობილური ტელეფონიდან QR კოდის სკანირების გზით და მიჰყევით ინსტრუქციას."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" დაუკავშირდით Wi-Fi-ს მობილური ტელეფონიდან QR კოდის სკანირების გზით და მიჰყევით ინსტრუქციას.\n \n "<b>"Android ტელეფონიდან"</b>" გადადით: პარამეტრები -> ქსელი და ინტერნეტი -> Wi-Fi -> აირჩიეთ Wi-Fi -> გაფართოებული -> დაამატეთ მოწყობილობა და შემდეგ დაასკანირეთ QR კოდი."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"გასაუქმებლად დააჭირეთ უკან გადასვლის ღილაკს"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"კარგი"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"გაგრძელება"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"მოწყობილობის მეხსიერება"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"ამოღებადი მეხსიერება"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"ქარხნულ მონაცემებზე დაბრუნება"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"მეხსიერების გათავისუფლება"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"წაიშალოს ქეშირებული მონაცემები"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"გამოთავისუფლდეს <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"წაშლის დროებით ფაილებს, რომლებიც მეხსიერების სივრცეს იკავებს. ვერ იმოქმედებს შენახულ მონაცემებზე, მათ შორის, აპის იერსახესა თუ ხაზგარეშე ვიდეოებს და აპებში ხელახლა შესვლაც არ დაგჭირდებათ."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"წაიშალოს ქეშირებული მონაცემები?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"წაიშლება ქეშირებული მონაცემები ყველა აპისთვის."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"აპების დეინსტალაცია"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> მიერთებულია"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g>-ის მიერთება ვერ მოხერხდა"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB მეხსიერება ხელახლა დაკავშირდა"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"მიკროფონი"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"მიკროფონზე წვდომა"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"აპების წვდომა მიკროფონზე"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"მიკროფონზე წვდომა დაბლოკილია"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"განსაბლოკად თქვენი მოწყობილობის კონფიდენციალურობის ჩამრთველი გადაიტანეთ მიკროფონთან ისეთ პოზიციაზე, რომ შეიძლებოდეს მიკროფონზე წვდომა."</string>
<string name="camera" msgid="1226671478936288283">"კამერა"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"კამერაზე წვდომა"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"აპების წვდომა კამერაზე"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"კამერაზე წვდომა დაბლოკილია"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"განსაბლოკად თქვენი მოწყობილობის კონფიდენციალურობის ჩამრთველი გადაიტანეთ კამერასთან ისეთ პოზიციაზე, რომ შეიძლებოდეს კამერაზე წვდომა."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"მიკროფონზე წვდომა: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"როდესაც ჩართულია, ნებართვის მქონე ყველა აპსა და სერვისს შეუძლია წვდომა ამ მოწყობილობის ნებისმიერ მიკროფონზე.\n\nეს პარამეტრი არ იმოქმედებს მორგებული პროტოკოლის მქონე პერიფერიულ აუდიომოწყობილობებზე."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"კამერაზე წვდომა: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"ციანი"</string>
<string name="color_yellow" msgid="3519470952904560404">"ყვითელი"</string>
<string name="color_magenta" msgid="2377854703399624607">"მაგენტა"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"აუდიოაღწერა"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"მოუსმინეთ აღწერას, თუ რა ხდება ეკრანზე, მხარდაჭერილ ფილმებსა და სერიალებში"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"ჩართვა"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"კონფიგურაცია"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"გსურთ <xliff:g id="SERVICE">%1$s</xliff:g>-ის გამოყენება?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"მონიტორინგი"</string>
<string name="system_apps" msgid="8481888654606868074">"აპები"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"დარჩეს აქტიური"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"ეკრანი არასოდეს დაიძინებს"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP შემოწმება"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI ოპტიმიზაცია"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"ახლა გადატვირთვა"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"HDMI მოწყობილობების გამორთვა ტელევიზორით"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"ტელევიზორის ავტომატური ჩართვა"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"ტელევიზორის ჩართვა HDMI მოწყობილობით"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">დაკავშირებული შემ. სიგნალები</item>
- <item quantity="one">დაკავშირებული შემ. სიგნალი</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">შემ. სიგნალები მოლოდ. რეჟიმში</item>
- <item quantity="one">შემ. სიგნალი მოლოდინის რეჟიმში</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">დაუკავშირებელი შემ. სიგნალები</item>
- <item quantity="one">დაუკავშირებელი შემ. სიგნალი</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{დაკავშირებული შესავალი}other{დაკავშირებული შესავლები}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{შესავალი მოლოდინის რეჟიმში}other{შესავლები მოლოდინის რეჟიმში}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{დაუკავშირებელი შესავალი}other{დაუკავშირებელი შესავლები}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"თქვენს ანგარიშში აპებსა და სხვა კონტენტზე წვდომის შეზღუდვა"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"შეზღუდული პროფილი"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"იმართება <xliff:g id="APP">%1$s</xliff:g>-ის მიერ"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"შეზღუდული პროფილის შექმნა"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"პარამეტრები"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"დაშვებული აპები"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d აპი დაშვებულია</item>
- <item quantity="one">დაშვებულია 1 აპი</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"დაშვებული"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"არ არის ნებადართული"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"შეზღუდვების მორგება"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"მესამე მხარის წყარო"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"ნებართვები"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"აპლიკაცია მიუწვდომელია"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"გამოუყენებელი აპები"</string>
<string name="settings_ok" msgid="5950888975075541964">"კარგი"</string>
<string name="settings_confirm" msgid="4489126458677153411">"დადასტურება"</string>
<string name="settings_cancel" msgid="576094334743686152">"გაუქმება"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"ეს ნებართვა უფლებას აძლევს აპს, შეცვალოს სისტემის პარამეტრები."</string>
<string name="write_settings_on" msgid="71675710746513956">"დიახ"</string>
<string name="write_settings_off" msgid="6730113471695092167">"არა"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"წვდომა ყველა ფაილზე"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"წვდომის დაშვება ყველა ფაილის სამართავად"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"აპს აძლევს უფლებას, წაიკითხოს, შეცვალოს და წაშალოს ყველა ფაილი ამ მოწყობილობაზე და ნებისმიერ დაკავშირებულ მეხსიერებაზე. ამ უფლების მინიჭების შემთხვევაში, აპს შეიძლება ფაილებზე წვდომა ჰქონდეს ისე, რომ ამის შესახებ არ იცოდეთ."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"ეკრანი ეკრანში"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"„ეკრანი ეკრანში“ რეჟიმის დაშვება"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"დაინსტალირებული აპების მიერ „ეკრანი ეკრანში“ მხარდაჭერილი არ არის"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"საშუალებას მისცემს აპებს, შექმნას „ეკრანი ეკრანში“ ტიპის ფანჯარა, როცა ის გახსნილია, ან აპიდან გასვლისას (მაგალითად, ვიდეოს ნახვის გასაგრძელებლად). ეს ფანჯარა თქვენ მიერ გამოყენებული აპების ზემოდან გამოჩნდება."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"ნებას რთავს აპებს, დააყენოს მაღვიძარები და დაგეგმოს დროზე დამოკიდებული მოქმედებები. ეს აპს ფონურად მუშაობის საშუალებას აძლევს, რამაც, შესაძლოა, ენერგიის მოხმარების გაზრდა გამოიწვიოს.\n\nთუ ეს ნებართვა გამორთულია, აპის მიერ დაყენებული მაღვიძარები და დროზე დამოკიდებული ღონისძიებები არ იმუშავებს."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"ეკრანის ჩართვა"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"ეკრანის ჩართვის დაშვება"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"დართეთ ნება აპს, ჩართოს ეკრანი. თუ ამ ნებართვას მიანიჭებთ, აპმა შეიძლება ნებისმიერ დროს ჩართოს ეკრანი თქვენი ცალსახა განზრახვის გარეშე."</string>
<string name="special_access" msgid="21806055758289916">"აპების სპეციალური წვდომა"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"აუდიო"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"მონაცემთა დამზოგველი"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"მობილური ინტერნეტის ნაკლებად მოსახმარად ავტომატურად დააკორექტირეთ ვიდეოს ხარისხი"</string>
<string name="title_data_alert" msgid="8262081890052682475">"მონაცემთა მოხმარება და გაფრთხილებები"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"ინტერნეტთან დაკავშირება შეგიძლიათ Wi-Fi-ის, Ethernet-ის ან თქვენი ტელეფონის უსადენო ქსელის მეშვეობით. დახმარებისთვის, ეწვიეთ გვერდს: "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"ინტერნეტთან დაკავშირება შეგიძლიათ Wi-Fi-ის, Ethernet-ის ან თქვენი ტელეფონის უსადენო ქსელის მეშვეობით."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"მოქმედება დაუშვებელია"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"ხმის შეცვლა ვერ მოხერხდა"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"დენი და ენერგია"</string>
<string name="power_on_behavior" msgid="927607372303160716">"ქცევა ჩართვისას"</string>
<string name="reset_options_title" msgid="7632580482285108955">"გადაყენება"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet-ის დაკავშირების კოდი"</string>
</resources>
diff --git a/Settings/res/values-kk/strings.xml b/Settings/res/values-kk/strings.xml
index 6696011..397cd9a 100644
--- a/Settings/res/values-kk/strings.xml
+++ b/Settings/res/values-kk/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Аккаунтты енгізу"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Аккаунттар және оларға кіру"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Аккаунттар жоқ"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> аккаунт</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> аккаунт</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# аккаунт}other{# аккаунт}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Медиа қызметтері, Assistant, Төлемдер"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Желі және интернет"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Дыбыс"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Қолданбалар"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Құрылғы параметрлері"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Қашықтан басқару пульттері және қосалқы құралдар"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Bluetooth құрылғылары қосылмаған"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> қосалқы құрал</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> қосалқы құрал</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Дисплей және дыбыс"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Анықтама және пікір"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Құпиялылық"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Зауыттық деректерді қалпына келтіру"</string>
<string name="device_calibration" msgid="2907914144048739705">"Калибрлеу"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Қуат үнемдеу"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Құрылғылар"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Форматтарды таңдау"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Көлемді дыбыс"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ҚОСЫЛҒАН ФОРМАТТАР"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ӨШІРІЛГЕН ФОРМАТТАР"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Өшіру үшін формат таңдау опциясын \"Қолмен\" режиміне өзгертіңіз."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Ажыратымдылық"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Автоматты"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Рұқсат өзгертілді"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Қазірден бастап %1$s рұқсатын пайдалану үшін \"Жарайды\" түймесін басыңыз."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Бас тарту"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Жарайды"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Гц"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Кэштелген деректер өшірілсін бе?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Бұл барлық қолданбалардың кэштелген деректерін тазартады."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Қосалқы құрал қосу"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Жұпталуда…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Қосылуда…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Жабдықтар"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Пульт"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Пульт параметрлері"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Пульт түймелерін реттеу"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Теледидардағы, қабылдағыштардағы және саундбарлардағы дыбыс деңгейін, қуатты, кіріс сигналының көздерін басқару"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Жалғау"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s құрылғысына жалғау"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Ажырату"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Қолжетімсіз"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Құрылғы әкімшісінің қолданбалары"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Істеп тұрған қолданбалар жоқ"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Әкімші, шифрлау саясаты немесе тіркелкі деректерінің жады өшірген"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Басқарылатын құрылғы ақпараты"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Ұйым басқаратын өзгерістер мен параметрлер"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Жоқ"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Орнатылған қолданбалар"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Қолданбалардың шамамен алғандағы саны есептелді. Оған Play Store дүкенінен тыс орнатылған қолданбалар кірмейді."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Ең кемі # қолданба}other{Ең кемі # қолданба}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Орналасу деректерін пайдалану рұқсаттары"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Микрофонды пайдалану рұқсаттары"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Камераны пайдалану рұқсаттары"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Әдепкі қолданбалар"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# қолданба}other{# қолданба}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Әдепкі пернетақта"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> әдісіне орнату"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Әрқашан қосулы VPN қосылды"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Сенімді тіркелу деректері"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Жеке профильдегі сенімді тіркелу деректері"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Жұмыс профиліндегі сенімді тіркелу деректері"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Ең кемі <xliff:g id="COUNT_1">%d</xliff:g> CA сертификаты</item>
- <item quantity="one">Ең кемі <xliff:g id="COUNT_0">%d</xliff:g> CA сертификаты</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA сертификаты}other{# CA сертификаты}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Әкімші құрылғыны құлыптап, құпия сөзді қайта орната алады"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Әкімші барлық құрылғы деректерін жоя алады"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Құпия сөз тым көп қате енгізілсе, барлық құрылғы деректері жойылады"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Құпия сөз тым көп қате енгізілсе, жұмыс профилі деректері жойылады"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# әрекет}other{# әрекет}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Бұл құрылғыны ұйым басқарады."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Бұл құрылғыны <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> басқарады."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Толығырақ"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Камера қолданбалары</item>
- <item quantity="one">Камера қолданбасы</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Камера қолданбасы}other{Камера қолданбалары}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Күнтізбе қолданбасы"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Контактілер қолданбасы"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Электрондық поштаның клиенттік қолданбалары</item>
- <item quantity="one">Электрондық поштаның клиенттік қолданбасы</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Электрондық поштаның клиенттік қолданбасы}other{Электрондық поштаның клиенттік қолданбалары}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Карта қолданбасы"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Телефон қолданбалары</item>
- <item quantity="one">Телефон қолданбасы</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Телефон қолданбасы}other{Телефон қолданбалары}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Браузер қолданбасы"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS нұсқасы"</string>
<string name="about_serial" msgid="3432319328808745459">"Сериялық нөмірі"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS құрамасы"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{# қадамнан кейін әзірлеуші атанасыз.}other{# қадамнан кейін әзірлеуші атанасыз.}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Жарнама"</string>
<string name="ads_description" msgid="8081069475265061074">"Жарнама параметрлерін басқару (мысалы, жарнама идентификаторын қайта орнату)."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Google Ads, жарнама параметрлерін басқару (мысалы, жарнама идентификаторын қайта орнату)."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Қосымша жүйе жаңартулары"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Желі бақылауда болуы мүмкін"</string>
<string name="done_button" msgid="616159688526431451">"Дайын"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Сертификаттарға сену немесе оларды жою</item>
- <item quantity="one">Сертификатқа сену немесе оны жою</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> құрылғыңызға бірнеше сертификат орнатты. Олар желідегі әрекеттерді, оның ішінде электрондық хаттарды, қолданбаларды және қауіпсіз веб-сайттарды бақылауға мүмкіндік береді.\n\nБұл сертификаттар туралы толық ақпарат алу үшін әкімшіңізге хабарласыңыз.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> құрылғыңызға сертификат орнатты. Ол желідегі әрекеттерді, оның ішінде электрондық хаттарды, қолданбаларды және қауіпсіз веб-сайттарды бақылауға мүмкіндік береді.\n\nБұл сертификат туралы толық ақпарат алу үшін әкімшіңізге хабарласыңыз.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> жұмыс профиліңізге бірнеше сертификат орнатты. Олар желідегі әрекеттерді, оның ішінде электрондық хаттарды, қолданбаларды және қауіпсіз веб-сайттарды бақылауға мүмкіндік береді.\n\nБұл сертификаттар туралы толық ақпарат алу үшін әкімшіңізге хабарласыңыз.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> жұмыс профиліңізге сертификат орнатты. Ол желідегі әрекеттерді, оның ішінде электрондық хаттарды, қолданбаларды және қауіпсіз веб-сайттарды бақылауға мүмкіндік береді.\n\nБұл сертификат туралы толық ақпарат алу үшін әкімшіңізге хабарласыңыз.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Үшінші жақтың желі жұмысын, эл.поштаны, қолданбаларды және қауіпсіз веб-сайттарды қоса, бақылау мүмкіндігі бар.\n\nБұған құрылғыда орнатылған сенімді растаулар мүмкіндік береді."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Сертификаттарды тексеру</item>
- <item quantity="one">Сертификатты тексеру</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Сертификатқа сену немесе оны жою}other{Сертификаттарға сену немесе оларды жою}}"</string>
<string name="device_status" msgid="8266002761193692207">"Күй"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Желі, сериялық нөмірі және басқа ақпарат"</string>
<string name="manual" msgid="5683935624321864999">"Қолмен"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Қосылу"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Желіні ұмыту"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Бұл осы желіге қосылу үшін пайдаланылған ақпаратты, соның ішінде, сақталған құпия сөзді тазалайды."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Ұялы телефоныңыздан QR кодын сканерлеңіз де, нұсқауларды орындап, Wi-Fi желісіне қосылыңыз."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Ұялы телефоннан QR кодын сканерлеңіз де, нұсқауларды орындап, Wi-Fi желісіне қосылыңыз.\n \n "<b>"Android телефонынан"</b>" \"Параметрлер -> Желі және интернет -> Wi-Fi -> Wi-Fi-ды таңдау -> Кеңейтілген -> Құрылғы қосу және бұдан кейін QR кодын сканерлеу\" тармағын таңдаңыз."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Бас тарту үшін \"Артқа\" түймесін басыңыз."</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Жарайды"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Жалғастыру"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Құрылғы жады"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Алынбалы жад"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Қалпына келтіру"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Орын босату"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Кэштелген деректерді өшіру"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> босату"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Жадта орын алатын уақытша файлдар өшіріледі. Қолданба параметрлері немесе офлайн бейнелер сияқты сақталған деректерге әсер етпейді және қолданбаларға қайта кірудің қажеті жоқ."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Кэштелген деректер өшірілсін бе?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Барлық қолданбаның кэштелген деректері өшіріледі."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Қолданбаларды жою"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> орнатылды"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> орнату мүмкін болмады"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB құралы қайта қосылды"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Микрофон"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Микрофонды пайдалану"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Қолданбаның микрофонды пайдалану рұқсаты"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Микрофонды пайдалану рұқсаты бөгелді"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Бөгеуді алу үшін құрылғыдағы құпиялылық ауыстырғышын микрофонға жылжытыңыз, оның қалпы микрофонды пайдалануға мүмкіндік беруі тиіс."</string>
<string name="camera" msgid="1226671478936288283">"Камера"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Камераны пайдалану рұқсаты"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Қолданбаның камераны пайдалану рұқсаты"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Камераны пайдалану рұқсаты бөгелді"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Бөгеуді алу үшін құрылғыдағы құпиялылық ауыстырғышын камераға жылжытыңыз, оның қалпы камераны пайдалануға мүмкіндік беруі тиіс."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Микрофонды пайдалану: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Бұл параметр қосулы болса, рұқсат берілген барлық қолданба мен қызмет осы құрылғыдағы кез келген микрофонды пайдалана алады.\n\nБұл параметр аудиожүйенің арнаулы протоколды перифериялық құрылғыларына әсер етпейді."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Камераны пайдалану рұқсаты: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Көкшіл"</string>
<string name="color_yellow" msgid="3519470952904560404">"Сары"</string>
<string name="color_magenta" msgid="2377854703399624607">"Қызылкүрең"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Аудио сипаттама"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Қолдау көрсетілетін фильмдер мен сериалдарда экрандағы әрекеттің аудио сипаттамасын есту"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Қосу"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Конфигурация"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> қызметін пайдалану керек пе?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Бақылау"</string>
<string name="system_apps" msgid="8481888654606868074">"Қолданбалар"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Ояу тұру"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Экран ұйқы режиміне ауыспайды."</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP тексеру"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI оңтайландыру"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Қазір қайта іске қосу керек пе?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"HDMI құрылғыларының қуатын теледидармен өшіру"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Теледидар қуатын авто өшіру"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Теледидар қуатын HDMI құрылғысымен қосу"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Қосылған кірістер</item>
- <item quantity="one">Қосылған кіріс</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Күту режиміндегі кірістер</item>
- <item quantity="one">Күту режиміндегі кіріс</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Қосылмаған кірістер</item>
- <item quantity="one">Қосылмаған кіріс</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Қосылған кіріс}other{Қосылған кірістер}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Күту режиміндегі кіріс}other{Күту режиміндегі кірістер}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Қосылмаған кіріс}other{Қосылмаған кірістер}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Аккаунтыңыздағы қолданбаларға және басқа мазмұнға қатынасты шектеу"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Шектелген профиль"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> басқарады"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Шектеулі профиль жасау"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Параметрлер"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Рұқсат етілген қолданбалар"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d қолданбаға рұқсат етілген</item>
- <item quantity="one">1 қолданбаға рұқсат етілген</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Рұқсат етілген"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Рұқсат етілмеген"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Шектеулерді теңшеу"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Үшінші тарап дереккөзі"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Рұқсаттар"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Қолданба қолжетімді емес"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Пайдаланылмайтын қолданбалар"</string>
<string name="settings_ok" msgid="5950888975075541964">"Жарайды"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Растау"</string>
<string name="settings_cancel" msgid="576094334743686152">"Бас тарту"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Бұл рұқсат қолданбаға жүйе параметрлерін өзгертуге мүмкіндік береді."</string>
<string name="write_settings_on" msgid="71675710746513956">"Иә"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Жоқ"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Барлық файлды пайдалану"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Барлық файлды пайдалануға рұқсат беру"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Қолданбаға осы құрылғыдағы немесе жалғанған сыртқы жад құрылғыларындағы барлық файлды оқуға, өзгертуге немесе жоюға рұқсат береді. Егер осы рұқсат берілсе, қолданба файлдарды сіздің келісіміңізсіз пайдалана алады."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Суреттегі сурет"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"\"Суреттегі сурет\" режиміне рұқсат беру"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Орнатылған қолданбалардың ешқайсысы \"суреттегі сурет\" режимін қолдамайды"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Қолданба ашық болғанда не одан шыққанда (мысалы, бейнені әрі қарай көру үшін), қолданбаларға \"суреттегі сурет\" терезесін ашуға мүмкіндік береді. Бұл терезе ашылған басқа қолданбалардың үстінен шығады."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Қолданбаларға оятқыштарды орнатуға және уақытқа қатысты басқа да әрекеттерді жоспарлауға рұқсат береді. Мұндайда қолданба фондық режимде жұмыс істейді, сондықтан қуат шығыны артуы мүмкін.\n\nБұл рұқсат өшірулі болса, осы қолданбада жоспарланған ағымдағы оятқыштар мен уақытқа байланысты іс-шаралар жұмыс істемейді."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Экранды қосу"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Экранды қосуға рұқсат беру"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Қолданбаның экранды қосуына рұқсат береді. Рұқсат берілсе, қолданба кез келген уақытта экранды өздігінен қосуы мүмкін."</string>
<string name="special_access" msgid="21806055758289916">"Арнайы рұқсат"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Аудио"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Трафикті үнемдеу"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Мобильдік интернетті азырақ пайдалану үшін бейне сапасын автоматты реттеу"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Дерек трафигі және ескертулер"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Wi-Fi, Ethernet немесе телефонның хотспоты арқылы интернетке қосыла аласыз. Анықтама алу үшін "<b>"g.co/network"</b>" бетіне өтіңіз."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Wi-Fi, Ethernet немесе телефонның хотспоты арқылы интернетке қосыла аласыз."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Әрекетке рұқсат етілмеген"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Дыбыс деңгейі өзгертілмейді"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Қуат және энергия"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Қосылу кезіндегі әрекет"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Қайтару"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet жұптау коды"</string>
</resources>
diff --git a/Settings/res/values-km/strings.xml b/Settings/res/values-km/strings.xml
index faeb0bf..cf5b398 100644
--- a/Settings/res/values-km/strings.xml
+++ b/Settings/res/values-km/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"បញ្ចូលគណនី"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"គណនី និងការចូលគណនី"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"គ្មានគណនីទេ"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other">គណនី <xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g></item>
- <item quantity="one">គណនី <xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g></item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{គណនី #}other{គណនី #}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"សេវាកម្មមេឌៀ ជំនួយការ ការបង់ប្រាក់"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"បណ្តាញ និងអ៊ីនធឺណិត"</string>
<string name="sound_category_title" msgid="7899816751041939518">"សំឡេង"</string>
<string name="applications_category_title" msgid="7112019490898586223">"កម្មវិធី"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"ចំណូលចិត្តឧបករណ៍"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"ឧបករណ៍បញ្ជាពីចម្ងាយ និងឧបករណ៍បន្ទាប់បន្សំ"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"មិនមានឧបករណ៍ប៊្លូធូសដែលបានភ្ជាប់ទេ"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other">ឧបករណ៍បន្ទាប់បន្សំ <xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g></item>
- <item quantity="one">ឧបករណ៍បន្ទាប់បន្សំ <xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g></item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ផ្ទាំងអេក្រង់ និងសំឡេង"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"ជំនួយ និងមតិកែលម្អ"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"ឯកជនភាព"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"កំណត់ទិន្នន័យដូចចេញពីរោងចក្រ"</string>
<string name="device_calibration" msgid="2907914144048739705">"ការក្រិតតាមខ្នាត"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"កម្មវិធីសន្សំសំចៃថាមពល"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"ឧបករណ៍"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ជ្រើសរើសទម្រង់"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"សំឡេងរងំ"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"បានបើកទម្រង់"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"បានបិទទម្រង់"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"ដើម្បីបិទ សូមប្ដូរការជ្រើសរើសទម្រង់ទៅ \"ដោយដៃ\"។"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"កម្រិតច្បាស់"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"ស្វ័យប្រវត្តិ"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"កម្រិតច្បាស់ត្រូវបានផ្លាស់ប្ដូរ"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"ជ្រើសរើស \"យល់ព្រម\" ដើម្បីប្រើ %1$s ចាប់ពីពេលនេះតទៅ។"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"បោះបង់"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"យល់ព្រម"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"ជម្រះទិន្នន័យក្នុងឃ្លាំងសម្ងាត់?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"វានឹងជម្រះទិន្នន័យឃ្លាំងសម្រាប់កម្មវិធីទាំងអស់។"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"បន្ថែមគ្រឿងបន្ទាប់បន្សំ"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"កំពុងផ្គូផ្គង..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"កំពុងតភ្ជាប់…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"គ្រឿងបន្ថែម"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"ឧបករណ៍បញ្ជាពីចម្ងាយ"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"ការកំណត់ឧបករណ៍បញ្ជាពីចម្ងាយ"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"រៀបចំប៊ូតុងឧបករណ៍បញ្ជាពីចម្ងាយ"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"គ្រប់គ្រងកម្រិតសំឡេង ថាមពល ប្រភពបញ្ចូលនៅលើទូរទស្សន៍ ឧបករណ៍ចាប់សំឡេងនិងរូបភាព និងរបារសំឡេង"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"ភ្ជាប់"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"ភ្ជាប់ទៅ %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"ផ្ដាច់"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"មិនមានទេ"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"កម្មវិធីអ្នកគ្រប់គ្រងឧបករណ៍"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"មិនមានកម្មវិធីដែលដំណើរការទេ"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"បិទដោយអ្នកគ្រប់គ្រង គោលការណ៍អ៊ិនគ្រីប ឬទំហំផ្ទុកព័ត៌មានសម្គាល់ខ្លួន"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"ព័ត៌មានឧបករណ៍ដែលស្ថិតក្រោមការគ្រប់គ្រង"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"ការផ្លាស់ប្តូរ និងការកំណត់ដែលស្ថិតក្រោមការគ្រប់គ្រងរបស់ស្ថាប័នអ្នក"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"គ្មាន"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"កម្មវិធីត្រូវបានដំឡើង"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"ចំនួនកម្មវិធីគឺត្រូវបានប៉ាន់ស្មាន។ វាប្រហែលជាមិនរួមបញ្ចូលកម្មវិធីដែលបានដំឡើងក្រៅពី Play Store ទេ។"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{មានកម្មវិធីអប្បបរមាចំនួន #}other{មានកម្មវិធីអប្បបរមាចំនួន #}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"ការអនុញ្ញាតប្រើទីតាំង"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"ការអនុញ្ញាតចូលប្រើមីក្រូហ្វូន"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"ការអនុញ្ញាតឲ្យចូលប្រើកាមេរ៉ា"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"កម្មវិធីលំនាំដើម"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{កម្មវិធី #}other{កម្មវិធី #}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"ក្ដារចុចលំនាំដើម"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"កំណត់ទៅ <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"បានបើក VPN ដែលបើកជានិច្ច"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"ព័ត៌មានផ្ទៀងផ្ទាត់ដែលទុកចិត្ត"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"ព័ត៌មានផ្ទៀងផ្ទាត់ដែលទុកចិត្តនៅក្នុងកម្រងព័ត៌មានផ្ទាល់ខ្លួនរបស់អ្នក"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"ព័ត៌មានផ្ទៀងផ្ទាត់ដែលទុកចិត្តនៅក្នុងកម្រងព័ត៌មានការងាររបស់អ្នក"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">មានវិញ្ញាបនបត្រ CA អប្បបរមាចំនួន <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">មានវិញ្ញាបនបត្រ CA អប្បបរមាចំនួន <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{វិញ្ញាបនបត្រ CA #}other{វិញ្ញាបនបត្រ CA #}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"អ្នកគ្រប់គ្រងអាចចាក់សោឧបករណ៍នេះ និងកំណត់ពាក្យសម្ងាត់ឡើងវិញបាន"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"អ្នកគ្រប់គ្រងអាចលុបទិន្នន័យឧបករណ៍ទាំងអស់បាន"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"មិនអាចបញ្ចូលពាក្យសម្ងាត់បានទេ លុះត្រាតែអ្នកលុបទិន្នន័យឧបករណ៍ទាំងអស់ជាមុនសិន"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"មិនអាចបញ្ចូលពាក្យសម្ងាត់បានទេ លុះត្រាតែអ្នកលុបទិន្នន័យកម្រងព័ត៌មានការងារជាមុនសិន"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{ព្យាយាម # ដងហើយ}other{ព្យាយាម # ដងហើយ}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"ឧបករណ៍នេះស្ថិតក្រោមការគ្រប់គ្រងរបស់ស្ថាប័នអ្នក។"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"ឧបករណ៍នេះស្ថិតក្រោមការគ្រប់គ្រងរបស់ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ។"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"ស្វែងយល់បន្ថែម"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">កម្មវិធីកាមេរ៉ា</item>
- <item quantity="one">កម្មវិធីកាមេរ៉ា</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{កម្មវិធីកាមេរ៉ា}other{កម្មវិធីកាមេរ៉ា}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"កម្មវិធីប្រតិទិន"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"កម្មវិធីទំនាក់ទំនង"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">កម្មវិធីផ្ញើអ៊ីមែល</item>
- <item quantity="one">កម្មវិធីផ្ញើអ៊ីមែល</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{កម្មវិធីផ្ញើអ៊ីមែល}other{កម្មវិធីផ្ញើអ៊ីមែល}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"កម្មវិធីផែនទី"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">កម្មវិធីទូរសព្ទ</item>
- <item quantity="one">កម្មវិធីទូរសព្ទ</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{កម្មវិធីទូរសព្ទ}other{កម្មវិធីទូរសព្ទ}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"កម្មវិធីរុករកតាមអ៊ីនធឺណិត"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"កំណែប្រព័ន្ធប្រតិបត្តិការ Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"លេខសៀរៀល"</string>
<string name="about_build" msgid="8467840394761634575">"កំណែបង្កើតប្រព័ន្ធប្រតិបត្តិការ Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{ឥឡូវនេះ នៅសល់ # ជំហានទៀត អ្នកនឹងក្លាយជាអ្នកអភិវឌ្ឍន៍}other{ឥឡូវនេះ នៅសល់ # ជំហានទៀត អ្នកនឹងក្លាយជាអ្នកអភិវឌ្ឍន៍}}"</string>
<string name="about_ads" msgid="7662896442040086522">"ផ្សាយពាណិជ្ជកម្ម"</string>
<string name="ads_description" msgid="8081069475265061074">"គ្រប់គ្រងការកំណត់ពាណិជ្ជកម្មរបស់អ្នក ដូចជាការកំណត់លេខសម្គាល់ការផ្សាយពាណិជ្ជកម្មរបស់អ្នកឡើងវិញជាដើម។"</string>
<string name="ads_content_description" msgid="1006489792324920289">"ការផ្សាយពាណិជ្ជកម្ម គ្រប់គ្រងការកំណត់ពាណិជ្ជកម្មរបស់អ្នកដូចជា ការកំណត់លេខសម្គាល់ការផ្សាយពាណិជ្ជកម្មរបស់អ្នកឡើងវិញជាដើម។"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"ការអាប់ដេតប្រព័ន្ធបន្ថែម"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"បណ្ដាញអាចត្រូវបានតាមដាន"</string>
<string name="done_button" msgid="616159688526431451">"រួចរាល់"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">ជឿទុកចិត្ត ឬដកវិញ្ញាបនបត្រចេញ</item>
- <item quantity="one">ជឿទុកចិត្ត ឬដកវិញ្ញាបនបត្រចេញ</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> បានដំឡើងអាជ្ញាធរវិញ្ញាបនបត្រនៅលើឧបករណ៍របស់អ្នក ដែលអាចអនុញ្ញាតឱ្យគេត្រួតពិនិត្យសកម្មភាពបណ្តាញលើឧបករណ៍របស់អ្នក រួមទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រដែលមានសុវត្ថិភាព។\n\nដើម្បីទទួលបានព័ត៌មានបន្ថែមអំពីវិញ្ញាបនបត្រទាំងនេះ សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> បានដំឡើងអាជ្ញាធរវិញ្ញាបនបត្រនៅលើឧបករណ៍របស់អ្នក ដែលអាចអនុញ្ញាតឱ្យគេត្រួតពិនិត្យសកម្មភាពបណ្តាញលើឧបករណ៍របស់អ្នក រួមទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រដែលមានសុវត្ថិភាព។\n\nដើម្បីទទួលបានព័ត៌មានបន្ថែមអំពីវិញ្ញាបនបត្រនេះ សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> បានដំឡើងអាជ្ញាធរវិញ្ញាបនបត្រសម្រាប់កម្រងព័ត៌មានការងាររបស់អ្នក ដែលអាចអនុញ្ញាតឱ្យគេត្រួតពិនិត្យសកម្មភាពបណ្តាញការងារ រួមទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រដែលមានសុវត្ថិភាព។\n\nដើម្បីទទួលបានព័ត៌មានបន្ថែមអំពីវិញ្ញាបនបត្រទាំងនេះ សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> បានដំឡើងអាជ្ញាធរវិញ្ញាបនបត្រសម្រាប់កម្រងព័ត៌មានការងាររបស់អ្នក ដែលអាចអនុញ្ញាតឱ្យគេត្រួតពិនិត្យសកម្មភាពបណ្តាញការងារ រួមទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រដែលមានសុវត្ថិភាព។\n\nដើម្បីទទួលបានព័ត៌មានបន្ថែមអំពីវិញ្ញាបនបត្រនេះ សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"ភាគីទីបីមានសមត្ថភាពគ្រប់គ្រងសកម្មភាពបណ្ដាញរបស់អ្នក រួមមានអ៊ីមែល កម្មវិធី និងសុវត្ថិភាពតំបន់បណ្ដាញ។ \n \n ព័ត៌មានសម្ងាត់ដែលទុកចិត្តត្រូវបានដំឡើងនៅលើឧបករណ៍របស់អ្នកដើម្បីឲ្យវាអាចធ្វើបាន។"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">ពិនិត្យមើលវិញ្ញាបនបត្រ</item>
- <item quantity="one">ពិនិត្យមើលវិញ្ញាបនបត្រ</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{ជឿទុកចិត្ត ឬដកវិញ្ញាបនបត្រចេញ}other{ជឿទុកចិត្ត ឬដកវិញ្ញាបនបត្រចេញ}}"</string>
<string name="device_status" msgid="8266002761193692207">"ស្ថានភាព"</string>
<string name="device_status_summary" msgid="3270932829412434985">"បណ្តាញ លេខស៊េរី និងព័ត៌មានផ្សេងទៀត"</string>
<string name="manual" msgid="5683935624321864999">"ឯកសារណែនាំ"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"តភ្ជាប់"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"បំភ្លេចបណ្ដាញ"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"វាសម្អាតព័ត៌មានដែលបានប្រើដើម្បីភ្ជាប់បណ្ដាញនេះ រួមមានពាក្យសម្ងាត់បានរក្សាទុក"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"ភ្ជាប់ Wifi ដោយស្កេនកូដ QR ពីទូរសព្ទចល័តរបស់អ្នក និងធ្វើតាមការណែនាំ។"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" ភ្ជាប់ Wi-Fi ដោយស្កេនកូដ QR ពីទូរសព្ទចល័ត និងធ្វើតាមការណែនាំ។\n \n ពី"<b>"ទូរសព្ទ Android"</b>" សូមចូលទៅកាន់ការកំណត់ -> បណ្ដាញ និងអ៊ីនធឺណិត -> Wi-Fi -> ជ្រើសរើស Wi-Fi -> កម្រិតខ្ពស់ -> បញ្ចូលឧបករណ៍ រួចស្កេនកូដ QR។"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"ចុចប៊ូតុង \"ថយក្រោយ\" ដើម្បីបោះបង់"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"យល់ព្រម"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"បន្ត"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"ឧបករណ៍ផ្ទុក"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"ឧបករណ៍ផ្ទុកចល័ត"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"កំណត់ឡើងវិញ"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"បង្កើនទំហំផ្ទុក"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"សម្អាតទិន្នន័យដែលទុកក្នុងឃ្លាំងបម្រុង"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"បង្កើនទំហំផ្ទុក <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"សម្អាតឯកសារបណ្ដោះអាសន្នដែលប្រើប្រាស់ទំហំផ្ទុក។ ការសម្អាតនេះនឹងមិនប៉ះពាល់ដល់ទិន្នន័យដែលបានរក្សាទុកដូចជា ចំណូលចិត្តកម្មវិធី ឬវីដេអូគ្មានអ៊ីនធឺណិតទេ ហើយអ្នកនឹងមិនចាំបាច់ចូលកម្មវិធីម្ដងទៀតឡើយ។"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"សម្អាតទិន្នន័យដែលទុកក្នុងឃ្លាំងបម្រុងឬ?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"សកម្មភាពនេះនឹងសម្អាតទិន្នន័យដែលទុកក្នុងឃ្លាំងបម្រុងសម្រាប់កម្មវិធីទាំងអស់។"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"លុបកម្មវិធី"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"បានភ្ជាប់ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"មិនអាចដក <xliff:g id="NAME">%1$s</xliff:g> ចេញបានទេ"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"បានតភា្ជប់ឧបករណ៍ផ្ទុក USB សារជាថ្មី"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"មីក្រូហ្វូន"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"ការចូលប្រើមីក្រូហ្វូន"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"ការចូលប្រើមីក្រូហ្វូនពីកម្មវិធី"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"បានទប់ស្កាត់ការចូលប្រើមីក្រូហ្វូន"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"ដើម្បីឈប់ទប់ស្កាត់ សូមប្ដូរប៊ូតុងបិទបើកឯកជនភាពនៅលើឧបករណ៍របស់អ្នកទៅទីតាំងបើកមីក្រូហ្វូន ដើម្បីអនុញ្ញាតឱ្យចូលប្រើមីក្រូហ្វូន។"</string>
<string name="camera" msgid="1226671478936288283">"កាមេរ៉ា"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"ការចូលប្រើកាមេរ៉ា"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"ការចូលប្រើកាមេរ៉ាពីកម្មវិធី"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"បានទប់ស្កាត់ការចូលប្រើកាមេរ៉ា"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"ដើម្បីឈប់ទប់ស្កាត់ សូមប្ដូរប៊ូតុងបិទបើកឯកជនភាពនៅលើឧបករណ៍របស់អ្នកទៅទីតាំងបើកកាមេរ៉ា ដើម្បីអនុញ្ញាតឱ្យចូលប្រើកាមេរ៉ា។"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"ការចូលប្រើមីក្រូហ្វូន៖ <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"នៅពេលបើក នោះសេវាកម្ម និងកម្មវិធីទាំងអស់ដែលមានការអនុញ្ញាតអាចចូលប្រើមីក្រូហ្វូនណាក៏បាននៅលើឧបករណ៍នេះ។\n\nការកំណត់នេះនឹងមិនប៉ះពាល់ដល់ឧបករណ៍សំឡេងដែលភ្ជាប់ពីខាងក្រៅដែលប្រើប្រូតូកូលផ្ទាល់ខ្លួនទេ។"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"ការចូលប្រើកាមេរ៉ា៖ <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"ផ្ទៃមេឃ"</string>
<string name="color_yellow" msgid="3519470952904560404">"លឿង"</string>
<string name="color_magenta" msgid="2377854703399624607">"ស្វាយខ្ចី"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"ការពណ៌នាជាសំឡេង"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"ស្ដាប់ការពណ៌នាអំពីអ្វីដែលកំពុងកើតឡើងនៅលើអេក្រង់ក្នុងភាពយន្ត និងកម្មវិធីទូរទស្សន៍ដែលមានការពណ៌នាជាសំឡេង"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"បើកដំណើរការ"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"ការកំណត់រចនាសម្ព័ន្ធ"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"ប្រើ <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"ការត្រួតពិនិត្យ"</string>
<string name="system_apps" msgid="8481888654606868074">"កម្មវិធី"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"រក្សាកុំឲ្យរលត់"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"អេក្រង់នឹងមិនដេកទេ"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"ពិនិត្យ HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"ការធ្វើឲ្យប្រសើរ HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"ចាប់ផ្ដើមឡើងវិញឥឡូវ?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"បិទឧបករណ៍ HDMI ជាមួយទូរទស្សន៍"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"ទូរទស្សន៍បើកស្វ័យប្រវត្តិ"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"បើកទូរទស្សន៍ជាមួយឧបករណ៍ HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other"> ធាតុបញ្ចូលត្រូវបានភ្ជាប់</item>
- <item quantity="one"> ធាតុបញ្ចូលត្រូវបានភ្ជាប់</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other"> ធាតុបញ្ចូលដែលមានការផ្អាក</item>
- <item quantity="one"> ធាតុបញ្ចូលដែលមានការផ្អាក</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other"> ធាតុបញ្ចូលមិនត្រូវបានភ្ជាប់</item>
- <item quantity="one"> ធាតុបញ្ចូលមិនត្រូវបានភ្ជាប់</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{ធាតុបញ្ចូលដែលបានភ្ជាប់}other{ធាតុបញ្ចូលដែលបានភ្ជាប់}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{ធាតុបញ្ចូលដែលផ្អាកដំណើរការ}other{ធាតុបញ្ចូលដែលផ្អាកដំណើរការ}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{ធាតុបញ្ចូលដែលមិនបានភ្ជាប់}other{ធាតុបញ្ចូលដែលមិនបានភ្ជាប់}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"ដាក់កម្រិតការចូលប្រើកម្មវិធី និងមាតិកាផ្សេងទៀតក្នុងគណនីរបស់អ្នក"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"ប្រវត្តិរូបដែលដាក់កម្រិត"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"គ្រប់គ្រងដោយ <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"បង្កើតប្រវត្តិរូបដែលរឹតបន្តឹង"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"ការកំណត់"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"កម្មវិធីដែលអនុញ្ញាត"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">បានអនុញ្ញាតកម្មវិធី %d</item>
- <item quantity="one">បានអនុញ្ញាតកម្មវិធី 1</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"បានអនុញ្ញាត"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"មិនបានអនុញ្ញាត"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"ប្ដូរការដាក់កម្រិតតាមតម្រូវការ"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"ប្រភពភាគីទីបី"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"ការអនុញ្ញាត"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"កម្មវិធីមិនអាចប្រើបានទេ"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"កម្មវិធីដែលមិនប្រើ"</string>
<string name="settings_ok" msgid="5950888975075541964">"យល់ព្រម"</string>
<string name="settings_confirm" msgid="4489126458677153411">"បញ្ជាក់"</string>
<string name="settings_cancel" msgid="576094334743686152">"បោះបង់"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"ការអនុញ្ញាតនេះអនុញ្ញាតឱ្យកម្មវិធីអាចកែសម្រួលការកំណត់ប្រព័ន្ធបាន។"</string>
<string name="write_settings_on" msgid="71675710746513956">"បាទ/ចាស"</string>
<string name="write_settings_off" msgid="6730113471695092167">"ទេ"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"ចូលប្រើឯកសារទាំងអស់"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"អនុញ្ញាតឱ្យចូលប្រើ ដើម្បីគ្រប់គ្រងឯកសារទាំងអស់"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"អនុញ្ញាតឱ្យកម្មវិធីនេះអាន កែសម្រួល និងលុបឯកសារទាំងអស់នៅលើឧបករណ៍នេះ ឬឧបករណ៍ផ្ទុកទាំងឡាយដែលបានភ្ជាប់។ ប្រសិនបើផ្ដល់ការអនុញ្ញាត កម្មវិធីនេះអាចចូលប្រើឯកសារ ដោយមិនឱ្យអ្នកដឹង។"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"រូបក្នុងរូប"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"អនុញ្ញាតសម្រាប់មុខងាររូបក្នុងរូប"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"កម្មវិធីដែលបានដំឡើងមិនអាចប្រើមុខងាររូបក្នុងរូបបានទេ"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"អនុញ្ញាតឱ្យកម្មវិធីបង្កើតវិនដូរូបក្នុងរូប ខណៈពេលដែលកម្មវិធីនេះកំពុងបើក ឬបន្ទាប់ពីអ្នកចាកចេញពីវា (ឧទាហរណ៍ ដើម្បីបន្តមើលវីដេអូ)។ វិនដូនេះបង្ហាញនៅផ្នែកខាងលើកម្មវិធីផ្សេងទៀតដែលអ្នកកំពុងប្រើប្រាស់។"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"អនុញ្ញាតឱ្យកម្មវិធីកំណត់ម៉ោងរោទ៍ និងកំណត់កាលវិភាគសកម្មភាពដែលតម្រូវឱ្យទាន់ពេលវេលា។ ការធ្វើបែបនេះអនុញ្ញាតឱ្យកម្មវិធីដំណើរការនៅផ្ទៃខាងក្រោយ ដែលសកម្មភាពនេះអាចប្រើថ្មច្រើន។\n\nប្រសិនបើបិទការអនុញ្ញាតនេះ ម៉ោងរោទ៍ដែលមានស្រាប់ និងព្រឹត្តិការណ៍ផ្អែកលើពេលវេលាដែលកម្មវិធីបានកំណត់កាលវិភាគនឹងមិនដំណើរការទេ។"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"បើកអេក្រង់"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"អនុញ្ញាតឱ្យបើកអេក្រង់"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"អនុញ្ញាតឱ្យកម្មវិធីបើកអេក្រង់។ ប្រសិនបើអនុញ្ញាត កម្មវិធីអាចបើកអេក្រង់បានគ្រប់ពេល ទោះបីជាអ្នកគ្មានបំណងធ្វើអន្តរកម្មក៏ដោយ។"</string>
<string name="special_access" msgid="21806055758289916">"ការចូលប្រើកម្មវិធីពិសេស"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"សំឡេង"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"មុខងារសន្សំសំចៃទិន្នន័យ"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"កែតម្រូវគុណភាពវីដេអូដោយស្វ័យប្រវត្តិ ដើម្បីប្រើទិន្នន័យទូរសព្ទចល័តតិចជាងមុន"</string>
<string name="title_data_alert" msgid="8262081890052682475">"ការប្រើប្រាស់ទិន្នន័យ និងការជូនដំណឹង"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"អ្នកអាចភ្ជាប់អ៊ីនធឺណិតតាមរយៈ Wi-Fi, អ៊ីសឺរណិត ឬហតស៉្បតទូរសព្ទរបស់អ្នក។ ដើម្បីទទួលបានជំនួយបន្ថែម សូមចូលទៅកាន់ "<b>"g.co/network"</b>"។"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"អ្នកអាចភ្ជាប់អ៊ីនធឺណិតតាមរយៈ Wi-Fi, អ៊ីសឺរណិត ឬហតស៉្បតទូរសព្ទរបស់អ្នក។"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"សកម្មភាពមិនអនុញ្ញាត"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"មិនអាចផ្លាស់ប្ដូរកម្រិតសំឡេងបានទេ"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"កម្លាំង និងថាមពល"</string>
<string name="power_on_behavior" msgid="927607372303160716">"សកម្មភាពនៅពេលបើក"</string>
<string name="reset_options_title" msgid="7632580482285108955">"កំណត់ឡើងវិញ"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"កូដផ្គូផ្គងអ៊ីសឺរណិត"</string>
</resources>
diff --git a/Settings/res/values-kn/strings.xml b/Settings/res/values-kn/strings.xml
index 6ec6723..3c4455e 100644
--- a/Settings/res/values-kn/strings.xml
+++ b/Settings/res/values-kn/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"ಖಾತೆಯನ್ನು ಸೇರಿಸಿ"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"ಖಾತೆಗಳು ಮತ್ತು ಸೈನ್ ಇನ್"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"ಯಾವುದೇ ಖಾತೆಗಳಿಲ್ಲ"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> ಖಾತೆಗಳು</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> ಖಾತೆಗಳು</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# ಖಾತೆ}one{# ಖಾತೆಗಳು}other{# ಖಾತೆಗಳು}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"ಮಾಧ್ಯಮ ಸೇವೆಗಳು, Assistant, ಪಾವತಿಗಳು"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"ನೆಟ್ವರ್ಕ್ ಮತ್ತು ಇಂಟರ್ನೆಟ್"</string>
<string name="sound_category_title" msgid="7899816751041939518">"ಧ್ವನಿ"</string>
<string name="applications_category_title" msgid="7112019490898586223">"ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"ಸಾಧನದ ಪ್ರಾಶಸ್ತ್ಯಗಳು"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"ರಿಮೋಟ್ಗಳು ಮತ್ತು ಪರಿಕರಗಳು"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"ಸಂಪರ್ಕಗೊಂಡಿರುವ ಯಾವುದೇ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳಿಲ್ಲ"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ಪರಿಕರಗಳು</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ಪರಿಕರಗಳು</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ಡಿಸ್ಪ್ಲೇ ಮತ್ತು ಧ್ವನಿ"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"ಸಹಾಯ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆ"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"ಗೌಪ್ಯತೆ"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"ಫ್ಯಾಕ್ಟರಿ ಡೇಟಾ ರಿಸೆಟ್"</string>
<string name="device_calibration" msgid="2907914144048739705">"ಕ್ಯಾಲಿಬರೇಶನ್"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"ಎನರ್ಜಿ ಸೇವರ್ ಮೋಡ್"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"ಸಾಧನಗಳು"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ಸ್ವರೂಪಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"ಸರೌಂಡ್ ಶಬ್ದ"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"ಡಾಲ್ಬೈ ಡಿಜಿಟಲ್"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ಸಕ್ರಿಯಗೊಳಿಸಿದ ಫಾರ್ಮ್ಯಾಟ್ಗಳು"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ ಫಾರ್ಮ್ಯಾಟ್ಗಳು"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು, ಫಾರ್ಮ್ಯಾಟ್ ಆಯ್ಕೆಯನ್ನು ಹಸ್ತಚಾಲಿತ ಮೋಡ್ಗೆ ಬದಲಾಯಿಸಿ."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"ರೆಸಲ್ಯೂಶನ್"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"ಸ್ವಯಂಚಾಲಿತ"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"ರೆಸಲ್ಯೂಷನ್ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"ಈಗಿನಿಂದ %1$s ಬಳಸಲು ಸರಿ ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"ರದ್ದುಗೊಳಿಸಿ"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ಸರಿ"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"ಸಂಗ್ರಹ ಡೇಟಾವನ್ನು ತೆರುವುಗೊಳಿಸುವುದೇ?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"ಎಲ್ಲ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಸಂಗ್ರಹ ಡೇಟಾವನ್ನು ಇದು ತೆರುವುಗೊಳಿಸುತ್ತದೆ."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"ಪರಿಕರವನ್ನು ಸೇರಿಸಿ"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"ಜೋಡಿಸಲಾಗುತ್ತಿದೆ..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"ಸಂಪರ್ಕಪಡಿಸಲಾಗುತ್ತಿದೆ..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"ಪರಿಕರಗಳು"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"ರಿಮೋಟ್ ನಿಯಂತ್ರಣ"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"ರಿಮೋಟ್ ನಿಯಂತ್ರಣದ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"ರಿಮೋಟ್ ಬಟನ್ಗಳನ್ನು ಸೆಟಪ್ ಮಾಡಿ"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"ಟಿವಿಗಳು, ರಿಸೀವರ್ಗಳು ಮತ್ತು ಸೌಂಡ್ಬಾರ್ಗಳಲ್ಲಿ ವಾಲ್ಯೂಮ್, ಪವರ್ ಹಾಗೂ ಇನ್ಪುಟ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"ಕನೆಕ್ಟ್ ಮಾಡಿ"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿ"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"ಡಿಸ್ಕನೆಕ್ಟ್ ಮಾಡಿ"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"ಸಾಧನ ನಿರ್ವಹಣಾ ಆ್ಯಪ್ಗಳು"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"ಸಕ್ರಿಯ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಲ್ಲ"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"ಅಡ್ಮಿನ್, ಎನ್ಕ್ರಿಪ್ಷನ್, ರುಜುವಾತಿನಿಂದಾಗಿ ನಿಷ್ಕ್ರಿಯ"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"ನಿರ್ವಹಿಸುವ ಸಾಧನದ ಮಾಹಿತಿ"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನಿರ್ವಹಿಸುವ ಬದಲಾವಣೆಗಳು ಮತ್ತು ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"ಯಾವುದೂ ಅಲ್ಲ"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿದೆ"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"ಆ್ಯಪ್ಗಳ ಸಂಖ್ಯೆಯನ್ನು ಅಂದಾಜು ಮಾಡಲಾಗಿದೆ. Play ಸ್ಟೋರ್ನಲ್ಲಿರುವುದನ್ನು ಹೊರತುಪಡಿಸಿ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿರುವ ಆ್ಯಪ್ಗಳು ಇದರಲ್ಲಿ ಒಳಗೊಂಡಿಲ್ಲದೇ ಇರಬಹುದು."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{ಕನಿಷ್ಠ # ಆ್ಯಪ್}one{ಕನಿಷ್ಠ # ಆ್ಯಪ್ಗಳು}other{ಕನಿಷ್ಠ # ಆ್ಯಪ್ಗಳು}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"ಸ್ಥಳದ ಅನುಮತಿಗಳು"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"ಮೈಕ್ರೋಫೋನ್ ಅನುಮತಿಗಳು"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"ಕ್ಯಾಮರಾ ಅನುಮತಿಗಳು"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"ಡಿಫಾಲ್ಟ್ ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# ಆ್ಯಪ್}one{# ಆ್ಯಪ್ಗಳು}other{# ಆ್ಯಪ್ಗಳು}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"ಡಿಫಾಲ್ಟ್ ಕೀಬೋರ್ಡ್"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> ಗೆ ಹೊಂದಿಸಲಾಗಿದೆ"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"VPN ನಲ್ಲಿ ಯಾವಾಗಲೂ ಆನ್ ಆಗಿರಿ ಎಂಬುದನ್ನು ಆನ್ ಮಾಡಿ"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"ವಿಶ್ವಾಸಾರ್ಹ ರುಜುವಾತುಗಳು"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್ನಲ್ಲಿರುವ ವಿಶ್ವಾಸಾರ್ಹ ರುಜುವಾತುಗಳು"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"ನಿಮ್ಮ ಕಚೇರಿ ಪ್ರೊಫೈಲ್ನಲ್ಲಿರುವ ವಿಶ್ವಾಸಾರ್ಹ ರುಜುವಾತುಗಳು"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">ಕನಿಷ್ಠ <xliff:g id="COUNT_1">%d</xliff:g> CA ಪ್ರಮಾಣಪತ್ರಗಳು</item>
- <item quantity="other">ಕನಿಷ್ಠ <xliff:g id="COUNT_1">%d</xliff:g> CA ಪ್ರಮಾಣಪತ್ರಗಳು</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA ಪ್ರಮಾಣಪತ್ರ}one{# CA ಪ್ರಮಾಣಪತ್ರಗಳು}other{# CA ಪ್ರಮಾಣಪತ್ರಗಳು}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"ನಿರ್ವಾಹಕರು ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಬಹುದು ಮತ್ತು ಪಾಸ್ವರ್ಡ್ ಮರುಹೊಂದಿಸಬಹುದು"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"ನಿರ್ವಾಹಕರು ಸಾಧನದ ಡೇಟಾವನ್ನು ಅಳಿಸಬಹುದು"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"ಸಾಧನದ ಎಲ್ಲ ಡೇಟಾವನ್ನು ಅಳಿಸುವ ಮುನ್ನ, ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸುವಿಕೆಯ ವಿಫಲ ಪ್ರಯತ್ನಗಳು"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್ನ ಡೇಟಾವನ್ನು ಅಳಿಸುವ ಮುನ್ನ, ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸುವಿಕೆಯ ವಿಫಲ ಪ್ರಯತ್ನಗಳು"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# ಪ್ರಯತ್ನ}one{# ಪ್ರಯತ್ನಗಳು}other{# ಪ್ರಯತ್ನಗಳು}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"ಈ ಸಾಧನವನ್ನು ನಿಮ್ಮ ಸಂಸ್ಥೆ ನಿರ್ವಹಿಸುತ್ತಿದೆ."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"ಈ ಸಾಧನವನ್ನು <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ನಿರ್ವಹಿಸುತ್ತಿದೆ."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">ಕ್ಯಾಮರಾ ಆ್ಯಪ್ಗಳು</item>
- <item quantity="other">ಕ್ಯಾಮರಾ ಆ್ಯಪ್ಗಳು</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{ಕ್ಯಾಮರಾ ಆ್ಯಪ್}one{ಕ್ಯಾಮರಾ ಆ್ಯಪ್ಗಳು}other{ಕ್ಯಾಮರಾ ಆ್ಯಪ್ಗಳು}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"ಕ್ಯಾಲೆಂಡರ್ ಅಪ್ಲಿಕೇಶನ್"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"ಸಂಪರ್ಕಗಳ ಅಪ್ಲಿಕೇಶನ್"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">ಇಮೇಲ್ ಕ್ಲೈಂಟ್ ಆ್ಯಪ್ಗಳು</item>
- <item quantity="other">ಇಮೇಲ್ ಕ್ಲೈಂಟ್ ಆ್ಯಪ್ಗಳು</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ಇಮೇಲ್ ಕ್ಲೈಂಟ್ ಆ್ಯಪ್}one{ಇಮೇಲ್ ಕ್ಲೈಂಟ್ ಆ್ಯಪ್ಗಳು}other{ಇಮೇಲ್ ಕ್ಲೈಂಟ್ ಆ್ಯಪ್ಗಳು}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Map ಆ್ಯಪ್"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">ಫೋನ್ ಆ್ಯಪ್ಗಳು</item>
- <item quantity="other">ಫೋನ್ ಆ್ಯಪ್ಗಳು</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{ಫೋನ್ ಆ್ಯಪ್}one{ಫೋನ್ ಆ್ಯಪ್ಗಳು}other{ಫೋನ್ ಆ್ಯಪ್ಗಳು}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"ಬ್ರೌಸರ್ ಆ್ಯಪ್"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS ಆವೃತ್ತಿ"</string>
<string name="about_serial" msgid="3432319328808745459">"ಕ್ರಮ ಸಂಖ್ಯೆ"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS ಬಿಲ್ಡ್"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{ನೀವು ಡೆವಲಪರ್ ಆಗುವುದಕ್ಕೆ ಈಗ # ಹಂತದಷ್ಟು ದೂರದಲ್ಲಿದ್ದೀರಿ}one{ನೀವು ಡೆವಲಪರ್ ಆಗುವುದಕ್ಕೆ ಈಗ # ಹಂತಗಳಷ್ಟು ದೂರದಲ್ಲಿದ್ದೀರಿ}other{ನೀವು ಡೆವಲಪರ್ ಆಗುವುದಕ್ಕೆ ಈಗ # ಹಂತಗಳಷ್ಟು ದೂರದಲ್ಲಿದ್ದೀರಿ}}"</string>
<string name="about_ads" msgid="7662896442040086522">"ಜಾಹೀರಾತುಗಳು"</string>
<string name="ads_description" msgid="8081069475265061074">"ನಿಮ್ಮ ಜಾಹೀರಾತು ಐಡಿಯನ್ನು ಮರುಹೊಂದಿಸುವ ಮೂಲಕ ನಿಮ್ಮ ಜಾಹೀರಾತು ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನಿರ್ವಹಿಸಿ."</string>
<string name="ads_content_description" msgid="1006489792324920289">"ಜಾಹೀರಾತುಗಳು, ನಿಮ್ಮ ಜಾಹೀರಾತು ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನಿರ್ವಹಿಸಿ, ಉದಾಹರಣೆಗೆ ನಿಮ್ಮ ಜಾಹೀರಾತು ಐಡಿಯನ್ನು ಮರುಹೊಂದಿಸುವುದು."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"ಹೆಚ್ಚುವರಿ ಸಿಸ್ಟಂ ಅಪ್ಡೇಟ್ಗಳು"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"ನೆಟ್ವರ್ಕ್ ಪರಿವೀಕ್ಷಿಸಬಹುದಾಗಿದೆ"</string>
<string name="done_button" msgid="616159688526431451">"ಮುಗಿದಿದೆ"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ನಂಬಿ ಅಥವಾ ತೆಗೆದುಹಾಕಿ</item>
- <item quantity="other">ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ನಂಬಿ ಅಥವಾ ತೆಗೆದುಹಾಕಿ</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪ್ರಮಾಣಪತ್ರದ ಅಂಗೀಕಾರಗಳನ್ನು <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿದೆ. ಇದು ಇಮೇಲ್ಗಳು, ಆ್ಯಪ್ಗಳು ಮತ್ತು ಸುರಕ್ಷಿತ ವೆಬ್ಸೈಟ್ಗಳು ಸೇರಿದಂತೆ, ನಿಮ್ಮ ಸಾಧನದ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮಾನಿಟರ್ ಮಾಡಲು ಅವರಿಗೆ ಅನುಮತಿಸಬಹುದು.\n\nಈ ಪ್ರಮಾಣಪತ್ರಗಳ ಕುರಿತು ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</item>
- <item quantity="other">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪ್ರಮಾಣಪತ್ರದ ಅಂಗೀಕಾರಗಳನ್ನು <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿದೆ. ಇದು ಇಮೇಲ್ಗಳು, ಆ್ಯಪ್ಗಳು ಮತ್ತು ಸುರಕ್ಷಿತ ವೆಬ್ಸೈಟ್ಗಳು ಸೇರಿದಂತೆ, ನಿಮ್ಮ ಸಾಧನದ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮಾನಿಟರ್ ಮಾಡಲು ಅವರಿಗೆ ಅನುಮತಿಸಬಹುದು.\n\nಈ ಪ್ರಮಾಣಪತ್ರಗಳ ಕುರಿತು ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one">ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ಗಾಗಿ ಪ್ರಮಾಣಪತ್ರದ ಅಂಗೀಕಾರಗಳನ್ನು <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿದೆ. ಇದು ಇಮೇಲ್ಗಳು, ಆ್ಯಪ್ಗಳು ಮತ್ತು ಸುರಕ್ಷಿತ ವೆಬ್ಸೈಟ್ಗಳು ಸೇರಿದಂತೆ, ಕೆಲಸದ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮಾನಿಟರ್ ಮಾಡಲು ಅವರಿಗೆ ಅನುಮತಿಸಬಹುದು.\n\nಈ ಪ್ರಮಾಣಪತ್ರಗಳ ಕುರಿತು ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</item>
- <item quantity="other">ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ಗಾಗಿ ಪ್ರಮಾಣಪತ್ರದ ಅಂಗೀಕಾರಗಳನ್ನು <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿದೆ. ಇದು ಇಮೇಲ್ಗಳು, ಆ್ಯಪ್ಗಳು ಮತ್ತು ಸುರಕ್ಷಿತ ವೆಬ್ಸೈಟ್ಗಳು ಸೇರಿದಂತೆ, ಕೆಲಸದ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮಾನಿಟರ್ ಮಾಡಲು ಅವರಿಗೆ ಅನುಮತಿಸಬಹುದು.\n\nಈ ಪ್ರಮಾಣಪತ್ರಗಳ ಕುರಿತು ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"ಮೂರನೇ ವ್ಯಕ್ತಿಯು ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಸುರಕ್ಷಿತ ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಹೊಂದಿದ್ದಾರೆ.\n\nನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸ್ಥಾಪಿಸಲಾದ ವಿಶ್ವಾಸಾರ್ಹ ರುಜುವಾತು ಇದನ್ನು ಸಾಧ್ಯವಾಗುವಂತೆ ಮಾಡುತ್ತಿದೆ."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</item>
- <item quantity="other">ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{ಪ್ರಮಾಣಪತ್ರವನ್ನು ನಂಬಿ ಅಥವಾ ತೆಗೆದುಹಾಕಿ}one{ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ನಂಬಿ ಅಥವಾ ತೆಗೆದುಹಾಕಿ}other{ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ನಂಬಿ ಅಥವಾ ತೆಗೆದುಹಾಕಿ}}"</string>
<string name="device_status" msgid="8266002761193692207">"ಸ್ಥಿತಿ"</string>
<string name="device_status_summary" msgid="3270932829412434985">"ನೆಟ್ವರ್ಕ್, ಕ್ರಮ ಸಂಖ್ಯೆಗಳು ಮತ್ತು ಇತರ ಮಾಹಿತಿ"</string>
<string name="manual" msgid="5683935624321864999">"ಹಸ್ತಚಾಲಿತ"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"ಸಂಪರ್ಕಪಡಿಸು"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"ನೆಟ್ವರ್ಕ್ ಮರೆತುಬಿಡು"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"ಇದು ಉಳಿಸಲಾಗಿರುವ ಪಾಸ್ವರ್ಡ್ ಸೇರಿದಂತೆ, ಈ ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕಿಸಲು ಬಳಸಲಾಗಿರುವ ಮಾಹಿತಿಯನ್ನು ತೆರವುಗೊಳಿಸುತ್ತದೆ."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"ನಿಮ್ಮ ಮೊಬೈಲ್ ಫೋನ್ ಸಹಾಯದಿಂದ QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡುವ ಮೂಲಕ ವೈಫೈಗೆ ಸೇರಿ ಹಾಗೂ ಸೂಚನೆಯನ್ನು ಅನುಸರಿಸಿ."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" ನಿಮ್ಮ ಮೊಬೈಲ್ ಫೋನ್ ಸಹಾಯದಿಂದ QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡುವ ಮೂಲಕ ವೈಫೈಗೆ ಸೇರಿ ಹಾಗೂ ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ.\n \n "<b>"Android ಫೋನ್ನಿಂದ"</b>" ಸೆಟ್ಟಿಂಗ್ಗಳು -> ನೆಟ್ವರ್ಕ್ & ಇಂಟರ್ನೆಟ್ -> ವೈ-ಫೈ -> ವೈ-ಫೈ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ -> ಸುಧಾರಿತ -> ಸಾಧನವನ್ನು ಸೇರಿಸಿ ಮತ್ತು ನಂತರ QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿ ಆಯ್ಕೆಗೆ ಹೋಗಿ."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"ರದ್ದುಗೊಳಿಸಲು, ಹಿಂದಿರುಗು ಬಟನ್ ಅನ್ನು ಒತ್ತಿ"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ಸರಿ"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"ಮುಂದುವರಿಸಿ"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"ಸಾಧನ ಸಂಗ್ರಹಣೆ"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"ತೆಗೆದು ಹಾಕಬಹುದಾದ ಸಂಗ್ರಹಣೆ"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"ಮರುಹೊಂದಿಸು"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"ಸಂಗ್ರಹಣೆಯನ್ನು ಮುಕ್ತಗೊಳಿಸಿ"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"ಕ್ಯಾಷ್ ಮಾಡಿದ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> ಮುಕ್ತಗೊಳಿಸಿ"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"ಸ್ಥಳವನ್ನು ಬಳಸುವ ತಾತ್ಕಾಲಿಕ ಫೈಲ್ಗಳನ್ನು ತೆರವುಗೊಳಿಸುತ್ತದೆ. ಇದು ಆ್ಯಪ್ನ ಆದ್ಯತೆಗಳು ಅಥವಾ ಆಫ್ಲೈನ್ ವೀಡಿಯೊಗಳಂತಹ ಉಳಿಸಿದ ಡೇಟಾದ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ ಮತ್ತು ನೀವು ಮತ್ತೊಮ್ಮೆ ಆ್ಯಪ್ಗಳಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡಬೇಕಾಗುವುದಿಲ್ಲ."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"ಕ್ಯಾಷ್ ಮಾಡಿದ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಬೇಕೇ?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"ಇದು ಆ್ಯಪ್ಗಳ ಕ್ಯಾಷ್ ಮಾಡಿದ ಡೇಟಾ ತೆರವುಗೊಳಿಸುತ್ತದೆ."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"ಆ್ಯಪ್ಗಳನ್ನು ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> ಅಳವಡಿಸಲಾಗಿದೆ"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> ಅಳವಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB ಸಂಗ್ರಹಣೆಯನ್ನು ಮರುಸಂಪರ್ಕಿಸಲಾಗಿದೆ"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"ಮೈಕ್ರೊಫೋನ್"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"ಮೈಕ್ರೊಫೋನ್ ಪ್ರವೇಶದ ಅನುಮತಿ"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"ಮೈಕ್ರೊಫೋನ್ಗೆ ಆ್ಯಪ್ನ ಪ್ರವೇಶ"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"ಮೈಕ್ರೊಫೋನ್ ಪ್ರವೇಶವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"ನಿರ್ಬಂಧವನ್ನು ತೆಗೆದುಹಾಕಲು, ಮೈಕ್ರೊಫೋನ್ಗೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸುವುದಕ್ಕಾಗಿ ನಿಮ್ಮ ಸಾಧನದ ಗೌಪ್ಯತೆ ಸ್ವಿಚ್ ಅನ್ನು ಮೈಕ್ರೊಫೋನ್ ಆನ್ ಸ್ಥಾನಕ್ಕೆ ಸರಿಸಿ."</string>
<string name="camera" msgid="1226671478936288283">"ಕ್ಯಾಮರಾ"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"ಕ್ಯಾಮರಾ ಪ್ರವೇಶದ ಅನುಮತಿ"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"ಕ್ಯಾಮರಾಗೆ ಆ್ಯಪ್ನ ಪ್ರವೇಶ"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"ಕ್ಯಾಮರಾ ಪ್ರವೇಶವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"ನಿರ್ಬಂಧವನ್ನು ತೆಗೆದುಹಾಕಲು, ಕ್ಯಾಮರಾಗೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸುವುದಕ್ಕಾಗಿ ನಿಮ್ಮ ಸಾಧನದ ಗೌಪ್ಯತೆ ಸ್ವಿಚ್ ಅನ್ನು ಕ್ಯಾಮರಾ ಆನ್ ಸ್ಥಾನಕ್ಕೆ ಸರಿಸಿ."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"ಮೈಕ್ರೊಫೋನ್ ಪ್ರವೇಶದ ಅನುಮತಿ: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"ಆನ್ ಮಾಡಿದಾಗ, ಅನುಮತಿ ಹೊಂದಿರುವ ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳು ಮತ್ತು ಸೇವೆಗಳು ಈ ಸಾಧನದಲ್ಲಿನ ಯಾವುದೇ ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ಪ್ರವೇಶಿಸಬಹುದು.\n\nಈ ಸೆಟ್ಟಿಂಗ್ ಕಸ್ಟಮ್ ಪ್ರೊಟೊಕಾಲ್ ಹೊಂದಿರುವ ಆಡಿಯೋ ಬಾಹ್ಯೋಪಕರಣಗಳ ಮೇಲೆ ಯಾವುದೇ ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"ಕ್ಯಾಮರಾ ಪ್ರವೇಶದ ಅನುಮತಿ: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"ಕ್ಯಾನ್"</string>
<string name="color_yellow" msgid="3519470952904560404">"ಹಳದಿ"</string>
<string name="color_magenta" msgid="2377854703399624607">"ಮಜೆಂತಾ"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"ಆಡಿಯೋ ವಿವರಣೆ"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"ಬೆಂಬಲಿತ ಚಲನಚಿತ್ರಗಳು ಮತ್ತು ಶೋಗಳಲ್ಲಿ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಏನಾಗುತ್ತಿದೆ ಎಂಬುದರ ವಿವರಣೆಯನ್ನು ಕೇಳಿ"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"ಸಕ್ರಿಯಗೊಳಿಸು"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"ಕಾನ್ಫಿಗರೇಶನ್"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> ಬಳಸುವುದೇ?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"ಪರಿವೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="system_apps" msgid="8481888654606868074">"ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"ಎಚ್ಚರವಾಗಿರುವಿಕೆ"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"ಸ್ಕ್ರೀನ್ ಎಂದಿಗೂ ಸ್ಲೀಪ್ ಮೋಡ್ಗೆ ಹೋಗುವುದಿಲ್ಲ"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP ಪರೀಕ್ಷಿಸುವಿಕೆ"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI ಆಪ್ಟಿಮೈಸೇಶನ್"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"ಈಗ ಮರುಪ್ರಾರಂಭಿಸುವುದೇ?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"ಟಿವಿ ಜೊತೆ HDMI ಸಾಧನಗಳ ಪವರ್ ಆಫ್ ಮಾಡಿ"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"ಟಿವಿ ಸ್ವಯಂ ಪವರ್ ಆನ್"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI ಸಾಧನದೊಂದಿಗೆ ಟಿವಿ ಪವರ್ ಆನ್ ಮಾಡಿ"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">ಸಂಪರ್ಕಪಡಿಸಿರುವ ಇನ್ಪುಟ್ಗಳು</item>
- <item quantity="other">ಸಂಪರ್ಕಪಡಿಸಿರುವ ಇನ್ಪುಟ್ಗಳು</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">ಸ್ಟ್ಯಾಂಡ್ಬೈ ಇನ್ಪುಟ್ಗಳು</item>
- <item quantity="other">ಸ್ಟ್ಯಾಂಡ್ಬೈ ಇನ್ಪುಟ್ಗಳು</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">ಸಂಪರ್ಕಪಡಿಸದಿರುವ ಇನ್ಪುಟ್ಗಳು</item>
- <item quantity="other">ಸಂಪರ್ಕಪಡಿಸದಿರುವ ಇನ್ಪುಟ್ಗಳು</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{ಕನೆಕ್ಟ್ ಮಾಡಲಾದ ಇನ್ಪುಟ್}one{ಕನೆಕ್ಟ್ ಮಾಡಲಾದ ಇನ್ಪುಟ್ಗಳು}other{ಕನೆಕ್ಟ್ ಮಾಡಲಾದ ಇನ್ಪುಟ್ಗಳು}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{ಸ್ಟ್ಯಾಂಡ್ಬೈ ಇನ್ಪುಟ್}one{ಸ್ಟ್ಯಾಂಡ್ಬೈ ಇನ್ಪುಟ್ಗಳು}other{ಸ್ಟ್ಯಾಂಡ್ಬೈ ಇನ್ಪುಟ್ಗಳು}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{ಕನೆಕ್ಟ್ ಮಾಡಿರದ ಇನ್ಪುಟ್}one{ಕನೆಕ್ಟ್ ಮಾಡಿರದ ಇನ್ಪುಟ್ಗಳು}other{ಕನೆಕ್ಟ್ ಮಾಡಿರದ ಇನ್ಪುಟ್ಗಳು}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"ನಿಮ್ಮ ಖಾತೆಯಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಇತರ ವಿಷಯಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ನಿರ್ಬಂಧಿಸಿ"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"ನಿರ್ಬಂಧಿಸಿದ ಪ್ರೊಫೈಲ್"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> ಮೂಲಕ ನಿಯಂತ್ರಿಸಲಾಗುತ್ತದೆ"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"ನಿರ್ಬಂಧಿಸಿದ ಪ್ರೊಫೈಲ್ ರಚಿಸಿ"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"ಅನುಮತಿಸಲಾದ ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ</item>
- <item quantity="other">%d ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"ಅನುಮತಿಸಲಾಗಿದೆ"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"ನಿರ್ಬಂಧಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಿ"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"ಥರ್ಡ್ ಪಾರ್ಟಿಯ ಮೂಲ"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"ಅನುಮತಿಗಳು"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"ಅಪ್ಲಿಕೇಶನ್ ಲಭ್ಯವಿಲ್ಲ"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"ಬಳಕೆಯಾಗದ ಆ್ಯಪ್ಗಳು"</string>
<string name="settings_ok" msgid="5950888975075541964">"ಸರಿ"</string>
<string name="settings_confirm" msgid="4489126458677153411">"ಖಚಿತಪಡಿಸಿ"</string>
<string name="settings_cancel" msgid="576094334743686152">"ರದ್ದುಮಾಡಿ"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"ಈ ಅನುಮತಿಯು ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="write_settings_on" msgid="71675710746513956">"ಹೌದು"</string>
<string name="write_settings_off" msgid="6730113471695092167">"ಇಲ್ಲ"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"ಎಲ್ಲಾ ಫೈಲ್ಗಳ ಪ್ರವೇಶ"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"ಎಲ್ಲಾ ಫೈಲ್ ನಿರ್ವಹಿಸಲು, ಪ್ರವೇಶಕ್ಕೆ ಅನುಮತಿಸಿ"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"ಈ ಸಾಧನ ಅಥವಾ ಕನೆಕ್ಟ್ ಮಾಡಿದ ಶೇಖರಣಾ ವಾಲ್ಯೂಮ್ಗಳಲ್ಲಿ ಎಲ್ಲಾ ಫೈಲ್ಗಳನ್ನು ಓದಲು, ಮಾರ್ಪಡಿಸಲು ಮತ್ತು ಅಳಿಸಲು ಈ ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸಿ. ಅನುಮತಿಸಿದರೆ, ಬಳಕೆದಾರರ ಪೂರ್ವಾನುಮತಿ ಇಲ್ಲದೆ ಆ್ಯಪ್ಗಳು ಫೈಲ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಬಹುದು."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರಕ್ಕೆ ಅನುಮತಿಸಿ"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"ಯಾವುದೇ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿದ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರವನ್ನು ಬೆಂಬಲಿಸುತ್ತಿಲ್ಲ"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"ಅಪ್ಲಿಕೇಶನ್ ತೆರೆದೇ ಇರುವಾಗ ಅಥವಾ ನೀವು ಈ ಅಪ್ಲಿಕೇಶನ್ ತೊರೆದ ಬಳಿಕ (ಉದಾಹರಣೆಗೆ, ವೀಡಿಯೊ ವೀಕ್ಷಿಸುವುದನ್ನು ಮುಂದುವರಿಸಲು), ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ ವಿಂಡೋ ರಚಿಸಲು ಈ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಅನುಮತಿ ನೀಡಿ. ನೀವು ಬಳಸುತ್ತಿರುವ ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಮೇಲೆ ಈ ವಿಂಡೋ ಡಿಸ್ಪ್ಲೇ ಆಗುತ್ತದೆ."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"ಅಲಾರಂಗಳನ್ನು ಸೆಟ್ ಮಾಡಲು ಮತ್ತು ಸಮಯ-ಸೂಕ್ಷ್ಮ ಈವೆಂಟ್ಗಳನ್ನು ನಿಗದಿಪಡಿಸಲು ಆ್ಯಪ್ಗಳಿಗೆ ಅನುಮತಿಸಿ. ಇದು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗಲು ಆ್ಯಪ್ಗಳಿಗೆ ಅನುಮತಿಸುತ್ತದೆ, ಅದರಿಂದ ಹೆಚ್ಚಿನ ಪವರ್ ಬಳಕೆಯಾಗಬಹುದು.\n\nಈ ಅನುಮತಿ ಆಫ್ ಆಗಿದ್ದರೆ, ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಅಲಾರಂಗಳು ಮತ್ತು ಈ ಆ್ಯಪ್ ನಿಗದಿಪಡಿಸಿದ ಸಮಯ-ಸೂಕ್ಷ್ಮ ಈವೆಂಟ್ಗಳು ಕೆಲಸ ಮಾಡುವುದಿಲ್ಲ."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"ಸ್ಕ್ರೀನ್ ಅನ್ನು ಆನ್ ಮಾಡಿ"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"ಸ್ಕ್ರೀನ್ ಅನ್ನು ಆನ್ ಮಾಡಲು ಅನುಮತಿಸಿ"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"ಸ್ಕ್ರೀನ್ ಅನ್ನು ಆನ್ ಮಾಡಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸಿ. ಅನುಮತಿಸಿದರೆ, ನಿಮ್ಮ ಅಗತ್ಯವಿಲ್ಲದಿದ್ದಾಗಲೂ ಆ್ಯಪ್ ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಆನ್ ಮಾಡಬಹುದು."</string>
<string name="special_access" msgid="21806055758289916">"ವಿಶೇಷ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರವೇಶ"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"ಆಡಿಯೋ"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"ಡೇಟಾ ಸೇವರ್"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"ಕಡಿಮೆ ಮೊಬೈಲ್ ಡೇಟಾ ಬಳಸಲು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವೀಡಿಯೊ ಗುಣಮಟ್ಟವನ್ನು ಹೊಂದಿಸಿ"</string>
<string name="title_data_alert" msgid="8262081890052682475">"ಡೇಟಾ ಬಳಕೆ ಮತ್ತು ಅಲರ್ಟ್ಗಳು"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"ವೈ-ಫೈ, ಇಥರ್ನೆಟ್ ಅಥವಾ ನಿಮ್ಮ ಫೋನ್ನ ಹಾಟ್ಸ್ಪಾಟ್ ಮೂಲಕ ನೀವು ಇಂಟರ್ನೆಟ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಬಹುದು. ಹೆಚ್ಚಿನ ಸಹಾಯಕ್ಕಾಗಿ, "<b>"g.co/network"</b>" ಗೆ ಭೇಟಿ ನೀಡಿ."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"ವೈ-ಫೈ, ಇಥರ್ನೆಟ್ ಅಥವಾ ನಿಮ್ಮ ಫೋನ್ನ ಹಾಟ್ಸ್ಪಾಟ್ ಮೂಲಕ ನೀವು ಇಂಟರ್ನೆಟ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಬಹುದು."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"ಚಟುವಟಿಕೆಯನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"ವಾಲ್ಯೂಮ್ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"ವಿದ್ಯುತ್ & ಶಕ್ತಿ"</string>
<string name="power_on_behavior" msgid="927607372303160716">"ಪವರ್ ಆನ್ ನಡವಳಿಕೆ"</string>
<string name="reset_options_title" msgid="7632580482285108955">"ಮರುಹೊಂದಿಸಿ"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"ಇಥರ್ನೆಟ್ ಜೋಡಣೆ ಕೋಡ್"</string>
</resources>
diff --git a/Settings/res/values-ko/strings.xml b/Settings/res/values-ko/strings.xml
index cee0675..44e303e 100644
--- a/Settings/res/values-ko/strings.xml
+++ b/Settings/res/values-ko/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"계정 추가"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"계정 및 로그인"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"계정 없음"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other">계정 <xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g>개</item>
- <item quantity="one">계정 <xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g>개</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{계정 #개}other{계정 #개}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"미디어 서비스, 어시스턴트, 결제"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"네트워크 및 인터넷"</string>
<string name="sound_category_title" msgid="7899816751041939518">"소리"</string>
<string name="applications_category_title" msgid="7112019490898586223">"앱"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"기기 환경설정"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"리모컨 및 액세서리"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"연결된 블루투스 기기 없음"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other">액세서리 <xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g>개</item>
- <item quantity="one">액세서리 <xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g>개</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"화면 및 소리"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"고객센터"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"개인정보 보호"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"초기화"</string>
<string name="device_calibration" msgid="2907914144048739705">"보정"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"에너지 절약"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"기기"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"형식 선택"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"서라운드 사운드"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"사용 설정된 형식"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"사용 중지된 형식"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"사용 중지하려면 형식 선택을 수동 모드로 변경하세요."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"해상도"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"자동"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"해상도 변경됨"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"지금부터 %1$s 해상도를 사용하려면 확인을 선택하세요."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"취소"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"확인"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"캐시된 데이터를 지우시겠습니까?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"모든 앱의 캐시된 데이터가 지워집니다."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"액세서리 추가"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"페어링 중..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"연결 중…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"액세서리"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"리모컨"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"리모컨 설정"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"리모컨 버튼 설정"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"TV, 수신기 및 사운드바의 볼륨, 전원, 입력을 제어합니다."</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"연결"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s에 연결하세요"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"연결 해제"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"사용 불가"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"기기 관리자 앱"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"활성 앱 없음"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"관리자, 암호화 정책 또는 사용자 인증 정보 저장소에 의해 사용 중지됨"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"관리 기기 정보"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"조직에서 관리하는 변경사항 및 설정"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"없음"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"설치된 앱"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"앱의 수는 추정치입니다. Play 스토어 이외의 출처에서 설치된 앱은 포함되지 않을 수도 있습니다."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{앱 최소 #개}other{앱 최소 #개}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"위치 정보 액세스 권한"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"마이크 사용 권한"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"카메라 사용 권한"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"기본 앱"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{앱 #개}other{앱 #개}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"기본 키보드"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g>(으)로 설정"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"연결 유지 VPN 사용 설정됨"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"신뢰할 수 있는 사용자 인증 정보"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"개인 프로필에서 신뢰할 수 있는 사용자 인증 정보"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"직장 프로필에서 신뢰할 수 있는 사용자 인증 정보"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">CA 인증서 최소 <xliff:g id="COUNT_1">%d</xliff:g>개</item>
- <item quantity="one">CA 인증서 최소 <xliff:g id="COUNT_0">%d</xliff:g>개</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{CA 인증서 #개}other{CA 인증서 #개}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"관리자는 기기를 잠그고 비밀번호를 재설정할 수 있음"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"관리자는 모든 기기 데이터를 삭제할 수 있습니다."</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"기기의 데이터가 모두 삭제되는 비밀번호 입력 시도 실패 횟수"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"직장 프로필 데이터가 삭제되는 비밀번호 입력 시도 실패 횟수"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{#회 시도}other{#회 시도}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"조직에서 관리하는 기기입니다."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>에서 관리하는 기기입니다."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"자세히 알아보기"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">카메라 앱</item>
- <item quantity="one">카메라 앱</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{카메라 앱}other{카메라 앱}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"캘린더 앱"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"연락처 앱"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">이메일 클라이언트 앱</item>
- <item quantity="one">이메일 클라이언트 앱</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{이메일 클라이언트 앱}other{이메일 클라이언트 앱}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"지도 앱"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">전화 앱</item>
- <item quantity="one">전화 앱</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{전화 앱}other{전화 앱}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"브라우저 앱"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS 버전"</string>
<string name="about_serial" msgid="3432319328808745459">"일련번호"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS 빌드"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{개발자 설정 완료까지 #단계 남았습니다.}other{개발자 설정 완료까지 #단계 남았습니다.}}"</string>
<string name="about_ads" msgid="7662896442040086522">"광고"</string>
<string name="ads_description" msgid="8081069475265061074">"광고 ID 재설정 등의 광고 설정을 관리합니다."</string>
<string name="ads_content_description" msgid="1006489792324920289">"광고, 광고 ID 재설정 등의 광고 설정을 관리합니다."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"추가 시스템 업데이트"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"네트워크가 모니터링될 수 있음"</string>
<string name="done_button" msgid="616159688526431451">"완료"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">인증서 신뢰 또는 삭제</item>
- <item quantity="one">인증서 신뢰 또는 삭제</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>에서 기기에 CA 인증서를 설치했으며, 인증서를 통해 관리자가 이메일, 앱, 보안 웹사이트를 포함한 내 기기의 네트워크 활동을 모니터링할 수 있습니다.\n\n이 인증서에 관해 자세히 알아보려면 관리자에게 문의하세요.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g>에서 내 기기에 CA 인증서를 설치했으며, 인증서를 통해 관리자가 이메일, 앱, 보안 웹사이트를 포함한 내 기기의 네트워크 활동을 모니터링할 수 있습니다.\n\n이 인증서에 관해 자세히 알아보려면 관리자에게 문의하세요.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>에서 내 직장 프로필에 CA 인증서를 설치했으며, 인증서를 통해 관리자가 이메일, 앱, 보안 웹사이트를 포함한 내 직장 프로필의 네트워크 활동을 모니터링할 수 있습니다.\n\n이 인증서에 관해 자세히 알아보려면 관리자에게 문의하세요.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g>에서 내 직장 프로필에 CA 인증서를 설치했으며, 인증서를 통해 관리자가 이메일, 앱, 보안 웹사이트를 포함한 내 직장 프로필의 네트워크 활동을 모니터링할 수 있습니다.\n\n이 인증서에 관해 자세히 알아보려면 관리자에게 문의하세요.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"기기에 신뢰할 수 있는 자격증명이 설치되어 있기 때문에\n제3자가 이메일, 앱, 보안 웹사이트를 포함한 네트워크 활동을 모니터링 할 수 있습니다.\n"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">인증서 확인</item>
- <item quantity="one">인증서 확인</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{인증서 신뢰 또는 삭제}other{인증서 신뢰 또는 삭제}}"</string>
<string name="device_status" msgid="8266002761193692207">"상태"</string>
<string name="device_status_summary" msgid="3270932829412434985">"네트워크, 일련번호 및 기타 정보"</string>
<string name="manual" msgid="5683935624321864999">"수동"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"연결"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"네트워크 저장 안함"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"저장된 비밀번호를 비롯하여 이 네트워크에 연결하는 데 사용된 정보가 삭제됩니다."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Wi-Fi에 연결하려면 휴대전화에서 QR 코드를 스캔하고 안내를 따르세요."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" 휴대전화에서 QR 코드를 스캔하여 Wi-Fi에 연결하고 안내에 따르세요.\n \n "<b>"Android 휴대전화"</b>"에서 설정 -> 네트워크 및 인터넷 -> Wi-Fi -> Wi-Fi 선택 -> 고급 -> 기기 추가로 이동한 다음 QR 코드를 스캔하세요."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"취소하려면 뒤로 버튼을 누르세요."</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"확인"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"계속"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"기기 저장용량"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"이동식 저장소"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"재설정"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"여유 공간 확보"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"캐시된 데이터 지우기"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> 확보"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"용량을 차지하는 임시 파일을 지웁니다. 앱 환경설정이나 오프라인 동영상 등의 저장된 데이터는 영향을 받지 않으며 다시 앱에 로그인하지 않아도 됩니다"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"캐시된 데이터를 지우시겠습니까?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"모든 앱의 캐시된 데이터가 지워집니다"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"앱 제거"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g>이(가) 마운트되었습니다."</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g>을(를) 마운트하지 못했습니다."</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB 저장소 다시 연결됨"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"마이크"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"마이크 액세스"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"앱의 마이크 액세스 권한"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"마이크 액세스 차단됨"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"차단을 해제하려면 기기에서 마이크에 대한 개인 정보 보호 스위치를 켜짐 위치에 놓아 마이크 액세스를 허용합니다."</string>
<string name="camera" msgid="1226671478936288283">"카메라"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"카메라 액세스"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"앱의 카메라 액세스 권한"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"카메라 액세스 차단됨"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"차단을 해제하려면 기기에서 카메라에 대한 개인 정보 보호 스위치를 켜짐 위치에 놓아 카메라 액세스를 허용합니다."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"마이크 액세스: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"옵션을 사용 설정하면 권한을 부여받은 모든 앱 및 서비스가 기기의 마이크에 모두 액세스할 수 있습니다.\n\n맞춤 프로토콜이 지정된 오디오 주변기기는 설정의 영향을 받지 않습니다."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"카메라 액세스: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"청록색"</string>
<string name="color_yellow" msgid="3519470952904560404">"노란색"</string>
<string name="color_magenta" msgid="2377854703399624607">"자홍색"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"오디오 설명"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"지원되는 영화 및 TV 프로그램에서 상황에 대한 설명을 음성으로 들으세요."</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"사용"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"설정"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> 사용"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"모니터링"</string>
<string name="system_apps" msgid="8481888654606868074">"앱"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"켜진 상태로 유지"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"화면이 절전 모드로 변경되지 않습니다."</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP 확인"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI 최적화"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"지금 다시 시작하시겠습니까?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"TV로 HDMI 기기 종료"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV 자동 켜기"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI 기기로 TV 전원 켜기"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">연결된 입력</item>
- <item quantity="one">연결된 입력</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">대기 입력</item>
- <item quantity="one">대기 입력</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">연결되지 않은 입력</item>
- <item quantity="one">연결되지 않은 입력</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{연결된 입력}other{연결된 입력}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{대기 입력}other{대기 입력}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{연결되지 않은 입력}other{연결되지 않은 입력}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"내 계정의 앱 및 기타 콘텐츠에 대한 액세스 제한"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"제한된 프로필"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g>에 의해 제어됨"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"제한된 프로필 만들기"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"설정"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"허용된 앱"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d개 앱 허용됨</item>
- <item quantity="one">1개 앱 허용됨</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"허용됨"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"허용되지 않음"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"제한 맞춤설정"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"제3자 출처"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"권한"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"사용할 수 없는 애플리케이션"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"사용하지 않는 앱"</string>
<string name="settings_ok" msgid="5950888975075541964">"확인"</string>
<string name="settings_confirm" msgid="4489126458677153411">"확인"</string>
<string name="settings_cancel" msgid="576094334743686152">"취소"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"이 권한은 앱이 시스템 설정을 수정하도록 허용합니다."</string>
<string name="write_settings_on" msgid="71675710746513956">"예"</string>
<string name="write_settings_off" msgid="6730113471695092167">"아니요"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"모든 파일에 액세스"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"모든 파일 관리 허용"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"앱이 이 기기 또는 연결된 모든 저장장치에 있는 파일을 모두 읽고 수정하고 삭제하도록 허용합니다. 권한을 부여하면 앱이 나에게 명시적으로 알리지 않고도 파일에 액세스할 수 있습니다."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"PIP 모드"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"PIP 모드 허용"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"PIP 모드를 지원하는 앱이 설치되지 않았습니다."</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"앱이 열려 있을 때나 사용자가 앱에서 나갔을 때 앱에서 PIP 창을 표시하도록 허용합니다(예: 동영상 시청을 계속하기 위해). 이 창은 사용 중인 다른 앱 위에 표시됩니다."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"앱에서 알람을 설정하고 시간 기반 작업을 예약할 수 있도록 허용합니다. 이렇게 하면 백그라운드에서 앱 실행이 허용되어 전원 사용량이 증가할 수 있습니다.\n\n이 권한을 사용 중지하면 앱에서 예약한 기존의 알람 및 시간 기반 일정이 작동하지 않습니다."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"화면 켜기"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"화면 켜기 허용"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"앱에서 화면을 켜도록 허용합니다. 권한이 부여된 경우 앱에서 명시적 인텐트 없이 언제든지 화면을 켤 수 있습니다."</string>
<string name="special_access" msgid="21806055758289916">"특수 앱 액세스"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"오디오"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"데이터 절약 모드"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"모바일 데이터를 절약하기 위해 동영상 품질을 자동 조정합니다."</string>
<string name="title_data_alert" msgid="8262081890052682475">"데이터 사용량 및 알림"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Wi-Fi, 이더넷 또는 휴대전화의 핫스팟으로 인터넷에 연결할 수 있습니다. 도움이 필요한 경우 "<b>"g.co/network"</b>"를 참조하세요."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Wi-Fi, 이더넷 또는 휴대전화의 핫스팟으로 인터넷에 연결할 수 있습니다"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"허용되지 않는 작업"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"볼륨을 변경할 수 없음"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"전원 및 에너지"</string>
<string name="power_on_behavior" msgid="927607372303160716">"전원이 켜질 때 동작"</string>
<string name="reset_options_title" msgid="7632580482285108955">"초기화"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"이더넷 페어링 코드"</string>
</resources>
diff --git a/Settings/res/values-ky/strings.xml b/Settings/res/values-ky/strings.xml
index ab6a9ff..693a4b0 100644
--- a/Settings/res/values-ky/strings.xml
+++ b/Settings/res/values-ky/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Аккаунт кошуу"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Аккаунтар жана кирүү"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Аккаунттар жок"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> аккаунт</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> аккаунт</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# аккаунт}other{# аккаунт}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Медиа кызматтары, Жардамчы, Төлөмдөр"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Тармак жана Интернет"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Үн"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Колдонмолор"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Түзмөктүн параметрлери"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Пульттар жана Көмөкчү жабдыктар"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Туташкан Bluetooth түзмөктөрү жок"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> көмөкчү жабдык</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> көмөкчү жабдык</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Дисплей жана добуш"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Жардам жана пикир билдирүү"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Купуялык"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Баштапкы абалга кайтаруу"</string>
<string name="device_calibration" msgid="2907914144048739705">"Калибрдөө аяктады"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Кубатты үнөмдөгүч"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Түзмөктөр"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Форматтарды тандоо"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Көлөмдүү үн"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ИШТЕТИЛГЕН ФОРМАТТАР"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ӨЧҮРҮЛГӨН ФОРМАТТАР"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Өчүрүү үчүн форматты Кол менен тандоого өзгөртүңүз."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Дааналык"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Автоматтык"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Резолюция өзгөртүлдү"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Мындан ары %1$s колдонуу үчүн \"Жарайт\" баскычын басыңыз."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Жокко чыгаруу"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Макул"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Герц"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Кеш берилиштери тазалансынбы?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Бул бардык колдонмолордун кештелген берилиштерин тазалайт."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Көмөкчү жабдык кошуу"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Жупташууда…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Туташууда…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Көмөкчү жабдыктар"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Пульт"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Пульттун жөндөөлөрү"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Пульттун баскычтарын жөндөө"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Сыналгыларда, ресиверлерде жана үн такталарында үндүн катуулугун, күйгүзүү/өчүрүүнү жана киргизүүнү башкаруу"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Туташтыруу"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s түзмөгүнө туташуу"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Ажыратуу"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Жеткиликсиз"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Түзмөктү башкарган колдонмолор"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Активдүү колдонмолор жок"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Администратор же башка эрежелер б-ча тыюу салынган"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Башкарылган түзмөк жөнүндө маалымат"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Өзгөртүүлөр жана жөндөөлөр уюмуңуз тарабынан башкарылат"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Жок"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Орнотулган колдонмолор"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Колдонмолордун саны болжол менен көрсөтүлгөн. Play Дүкөндөн тышкары булактардан орнотулган колдонмолор бул жерге кошулбайт."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Кеминде # колдонмо}other{Кеминде # колдонмо}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Жайгашкан жер жөнүндө маалыматты пайдалануучу колдонмолор"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Микрофонду пайдалануучу колдонмолор"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Камераны пайдалануучу колдонмолор"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Демейки колдонмолор"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# колдонмо}other{# колдонмо}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Демейки баскычтоп"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> деп коюлду"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Туруктуу VPN күйгүзүлдү"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Ишенимдүү эсептик дайындар"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Жеке профилиңиздеги ишенимдүү эсептик дайындар"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Жумуш профилиңиздеги ишенимдүү эсептик дайындар"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item 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="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{Тастыктоочу борбордун (ТБ) # тастыктамасы}other{Тастыктоочу борбордун (ТБ) # тастыктамасы}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Администратор түзмөктү кулпулап, сырсөздү баштапкы абалга келтире алат"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Администратор түзмөктүн бардык дайындарын жок кыла алат"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Сырсөздү бир нече жолу ката киргизгенден кийин түзмөктөгү бардык маалыматтар өчүрүлөт"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Сырсөздү бир нече жолу ката киргизгенден кийин жумуш профилиндеги бардык маалыматтар өчүрүлөт"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# аракет}other{# аракет}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Бул түзмөк уюмуңуз тарабынан башкарылат."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Бул түзмөк <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> тарабынан башкарылат."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Кеңири маалымат"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Камера колдонмолору</item>
- <item quantity="one">Камера колдонмосу</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Камера колдонмосу}other{Камера колдонмолору}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Жылнаама колдонмосу"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Байланыштар колдонмосу"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Электрондук почта кардарлары</item>
- <item quantity="one">Электрондук почта кардары</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Электрондук почта кардары}other{Электрондук почта кардарлары}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Карта колдонмосу"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Телефон колдонмолору</item>
- <item quantity="one">Телефон колдонмосу</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Телефон колдонмосу}other{Телефон колдонмолору}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Серепчи колдонмосу"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS версиясы"</string>
<string name="about_serial" msgid="3432319328808745459">"Сериялык номери"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS куралышы"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{Сиздин иштеп чыгуучу болушуңузга # кадам калды}other{Сиздин иштеп чыгуучу болушуңузга # кадам калды}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Жарнамалар"</string>
<string name="ads_description" msgid="8081069475265061074">"Жарнама жөндөөлөрүн башкарып, жарнама идентификаторун баштапкы абалга келтирүү сыяктуу аракеттерди аткара аласыз."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Жарнамалар. Жарнама жөндөөлөрүн башкарып, жарнама идентификаторун баштапкы абалга келтирүү сыяктуу аракеттерди аткара аласыз."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Кошумча тутум жаңыртуулары"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Желе көзөмөлдөнүшү мүмкүн"</string>
<string name="done_button" msgid="616159688526431451">"Даяр"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Тастыктамаларды кабыл алыңыз же өчүрүп салыңыз</item>
- <item quantity="one">Тастыктаманы кабыл алыңыз же өчүрүп салыңыз</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> доменинин администратору түзмөгүңүзгө ТБнын тастыктамасын орнотту. Ушуну менен ал түзмөктөгү аракеттериңизге, электрондук почтанын жана колдонмолордун пайдаланылышына, ошондой эле кандай веб-сайттарга кирип жатканыңызды көзөмөлдөп турат.\n\nБул тастыктамалар тууралуу кошумча маалымат алуу үчүн администраторуңузга кайрылыңыз.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> доменинин администратору түзмөгүңүзгө ТБнын тастыктамасын орнотту. Ушуну менен ал түзмөктөгү аракеттериңизге, электрондук почтанын жана колдонмолордун пайдаланылышына, ошондой эле кандай веб-сайттарга кирип жатканыңызды көзөмөлдөп турат.\n\nБул тастыктама тууралуу кошумча маалымат алуу үчүн администраторуңузга кайрылыңыз.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> доменинин администратору жумуш профилиңизге ТБнын тастыктамасын орнотту. Ушуну менен ал жумуш тармагындагы аракеттериңизге, электрондук почтанын жана колдонмолордун пайдаланылышына, ошондой эле кандай веб-сайттарга кирип жатканыңызды көзөмөлдөп турат.\n\nБул тастыктамалар тууралуу кошумча маалымат алуу үчүн администраторуңузга кайрылыңыз.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> доменинин администратору жумуш профилиңизге ТБнын тастыктамасын орнотту. Ушуну менен ал жумуш тармагындагы аракеттериңизге, электрондук почтанын жана колдонмолордун пайдаланылышына, ошондой эле кандай веб-сайттарга кирип жатканыңызды көзөмөлдөп турат.\n\nБул тастыктама тууралуу кошумча маалымат алуу үчүн администраторуңузга кайрылыңыз.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Үчүнчү тараптар сиздин желедеги иш-аракеттериңизди, анын ичинде эмейлдер, колдонмолор жана корголгон вебсайттарды көзөмөл кыла алышат.\n\nБул, түзмөгүңүзгө ишенимдүү сертификаттарды орнотуу аркылуу мүмкүн болот."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Тастыктамаларды текшерүү</item>
- <item quantity="one">Тастыктаманы текшерүү</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Тастыктаманы кабыл алыңыз же өчүрүп салыңыз}other{Тастыктамаларды кабыл алыңыз же өчүрүп салыңыз}}"</string>
<string name="device_status" msgid="8266002761193692207">"Абал"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Тармак, серия номери жана башка маалымат"</string>
<string name="manual" msgid="5683935624321864999">"Кол менен"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Туташуу"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Тармак унутулсун"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Ушуну менен бул тармакка туташуу үчүн колдонулган маалымат, ошондой эле сакталган сырсөз тазаланат"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Мобилдик телефонуңуздагы QR кодун скандап жана нускамаларды аткарып, Wifi\'га туташыңыз."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Мобилдик телефондун камерасы менен QR кодун скандап, Wi-Fi тармагына туташып, нускамаларды аткарыңыз.\n \n "<b>"Android телефонунан"</b>" Жөндөөлөргө -> Тармак жана Интернет -> Wi-Fi -> бөлүмүнө өтүп, Wi-Fi -> Өркүндөтүлгөн -> Түзмөктү кошууну тандап, QR кодун скандаңыз."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Жокко чыгаруу үчүн \"Артка\" баскычын басыңыз"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Улантуу"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Түзмөктүн сактагычы"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Ташыма сактагыч"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Кайра коюу"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Орун бошотуңуз"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Кештелген маалыматты өчүрүү"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> бошотуу"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Орун ээлеп жаткан убактылуу файлдар өчүрүлөт. Колдонмодогу параметрлер же оффлайн видеолор сыяктуу сакталган маалыматка таасирин тийгизбейт. Колдонмолорго кайра башынан кирбейсиз."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Кештелген маалымат өчүрүлсүнбү?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Ушуну менен бардык колдонмолордун кештелген маалыматы өчүрүлөт."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Колдонмолорду чыгарып салуу"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> туташты"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> туташпай койду"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB сактагыч кайра туташтырылды"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Микрофон"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Микрофонду колдонуу"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Колдонмолордун микрофонду пайдалануу мүмкүнчүлүгү"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Микрофонду колдонуу мүмкүнчүлүгү бөгөттөлгөн"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Бөгөттөн чыгаруу үчүн түзмөктүн купуялык которгучун \"Микрофон күйүк\" абалына которуп, микрофонду колдонууга уруксат бериңиз."</string>
<string name="camera" msgid="1226671478936288283">"Камера"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Камераны колдонуу"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Колдонмолордун камераны пайдалануу мүмкүнчүлүгү"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Камераны колдонуу мүмкүнчүлүгү бөгөттөлгөн"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Бөгөттөн чыгаруу үчүн түзмөктүн купуялык которгучун \"Камера күйүк\" абалына которуп, камераны колдонууга уруксат бериңиз."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Микрофонду колдонуу: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Бул параметр күйгүзүлсө, уруксаты бар колдонмолордун жана кызматтардын баары бул түзмөктөгү микрофондорду пайдалана алат.\n\nЫңгайлаштырылган протоколу бар аудио түзмөктүн көмөкчү жабдыктарына бул жөндөө таасирин тийгизбейт."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Камераны колдонуу: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Көгүш"</string>
<string name="color_yellow" msgid="3519470952904560404">"Сары"</string>
<string name="color_magenta" msgid="2377854703399624607">"Маджента"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Аудио коштомо"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Көркөм тасмалардын жана сериалдардын коштомо жазуулары аркылуу экранда эмне болуп жатканын биле аласыз"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Иштетүү"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Конфигурация"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> колдоносузбу?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Мониторинг"</string>
<string name="system_apps" msgid="8481888654606868074">"Колдонмолор"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Ойгоо турсун"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Экран уйку режимине эч качан өтпөйт"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP текшерүү"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI ыңгайлаштыруу"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Азыр өчүрүп күйгүзүлсүнбү?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"HDMI түзмөктөрүн сыналгы менен өчүрүү"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Сыналгы кубатын авто күйгүзүү"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Сынагы кубатын HDMI түзмөгү менен күйгүзүү"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Туташкан киргизүүлөр</item>
- <item quantity="one">Туташкан киргизүү</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Күтүүдөгү киргизүүлөр</item>
- <item quantity="one">Күтүүдөгү киргизүү</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Туташпаган киргизүүлөр</item>
- <item quantity="one">Туташпаган киргизүү</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Туташкан киргизүү}other{Туташкан киргизүүлөр}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Күтүүдөгү киргизүү}other{Күтүүдөгү киргизүүлөр}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Туташпаган киргизүү}other{Туташпаган киргизүүлөр}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Аккаунтуңуздагы колдонмолорго жана башка мазмунга уруксатты чектөө"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Чектелген профиль"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> тарабынан башкарылат"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Чектелген профиль түзүү"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Жөндөөлөр"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Уруксат берилген колдонмолор"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d колдонмого уруксат бар</item>
- <item quantity="one">1 колдонмого уруксат бар</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Уруксат бар"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Уруксат жок"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Чектөөлөрдү өзгөчөлөштүрүү"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Үчүнчү тараптын булагы"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Уруксаттар"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Колдонмо жеткиликсиз"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Колдонулбаган колдонмолор"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Ырастоо"</string>
<string name="settings_cancel" msgid="576094334743686152">"Жокко чыгаруу"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Колдонмо системанын жөндөөлөрүн өзгөртө алат."</string>
<string name="write_settings_on" msgid="71675710746513956">"Ооба"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Жок"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Бардык файлдарга мүмкүнчүлүк"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Бардык файлдарды башкарууга уруксат берүү"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Бул колдонмого түзмөктөгү жана башка байланышкан сактагычтардагы бардык файлдарды көрүп, өзгөртүп жана өчүрүүгө уруксат бересизби? Колдонмо файлдарды сизге айтпай пайдалана алат."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Сүрөт ичиндеги сүрөт"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Сүрөт ичиндеги сүрөткө уруксат берүү"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Орнотулган колдонмолордун бири да сүрөт ичиндеги сүрөт функциясын колдобойт"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Колдонмо ачылып турганда же андан чыгып кеткенде (мисалы, видео көрүүнү улантуу үчүн), колдонмодо сүрөт ичиндеги сүрөт терезеси пайда болушу мүмкүн. Мындай терезе башка колдонмолордун үстүнөн көрүнөт."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Колдонмолорго ойготкучтарды коюуга жана башка аракеттерди графикке киргизүүгө уруксат берүү. Ушуну менен колдонмолор фондо иштеп, көбүрөөк кубат сарпталышы мүмкүн.\n\nЭгер бул уруксат өчүрүлсө, колдонмодогу ойготкучтар жана графикке киргизилген башка аракеттер иштебейт."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Экранды күйгүзүү"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Экранды күйгүзүүгө уруксат берүү"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Колдонмого экранды күйгүзүүгө уруксат бериңиз. Уруксат берилсе, колдонмо экранды каалаган убакта сизден уруксат сурабастан күйгүзүшү мүмкүн."</string>
<string name="special_access" msgid="21806055758289916">"Атайын мүмкүнчүлүк"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Аудио"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Трафикти үнөмдөө"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Мобилдик трафикти үнөмдөө үчүн видеонун сапатын автоматтык түрдө тууралоо"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Маалыматтардын колдонулушу жана эскертүүлөр"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Интернетке Wi-Fi, Ethernet же телефонуңуздагы байланыш түйүнү аркылуу туташа аласыз. Жардам үчүн "<b>"g.co/network"</b>" бөлүмүнө өтүңүз."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Интернетке Wi-Fi, Ethernet же телефонуңуздагы хотспот аркылуу туташа аласыз."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Аракетке тыюу салынган"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Үнү өзгөртүлбөйт"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Кубат жана энергия"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Күйүк болгондогу тартиптер"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Кайра коюу"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet жупташтыруучу коду"</string>
</resources>
diff --git a/Settings/res/values-lo/strings.xml b/Settings/res/values-lo/strings.xml
index b309be5..770072e 100644
--- a/Settings/res/values-lo/strings.xml
+++ b/Settings/res/values-lo/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"ເພີ່ມບັນຊີ"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"ບັນຊີ ແລະ ການເຂົ້າສູ່ລະບົບ"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"ບໍ່ມີບັນຊີ"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> ບັນຊີ</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> ບັນຊີ</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# ບັນຊີ}other{# ບັນຊີ}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"ບໍລິການມີເດຍ, ຜູ້ຊ່ວຍ, ການຈ່າຍເງິນ"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"ເຄືອຂ່າຍ ແລະ ອິນເຕີເນັດ"</string>
<string name="sound_category_title" msgid="7899816751041939518">"ສຽງ"</string>
<string name="applications_category_title" msgid="7112019490898586223">"ແອັບ"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"ການຕັ້ງຄ່າອຸປະກອນ"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"ຣີໂໝດ ແລະ ອຸປະກອນເສີມ"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"ບໍ່ມີອຸປະກອນ Bluetooth ທີ່ເຊື່ອມຕໍ່ໄວ້"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ອຸປະກອນເສີມ</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> ອຸປະກອນເສີມ</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ການສະແດງຜົນ ແລະ ສຽງ"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"ຊ່ວຍເຫຼືອ ແລະ ຄຳຕິຊົມ"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"ຄວາມເປັນສ່ວນຕົວ"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"ຣີເຊັດຄ່າຈາກໂຮງງານ"</string>
<string name="device_calibration" msgid="2907914144048739705">"ການປັບທຽບ"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"ຕົວປະຢັດພະລັງງານ"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"ອຸປະກອນ"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ເລືອກຮູບແບບ"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"ສຽງຮອບທິດທາງ"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ຮູບແບບທີ່ເປີດການນຳໃຊ້ໄວ້"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ຮູບແບບທີ່ປິດການນຳໃຊ້ໄວ້"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"ເພື່ອປິດການນຳໃຊ້, ກະລຸນາປ່ຽນການເລືອກຮູບແບບເປັນແບບເລືອກດ້ວຍຕົວເອງ."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"ຄວາມລະອຽດ"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"ອັດຕະໂນມັດ"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"ປ່ຽນຄວາມລະອຽດແລ້ວ"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"ເລືອກຕົກລົງເພື່ອໃຊ້ %1$s ຈາກນີ້ໄປ."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"ຍົກເລີກ"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ຕົກລົງ"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"ລຶບຂໍ້ມູນທີ່ເກັບໄວ້ບໍ?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"ອັນນີ້ຈະລຶບຂໍ້ມູນທີ່ເກັບໄວ້ສຳລັບທຸກແອັບຯ."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"ເພີ່ມອຸປະກອນເສີມ"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"ກຳລັງຈັບຄູ່..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"ກຳລັງເຊື່ອມຕໍ່..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"ອຸປະກອນເສີມ"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"ຣີໂໝດ"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"ການຕັ້ງຄ່າຣີໂໝດ"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"ຕັ້ງຄ່າປຸ່ມຣີໂໝດ"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"ຄວບຄຸມລະດັບສຽງ, ການເປີດປິດ, ອິນພຸດຢູ່ໂທລະທັດ ແລະ ລຳໂພງຊາວບາ"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"ເຊື່ອມຕໍ່"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"ເຊື່ອມຕໍ່ຫາ %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"ຕັດການເຊື່ອມຕໍ່"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"ບໍ່ສາມາດໃຊ້ໄດ້"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"ແອັບຜູ້ເບິ່ງແຍງລະບົບອຸປະກອນ"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"ບໍ່ມີແອັບທີ່ກຳລັງເຮັດວຽກ"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບ, ນະໂຍບາຍການເຂົ້າລະຫັດ ຫຼື ບ່ອນຈັດເກັບຂໍ້ມູນລັບ"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"ຂໍ້ມູນອຸປະກອນທີ່ມີການຈັດການ"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"ການປ່ຽນແປງ ແລະ ການຕັ້ງຄ່າທີ່ຈັດການໂດຍອົງກອນຂອງທ່ານ"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"ບໍ່ມີ"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"ຕິດຕັ້ງແອັບແລ້ວ"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"ຈຳນວນຂອງແອັບແມ່ນເປັນການປະມານການເທົ່ານັ້ນ. ມັນອາດບໍ່ຮວມແອັບທີ່ຕິດຕັ້ງຈາກນອກ Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{ຂັ້ນຕ່ຳ # ແອັບ}other{ຂັ້ນຕ່ຳ # ແອັບ}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"ສິດອະນຸຍາດສະຖານທີ່"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"ສິດອະນຸຍາດໄມໂຄຣໂຟນ"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"ສິດອະນຸຍາດກ້ອງຖ່າຍຮູບ"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"ແອັບເລີ່ມຕົ້ນ"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# ແອັບ}other{# ແອັບ}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"ແປ້ນພິມເລີ່ມຕົ້ນ"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"ຕັ້ງເປັນ <xliff:g id="APP_LABEL">%s</xliff:g> ແລ້ວ"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Always-on VPN turned on"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"ຂໍ້ມູນລັບທີ່ເຊື່ອຖື"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"ຂໍ້ມູນລັບທີ່ເຊື່ອຖືໃນໂປຣໄຟລ໌ສ່ວນຕົວຂອງທ່ານ"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"ຂໍ້ມູນລັບທີ່ເຊື່ອຖືໃນໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານ"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">ໃບຮັບຮອງ CA ຂັ້ນຕ່ຳ <xliff:g id="COUNT_1">%d</xliff:g> ໃບ</item>
- <item quantity="one">ໃບຮັບຮອງ CA ຂັ້ນຕ່ຳ <xliff:g id="COUNT_0">%d</xliff:g> ໃບ</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# ໃບຮັບຮອງ CA}other{# ໃບຮັບຮອງ CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"ຜູ້ເບິ່ງແຍງລະບົບສາມາດລັອກອຸປະກອນ ແລະ ຕັ້ງລະຫັດຜ່ານໃໝ່ໄດ້"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"ຜູ້ເບິ່ງແຍງສາມາດລຶບຂໍ້ມູນອຸປະກອນທັງໝົດໄດ້"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"ຈຳນວນການໃສ່ລະຫັດຜ່ານບໍ່ສຳເລັດກ່ອນຈະລຶບຂໍ້ມູນໃນອຸປະກອນທັງໝົດອອກ"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"ຈຳນວນການໃສ່ລະຫັດຜ່ານບໍ່ສຳເລັດກ່ອນຈະລຶບຂໍ້ມູນໂປຣໄຟລ໌ບ່ອນເຮັດວຽກອອກ"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{ພະຍາຍາມ # ເທື່ອ}other{ພະຍາຍາມ # ເທື່ອ}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"ອຸປະກອນນີ້ແມ່ນຈັດການໂດຍອົງກອນຂອງທ່ານ."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"ອຸປະກອນນີ້ຖືກຈັດການໂດຍ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"ສຶກສາເພີ່ມເຕີມ"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">ແອັບກ້ອງຖ່າຍຮູບ</item>
- <item quantity="one">ແອັບກ້ອງຖ່າຍຮູບ</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{ແອັບກ້ອງຖ່າຍຮູບ}other{ແອັບກ້ອງຖ່າຍຮູບ}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"ແອັບປະຕິທິນ"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"ແອັບລາຍຊື່ຜູ້ຕິດຕໍ່"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">ແອັບໂປຣແກຣມອີເມວ</item>
- <item quantity="one">ແອັບໂປຣແກຣມອີເມວ</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ແອັບໂປຣແກຣມອີເມວ}other{ແອັບໂປຣແກຣມອີເມວ}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"ແອັບແຜນທີ່"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">ແອັບໂທລະສັບ</item>
- <item quantity="one">ແອັບໂທລະສັບ</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{ແອັບໂທລະສັບ}other{ແອັບໂທລະສັບ}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"ແອັບໂປຣແກຣມທ່ອງເວັບ"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"ເວີຊັນ Android TV OS"</string>
<string name="about_serial" msgid="3432319328808745459">"ໝາຍເລກຊີຣຽວ"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS build"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{ຕອນນີ້ທ່ານຍັງອີກ # ຂັ້ນຕອນກໍຈະເປັນນັກພັດທະນາແລ້ວ}other{ຕອນນີ້ທ່ານຍັງອີກ # ຂັ້ນຕອນກໍຈະເປັນນັກພັດທະນາແລ້ວ}}"</string>
<string name="about_ads" msgid="7662896442040086522">"ໂຄສະນາ"</string>
<string name="ads_description" msgid="8081069475265061074">"ຈັດການການຕັ້ງຄ່າໂຄສະນາ ເຊັ່ນ: ການຣີເຊັດ ID ການໂຄສະນາ."</string>
<string name="ads_content_description" msgid="1006489792324920289">"ໂຄສະນາ, ຈັດການການຕັ້ງຄ່າໂຄສະນາ ເຊັ່ນ: ການຣີເຊັດ ID ການໂຄສະນາຂອງທ່ານ."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"ການອັບເດດລະບົບເພີ່ມເຕີມ"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"ການນຳໃຊ້ເຄືອຂ່າຍອາດມີການກວດສອບຕິດຕາມ"</string>
<string name="done_button" msgid="616159688526431451">"ແລ້ວໆ"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">ເຊື່ອຖື ຫຼື ລຶບໃບຮັບຮອງອອກ</item>
- <item quantity="one">ເຊື່ອຖື ຫຼື ລຶບໃບຮັບຮອງອອກ</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ໄດ້ຕິດຕັ້ງຜູ້ອອກໃບຮັບຮອງຢູ່ອຸປະກອນຂອງທ່ານແລ້ວ, ເຊິ່ງອາດອະນຸຍາດເຂົາເຈົ້າສັງເກດການການເຄື່ອນໄຫວເຄືອຂ່າຍອຸປະກອນຂອງທ່ານໄດ້, ຮວມທັງອີເມວ, ແອັບ ແລະ ເວັບໄຊທີ່ເຂົ້າລະຫັດ.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບໃບຮັບຮອງເຫຼົ່ານີ້, ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງຂອງທ່ານ.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ໄດ້ຕິດຕັ້ງຜູ້ອອກໃບຮັບຮອງຢູ່ອຸປະກອນຂອງທ່ານແລ້ວ, ເຊິ່ງອາດອະນຸຍາດເຂົາເຈົ້າສັງເກດການການເຄື່ອນໄຫວເຄືອຂ່າຍອຸປະກອນຂອງທ່ານໄດ້, ຮວມທັງອີເມວ, ແອັບ ແລະ ເວັບໄຊທີ່ເຂົ້າລະຫັດ.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບໃບຮັບຮອງນີ້, ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງຂອງທ່ານ.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ໄດ້ຕິດຕັ້ງຜູ້ອອກໃບຮັບຮອງສຳລັບໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານແລ້ວ, ເຊິ່ງອາດອະນຸຍາດເຂົາເຈົ້າສັງເກດການການເຄື່ອນໄຫວເຄືອຂ່າຍບ່ອນເຮັດວຽກໄດ້, ຮວມທັງອີເມວ, ແອັບ ແລະ ເວັບໄຊທີ່ເຂົ້າລະຫັດ.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບໃບຮັບຮອງເຫຼົ່ານີ້, ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງຂອງທ່ານ.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ໄດ້ຕິດຕັ້ງຜູ້ອອກໃບຮັບຮອງສຳລັບໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານແລ້ວ, ເຊິ່ງອາດອະນຸຍາດເຂົາເຈົ້າສັງເກດການການເຄື່ອນໄຫວເຄືອຂ່າຍບ່ອນເຮັດວຽກໄດ້, ຮວມທັງອີເມວ, ແອັບ ແລະ ເວັບໄຊທີ່ເຂົ້າລະຫັດ.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບໃບຮັບຮອງນີ້, ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງຂອງທ່ານ.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"ພາກສ່ວນທີສາມສາມາດເບິ່ງການເຄື່ອນໄຫວເຄືອຂ່າຍຂອງທ່ານໄດ້ ຮວມເຖິງອີເມວ, ແອັບຯ ແລະເວັບໄຊທີ່ເຂົ້າລະຫັດ.\n\nຂໍ້ມູນການຢືນຢັນທີ່ເຊື່ອຖືໄດ້ໃນຄອມພິວເຕີຂອງທ່ານ ອະນຸມັດໃຫ້ຂັ້ນຕອນນີ້ເປັນໄປໄດ້."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">ກວດສອບໃບຮັບຮອງ</item>
- <item quantity="one">ກວດສອບໃບຮັບຮອງ</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{ເຊື່ອຖື ຫຼື ລຶບໃບຮັບຮອງອອກ}other{ເຊື່ອຖື ຫຼື ລຶບໃບຮັບຮອງອອກ}}"</string>
<string name="device_status" msgid="8266002761193692207">"ສະຖານະ"</string>
<string name="device_status_summary" msgid="3270932829412434985">"ເຄືອຂ່າຍ, ເລກລໍາດັບ ແລະຂໍ້ມູນອື່ນ"</string>
<string name="manual" msgid="5683935624321864999">"ຄູ່ມື"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"ເຊື່ອມຕໍ່"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"ລືມເຄືອຂ່າຍ"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"ນີ້ຈະເປັນການລຶບລ້າງຂໍ້ມູນທີ່ໃຊ້ໃນການເຊື່ອມຕໍ່ກັບເຄືອຂ່າຍນີ້, ຮວມທັງລະຫັດຜ່ານທີ່ບັນທຶກໄວ້."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"ເຂົ້າຮ່ວມ Wifi ໂດຍການສະແກນລະຫັດ QR ຈາກໂທລະສັບມືຖືຂອງທ່ານແລ້ວເຮັດຕາມຄຳແນະນຳ."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" ເຂົ້າຮ່ວມ Wi-Fi ໂດຍການສະແກນລະຫັດ QR ຈາກໂທລະສັບມືຖືແລ້ວເຮັດຕາມຄຳແນະນຳ.\n \n ຈາກ "<b>"ໂທລະສັບ Android"</b>" ໃຫ້ເຂົ້າໄປການຕັ້ງຄ່າ -> ເຄືອຂ່າຍ ແລະ ອິນເຕີເນັດ -> Wi-Fi -> ເລືອກ Wi-Fi -> ຂັ້ນສູງ -> ເພີ່ມອຸປະກອນແລ້ວສະແກນລະຫັດ QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"ກົດປຸ່ມກັບຄືນເພື່ອຍົກເລີກ"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ຕົກລົງ"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"ສືບຕໍ່"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"ບ່ອນຈັດເກັບຂໍ້ມູນອຸປະກອນ"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"ໜ່ວຍຈັດເກັບຂໍ້ມູນທີ່ຖອດອອກໄດ້"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"ຕັ້ງຄ່າຄືນໃໝ່"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"ສ້າງບ່ອນຈັດເກັບຂໍ້ມູນຫວ່າງ"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"ລຶບລ້າງຂໍ້ມູນທີ່ແຄສໄວ້ບໍ?"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"ສ້າງພື້ນທີ່ຫວ່າງ <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"ລ້າງໄຟລ໌ຊົ່ວຄາວທີ່ກິນພື້ນທີ່. ຈະບໍ່ກະທົບກັບຂໍ້ມູນທີ່ບັນທຶກໄວ້ ເຊັ່ນ: ການຕັ້ງຄ່າແອັບ ຫຼື ວິດີໂອອອບລາຍ ແລະ ທ່ານຈະບໍ່ຈຳເປັນຕ້ອງເຂົ້າສູ່ລະບົບຫາແອັບຄືນໃໝ່."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"ລຶບລ້າງຂໍ້ມູນທີ່ແຄສໄວ້ບໍ?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"ຈະລ້າງຂໍ້ມູນທີ່ແຄສໄວ້ຂອງແອັບ."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"ຖອນການຕິດຕັ້ງແອັບ"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> ຖືກເອົາຕໍ່ໃສ່ແລ້ວ"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"ບໍ່ສາມາດຕໍ່ໃສ່ <xliff:g id="NAME">%1$s</xliff:g> ໄດ້"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"ບ່ອນຈັດເກັບຂໍ້ມູນ USB ເຊື່ອມຕໍ່ຄືນໃໝ່ແລ້ວ"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"ໄມໂຄຣໂຟນ"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"ການເຂົ້າເຖິງໄມໂຄຣໂຟນ"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"ສິດເຂົ້າເຖິງໄມໂຄຣໂຟນຂອງແອັບ"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"ບລັອກສິດເຂົ້າເຖິງໄມໂຄຣໂຟນແລ້ວ"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"ເພື່ອປົດລັອກ, ໃຫ້ເລື່ອນສະວິດຄວາມເປັນສ່ວນຕົວຢູ່ອຸປະກອນຂອງທ່ານໄປໃສ່ຕຳແໜ່ງເປີດຢູ່ໄມໂຄຣໂຟນເພື່ອອະນຸຍາດສິດເຂົ້າເຖິງໄມໂຄຣໂຟນ."</string>
<string name="camera" msgid="1226671478936288283">"ກ້ອງຖ່າຍຮູບ"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"ການເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"ສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບຂອງແອັບ"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"ບລັອກສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບແລ້ວ"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"ເພື່ອປົດລັອກ, ໃຫ້ເລື່ອນສະວິດຄວາມເປັນສ່ວນຕົວຢູ່ອຸປະກອນຂອງທ່ານໄປໃສ່ຕຳແໜ່ງເປີດຢູ່ກ້ອງຖ່າຍຮູບເພື່ອອະນຸຍາດສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"ການເຂົ້າເຖິງໄມໂຄຣໂຟນ: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"ເມື່ອເປີດໃຊ້ແລ້ວ, ແອັບ ແລະ ບໍລິການທັງໝົດທີ່ມີການອະນຸຍາດຈະສາມາດເຂົ້າເຖິງໄມໂຄຣໂຟນໃດກໍຕາມຢູ່ອຸປະກອນນີ້ໄດ້.\n\nອຸປະກອນຕໍ່ພ່ວງສຽງທີ່ມີໂປຣໂຕຄໍກຳນົດເອງຈະບໍ່ໄດ້ຮັບຜົນກະທົບຈາກການຕັ້ງຄ່ານີ້."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"ການເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"ຟ້າຂຽວ"</string>
<string name="color_yellow" msgid="3519470952904560404">"ເຫຼືອງ"</string>
<string name="color_magenta" msgid="2377854703399624607">"ແດງມ່ວງ"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"ຄໍາອະທິບາຍສຽງ"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"ຟັງຄຳອະທິບາຍວ່າກຳລັງເກີດຫຍັງຂຶ້ນຢູ່ໜ້າຈໍໃນໜັງ ແລະ ລາຍການທີ່ຮອງຮັບ"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"ເປີດນຳໃຊ້"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"ການປັບແຕ່ງຄ່າ"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"ໃຊ້ <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"ກຳລັງກວດສອບ"</string>
<string name="system_apps" msgid="8481888654606868074">"ແອັບຯ"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"ເປີດໜ້າຈໍຕະຫຼອດ"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"ໜ້າຈໍຈະບໍ່ນອນ"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"ການກວດສອບ HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"ການປັບແຕ່ງ HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"ຣີສະຕາດດຽວນີ້ບໍ?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"ປິດອຸປະກອນ HDMI ກັບໂທລະພາບ"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"ເປີດໂທລະພາບອັດຕະໂນມັດ"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"ເປີດໂທລະພາບກັບອຸປະກອນ HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">ເຊື່ອມຕໍ່ສັນຍານເຂົ້າແລ້ວ</item>
- <item quantity="one">ເຊື່ອມຕໍ່ສັນຍານເຂົ້າແລ້ວ</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">ສັນຍານເຂົ້າກຽມພ້ອມ</item>
- <item quantity="one">ສັນຍານເຂົ້າກຽມພ້ອມ</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">ບໍ່ໄດ້ເຊື່ອມຕໍ່ສັນຍານເຂົ້າເທື່ອ</item>
- <item quantity="one">ບໍ່ໄດ້ເຊື່ອມຕໍ່ສັນຍານເຂົ້າເທື່ອ</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{ອິນພຸດທີ່ເຊື່ອມຕໍ່ແລ້ວ}other{ອິນພຸດທີ່ເຊື່ອມຕໍ່ແລ້ວ}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{ອິນພຸດທີ່ສະແຕນບາຍ}other{ອິນພຸດທີ່ສະແຕນບາຍ}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{ອິນພຸດທີ່ບໍ່ໄດ້ເຊື່ອມຕໍ່}other{ອິນພຸດທີ່ບໍ່ໄດ້ເຊື່ອມຕໍ່}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"ຈຳກັດການເຂົ້າເຖິງແອັບຯ ແລະ ເນື້ອຫາຕ່າງໆໃນບັນຊີຂອງທ່ານ"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"ໂປຣໄຟລ໌ຈຳກັດ"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"ຄວບຄຸມໂດຍ <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"ສ້າງໂປຣໄຟລ໌ທີ່ຈຳກັດ"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"ການຕັ້ງຄ່າ"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"ແອັບຯທີ່ອະນຸຍາດ"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d ແອັບຯໄດ້ຮັບອະນຸຍາດ</item>
- <item quantity="one">1 ແອັບໄດ້ຮັບອະນຸຍາດ</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"ອະນຸຍາດແລ້ວ"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"ບໍ່ອະນຸຍາດ"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"ປັບແຕ່ງການຈຳກັດ"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"ແຫຼ່ງຂໍ້ມູນພາກສ່ວນທີສາມ"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"ການອະນຸຍາດ"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"ບໍ່ສາມາດໃຊ້ແອັບພລິເຄຊັນໄດ້"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"ແອັບທີ່ບໍ່ໄດ້ໃຊ້"</string>
<string name="settings_ok" msgid="5950888975075541964">"ຕົກລົງ"</string>
<string name="settings_confirm" msgid="4489126458677153411">"ຢືນຢັນ"</string>
<string name="settings_cancel" msgid="576094334743686152">"ຍົກເລີກ"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"ການອະນຸຍາດນີ້ອະນຸຍາດໃຫ້ແອັບແກ້ໄຂການຕັ້ງຄ່າລະບົບໄດ້."</string>
<string name="write_settings_on" msgid="71675710746513956">"ແມ່ນ"</string>
<string name="write_settings_off" msgid="6730113471695092167">"ບໍ່"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"ສິດການເຂົ້າເຖິງໄຟລ໌ທັງໝົດ"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"ອະນຸຍາດການເຂົ້າເຖິງເພື່ອຈັດການໄຟລ໌ທັງໝົດ"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"ອະນຸຍາດໃຫ້ແອັບນີ້ອ່ານ, ແກ້ໄຂ ແລະ ລຶບໄຟລ໌ທັງໝົດຢູ່ອຸປະກອນນີ້ ຫຼື ບ່ອນຈັດເກັບຂໍ້ມູນໃດກໍຕາມທີ່ເຊື່ອມຕໍ່ໄວ້. ຫາກໄດ້ຮັບອະນຸຍາດແລ້ວ, ແອັບຈະສາມາດເຂົ້າເຖິງໄຟລ໌ໂດຍແຈ້ງໃຫ້ທ່ານຮັບຮູ້ຢ່າງຈະແຈ້ງໄດ້."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"ສະແດງຜົນຫຼາຍຢ່າງພ້ອມກັນ"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"ອະນຸຍາດການສະແດງຜົນຊ້ອນ"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"ບໍ່ມີແອັບທີ່ຮອງຮັບການສະແດງຜົນຫຼາຍຢ່າງພ້ອມກັນຕິດຕັ້ງໄວ້"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"ອະນຸຍາດໃຫ້ແອັບຕ່າງໆສາມາດສ້າງໜ້າຈໍທີ່ຊ້ອນຂຶ້ນມາໃນເວລາເປີດແອັບອື່ນ ຫຼື ຫຼັງຈາກທ່ານອອກຈາກມັນ (ເຊັ່ນ: ເພື່ອສືບຕໍ່ການເບິ່ງວິດີໂອ). ໜ້າຈໍນີ້ຈະສະແດງບັງແອັບອື່ນທີ່ທ່ານກຳລັງໃຊ້ຢູ່."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"ອະນຸຍາດໃຫ້ແອັບຕັ້ງໂມງປຸກ ແລະ ກຳນົດເວລາຄຳສັ່ງທີ່ເນັ້ນເລື່ອງເວລາເປັນສຳຄັນໄດ້. ນີ້ຈະເຮັດໃຫ້ແອັບເຮັດວຽກໄດ້ໃນພື້ນຫຼັງ, ເຊິ່ງອາດໃຊ້ແບັດເຕີຣີຫຼາຍຂຶ້ນ.\n\nຫາກປິດການອະນຸຍາດນີ້ໄວ້, ໂມງປຸກທີ່ມີຢູ່ກ່ອນແລ້ວ ແລະ ເຫດການທີ່ອ້າງອີງເວລາທີ່ກຳນົດໄວ້ໂດຍແອັບຈະບໍ່ສາມາດເຮັດວຽກໄດ້."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"ເປີດໜ້າຈໍ"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"ອະນຸຍາດໃຫ້ເປີດໜ້າຈໍ"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"ອະນຸຍາດໃຫ້ແອັບເປີດໜ້າຈໍໄດ້. ຫາກອະນຸມັດ, ແອັບຈະສາມາດເປີດໜ້າຈໍຕອນໃດກໍໄດ້ໂດຍທີ່ທ່ານບໍ່ຕ້ອງມີເຈດຕະນາຢ່າງຈະແຈ້ງ."</string>
<string name="special_access" msgid="21806055758289916">"ສິດການເຂົ້າເຖິງແອັບພິເສດ"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"ສຽງ"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"ຕົວປະຢັດຂໍ້ມູນ"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"ປັບຄຸນນະພາບວິດີໂອເພື່ອໃຊ້ອິນເຕີເນັດມືຖືໃຫ້ໜ້ອຍລົງໂດຍອັດຕະໂນມັດ"</string>
<string name="title_data_alert" msgid="8262081890052682475">"ການໃຊ້ອິນເຕີເນັດ ແລະ ການເຕືອນ"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"ທ່ານສາມາດເຊື່ອມຕໍ່ຫາອິນເຕີເນັດດ້ວຍ Wi-Fi, Ethernet ຫຼື ຮັອດສະປອດຂອງໂທລະສັບທ່ານໄດ້. ສຳລັບການຊ່ວຍເຫຼືອເພີ່ມເຕີມ, ກະລຸນາໄປທີ່ "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"ທ່ານສາມາດເຊື່ອມຕໍ່ຫາອິນເຕີເນັດດ້ວຍ Wi-Fi, Ethernet ຫຼື ຮັອດສະປອດຂອງໂທລະສັບທ່ານໄດ້."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"ບໍ່ອະນຸຍາດໃຫ້ດຳເນີນການ"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"ບໍ່ສາມາດປ່ຽນລະດັບສຽງໄດ້"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"ການເປີດປິດ ແລະ ພະລັງງານ"</string>
<string name="power_on_behavior" msgid="927607372303160716">"ພຶດຕິກຳການເປີດ"</string>
<string name="reset_options_title" msgid="7632580482285108955">"ຣີເຊັດ"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"ລະຫັດການຈັບຄູ່ອີເທີເນັດ"</string>
</resources>
diff --git a/Settings/res/values-lt/strings.xml b/Settings/res/values-lt/strings.xml
index 5e74a9a..55a7023 100644
--- a/Settings/res/values-lt/strings.xml
+++ b/Settings/res/values-lt/strings.xml
@@ -45,25 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Paskyros pridėjimas"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Paskyros ir prisijungimas"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Paskyrų nėra"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> paskyra</item>
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> paskyros</item>
- <item quantity="many"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> paskyros</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> paskyrų</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# paskyra}one{# paskyra}few{# paskyros}many{# paskyros}other{# paskyrų}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Medijos paslaugos, Padėjėjas, mokėjimai"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Tinkas ir internetas"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Garsas"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Programos"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Įrenginių nuostatos"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Nuotolinis valdymas ir priedai"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"„Bluetooth“ susietų įrenginių nėra"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> priedas</item>
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> priedai</item>
- <item quantity="many"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> priedo</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> priedų</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Pateiktis ir garsas"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Pagalba ir atsiliepimai"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privatumas"</string>
@@ -122,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Gamyklinių duomenų atkūrimas"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibravimas"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Energijos taupymo priemonė"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Įrenginiai"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Rinktis formatus"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Erdvinis garsas"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -189,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ĮGALINTI FORMATAI"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"IŠJUNGTI FORMATAI"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Norėdami išjungti, pakeiskite formato pasirinkimo parinktį į „Neautomatinis“."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Skyra"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatinis"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Skyra pakeista"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Pasirinkite „Gerai“, kad nuo dabar naudotumėte %1$s."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Atšaukti"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Gerai"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Išvalyti talpykloje saugomus duomenis?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Bus išval. visų progr. talpykl. saugomi duomen."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Pridėti priedą"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Susiejama…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Jungiamasi…"</string>
@@ -228,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Priedai"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Nuotolinio valdymo pultelis"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Nuotolinio valdymo nustatymai"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Nuotolinio valdymo pultelio mygtukų nustatymas"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Valdykite TV, imtuvų ir garso kolonėlių garsumą, maitinimą bei įvestį"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Susieti"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Prisijungti prie „%1$s“ įrenginio"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Atjungti"</string>
@@ -266,12 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Nepasiekiama"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Įrenginio admin. progr."</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Nėra jokių aktyvių programų"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> aktyvi programa</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aktyvios programos</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> aktyvios programos</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktyvių programų</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Neleido: admin., šifr. polit. ar pr. duom. atmin."</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Tvarkoma įrenginio informacija"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Pakeitimus ir nustatymus tvarko jūsų organizacija"</string>
@@ -289,22 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Nėra"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Programos įdiegtos"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Numatomas programų skaičius. Jis gali neapimti už „Play“ parduotuvės ribų įdiegtų programų."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="one">Mažiausiai <xliff:g id="COUNT_1">%d</xliff:g> programa</item>
- <item quantity="few">Mažiausiai <xliff:g id="COUNT_1">%d</xliff:g> programos</item>
- <item quantity="many">Mažiausiai <xliff:g id="COUNT_1">%d</xliff:g> programos</item>
- <item quantity="other">Mažiausiai <xliff:g id="COUNT_1">%d</xliff:g> programų</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Mažiausiai # programa}one{Mažiausiai # programa}few{Mažiausiai # programos}many{Mažiausiai # programos}other{Mažiausiai # programų}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Leidimas pasiekti vietovės duomenis"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mikrofono leidimai"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Fotoaparato leidimai"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Numatytosios programos"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> programa</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> programos</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> programos</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> programų</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# programa}one{# programa}few{# programos}many{# programos}other{# programų}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Numatytoji klaviatūra"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Nustatyti į „<xliff:g id="APP_LABEL">%s</xliff:g>“"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Visada įjungto VPN funkcija įjungta"</string>
@@ -314,47 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Patikimi prisijungimo duomenys"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Patikimi prisijungimo duomenys asmeniniame profilyje"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Patikimi prisijungimo duomenys darbo profilyje"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Mažiausiai <xliff:g id="COUNT_1">%d</xliff:g> CA sertifikatas</item>
- <item quantity="few">Mažiausiai <xliff:g id="COUNT_1">%d</xliff:g> CA sertifikatai</item>
- <item quantity="many">Mažiausiai <xliff:g id="COUNT_1">%d</xliff:g> CA sertifikato</item>
- <item quantity="other">Mažiausiai <xliff:g id="COUNT_1">%d</xliff:g> CA sertifikatų</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA sertifikatas}one{# CA sertifikatas}few{# CA sertifikatai}many{# CA sertifikato}other{# CA sertifikatų}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administratorius gali užrakinti įrenginį ir iš naujo nustatyti slaptažodį"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administratorius gali ištrinti visus įrenginio duomenis"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Nesėkmingų bandymų įvesti slaptažodį skaičius prieš ištrinant visus įrenginio duomenis"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Nesėkmingų bandymų įvesti slaptažodį skaičius prieš ištrinant darbo profilio duomenis"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> bandymas</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> bandymai</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> bandymo</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> bandymų</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# bandymas}one{# bandymas}few{# bandymai}many{# bandymo}other{# bandymų}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Šį įrenginį tvarko jūsų organizacija."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Šį įrenginį tvarko „<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>“."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Sužinoti daugiau"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Fotoaparato programos</item>
- <item quantity="few">Fotoaparato programos</item>
- <item quantity="many">Fotoaparato programos</item>
- <item quantity="other">Fotoaparato programos</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Fotoaparato programa}one{Fotoaparato programos}few{Fotoaparato programos}many{Fotoaparato programos}other{Fotoaparato programos}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Kalendoriaus programa"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Kontaktų programa"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">El. pašto programos</item>
- <item quantity="few">El. pašto programos</item>
- <item quantity="many">El. pašto programos</item>
- <item quantity="other">El. pašto programos</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{El. pašto programa}one{El. pašto programos}few{El. pašto programos}many{El. pašto programos}other{El. pašto programos}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Žemėlapių programa"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Telefono programos</item>
- <item quantity="few">Telefono programos</item>
- <item quantity="many">Telefono programos</item>
- <item quantity="other">Telefono programos</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Telefono programa}one{Telefono programos}few{Telefono programos}many{Telefono programos}other{Telefono programos}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Naršyklės programa"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"„<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>“, „<xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>“"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"„<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>“, „<xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>“, „<xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>“"</string>
@@ -373,12 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"„Android TV“ OS versija"</string>
<string name="about_serial" msgid="3432319328808745459">"Serijos numeris"</string>
<string name="about_build" msgid="8467840394761634575">"„Android TV“ OS versija"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="one">Kad taptumėte kūrėju, dabar tereikia atlikti <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> veiksmą</item>
- <item quantity="few">Kad taptumėte kūrėju, dabar tereikia atlikti <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> veiksmus</item>
- <item quantity="many">Kad taptumėte kūrėju, dabar tereikia atlikti <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> veiksmo</item>
- <item quantity="other">Kad taptumėte kūrėju, dabar tereikia atlikti <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> veiksmų</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Skelbimai"</string>
<string name="ads_description" msgid="8081069475265061074">"Tvark. skelb. nust., pvz., reklamavimo ID nustatymą iš naujo."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Skelbimai: tvarkykite skelbinų nustatymus, pvz., reklamavimo ID nustatymą iš naujo."</string>
@@ -392,31 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Papild. sistem. naujiniai"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Tinklas gali būti stebimas"</string>
<string name="done_button" msgid="616159688526431451">"Atlikta"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Pasitikėjimas sertifikatais arba jų pašalinimas</item>
- <item quantity="few">Pasitikėjimas sertifikatais arba jų pašalinimas</item>
- <item quantity="many">Pasitikėjimas sertifikatais arba jų pašalinimas</item>
- <item quantity="other">Pasitikėjimas sertifikatais arba jų pašalinimas</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> jūsų įrenginyje įdiegė sertifikato įgaliojimus, kurie gali leisti domenui stebėti jūsų įrenginio tinklo veiklą, įskaitant el. laiškus, programas ir saugias svetaines.\n\nJei reikia daugiau informacijos apie šį sertifikatą, susisiekite su savo administratoriumi.</item>
- <item quantity="few"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> jūsų įrenginyje įdiegė sertifikato įgaliojimus, kurie gali leisti domenui stebėti jūsų įrenginio tinklo veiklą, įskaitant el. laiškus, programas ir saugias svetaines.\n\nJei reikia daugiau informacijos apie šį sertifikatą, susisiekite su savo administratoriumi.</item>
- <item quantity="many"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> jūsų įrenginyje įdiegė sertifikato įgaliojimus, kurie gali leisti domenui stebėti jūsų įrenginio tinklo veiklą, įskaitant el. laiškus, programas ir saugias svetaines.\n\nJei reikia daugiau informacijos apie šį sertifikatą, susisiekite su savo administratoriumi.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> jūsų įrenginyje įdiegė sertifikato įgaliojimus, kurie gali leisti domenui stebėti jūsų įrenginio tinklo veiklą, įskaitant el. laiškus, programas ir saugias svetaines.\n\nJei reikia daugiau informacijos apie šį sertifikatą, susisiekite su savo administratoriumi.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> įdiegė jūsų darbo profiliui skirtus sertifikato įgaliojimus, kurie gali leisti domenui stebėti jūsų darbo tinklo veiklą, įskaitant el. laiškus, programas ir saugias svetaines.\n\nJei reikia daugiau informacijos apie šį sertifikatą, susisiekite su savo administratoriumi.</item>
- <item quantity="few"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> įdiegė jūsų darbo profiliui skirtus sertifikato įgaliojimus, kurie gali leisti domenui stebėti jūsų darbo tinklo veiklą, įskaitant el. laiškus, programas ir saugias svetaines.\n\nJei reikia daugiau informacijos apie šį sertifikatą, susisiekite su savo administratoriumi.</item>
- <item quantity="many"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> įdiegė jūsų darbo profiliui skirtus sertifikato įgaliojimus, kurie gali leisti domenui stebėti jūsų darbo tinklo veiklą, įskaitant el. laiškus, programas ir saugias svetaines.\n\nJei reikia daugiau informacijos apie šį sertifikatą, susisiekite su savo administratoriumi.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> įdiegė jūsų darbo profiliui skirtus sertifikato įgaliojimus, kurie gali leisti domenui stebėti jūsų darbo tinklo veiklą, įskaitant el. laiškus, programas ir saugias svetaines.\n\nJei reikia daugiau informacijos apie šį sertifikatą, susisiekite su savo administratoriumi.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Trečioji šalis gali stebėti jūsų tinklo veiklą, įskaitant el. laiškus, programas ir saugias svetaines.\n\nVisa tai galima dėl įrenginyje įdiegtų patikimų prisijungimo duomenų."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Tikrinti sertifikatus</item>
- <item quantity="few">Tikrinti sertifikatus</item>
- <item quantity="many">Tikrinti sertifikatus</item>
- <item quantity="other">Tikrinti sertifikatus</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Pasitikėjimas sertifikatu arba jo pašalinimas}one{Pasitikėjimas sertifikatais arba jų pašalinimas}few{Pasitikėjimas sertifikatais arba jų pašalinimas}many{Pasitikėjimas sertifikatais arba jų pašalinimas}other{Pasitikėjimas sertifikatais arba jų pašalinimas}}"</string>
<string name="device_status" msgid="8266002761193692207">"Būsena"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Tinklas, serijų numeriai ir kita informacija"</string>
<string name="manual" msgid="5683935624321864999">"Neautomatinis"</string>
@@ -508,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Prisijungti"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Pamiršti tinklą"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Bus išvalyta informacija, naudota prisijungiant prie šio tinklo, įskaitant išsaugotą slaptažodį"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Prisijunkite prie „Wi-Fi“ nuskaitę QR kodą iš mobiliojo telefono ir vadovaukitės instrukcijomis."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Prisijunkite prie „Wi-Fi“ nuskaitę QR kodą iš mobiliojo telefono ir vadovaukitės instrukcijomis.\n \n "<b>"„Android“ telefone"</b>" eikite į skiltį „Nustatymai“ -> „Tinklas ir internetas“ -> „Wi-Fi“ -> „Pasirinkti „Wi-Fi“ -> „Išplėstiniai“ -> „Pridėti įrenginį“ ir nuskaitykite QR kodą."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Paspauskite mygtuką „Atgal“, kad atšauktumėte"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Gerai"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Tęsti"</string>
@@ -577,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Įrenginio atmintinė"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Keičiama atmintis"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Nustatyti iš naujo"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Saugyklos vietos atlaisvinimas"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Talpykloje saugomų duomenų išvalymas"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Iki <xliff:g id="SPACE">%1$s</xliff:g> saugyklos vietos atlaisvinimas"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Išvalomi laikini failai, užimantys vietą. Tai neturės įtakos išsaugotiems duomenims, pvz., programų nuostatoms ar neprisijungus pasiekiamiems vaizdo įrašams, o jums nereikės dar kartą prisijungti prie programų."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Išvalyti talpykloje saugomus duomenis?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Bus išval. visų progr. talpykl. saugomi duomen."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Programų pašalinimas"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Įdėta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Nepavyko įdėti: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB atmintis prijungta iš naujo"</string>
@@ -654,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofonas"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Galimybė pasiekti mikrofoną"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Programos galimybė pasiekti mikrofoną"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Prieiga prie mikrofono užblokuota"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Jei norite panaikinti blokavimą, įrenginyje nustatykite privatumo jungiklį į padėtį „Mikrofonas įjungtas“ ir leiskite pasiekti mikrofoną."</string>
<string name="camera" msgid="1226671478936288283">"Vaizdo kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Vaizdo kameros pasiekiamumas"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Programos galimybė pasiekti vaizdo kamerą"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Prieiga prie vaizdo kameros užblokuota"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Jei norite panaikinti blokavimą, įrenginyje nustatykite privatumo jungiklį į padėtį „Vaizdo kamera įjungta“ ir leiskite pasiekti vaizdo kamerą."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Galimybė pasiekti mikrofoną: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Kai įjungta, visos leidimą turinčios programos ir paslaugos gali pasiekti bet kurį mikrofoną šiame įrenginyje.\n\nŠis nustatymas neturės įtakos išoriniams garso įrenginiams su tinkintu protokolu."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Vaizdo kameros pasiekiamumas: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -728,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Žalsvai mėlyna"</string>
<string name="color_yellow" msgid="3519470952904560404">"Geltona"</string>
<string name="color_magenta" msgid="2377854703399624607">"Purpurinė"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Garsų aprašas"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Klausykitės ekrane rodomų įvykių aprašymo palaikomuose filmuose ir serialuose"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Įgalinti"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfigūracija"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Naudoti „<xliff:g id="SERVICE">%1$s</xliff:g>“?"</string>
@@ -748,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Stebėjimas"</string>
<string name="system_apps" msgid="8481888654606868074">"Programos"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Veikti"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Ekranas niekada neveiks miego režimu"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP tikrinimas"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimizavimas"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Paleisti iš naujo dabar?"</string>
@@ -868,24 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Išjungti HDMI įrenginius kartu su TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Automatinis TV įjungimas"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Įjungti TV kartu su HDMI įrenginiu"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Prijungtos įvestys</item>
- <item quantity="few">Prijungtos įvestys</item>
- <item quantity="many">Prijungtos įvestys</item>
- <item quantity="other">Prijungtos įvestys</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Budėjimo režimo įvestys</item>
- <item quantity="few">Budėjimo režimo įvestys</item>
- <item quantity="many">Budėjimo režimo įvestys</item>
- <item quantity="other">Budėjimo režimo įvestys</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Neprijungtos įvestys</item>
- <item quantity="few">Neprijungtos įvestys</item>
- <item quantity="many">Neprijungtos įvestys</item>
- <item quantity="other">Neprijungtos įvestys</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Prijungtas įvesties įrenginys}one{Prijungti įvesties įrenginiai}few{Prijungti įvesties įrenginiai}many{Prijungti įvesties įrenginiai}other{Prijungti įvesties įrenginiai}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Budėjimo rež. įv. įrenginys}one{Budėjimo rež. įv. įrenginiai}few{Budėjimo rež. įv. įrenginiai}many{Budėjimo rež. įv. įrenginiai}other{Budėjimo rež. įv. įrenginiai}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Neprijungtas įvest. įrenginys}one{Neprijungti įvest. įrenginiai}few{Neprijungti įvest. įrenginiai}many{Neprijungti įvest. įrenginiai}other{Neprijungti įvest. įrenginiai}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Ribokite prieigą prie programų ir kito paskyros turinio"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Ribotas profilis"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Valdo „<xliff:g id="APP">%1$s</xliff:g>“"</string>
@@ -899,12 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Ribojamo profilio kūrimas"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Nustatymai"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Leidžiamos programos"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">Leidžiama %d programa</item>
- <item quantity="few">Leidžiamos %d programos</item>
- <item quantity="many">Leidžiama %d programos</item>
- <item quantity="other">Leidžiama %d programų</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Leidžiama"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Neleidžiama"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Tinkinti apribojimus"</string>
@@ -949,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Trečiosios šalies šaltinis"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Leidimai"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Programa nepasiekiama"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Nenaudojamos programos"</string>
<string name="settings_ok" msgid="5950888975075541964">"Gerai"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Patvirtinti"</string>
<string name="settings_cancel" msgid="576094334743686152">"Atšaukti"</string>
@@ -1032,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Programai bus leidžiama keisti sistemos nustatymus."</string>
<string name="write_settings_on" msgid="71675710746513956">"Taip"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Ne"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Visų failų prieiga"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Leisti pasiekti ir tvarkyti visus failus"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Šiai programai leidžiama nuskaityti, keisti ir ištrinti visus failus, esančius šiame įrenginyje ar bet kurioje prijungtoje saugykloje. Jei suteiksite leidimą, programa gali pasiekti failus jūsų tiksliai neinformavus."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Vaizdas vaizde"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Leisti vaizdą vaizde"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Nė viena iš įdiegtų programų nepalaiko vaizdo vaizde režimo"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Leisti programoms kurti vaizdo vaizde langą, kol programa yra atidaryta arba ją uždarius (pvz., kad galėtumėte ir toliau žiūrėti vaizdo įrašą). Šis langas rodomas virš kitų naudojamų programų."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Leiskite programoms nustatyti signalus ir suplanuoti veiksmus, kuriems svarbus laiko veiksnys. Programos galės veikti fone, todėl gali būti sunaudojama daugiau energijos.\n\nJei šis leidimas išjungtas, programos suplanuoti esami signalai ir laiku pagrįsti įvykiai neveiks."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Įjungti ekraną"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Leisti įjungti ekraną"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Leiskite programai įjungti ekraną. Jei suteiksite leidimą, programa galės įjungti ekraną bet kuriuo metu be aiškaus jūsų sutikimo."</string>
<string name="special_access" msgid="21806055758289916">"Speciali prieiga prie programų"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Garso įrašas"</string>
@@ -1053,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Duomenų taupymo priemonė"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Automat. koreg. vaizdo įr. kokybę, kad būtų sunaud. mažiau mob. ryšio duomenų"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Duomenų naudojimas ir įspėjimai"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Prie interneto galite prisijungti naudodami „Wi-Fi“, eternetą ar telefono viešosios interneto prieigos tašką. Jei reikia daugiau pagalbos, apsilankykite adresu "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Prie interneto galite prisijungti naudodami „Wi-Fi“, eternetą ar telefono viešosios interneto prieigos tašką."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Neleistinas veiksmas"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Nepavyko pakeisti garsumo"</string>
@@ -1103,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Maitinimas ir energija"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Elgsena įjungus maitinimą"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Nustatymas iš naujo"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Eterneto susiejimo kodas"</string>
</resources>
diff --git a/Settings/res/values-lv/strings.xml b/Settings/res/values-lv/strings.xml
index a0daad2..febba73 100644
--- a/Settings/res/values-lv/strings.xml
+++ b/Settings/res/values-lv/strings.xml
@@ -45,23 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Konta pievienošana"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Konti un pierakstīšanās"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Nav kontu"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="zero"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> kontu</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> konts</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> konti</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# konts}zero{# kontu}one{# konts}other{# konti}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Multivides pakalpojumi, Asistents, maksājumi"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Tīkls un internets"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Skaņa"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Lietotnes"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Ierīces preferences"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Tālvadības ierīces un piederumi"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Nav izveidots savienojums ar Bluetooth ierīcēm"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="zero"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> piederumu</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> piederums</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> piederumi</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Displejs un skaņa"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Palīdzība un atsauksmes"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Konfidencialitāte"</string>
@@ -120,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Rūpnīcas datu atiestatīšana"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrēšana"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Enerģijas taupīšana"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Ierīces"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Formātu atlase"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Ieskaujošā skaņa"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -187,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"IESPĒJOTIE FORMĀTI"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ATSPĒJOTIE FORMĀTI"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Lai atspējotu, mainiet formātu atlasi uz “Manuāli”."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Izšķirtspēja"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automātiska"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Izšķirtspēja ir mainīta"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Atlasiet “Labi”, lai turpmāk izmantotu šādu izšķirtspēju: %1$s."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Atcelt"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Labi"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Vai dzēst kešatmiņā ievietotos datus?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Tiks dzēsti kešatmiņā ievietotie lietotņu dati."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Pievienot piederumu"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Notiek savienošana pārī..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Tiek veikta savienošana…"</string>
@@ -226,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Piederumi"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Tālvadības ierīce"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Tālvadības ierīces iestatījumi"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Tālvadības ierīces pogu iestatīšana"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Kontrolējiet skaļumu, ieslēgšanu un izslēgšanu, kā arī televizora, uztvērēju un skaņas joslu ieejas avotus"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Izveidot savienojumu"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Izveidot savienojumu ar “%1$s”"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Pārtraukt savienojumu"</string>
@@ -264,11 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Nav pieejama"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Ierīces administratora lietotnes"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Nav aktīvu lietotņu"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> aktīvu lietotņu</item>
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> aktīvu lietotne</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktīvu lietotnes</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Atspējoja administrators, šifrēšanas politika vai akreditācijas datu maiņa"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informācija par pārvaldīto ierīci"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Izmaiņas un iestatījumus pārvalda jūsu organizācija"</string>
@@ -286,20 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Nav"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Ir instalētas lietotnes."</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Lietotņu skaits ir aptuvens. Tajā var nebūt ietvertas lietotnes, kas instalētas ārpus Play veikala."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="zero">Vismaz <xliff:g id="COUNT_1">%d</xliff:g> lietotņu</item>
- <item quantity="one">Vismaz <xliff:g id="COUNT_1">%d</xliff:g> lietotne</item>
- <item quantity="other">Vismaz <xliff:g id="COUNT_1">%d</xliff:g> lietotnes</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Vismaz # lietotne}zero{Vismaz # lietotņu}one{Vismaz # lietotne}other{Vismaz # lietotnes}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Atrašanās vietas atļaujas"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mikrofona atļaujas"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Kameras atļaujas"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Noklusējuma lietotnes"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> lietotņu</item>
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> lietotne</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> lietotnes</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# lietotne}zero{# lietotņu}one{# lietotne}other{# lietotnes}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Noklusējuma tastatūra"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Iestatītā metode: <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Iestatījums “Vienmēr ieslēgts VPN” ir ieslēgts"</string>
@@ -309,42 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Uzticami akreditācijas dati"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Jūsu personiskajā profilā instalēti uzticami akreditācijas dati"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Jūsu darba profilā instalēti uzticami akreditācijas dati"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="zero">Vismaz <xliff:g id="COUNT_1">%d</xliff:g> CA sertifikātu</item>
- <item quantity="one">Vismaz <xliff:g id="COUNT_1">%d</xliff:g> CA sertifikāts</item>
- <item quantity="other">Vismaz <xliff:g id="COUNT_1">%d</xliff:g> CA sertifikāti</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA sertifikāts}zero{# CA sertifikātu}one{# CA sertifikāts}other{# CA sertifikāti}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administrators var bloķēt ierīci un atiestatīt paroli."</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administrators var dzēst visus ierīces datus"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Nesekmīgi paroles ievadīšanas mēģinājumi, pirms tiek dzēsti visi ierīces dati."</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Nesekmīgi paroles ievadīšanas mēģinājumi, pirms tiek dzēsti darba profila dati."</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> mēģinājumu</item>
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> mēģinājums</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> mēģinājumi</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# mēģinājums}zero{# mēģinājumu}one{# mēģinājums}other{# mēģinājumi}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Šo ierīci pārvalda jūsu organizācija."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Šo ierīci pārvalda <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Uzzināt vairāk"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="zero">Kameras lietotnes</item>
- <item quantity="one">Kameras lietotnes</item>
- <item quantity="other">Kameras lietotnes</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Kameras lietotne}zero{Kameras lietotnes}one{Kameras lietotnes}other{Kameras lietotnes}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Kalendāra lietotne"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Kontaktpersonu lietotne"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="zero">E-pasta klienta lietotnes</item>
- <item quantity="one">E-pasta klienta lietotnes</item>
- <item quantity="other">E-pasta klienta lietotnes</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{E-pasta klienta lietotne}zero{E-pasta klienta lietotnes}one{E-pasta klienta lietotnes}other{E-pasta klienta lietotnes}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Karšu lietotne"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="zero">Tālruņa lietotnes</item>
- <item quantity="one">Tālruņa lietotnes</item>
- <item quantity="other">Tālruņa lietotnes</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Tālruņa lietotne}zero{Tālruņa lietotnes}one{Tālruņa lietotnes}other{Tālruņa lietotnes}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Pārlūkprogrammas lietotne"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -363,11 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS versija"</string>
<string name="about_serial" msgid="3432319328808745459">"Sērijas numurs"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS versija"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="zero">Jums ir atlikušas <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> darbības, līdz kļūsiet par izstrādātāju.</item>
- <item quantity="one">Jums ir atlikusi <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> darbība, līdz kļūsiet par izstrādātāju.</item>
- <item quantity="other">Jums ir atlikušas <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> darbības, līdz kļūsiet par izstrādātāju.</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Reklāmas"</string>
<string name="ads_description" msgid="8081069475265061074">"Pārvaldiet reklāmu iestatījumus, piemēram, reklamēšanas ID atiestatīšanu."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Reklāmas: pārvaldiet reklāmu iestatījumus, piemēram, reklamēšanas ID atiestatīšanu."</string>
@@ -381,27 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Citi sistēmas atjauninājumi"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Iespējams, tīklā veiktās darbības tiek pārraudzītas."</string>
<string name="done_button" msgid="616159688526431451">"Gatavs"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="zero">Sertifikātu pieņemšana vai noņemšana</item>
- <item quantity="one">Sertifikātu pieņemšana vai noņemšana</item>
- <item quantity="other">Sertifikātu pieņemšana vai noņemšana</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="zero"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalēja sertificēšanas iestāžu sertifikātus jūsu ierīcē. Šie sertifikāti atļauj iestādēm pārraudzīt darbības tīklā jūsu ierīcē, tostarp e-pasta kontus, lietotnes un drošās vietnes.\n\nLai iegūtu plašāku informāciju par šiem sertifikātiem, sazinieties ar administratoru.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalēja sertificēšanas iestāžu sertifikātus jūsu ierīcē. Šie sertifikāti atļauj iestādēm pārraudzīt darbības tīklā jūsu ierīcē, tostarp e-pasta kontus, lietotnes un drošās vietnes.\n\nLai iegūtu plašāku informāciju par šiem sertifikātiem, sazinieties ar administratoru.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalēja sertificēšanas iestāžu sertifikātus jūsu ierīcē. Šie sertifikāti atļauj iestādēm pārraudzīt darbības tīklā jūsu ierīcē, tostarp e-pasta kontus, lietotnes un drošās vietnes.\n\nLai iegūtu plašāku informāciju par šiem sertifikātiem, sazinieties ar administratoru.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="zero"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalēja sertificēšanas iestāžu sertifikātus jūsu darba profilam. Šie sertifikāti atļauj iestādēm pārraudzīt darbības darba tīklā, tostarp e-pasta kontus, lietotnes un drošās vietnes.\n\nLai iegūtu plašāku informāciju par šiem sertifikātiem, sazinieties ar administratoru</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalēja sertificēšanas iestāžu sertifikātus jūsu darba profilam. Šie sertifikāti atļauj iestādēm pārraudzīt darbības darba tīklā, tostarp e-pasta kontus, lietotnes un drošās vietnes.\n\nLai iegūtu plašāku informāciju par šiem sertifikātiem, sazinieties ar administratoru</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalēja sertificēšanas iestāžu sertifikātus jūsu darba profilam. Šie sertifikāti atļauj iestādēm pārraudzīt darbības darba tīklā, tostarp e-pasta kontus, lietotnes un drošās vietnes.\n\nLai iegūtu plašāku informāciju par šiem sertifikātiem, sazinieties ar administratoru</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Trešā puse spēj pārraudzīt jūsu darbības tīklā, tostarp e-pastu, lietotnes un drošās vietnes.\n\nŠo pārraudzības iespēju nodrošina jūsu ierīcē instalēts sertifikāts."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="zero">Pārbaudīt sertifikātus</item>
- <item quantity="one">Pārbaudīt sertifikātus</item>
- <item quantity="other">Pārbaudīt sertifikātus</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Sertifikāta pieņemšana vai noņemšana}zero{Sertifikātu pieņemšana vai noņemšana}one{Sertifikātu pieņemšana vai noņemšana}other{Sertifikātu pieņemšana vai noņemšana}}"</string>
<string name="device_status" msgid="8266002761193692207">"Statuss"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Tīkls, sērijas numuri un cita informācija"</string>
<string name="manual" msgid="5683935624321864999">"Manuāli"</string>
@@ -493,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Izveidot savienojumu"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Tīkla aizmiršana"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Tiks dzēsta informācija, kas izmantota savienojuma izveidei ar šo tīklu, tostarp saglabātā parole."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Pievienojieties Wi-Fi tīklam, skenējot kvadrātkodu savā mobilajā tālrunī, un izpildiet sniegtos norādījumus."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Pievienojieties Wi-Fi tīklam, skenējot kvadrātkodu mobilajā tālrunī, un izpildiet sniegtos norādījumus.\n \n "<b>"Android tālrunī"</b>" atveriet sadaļu Iestatījumi -> Tīkls un internets -> Wi-Fi -> Atlasīt Wi-Fi -> Papildu -> Pievienot ierīci. Pēc tam skenējiet kvadrātkodu."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Nospiediet pogu Atpakaļ, lai atceltu darbību."</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Labi"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Turpināt"</string>
@@ -562,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Ierīces atmiņa"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Noņemama atmiņas ierīce"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Atiestatīt"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Vietas atbrīvošana krātuvē"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Kešatmiņā saglabāto datu notīrīšana"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Vietas (<xliff:g id="SPACE">%1$s</xliff:g>) atbrīvošana"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Tiks notīrīti pagaidu faili, kas aizņem vietu. Tas neietekmēs saglabātos datus, piemēram, lietotņu preferences vai bezsaistes videoklipus, un jums nebūs vēlreiz jāpierakstās lietotnēs."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Vai notīrīt kešatmiņā saglabātos datus?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Tiks notīrīti kešatmiņā saglabātie lietotņu dati."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Lietotņu atinstalēšana"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> ir pievienota"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Nevarēja pievienot: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB atmiņa atkārtoti pievienota"</string>
@@ -639,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofons"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Piekļuve mikrofonam"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Lietotņu piekļuve mikrofonam"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Piekļuve mikrofonam bloķēta"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Lai atbloķētu piekļuvi, ierīcē pavirziet konfidencialitātes slēdzi uz mikrofonu, lai atļautu piekļuvi mikrofonam."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Piekļuve kamerai"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Lietotņu piekļuve kamerai"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Piekļuve kamerai bloķēta"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Lai atbloķētu piekļuvi, ierīcē pavirziet konfidencialitātes slēdzi uz kameru, lai atļautu piekļuvi kamerai."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Piekļuve mikrofonam: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Ja šis iestatījums ir ieslēgts, visas lietotnes un pakalpojumi, kam ir attiecīgā atļauja, var piekļūt jebkuram šīs ierīces mikrofonam.\n\nŠis iestatījums neietekmēs perifērās audio ierīces, kurām ir pielāgots protokols."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Piekļuve kamerai: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -713,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Ciānzila"</string>
<string name="color_yellow" msgid="3519470952904560404">"Dzeltena"</string>
<string name="color_magenta" msgid="2377854703399624607">"Fuksīnsarkana"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audio apraksts"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Klausieties aprakstu par notiekošo atbalstītajās filmās un pārraidēs"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Iespējot"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfigurācija"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Izmantot <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -733,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Pārraudzība"</string>
<string name="system_apps" msgid="8481888654606868074">"Lietotnes"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Atstāt nomodā"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Ekrāna miega režīms netiks aktivizēts"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP pārbaude"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimizācija"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Vai restartēt tūlīt?"</string>
@@ -853,21 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Izslēgt televizoram pievienotās HDMI ierīces"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV automātiska ieslēgšanās"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Ieslēgt TV, izmantojot HDMI ierīci"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="zero">Pievienotās ieejas</item>
- <item quantity="one">Pievienotās ieejas</item>
- <item quantity="other">Pievienotās ieejas</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="zero">Gaidstāves ieejas</item>
- <item quantity="one">Gaidstāves ieejas</item>
- <item quantity="other">Gaidstāves ieejas</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="zero">Nepievienotās ieejas</item>
- <item quantity="one">Nepievienotās ieejas</item>
- <item quantity="other">Nepievienotās ieejas</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Pievienotā ieeja}zero{Pievienotās ieejas}one{Pievienotās ieejas}other{Pievienotās ieejas}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Gaidstāves ieeja}zero{Gaidstāves ieejas}one{Gaidstāves ieejas}other{Gaidstāves ieejas}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Nepievienotā ieeja}zero{Nepievienotās ieejas}one{Nepievienotās ieejas}other{Nepievienotās ieejas}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Ierobežojiet savā kontā piekļuvi lietotnēm un citam saturam."</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Ierobežots profils"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Pārvalda: <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -881,11 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Izveidot ierobežotu profilu"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Iestatījumi"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Atļautās lietotnes"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="zero">Atļautas %d lietotnes</item>
- <item quantity="one">Atļauta %d lietotne</item>
- <item quantity="other">Atļautas %d lietotnes</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Atļauta"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Nav atļauta"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Pielāgot ierobežojumus"</string>
@@ -930,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Trešās puses avots"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Atļaujas"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Lietojumprogramma nav pieejama."</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Neizmantotās lietotnes"</string>
<string name="settings_ok" msgid="5950888975075541964">"Labi"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Apstiprināt"</string>
<string name="settings_cancel" msgid="576094334743686152">"Atcelt"</string>
@@ -1013,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Ar šo atļauju lietotne var pārveidot sistēmas iestatījumus."</string>
<string name="write_settings_on" msgid="71675710746513956">"Jā"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Nē"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Piekļuve visiem failiem"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Atļaut piekļuvi visu failu pārvaldībai"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Atļaujiet šai lietotnei lasīt, pārveidot un dzēst visus failus šajā ierīcē vai pievienotajās atmiņas ierīcēs. Ja piešķirsiet atļauju, lietotne varēs piekļūt failiem, jums par to nezinot."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Attēls attēlā"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Atļaut attēlu attēlā"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Nevienā no instalētajām lietotnēm netiek atbalstīts attēls attēlā."</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Atļaut lietotnēm izveidot logu ar attēlu attēlā, kad lietotne ir atvērta vai pēc tās aizvēršanas (piemēram, lai turpinātu skatīties video). Šis logs tiek rādīts pāri citām izmantotajām lietotnēm."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Atļaujiet lietotnēm iestatīt signālus un ieplānot darbības, kas jāveic konkrētā laikā. Tādējādi lietotnes darbosies fonā un, iespējams, patērēs vairāk akumulatora enerģijas.\n\nJa šī atļauja nav piešķirta, esošie signāli un lietotņu ieplānotie notikumi, kas jāizpilda konkrētā laikā, nedarbosies."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Ekrāna ieslēgšana"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Atļaut ieslēgt ekrānu"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Atļaujiet lietotnei ieslēgt ekrānu. Ja to atļausiet, lietotne varēs jebkurā laikā ieslēgt ekrānu bez tiešas jūsu piekrišanas."</string>
<string name="special_access" msgid="21806055758289916">"Īpaša piekļuve lietotnēm"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1034,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Datu lietojuma samazinātājs"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Automātiski pielāgot video kvalitāti, lai izmantotu mazāk mobilo datu"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Datu lietojums un brīdinājumi"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Varat izveidot savienojumu ar internetu, izmantojot Wi-Fi, tīklu Ethernet vai tālruņa tīklāju. Papildu palīdzību meklējiet vietnē "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Varat izveidot savienojumu ar internetu, izmantojot Wi-Fi, tīklu Ethernet vai tālruņa tīklāju."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Darbība nav atļauta"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Nevar mainīt skaļumu"</string>
@@ -1084,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Barošana un enerģija"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Ieslēgšanas rīcība"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Atiestatīšana"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Tīkla Ethernet kods savienošanai pārī"</string>
</resources>
diff --git a/Settings/res/values-mk/strings.xml b/Settings/res/values-mk/strings.xml
index d36b102..d3ef3a9 100644
--- a/Settings/res/values-mk/strings.xml
+++ b/Settings/res/values-mk/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Додајте сметка"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Сметки и најавување"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Нема сметки"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> сметка</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> сметки</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# сметка}one{# сметка}other{# сметки}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Аудиовизуелни услуги, „Помошник“, плаќања"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Мрежа и интернет"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Звук"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Апликации"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Поставки за уредот"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Далечински управувач и додатоци"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Нема поврзани уреди со Bluetooth"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> додаток</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> додатоци</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Екран и звук"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Помош и повратни информации"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Приватност"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Ресетирање фабрички податоци"</string>
<string name="device_calibration" msgid="2907914144048739705">"Калибрација"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Штедач на енергија"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Уреди"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Избор на формати"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Опкружувачки звук"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ОВОЗМОЖЕНИ ФОРМАТИ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ОНЕВОЗМОЖЕНИ ФОРМАТИ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"За да оневозможите, променете го изборот на форматот на „Рачно“."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Резолуција"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Автоматски"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Резолуцијата е променета"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Изберете „Во ред“ за да користите %1$s отсега, па натаму."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Откажи"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Во ред"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Исчисти кеширани податоци?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Ова ќе исчисти кеширани податоци за сите аплик."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Додај додаток"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Спарување..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Се поврзува…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Додатоци"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Далечински управувач"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Поставки за далечински управувач"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Поставете копчиња на далечинскиот управувач"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Контролирајте ги јачината на звукот, вклучувањето, влезот на телевизорите, приемниците и звучниците"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Поврзи"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Да се поврзе со уредот %1$s?"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Прекини врска"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Не е достапно"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Апликации за администраторот"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Нема активни апликации"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Оневозм. од админ., шифрир. или складир. акредит."</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Информации за управуваниот уред"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Измени и поставки со кои управува организацијата"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Нема"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Инсталирани се апликации"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Бројот на апликации е приближен. Можеби не опфаќа апликации што не се инсталирани од Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Минимум # апликација}one{Минимум # апликација}other{Минимум # апликации}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Дозволи за локацијата"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Дозволи за микрофонот"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Дозволи за камерата"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Стандардни апликации"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# апликација}one{# апликација}other{# апликации}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Стандардна тастатура"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Поставено на <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"VPN е поставена да биде секогаш вклучена"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Доверливи акредитиви"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Доверливи акредитиви на вашиот личен профил"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Доверливи акредитиви на вашиот работен профил"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Минимум <xliff:g id="COUNT_1">%d</xliff:g> сертификат CA</item>
- <item quantity="other">Минимум <xliff:g id="COUNT_1">%d</xliff:g> сертификати CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA-сертификат}one{# CA-сертификат}other{# CA-сертификати}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Администраторот може да го заклучи уредот и да ја ресетира лозинката"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Администраторот може да ги избрише сите податоци на уредот"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Неуспешни обиди за внесување лозинка пред да се избришат сите податоци на уредот"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Неуспешни обиди за внесување лозинка пред да се избришат податоците на работниот профил"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# обид}one{# обид}other{# обиди}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Вашата организација управува со уредов."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> управува со уредов."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Дознајте повеќе"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Апликации за камера</item>
- <item quantity="other">Апликации за камера</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Апликација за камера}one{Апликации за камера}other{Апликации за камера}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Апликацијата „Календар“"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Апликацијата „Контакти“"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Апликации за клиент на е-пошта</item>
- <item quantity="other">Апликации за клиент на е-пошта</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Апликација за клиент на е-пошта}one{Апликации за клиент на е-пошта}other{Апликации за клиент на е-пошта}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Апликацијата „Карти“"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Апликации за телефон</item>
- <item quantity="other">Апликации за телефон</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Апликација за телефон}one{Апликации за телефон}other{Апликации за телефон}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Апликација за прелистување"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Верзија на OS на Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Сериски број"</string>
<string name="about_build" msgid="8467840394761634575">"Верзија на OS на Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{Сега сте на # чекор поблиску да станете програмер}one{Сега сте на # чекор поблиску да станете програмер}other{Сега сте на # чекори поблиску да станете програмер}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Реклами"</string>
<string name="ads_description" msgid="8081069475265061074">"Управувајте со поставките, како ресетирање ID за рекламирање."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Ads, управувајте со поставките за реклами, како што е ресетирање ID за рекламирање."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Дополн. ажур. на системот"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Мрежата може да се следи"</string>
<string name="done_button" msgid="616159688526431451">"Готово"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Или имајте доверба или отстранете ги сертификатите</item>
- <item quantity="other">Или имајте доверба или отстранете ги сертификатите</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> инсталираше авторитети за сертификатите на вашиот уред, што може да му дозволи да ја следи активноста на мрежата на уредот, вклучувајќи ги е-пораките, апликациите и безбедните веб-сајтови.\n\nЗа повеќе информации за овие сертификати, контактирајте со администраторот.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> инсталираше авторитети за сертификатите на вашиот уред, што може да му дозволи да ја следи активноста на мрежата на уредот, вклучувајќи ги е-пораките, апликациите и безбедните веб-сајтови.\n\nЗа повеќе информации за овие сертификати, контактирајте со администраторот.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> инсталираше авторитети за сертификатите за вашиот работен профил, што може да му дозволи да ја следи активноста на работната мрежа, вклучувајќи ги е-пораките, апликациите и безбедните веб-сајтови.\n\nЗа повеќе информации за овие сертификати, контактирајте со администраторот.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> инсталираше авторитети за сертификатите за вашиот работен профил, што може да му дозволи да ја следи активноста на работната мрежа, вклучувајќи ги е-пораките, апликациите и безбедните веб-сајтови.\n\nЗа повеќе информации за овие сертификати, контактирајте со администраторот.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Трето лица може да ја следи вашата мрежна активност, вклучувајќи е-пошта, апликации и безбедни веб-сајтови.\n\nОва го овозможува доверлив акредитив инсталиран на вашиот уред."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Проверка на сертификати</item>
- <item quantity="other">Проверка на сертификати</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Или имајте доверба или отстранете го сертификатот}one{Или имајте доверба или отстранете ги сертификатите}other{Или имајте доверба или отстранете ги сертификатите}}"</string>
<string name="device_status" msgid="8266002761193692207">"Статус"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Мрежа, сериски броеви и други информации"</string>
<string name="manual" msgid="5683935624321864999">"Рачно"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Поврзи се"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Заборави мрежа"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Ова ги чисти информациите користени за поврзување со оваа мрежа, вклучувајќи ги зачуваните лозинки."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Придружете се на Wi-Fi со скенирање на QR-кодот од мобилниот телефон и со следење на упатствата."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Придружете се на Wi-Fi со скенирање на QR-кодот од мобилниот телефон и со следење на упатствата.\n \n Од "<b>"телефон со Android"</b>", одете во „Поставки -> Мрежа и интернет -> Wi-Fi -> Изберете Wi-Fi -> Напредни -> Додајте уред“, а потоа скенирајте го QR-кодот."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Притиснете го копчето за назад за да откажете"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Во ред"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Продолжете"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Капацитет на уредот"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Пренослива меморија"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Ресетирај"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Ослободете капацитет"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Избришете ги кешираните податоци"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Ослободете <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Ги брише привремените датотеки што зафаќаат простор. Нема да влијае врз зачуваните податоци како што се поставките за апликации или офлајн-видеата и нема да мора повторно да се најавувате на апликациите."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Да се избришат кешираните податоци?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Ова ќе ги избрише сите кеширани податоци."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Деинсталирајте апликации"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> е монтирано"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Не може да се монтира <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB меморијата е повторно поврзана"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Микрофон"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Пристап до микрофонот"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Пристап на апликации до микрофонот"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Пристапот до микрофонот е блокиран"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"За да одблокирате, поместете го прекинувачот за приватност на уредот во положбата „Микрофонот е вклучен“ што ќе дозволи пристап до него."</string>
<string name="camera" msgid="1226671478936288283">"Камера"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Пристап до камерата"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Пристап на апликации до камерата"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Пристапот до камерата е блокиран"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"За да одблокирате, поместете го прекинувачот за приватност на уредот во положбата „Камерата е вклучена“ што ќе дозволи пристап до неа."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Пристап до микрофонот: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Кога е вклучено, сите апликации и услуги со дозвола може да пристапуваат до сите микрофони на уредов.\n\nПериферните аудиоуреди со приспособен протокол нема да бидат засегнати од поставкава."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Пристап до камерата: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Зелено-сина"</string>
<string name="color_yellow" msgid="3519470952904560404">"Жолта"</string>
<string name="color_magenta" msgid="2377854703399624607">"Виолетова"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Звучен опис"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Слушајте опис на она што се случува на екранот во поддржаните филмови и серии"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Овозможи"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Конфигурација"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Употреби <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Следење"</string>
<string name="system_apps" msgid="8481888654606868074">"Апликации"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Остани во активен режим"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Екранот никогаш нема да биде во режим во мирување"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Проверување HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI оптимизација"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Рестартирај сега?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Исклучете ги уредите за HDMI со телевизорот"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Автоматско вклучување ТВ"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Вклучете го телевизорот со уредот за HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Поврзан влез</item>
- <item quantity="other">Поврзани влеза</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Влез за подготвеност</item>
- <item quantity="other">Влеза за подготвеност</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Неповрзан влез</item>
- <item quantity="other">Неповрзани влеза</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Поврзан влез}one{Поврзани влезови}other{Поврзани влезови}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Влез за режим на подготвеност}one{Влезови за режим на подготвеност}other{Влезови за режим на подготвеност}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Неповрзан влез}one{Неповрзани влезови}other{Неповрзани влезови}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Ограничете го пристапот до апликациите и другата содржина во вашата сметка"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Ограничен профил"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Контролирани од <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Создадете ограничен профил"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Поставки"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Дозволени апликации"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">Дозволена е %d апликација</item>
- <item quantity="other">Дозволени се %d апликации</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Дозволено"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Не е дозволено"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Приспособи ограничувања"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Извор од трета страна"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Дозволи"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Апликацијата е недостапна"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Некористени апликации"</string>
<string name="settings_ok" msgid="5950888975075541964">"Во ред"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Потврди"</string>
<string name="settings_cancel" msgid="576094334743686152">"Откажи"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Оваа дозвола овозможува апликацијата да ги менува поставките на системот."</string>
<string name="write_settings_on" msgid="71675710746513956">"Да"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Не"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Пристап до сите датотеки"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Дозволи пристап за управување со датотеки"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Дозволете апликацијава да ги чита, менува и брише сите датотеки на уредов или на поврзаните мемориски уреди. Ако се дозволи, апликацијата може да пристапува до датотеките без ваше изречно знаење."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Слика во слика"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Дозволи слика во слика"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Ниту една од инсталираните апликации не поддржува слика во слика"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Дозволете апликациите да создаваат прозорец за слика во слика додека апликацијата е отворена или пак, откако ќе ја напуштите (на пр., за да продолжите со гледање видео). Прозорецов се прикажува врз другите апликации што ги користите."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Дозволете им на апликаците да поставуваат аларми и да закажуваат дејства со временски рокови. Ова овозможува апликациите да работат во заднина и така може повеќе да ја трошат батеријата.\n\nАко дозволава е исклучена, нема да функционираат постојните аларми и настаните според време закажани од апликацијата."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Вклучи го екранот"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Дозволи вклучување на екранот"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Дозволете апликација да го вклучи екранот. Ако дозволите, апликацијата може да го вклучи екранот во секое време без ваша намера."</string>
<string name="special_access" msgid="21806055758289916">"Посебен пристап за апликации"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Аудио"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Штедач на интернет"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Автоматски приспособи квалитетот на видеото да користи помалку мобилен интернет"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Потрошен интернет и известувања"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Може да се поврзете на интернет преку Wi-Fi, етернет или точката на пристап на телефонот. За повеќе помош, посетете ја "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Може да се поврзете на интернет преку Wi-Fi, етернет или точката на пристап на телефонот."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Дејството не е дозволено"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Јачината на звукот не може да се смени"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Напојување и енергија"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Однесување кога е вклучен"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Ресетирај"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Код за спарување преку Ethernet"</string>
</resources>
diff --git a/Settings/res/values-ml/strings.xml b/Settings/res/values-ml/strings.xml
index 152bd48..a67cf42 100644
--- a/Settings/res/values-ml/strings.xml
+++ b/Settings/res/values-ml/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"ഒരു അക്കൗണ്ട് ചേർക്കുക"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"അക്കൗണ്ടുകളും സൈൻ ഇൻ ചെയ്യലും"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"അക്കൗണ്ടുകളില്ല"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> അക്കൗണ്ടുകൾ</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> അക്കൗണ്ട്</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# അക്കൗണ്ട്}other{# അക്കൗണ്ടുകൾ}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"മീഡിയ സേവനങ്ങൾ, Assistant, പേയ്മെന്റുകൾ എന്നിവ"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"നെറ്റ്വർക്കും ഇന്റർനെറ്റും"</string>
<string name="sound_category_title" msgid="7899816751041939518">"ശബ്ദം"</string>
<string name="applications_category_title" msgid="7112019490898586223">"ആപ്പുകൾ"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"ഉപകരണ മുൻഗണനകൾ"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"റിമോട്ടുകളും ആക്സസറികളും"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"കണക്റ്റ് ചെയ്ത Bluetooth ഉപകരണങ്ങളൊന്നുമില്ല"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ആക്സസറികൾ</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> ആക്സസറി</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ഡിസ്പ്ലേയും ശബ്ദവും"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"സഹായവും ഫീഡ്ബാക്കും"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"സ്വകാര്യത"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"ഫാക്ടറി ഡാറ്റ പുനഃക്രമീകരണം"</string>
<string name="device_calibration" msgid="2907914144048739705">"കാലിബ്രേഷൻ"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"എനർജി സേവർ"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"ഉപകരണങ്ങൾ"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ഫോർമാറ്റുകൾ തിരഞ്ഞെടുക്കുക"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"സറൗണ്ട് ശബ്ദം"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"ഡോൾബി ഡിജിറ്റൽ"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"പ്രവർത്തനക്ഷമമാക്കിയ ഫോർമാറ്റുകൾ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"പ്രവർത്തനരഹിതമാക്കിയ ഫോർമാറ്റുകൾ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"പ്രവർത്തനരഹിതമാക്കാൻ, ഫോർമാറ്റ് തിരഞ്ഞെടുക്കൽ \'നേരിട്ട്\' എന്നതിലേക്ക് മാറ്റുക."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"റെസല്യൂഷൻ"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"സ്വയമേവ"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"റെസല്യൂഷൻ മാറ്റി"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"ഇപ്പോൾ മുതൽ %1$s ഉപയോഗിക്കാൻ ശരി തിരഞ്ഞെടുക്കുക."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"റദ്ദാക്കുക"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ശരി"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"കാഷെ ചെയ്ത ഡാറ്റ മായ്ക്കണോ?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"ഇത് എല്ലാ അപ്ലിക്കേഷനുകൾക്കുമായി കാഷെ ചെയ്ത ഡാറ്റ മായ്ക്കും."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"ചേർക്കൂ"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"ജോടിയാക്കുന്നു…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"കണക്റ്റുചെയ്യുന്നു..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"ആക്സസറികൾ"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"റിമോട്ട് കൺട്രോൾ"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"റിമോട്ട് കൺട്രോൾ ക്രമീകരണം"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"റിമോട്ട് ബട്ടണുകൾ സജ്ജീകരിക്കുക"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"ശബ്ദം, പവർ, ടിവികളിലെ ഇൻപുട്ട്, റിസീവറുകൾ, സൗണ്ട് ബാറുകൾ എന്നിവ നിയന്ത്രിക്കുക"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"കണക്റ്റ് ചെയ്യുക"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s എന്നതിലേക്ക് കണക്റ്റ് ചെയ്യുക"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"വിച്ഛേദിക്കുക"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"ലഭ്യമല്ല"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"ഉപകരണ അഡ്മിൻ ആപ്പുകൾ"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"സജീവ ആപ്പുകളൊന്നുമില്ല"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"അഡ്മിനോ എൻക്രിപ്ഷൻ നയമോ ക്രെഡൻഷ്യൽ സ്റ്റോറേജോ പ്രവർത്തനരഹിതമാക്കി"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"മാനേജുചെയ്യപ്പെടുന്ന ഉപകരണത്തിന്റെ വിവരങ്ങൾ"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"മാറ്റങ്ങളും ക്രമീകരണവും മാനേജുചെയ്യുന്നത് നിങ്ങളുടെ സ്ഥാപനമാണ്"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"ഒന്നുമില്ല"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"അപ്ലിക്കേഷനുകൾ ഇൻസ്റ്റാളുചെയ്തു"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"ആപ്പുകളുടെ എണ്ണം ഏകദേശക്കണക്കാണ്. ഇതിൽ Play സ്റ്റോറിന് പുറത്തുനിന്ന് ഇൻസ്റ്റാൾ ചെയ്ത ആപ്പുകൾ ഉൾപ്പെടണമെന്നില്ല."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{കുറഞ്ഞത് # ആപ്പ്}other{കുറഞ്ഞത് # ആപ്പുകൾ}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"ലൊക്കേഷൻ അനുമതികൾ"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"മൈക്രോഫോൺ അനുമതികൾ"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"ക്യാമറ അനുമതികൾ"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"ഡിഫോൾട്ട് ആപ്പുകൾ"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# ആപ്പ്}other{# ആപ്പുകൾ}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"ഡിഫോൾട്ട് കീബോർഡ്"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> എന്നതിലേക്ക് സജ്ജമാക്കുക"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"എപ്പോഴും ഓണായിരിക്കുന്ന VPN ഓണാണ്"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"വിശ്വസ്ത ക്രെഡൻഷ്യലുകൾ"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"നിങ്ങളുടെ വ്യക്തിഗത പ്രൊഫൈലിലെ വിശ്വസ്ത ക്രെഡൻഷ്യലുകൾ"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിലെ വിശ്വസ്ത ക്രെഡൻഷ്യലുകൾ"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">കുറഞ്ഞത് <xliff:g id="COUNT_1">%d</xliff:g> CA സർട്ടിഫിക്കറ്റുകൾ</item>
- <item quantity="one">കുറഞ്ഞത് <xliff:g id="COUNT_0">%d</xliff:g> CA സർട്ടിഫിക്കറ്റ്</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA സർട്ടിഫിക്കറ്റ്}other{# CA സർട്ടിഫിക്കറ്റുകൾ}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"അഡ്മിന് ഉപകരണം ലോക്കുചെയ്യാനും പാസ്വേഡ് പുനഃക്രമീകരിക്കാനും കഴിയും"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"അഡ്മിന് ഉപകരണത്തിലെ എല്ലാ ഡാറ്റയും ഇല്ലാതാക്കാൻ കഴിയും"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"എല്ലാ ഉപകരണ ഡാറ്റയും ഇല്ലാതാക്കുന്നതിന് മുമ്പ് പരാജയപ്പെട്ട പാസ്വേഡ് ശ്രമങ്ങൾ"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"ഔദ്യോഗിക പ്രൊഫൈൽ ഡാറ്റ ഇല്ലാതാക്കുന്നതിന് മുമ്പ് പരാജയപ്പെട്ട പാസ്വേഡ് ശ്രമങ്ങൾ"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# ശ്രമം}other{# ശ്രമങ്ങൾ}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"ഈ ഉപകരണം മാനേജുചെയ്യുന്നത് നിങ്ങളുടെ സ്ഥാപനമാണ്."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"ഈ ഉപകരണം നിയന്ത്രിക്കുന്നത് <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ആണ്."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"കൂടുതലറിയുക"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">ക്യാമറാ ആപ്പുകൾ</item>
- <item quantity="one">ക്യാമറാ ആപ്പ്</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{ക്യാമറാ ആപ്പ്}other{ക്യാമറാ ആപ്പുകൾ}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Calendar ആപ്പ്"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"കോണ്ടാക്റ്റ് ആപ്പ്"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">ഇമെയിൽ ക്ലയന്റ് ആപ്പുകൾ</item>
- <item quantity="one">ഇമെയിൽ ക്ലയന്റ് ആപ്പ്</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ഇമെയിൽ ക്ലയന്റ് ആപ്പ്}other{ഇമെയിൽ ക്ലയന്റ് ആപ്പുകൾ}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"മാപ്പ് ആപ്പ്"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">ഫോൺ ആപ്പുകൾ</item>
- <item quantity="one">ഫോൺ ആപ്പ്</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{ഫോൺ ആപ്പ്}other{ഫോൺ ആപ്പുകൾ}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"ബ്രൗസർ ആപ്പ്"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS പതിപ്പ്"</string>
<string name="about_serial" msgid="3432319328808745459">"സീരിയല് നമ്പര്"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS ബിൽഡ്"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{ഒരു ഡെവലപ്പറാകുന്നതിൽ നിന്നും # ചുവട് അകലെയാണ് നിങ്ങൾ ഇപ്പോൾ}other{ഒരു ഡെവലപ്പറാകുന്നതിൽ നിന്നും # ചുവട് അകലെയാണ് നിങ്ങൾ ഇപ്പോൾ}}"</string>
<string name="about_ads" msgid="7662896442040086522">"പരസ്യങ്ങൾ"</string>
<string name="ads_description" msgid="8081069475265061074">"പരസ്യം ചെയ്യൽ ഐഡി റീസെറ്റ് ചെയ്യുന്നത് പോലുള്ള പരസ്യ ക്രമീകരണം മാനേജ് ചെയ്യൂ."</string>
<string name="ads_content_description" msgid="1006489792324920289">"പരസ്യങ്ങൾ, പരസ്യം ചെയ്യൽ ഐഡി റീസെറ്റ് ചെയ്യുന്നത് പോലുള്ള നിങ്ങളുടെ പരസ്യ ക്രമീകരണം മാനേജ് ചെയ്യൂ."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"അധിക സിസ്റ്റം അപ്ഡേറ്റുകൾ"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"നെറ്റ്വർക്ക് നിരീക്ഷിക്കപ്പെടാം"</string>
<string name="done_button" msgid="616159688526431451">"പൂർത്തിയാക്കി"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">സർട്ടിഫിക്കറ്റുകൾ വിശ്വസിക്കുക അല്ലെങ്കിൽ നീക്കം ചെയ്യുക</item>
- <item quantity="one">സർട്ടിഫിക്കറ്റ് വിശ്വസിക്കുക അല്ലെങ്കിൽ നീക്കം ചെയ്യുക</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>, നിങ്ങളുടെ ഉപകരണത്തിൽ സർട്ടിഫിക്കറ്റ് അതോറിറ്റികൾ ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ട്, ഇമെയിലുകളും ആപ്പുകളും സുരക്ഷിത വെബ്സൈറ്റുകളും ഉൾപ്പെടെ, ഉപകരണ നെറ്റ്വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കുന്നതിന് ഇത് അവരെ അനുവദിച്ചേക്കാം.\n\nഈ സർട്ടിഫിക്കറ്റുകളെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക്, നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g>, നിങ്ങളുടെ ഉപകരണത്തിൽ ഒരു സർട്ടിഫിക്കറ്റ് അതോറിറ്റി ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ട്, ഇമെയിലുകളും ആപ്പുകളും സുരക്ഷിത വെബ്സൈറ്റുകളും ഉൾപ്പെടെ, ഉപകരണ നെറ്റ്വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കുന്നതിന് ഇത് അവരെ അനുവദിച്ചേക്കാം.\n\nഈ സർട്ടിഫിക്കറ്റിനെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക്, നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>, നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിന് സർട്ടിഫിക്കറ്റ് അതോറിറ്റികൾ ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ട്, ഇമെയിലുകളും ആപ്പുകളും സുരക്ഷിത വെബ്സൈറ്റുകളും ഉൾപ്പെടെ, ഔദ്യോഗിക നെറ്റ്വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കുന്നതിന് ഇത് അവരെ അനുവദിച്ചേക്കാം.\n\nഈ സർട്ടിഫിക്കറ്റുകളെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക്, നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g>, നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിന് ഒരു സർട്ടിഫിക്കറ്റ് അതോറിറ്റി ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ട്, ഇമെയിലുകളും ആപ്പുകളും സുരക്ഷിത വെബ്സൈറ്റുകളും ഉൾപ്പെടെ, ഔദ്യോഗിക നെറ്റ്വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കുന്നതിന് ഇത് അവരെ അനുവദിച്ചേക്കാം.\n\nഈ സർട്ടിഫിക്കറ്റിനെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക്, നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"ഇമെയിലുകളും അപ്ലിക്കേഷനുകളും വെബ്സൈറ്റുകൾ സുരക്ഷിതമാക്കലും ഉൾപ്പെടെയുള്ള നിങ്ങളുടെ നെറ്റ്വർക്ക് പ്രവർത്തനങ്ങൾ നിരീക്ഷിക്കാൻ ഒരു മൂന്നാം കക്ഷിയ്ക്ക് കഴിയും.\n\nനിങ്ങളുടെ ഉപകരണത്തിൽ വിശ്വാസ്യയോഗ്യമായ ഒരു ക്രെഡൻഷ്യൽ ഇൻസ്റ്റാളുചെയ്യുന്നത് ഇത് സാധ്യമാക്കുന്നു."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">സർട്ടിഫിക്കറ്റുകൾ പരിശോധിക്കുക</item>
- <item quantity="one">സർട്ടിഫിക്കറ്റ് പരിശോധിക്കുക</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{സർട്ടിഫിക്കറ്റ് വിശ്വസിക്കുക അല്ലെങ്കിൽ നീക്കം ചെയ്യുക}other{സർട്ടിഫിക്കറ്റുകൾ വിശ്വസിക്കുക അല്ലെങ്കിൽ നീക്കം ചെയ്യുക}}"</string>
<string name="device_status" msgid="8266002761193692207">"നില"</string>
<string name="device_status_summary" msgid="3270932829412434985">"നെറ്റ്വർക്കും സീരിയൽ നമ്പറുകളും മറ്റ് വിവരങ്ങളും"</string>
<string name="manual" msgid="5683935624321864999">"മാനുവൽ"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"കണക്റ്റുചെയ്യുക"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"നെറ്റ്വർക്ക് മറക്കുക"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"സംരക്ഷിച്ച ഒരു പാസ്വേഡ് ഉൾപ്പടെ, ഈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യാൻ ഉപയോഗിച്ച വിവരങ്ങളെ ഇത് മായ്ക്കുന്നു"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"നിങ്ങളുടെ മൊബൈലിൽ QR കോഡ് സ്കാൻ ചെയ്ത ശേഷം നിർദ്ദേശങ്ങൾ പിന്തുടർന്ന് വൈഫൈയിൽ ചേരുക."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" നിങ്ങളുടെ മൊബൈലിൽ QR കോഡ് സ്കാൻ ചെയ്ത ശേഷം നിർദ്ദേശങ്ങൾ പിന്തുടർന്ന് വൈഫൈയിൽ ചേരുക.\n \n ഒരു "<b>"Android ഫോണിൽ നിന്ന്"</b>" ക്രമീകരണം -> നെറ്റ്വർക്കും ഇന്റർനെറ്റും -> വൈഫൈ -> വൈഫൈ തിരഞ്ഞെടുക്കുക -> വിപുലമായത് -> ഉപകരണം ചേർത്ത ശേഷം QR കോഡ് സ്കാൻ ചെയ്യുക എന്നതിലേക്ക് പോകുക."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"റദ്ദാക്കാൻ, മടങ്ങുക ബട്ടൺ അമർത്തുക"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ശരി"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"തുടരുക"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"ഉപകരണ സ്റ്റോറേജ്"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"നീക്കംചെയ്യാനാവുന്ന സ്റ്റോറേജ്"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"റീസെറ്റുചെയ്യുക"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"സ്റ്റോറേജിൽ ഇടം സൃഷ്ടിക്കുക"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"കാഷെ ചെയ്ത ഡാറ്റ മായ്ക്കുക"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> ഇടം സൃഷ്ടിക്കുക"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"ഇടം അപഹരിക്കുന്ന താൽക്കാലിക ഫയലുകൾ മായ്ക്കുന്നു. ആപ്പ് മുൻഗണനകളോ ഓഫ്ലൈൻ വീഡിയോകളോ പോലുള്ള സംരക്ഷിച്ച ഡാറ്റയെ ബാധിക്കില്ല, നിങ്ങൾ വീണ്ടും ആപ്പുകളിലേക്ക് സൈൻ ഇൻ ചെയ്യേണ്ടതില്ല."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"കാഷെ ചെയ്ത ഡാറ്റ മായ്ക്കണോ?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"ഇത് എല്ലാ ആപ്പുകൾക്കുമായി കാഷെ ചെയ്ത ഡാറ്റ മായ്ക്കും."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"ആപ്പുകൾ അൺഇൻസ്റ്റാൾ ചെയ്യുക"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> എന്നതിനെ മൗണ്ടുചെയ്തു"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> മൗണ്ടുചെയ്യാനായില്ല"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB സ്റ്റോറേജ് വീണ്ടും കണക്റ്റുചെയ്തു"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"മൈക്രോഫോൺ"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"മൈക്രോഫോൺ ആക്സസ്"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"മൈക്രോഫോണിലേക്കുള്ള ആപ്പ് ആക്സസ്"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"മൈക്രോഫോൺ ആക്സസ് ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"അൺബ്ലോക്ക് ചെയ്യാൻ, മൈക്രോഫോൺ ആക്സസ് അനുവദിക്കുന്നതിന്, മൈക്രോഫോൺ ഓണാണ് എന്ന സ്ഥാനത്തേക്ക് നിങ്ങളുടെ ഉപകരണത്തിലെ സ്വകാര്യത മാറ്റുക."</string>
<string name="camera" msgid="1226671478936288283">"ക്യാമറ"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"ക്യാമറാ ആക്സസ്"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"ക്യാമറയിലേക്കുള്ള ആപ്പ് ആക്സസ്"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"ക്യാമറാ ആക്സസ് ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"അൺബ്ലോക്ക് ചെയ്യാൻ, ക്യാമറാ ആക്സസ് അനുവദിക്കുന്നതിന്, ക്യാമറ ഓണാണ് എന്ന സ്ഥാനത്തേക്ക് നിങ്ങളുടെ ഉപകരണത്തിലെ സ്വകാര്യത മാറ്റുക."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"മൈക്രോഫോൺ ആക്സസ്: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"ഓണായിരിക്കുമ്പോൾ, അനുമതിയുള്ള എല്ലാ ആപ്പുകൾക്കും സേവനങ്ങൾക്കും ഈ ഉപകരണത്തിലെ ഏത് മൈക്രോഫോണും ആക്സസ് ചെയ്യാനാകും.\n\nഇഷ്ടാനുസൃത പ്രോട്ടോക്കോളുള്ള ഓഡിയോ പെരിഫറലുകളെ ഈ ക്രമീകരണം ബാധിക്കില്ല."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"ക്യാമറാ ആക്സസ്: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"സിയാൻ"</string>
<string name="color_yellow" msgid="3519470952904560404">"മഞ്ഞ"</string>
<string name="color_magenta" msgid="2377854703399624607">"മജന്ത"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"ഓഡിയോ വിവരണം"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"പിന്തുണയ്ക്കുന്ന സിനിമകളിലും ഷോകളിലും, സ്ക്രീനിൽ എന്താണ് സംഭവിക്കുന്നത് എന്നതിന്റെ ഒരു വിവരണം കേൾക്കുക"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"പ്രവർത്തനക്ഷമമാക്കുക"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"കോൺഫിഗറേഷൻ"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> ഉപയോഗിക്കണോ?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"മോണിറ്ററിംഗ്"</string>
<string name="system_apps" msgid="8481888654606868074">"ആപ്പുകൾ"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"സജീവമായി തുടരുക"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"സ്ക്രീൻ ഒരിക്കലും സ്ലീപ്പ് മോഡിലാകില്ല"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP പരിശോധന"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI അനുരൂപമാക്കൽ"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"ഇപ്പോൾ റീസ്റ്റാർട്ട് ചെയ്യണോ?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"ടിവിയ്ക്കൊപ്പമുള്ള HDMI ഉപകരണങ്ങളുടെ പവർ ഓഫ് ചെയ്യുക"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"ടിവി യാന്ത്രിക പവർ ഓൺ"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI ഉപകരണം ഉപയോഗിച്ച് ടിവി ഓൺ ചെയ്യുക"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">കണക്റ്റുചെയ്ത ഇൻപുട്ടുകൾ</item>
- <item quantity="one">കണക്റ്റുചെയ്ത ഇൻപുട്ട്</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">സ്റ്റാൻഡ്ബൈ ഇൻപുട്ടുകൾ</item>
- <item quantity="one">സ്റ്റാൻഡ്ബൈ ഇൻപുട്ട്</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">കണക്റ്റുചെയ്തിട്ടില്ലാത്ത ഇൻപുട്ടുകൾ</item>
- <item quantity="one">കണക്റ്റുചെയ്തിട്ടില്ലാത്ത ഇൻപുട്ട്</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{കണക്റ്റ് ചെയ്തിരിക്കുന്ന ഇൻപുട്ട്}other{കണക്റ്റ് ചെയ്തിരിക്കുന്ന ഇൻപുട്ടുകൾ}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{സ്റ്റാൻഡ്ബൈ ഇൻപുട്ട്}other{സ്റ്റാൻഡ്ബൈ ഇൻപുട്ട്}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{കണക്റ്റ് ചെയ്തിട്ടില്ലാത്ത ഇൻപുട്ട്}other{കണക്റ്റ് ചെയ്തിട്ടില്ലാത്ത ഇൻപുട്ടുകൾ}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"നിങ്ങളുടെ അക്കൗണ്ടിലെ അപ്ലിക്കേഷനിലേക്കും മറ്റ് ഉള്ളടക്കത്തിലേക്കുമുള്ള ആക്സസ്സ് നിയന്ത്രിക്കുക"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"നിയന്ത്രിത പ്രൊഫൈൽ"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> നിയന്ത്രിക്കുന്നത്"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"നിയന്ത്രിത പ്രൊഫൈൽ സൃഷ്ടിക്കുക"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"ക്രമീകരണം"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"അനുവദിച്ച അപ്ലിക്കേഷനുകൾ"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d അപ്ലിക്കേഷനുകൾ അനുവദിച്ചു</item>
- <item quantity="one">ഒരു അപ്ലിക്കേഷൻ അനുവദിച്ചു</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"അനുവദനീയം"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"അനുവദിച്ചിട്ടില്ല"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"നിയന്ത്രണങ്ങൾ ഇഷ്ടാനുസൃതമാക്കുക"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"മൂന്നാം കക്ഷി ഉറവിടം"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"അനുമതികൾ"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"അപ്ലിക്കേഷൻ ലഭ്യമല്ല"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"ഉപയോഗിക്കാത്ത ആപ്പുകൾ"</string>
<string name="settings_ok" msgid="5950888975075541964">"ശരി"</string>
<string name="settings_confirm" msgid="4489126458677153411">"സ്ഥിരീകരിക്കൂ"</string>
<string name="settings_cancel" msgid="576094334743686152">"റദ്ദാക്കുക"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"ഈ അനുമതി, സിസ്റ്റം ക്രമീകരണം പരിഷ്ക്കരിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="write_settings_on" msgid="71675710746513956">"അതെ"</string>
<string name="write_settings_off" msgid="6730113471695092167">"ഇല്ല"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"എല്ലാ ഫയലുകളിലേക്കും ആക്സസ്"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"എല്ലാ ഫയലുകളും മാനേജ് ചെയ്യാൻ ആക്സസ് അനുവദിക്കൂ"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"ഈ ഉപകരണത്തിലെയോ ഇതുമായി ബന്ധിപ്പിച്ചിട്ടുള്ള ഏതെങ്കിലും സ്റ്റോറേജുകളിലെയോ എല്ലാ ഫയലുകളും വായിക്കാനും പരിഷ്ക്കരിക്കാനും ഇല്ലാതാക്കാനും ഈ ആപ്പിനെ അനുവദിക്കുക. അനുമതി നൽകിയിട്ടുണ്ടെങ്കിൽ, നിങ്ങളുടെ അറിവില്ലാതെ തന്നെ ആപ്പ് ഫയലുകൾ ആക്സസ് ചെയ്തേക്കാം."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"ചിത്രത്തിനുള്ളിൽ ചിത്രം"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"\'ചിത്രത്തിനുള്ളിൽ ചിത്രം\' അനുവദിക്കുക"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"ഇൻസ്റ്റാൾ ചെയ്ത ആപ്പുകളൊന്നും \'ചിത്രത്തിനുള്ളിൽ ചിത്രം\' പിന്തുണയ്ക്കുന്നില്ല"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"ഈ ആപ്പ് തുറന്നിരിക്കുന്ന സമയത്തോ നിങ്ങളതിൽ നിന്ന് പുറത്തുകടന്നതിന് ശേഷമോ (ഉദാഹരണത്തിന്, ഒരു വീഡിയോ കാണുന്നത് തുടരുന്നതിന്) \'ചിത്രത്തിനുള്ളിൽ ചിത്രം\' വിൻഡോ സൃഷ്ടിക്കാൻ ഈ ആപ്പിനെ അനുവദിക്കുക. നിങ്ങൾ ഉപയോഗിക്കുന്ന മറ്റ് ആപ്പുകളുടെ മുകളിൽ ഈ വിൻഡോ പ്രദർശിപ്പിക്കുന്നു."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"അലാറങ്ങൾ സജ്ജീകരിക്കാനും സമയപ്രാധാന്യമുള്ള പ്രവർത്തനങ്ങൾ ഷെഡ്യൂൾ ചെയ്യാനും ആപ്പുകളെ അനുവദിക്കുക. പശ്ചാത്തലത്തിൽ റൺ ചെയ്യാൻ ഇത് ആപ്പുകളെ അനുവദിക്കുന്നു, ഇതിന് കൂടുതൽ ബാറ്ററി ഉപയോഗിച്ചേക്കാം.\n\nഈ അനുമതി ഓഫാണെങ്കിൽ, ആപ്പ് ഷെഡ്യൂൾ ചെയ്തസമയാധിഷ്ഠിത ഇവന്റുകളും നിലവിലെ അലാറങ്ങളും പ്രവർത്തിക്കില്ല."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"സ്ക്രീൻ ഓണാക്കുക"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"സ്ക്രീൻ ഓണാക്കാൻ അനുവദിക്കുക"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"സ്ക്രീൻ ഓണാക്കാൻ ഒരു ആപ്പിനെ അനുവദിക്കുക. അനുവദിക്കുകയാണെങ്കിൽ, നിങ്ങൾക്ക് വ്യക്തമായ ഉദ്ദേശ്യമില്ലെങ്കിലും ആപ്പ് ഏതുസമയത്തും സ്ക്രീൻ ഓണാക്കിയേക്കാം."</string>
<string name="special_access" msgid="21806055758289916">"പ്രത്യേക ആപ്പ് ആക്സസ്"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"ഓഡിയോ"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"ഡാറ്റ സേവർ"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"കുറഞ്ഞ മൊബെെൽ ഡാറ്റ ഉപയോഗിക്കുന്നതിന്, വീഡിയോ നിലവാരം സ്വയമേവ ക്രമീകരിക്കുക"</string>
<string name="title_data_alert" msgid="8262081890052682475">"ഡാറ്റാ ഉപയോഗവും മുന്നറിയിപ്പുകളും"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"വെെഫെെ, എതെർനെറ്റ്, അല്ലെങ്കിൽ ഫോണിന്റെ ഹോട്ട്സ്പോട്ട് ഉപയോഗിച്ച് ഇന്റർനെറ്റിലേക്ക് കണക്റ്റ് ചെയ്യാം. കൂടുതൽ സഹായത്തിന് "<b>"g.co/network"</b>" സന്ദർശിക്കൂ."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"വെെഫെെ, ഇതർനെറ്റ്, അല്ലെങ്കിൽ ഫോണിന്റെ ഹോട്ട്സ്പോട്ട് ഉപയോഗിച്ച് ഇന്റർനെറ്റിലേക്ക് കണക്റ്റ് ചെയ്യാം."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"പ്രവർത്തനം അനുവദനീയമല്ല"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"വോളിയം മാറ്റാനാകില്ല"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"പവറും ഊർജ്ജവും"</string>
<string name="power_on_behavior" msgid="927607372303160716">"പവർ ഓണാക്കുമ്പോഴുള്ള പ്രവർത്തനരീതി"</string>
<string name="reset_options_title" msgid="7632580482285108955">"റീസെറ്റ് ചെയ്യുക"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"ഇതർനെറ്റ് ജോടിയാക്കൽ കോഡ്"</string>
</resources>
diff --git a/Settings/res/values-mn/strings.xml b/Settings/res/values-mn/strings.xml
index 3998169..ed3061f 100644
--- a/Settings/res/values-mn/strings.xml
+++ b/Settings/res/values-mn/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Бүртгэл нэмэх"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Бүртгэл, нэвтрэлт"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Бүртгэл алга"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> бүртгэл</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> бүртгэл</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# бүртгэл}other{# бүртгэл}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Медиа үйлчилгээ, Туслах, Төлбөр"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Сүлжээ, интернэт"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Дуу"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Апп"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Төхөөрөмжийн сонголт"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Удирдлага, дагалдах хэрэгслүүд"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Холбогдсон Bluetooth төхөөрөмж алга"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> дагалдах хэрэгсэл</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> дагалдах хэрэгсэл</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Дэлгэц болон дуу чимээ"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Тусламж болон санал хүсэлт"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Нууцлал"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Үйлдвэрээс гарсан төлөвт"</string>
<string name="device_calibration" msgid="2907914144048739705">"Тааруулалт"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Эрчим хүч хэмнэгч"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Төхөөрөмжүүд"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Формат сонгох"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Орчин тойрны дуу"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ИДЭВХЖҮҮЛСЭН ФОРМАТУУД"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ИДЭВХГҮЙ БОЛГОСОН ФОРМАТУУД"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Идэвхгүй болгохын тулд форматын сонголтыг Гар арга руу өөрчилнө үү."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Нягтрал"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Автомат"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Нягтралыг өөрчилсөн"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Одооноос %1$s-г ашиглахын тулд OK-г сонгоно уу."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Цуцлах"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Гц"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Кеш хийгдсэн өгөгдлийг арилгах уу?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Бүх програмд зориулан кеш хийгдсэн өгөгдлийг арилгах болно."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Аксесуар нэмэх"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Хослуулж байна…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Холбогдож байна..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Дагалдах хэрэгслүүд"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Алсын удирдлага"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Алсын удирдлагын тохиргоо"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Удирдлагын товчлуур тохируулах"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"ТВ, хүлээн авагч болон дууны самбар дээрх дууны түвшин, асаах/унтраах, оролтыг удирдах"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Холбогдох"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s-д холбогдох"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Салгах"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Боломжгүй"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Төхөөрөмжийн админы апп"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Идэхтэй апп алга"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Админ, шифрлэлтийн бодлого, эсвэл итгэмжлэлийн сангаас цуцалсан"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Удирдсан төхөөрөмжийн мэдээлэл"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Таны байгууллагын удирдсан тохиргооны өөрчлөлт"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Байхгүй"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Апп суулгасан"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Аппын тоог тооцоолсон. Үүнд Play Store-с гадуур суулгасан аппуудыг оруулаагүй байж болзошгүй."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Хамгийн багадаа # апп}other{Хамгийн багадаа # апп}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Байршлын зөвшөөрөл"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Микрофоны зөвшөөрөл"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Камерын зөвшөөрөл"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Өгөгдмөл апп"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# апп}other{# апп}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Өгөгдмөл гар"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g>-д тохируулах"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Тогтмол асаалттай VPN асаасан"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Итгэмжит мандат үнэмлэх"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Таны хувийн профайлд суулгасан итгэмжит мандат үнэмлэх"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Таны ажлын профайлд суулгасан итгэмжит мандат үнэмлэх"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Хамгийн багадаа <xliff:g id="COUNT_1">%d</xliff:g> CA сертификат</item>
- <item quantity="one">Хамгийн багадаа <xliff:g id="COUNT_0">%d</xliff:g> CA сертификат</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA сертификат}other{# CA сертификат}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Админ төхөөрөмжийг түгжиж, нууц үгийг сэргээх боломжтой"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Админ төхөөрөмжийн бүх өгөгдлийг устгах боломжтой"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Бүх төхөөрөмжийн өгөгдлийг устгахаас өмнө нууц үгийн оролдлого амжилтгүй болсон"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Ажлын профайлын өгөгдлийг устгахаас өмнө нууц үгийн оролдлого амжилтгүй болсон"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# оролдлого}other{# оролдлого}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Энэ төхөөрөмжийг таны байгууллага удирдаж байна."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Энэ төхөөрөмжийг <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> удирддаг"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Дэлгэрэнгүй үзэх"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Камерын аппууд</item>
- <item quantity="one">Камерын апп</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Камерын апп}other{Камерын аппууд}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Хуанлины апп"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Харилцагчийн апп"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Имэйл хэрэглэгчийн аппууд</item>
- <item quantity="one">Имэйл хэрэглэгчийн апп</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Имэйл хэрэглэгчийн апп}other{Имэйл хэрэглэгчийн аппууд}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Газрын зургийн апп"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Гар утасны аппууд</item>
- <item quantity="one">Гар утасны апп</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Гар утасны апп}other{Гар утасны аппууд}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Хөтөч апп"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV-н үйлдлийн системийн хувилбар"</string>
<string name="about_serial" msgid="3432319328808745459">"Сериалын дугаар"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV-н үйлдлийн системийн хийц"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{Та одоо хөгжүүлэгч болоход # алхам дутуу байна}other{Та одоо хөгжүүлэгч болоход # алхам дутуу байна}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Зар"</string>
<string name="ads_description" msgid="8081069475265061074">"Зарын ID-г шинэчлэх зэргээр зарын тохиргоог удирд"</string>
<string name="ads_content_description" msgid="1006489792324920289">"Зар, Зар сурталчилгааны ID-аа шинэчлэх зэрэг сурталчилгааны тохиргоогоо удирдаарай"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Системийн нэмэлт шинэчлэлт"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Сүлжээ хянагдаж байж болзошгүй"</string>
<string name="done_button" msgid="616159688526431451">"Дууссан"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Сертификатуудад итгэх эсвэл устгах</item>
- <item quantity="one">Сертификатад итгэх эсвэл устгах</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> таны ажлын төхөөрөмжид сертификатын удирдлага суулгасан бөгөөд энэ нь тэдэнд имэйл, апп, аюулгүй вебсайт зэрэг таны төхөөрөмжийн сүлжээний үйл ажиллагааг удирдах зөвшөөрөл олгож болно. \n\nЭдгээр сертификатын талаар нэмэлт мэдээлэл авахын тулд админтайгаа холбогдоно уу.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> таны ажлын төхөөрөмжид сертификатын удирдлага суулгасан бөгөөд энэ нь тэдэнд имэйл, апп, аюулгүй вебсайт зэрэг таны төхөөрөмжийн сүлжээний үйл ажиллагааг удирдах зөвшөөрөл олгож болно. \n\nЭнэ сертификатын талаар нэмэлт мэдээлэл авахын тулд админтайгаа холбогдоно уу.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> таны ажлын профайлд сертификатын удирдлага суулгасан бөгөөд энэ нь тэдэнд имэйл, апп, аюулгүй вебсайт зэрэг ажлын сүлжээний үйл ажиллагааг удирдах зөвшөөрөл олгож болно. \n\nЭдгээр сертификатын талаар нэмэлт мэдээлэл авахын тулд админтайгаа холбогдоно уу.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> таны ажлын профайлд сертификатын удирдлага суулгасан бөгөөд энэ нь тэдэнд имэйл, апп, аюулгүй вебсайт зэрэг ажлын сүлжээний үйл ажиллагааг удирдах зөвшөөрөл олгож болно. \n\nЭнэ сертификатын талаар нэмэлт мэдээлэл авахын тулд админтайгаа холбогдоно уу.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Гуравдагч талын этгээд таны имэйл, апп-ууд болон аюулгүй вебсайтууд гэх мэтийг оруулан таны сүлжээний үйл ажиллагааг хянах боломжтой.\n\nТаны төхөөрөмж дээр суулгасан итгэмжлэгдсэн жуухын тусламжтайгаар ингэх боломжтой."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Сертификатууд шалгах</item>
- <item quantity="one">Сертификат шалгах</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Сертификатад итгэх эсвэл устгах}other{Сертификатуудад итгэх эсвэл устгах}}"</string>
<string name="device_status" msgid="8266002761193692207">"Төлөв"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Сүлжээ, сериал дугаар болон бусад мэдээлэл"</string>
<string name="manual" msgid="5683935624321864999">"Гар ажиллагаатай"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Холбох"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Сүлжээг мартах"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Ингэснээр тус сүлжээнд холбогдоход шаардагддаг хадгалагдсан нууц үг гэх мэт мэдээллийг арилгах болно"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Мобайл утаснаасаа QR кодыг скан хийж, Wi-Fi-д нэгдээд зааварчилгааг дагана уу."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Мобайл утаснаас QR кодыг скан хийснээр Wi-Fi-д нэгдэж, зааварчилгааг дагана уу.\n \n "<b>"Android утаснаасаа"</b>" Тохиргоо -> Сүлжээ & Интернэт -> Wi-Fi -> Wi-Fi сонгох -> Дэвшилтэт -> Төхөөрөмж нэмэх рүү очоод, дараа нь QR кодыг скан хийнэ үү."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Цуцлахын тулд буцах товчлуурыг дарна уу"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Үргэлжлүүлэх"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Төхөөрөмжийн хадгалах сан"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Хөдөлгөөнт санах ой"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Дахин шинэчлэх"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Хадгалах санд зай гаргах"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Завсрын санах ойд хадгалсан өгөгдлийг арилгах"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g>-д зай гаргах"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Зай эзэлж байгаа түр зуурын файлуудыг арилгана уу. Аппын тохируулга эсвэл офлайн видео зэрэг хадгалсан өгөгдөлд нөлөөлөхгүй бөгөөд та дахин аппуудад нэвтрэх шаардлагагүй болно."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Завсрын санах ойд хадгалсан өгөгдлийг арилгах уу?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Энэ нь бүх аппын завсрын санах ойд хадгалсан өгөгдлийг арилгах болно."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Аппуудыг устгах"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g>-ыг залгасан байна"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g>-ыг залгаж чадахгүй байна"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB хадгалах санг дахин холболоо"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Микрофон"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Микрофоны хандалт"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Микрофоны аппын хандалт"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Микрофоны хандалтыг блоклосон"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Блокоос гаргахын тулд төхөөрөмжийнхөө нууцлалын сэлгүүрийг микрофон асаалттай байрлалд зөөж микрофонд хандахыг зөвшөөрнө үү."</string>
<string name="camera" msgid="1226671478936288283">"Камер"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Камерын хандалт"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Камерын аппын хандалт"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Камерын хандалтыг блоклосон"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Блокоос гаргахын тулд төхөөрөмжийнхөө нууцлалын сэлгүүрийг камер асаалттай байрлалд зөөж камерт хандахыг зөвшөөрнө үү."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Микрофоны хандалт: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Асаасан үед зөвшөөрөлтэй бүх апп болон үйлчилгээ энэ төхөөрөмж дээрх дурын микрофонд хандаж болно.\n\nЗахиалгат протоколтой аудионы нэмэлт хэрэгслүүдэд энэ тохиргоо нөлөөлөхгүй."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Камерын хандалт: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Шар хөх"</string>
<string name="color_yellow" msgid="3519470952904560404">"Шар"</string>
<string name="color_magenta" msgid="2377854703399624607">"Магента"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Аудио тайлбар"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Дэмжсэн кино болон шоуны дэлгэц дээр юу болж байгаа талаарх тайлбарыг сонсоорой"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Идэвхжүүлэх"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Тохируулга"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g>-г ашиглах уу?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Мониторинг"</string>
<string name="system_apps" msgid="8481888654606868074">"Апп"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Идэвхтэй байлгах"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Дэлгэц хэзээ ч унтрахгүй"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP шалгах"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI-н оновчлол"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Одоо дахин эхлүүлэх үү?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"HDMI төхөөрөмжүүдийг TВ-тэй хамт унтраах"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"ТВ автоматаар асаах"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"TВ-г HDMI төхөөрөмжийн хамт асаах"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Холбогдсон оролт</item>
- <item quantity="one">Холбогдсон оролт</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Түр горимын оролт</item>
- <item quantity="one">Түр горимын оролт</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Холбогдоогүй оролт</item>
- <item quantity="one">Холбогдоогүй оролт</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Холбогдсон оролт}other{Холбогдсон оролт}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Түр горимын оролт}other{Түр горимын оролт}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Холбогдоогүй оролт}other{Холбогдоогүй оролт}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Өөрийн бүртгэл дээрх апп-ууд болон бусад контентэд хандахыг хязгаарлах"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Хязгаарлагдсан профайл"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> хянадаг"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Хязгаарлагдмал профайл үүсгэх"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Тохиргоо"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Зөвшөөрөгдсөн апп-ууд"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d apps allowed</item>
- <item quantity="one">1 апп зөвшөөрөгдсөн байна</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Зөвшөөрөгдсөн"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Зөвшөөрөгдөөгүй"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Хязгаарлалтуудыг тааруулах"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Гуравдагч талын эх сурвалж"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Зөвшөөрлүүд"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Апп боломжгүй байна"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Ашиглаагүй апп"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Баталгаажуулах"</string>
<string name="settings_cancel" msgid="576094334743686152">"Цуцлах"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Энэ зөвшөөрөл нь аппад системийн тохиргоог өөрчлөхийг зөвшөөрдөг."</string>
<string name="write_settings_on" msgid="71675710746513956">"Тийм"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Үгүй"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Бүх файлд хандах хандалт"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Бүх файлыг удирдахын тулд хандахыг зөвшөөрөх"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Энэ аппад энэ төхөөрөмж дээрх эсвэл холбогдсон дурын хадгалах сангийн бүх файлыг унших, өөрчлөх болон устгахыг зөвшөөрөх. Зөвшөөрөл олгогдсон бол апп нь танд тодорхойлон мэдэгдэлгүйгээр файлд хандаж болзошгүй."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Дэлгэцэн доторх дэлгэц"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Дэлгэцэн доторх дэлгэцийг зөвшөөрөх"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Дэлгэцэн доторх дэлгэцийг дэмждэг суулгасан апп алга"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Апп нээлттэй үед эсвэл таныг энэ аппаас гарсны дараа (жишээ нь видео үргэлжлүүлэн үзэхийн тулд) дэлгэцэн доторх дэлгэц цонх үүсгэхийг аппад зөвшөөрнө үү. Энэ цонх таны ашиглаж буй бусад апп дээр харагдана."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Аппад сэрүүлэг тавих болон хугацаанд мэдрэг үйлдлийн хуваарь гаргахыг зөвшөөрнө үү. Энэ нь аппад ард ажиллахыг зөвшөөрөх бөгөөд ингэснээр илүү их цэнэг ашиглаж магадгүй.\n\nХэрэв энэ зөвшөөрөл унтраалттай бол аппын аль хэдийн тавьсан сэрүүлэг болон хуваарь гаргасан хугацаанд тулгуурласан үйл явдал ажиллахгүй."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Дэлгэцийг асаах"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Дэлгэцийг асаахыг зөвшөөрнө үү"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Аппад дэлгэцийг асаахыг зөвшөөрнө үү. Зөвшөөрсөн тохиолдолд апп нь таны тодорхой оролцоогүйгээр ямар ч үед дэлгэцийг асааж болно."</string>
<string name="special_access" msgid="21806055758289916">"Аппын тусгай хандалт"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Аудио"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Дата хэмнэгч"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Илүү бага мобайл дата ашиглахын тулд видеоны чанарыг автоматаар тохируулах"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Дата ашиглалт болон сэрэмжлүүлэг"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Та Wi-Fi, Ethernet эсвэл утасныхаа сүлжээний цэгээр дамжуулан интернэтэд холбогдох боломжтой. Нэмэлт тусламж авахын тулд "<b>"g.co/network"</b>" хаягаар зочилно уу."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Та Wi-Fi, Ethernet эсвэл утасныхаа сүлжээний цэгээр дамжуулан интернэтэд холбогдох боломжтой."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Үйлдлийг зөвшөөрөөгүй"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Дууны түвшнийг өөрчлөх боломжгүй"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Тэжээл болон эрчим хүч"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Асаалттай үеийн төлөв"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Шинэчлэх"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Этернэт хослуулах код"</string>
</resources>
diff --git a/Settings/res/values-mr/strings.xml b/Settings/res/values-mr/strings.xml
index 9d973f2..74c77fa 100644
--- a/Settings/res/values-mr/strings.xml
+++ b/Settings/res/values-mr/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"खाते जोडा"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"खाती आणि साइन इन"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"कोणतीही खाती नाहीत"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> खाती</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> खाते</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# खाते}other{# खाती}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"मीडियासंबंधित सेवा, Assistant, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"नेटवर्क आणि इंटरनेट"</string>
<string name="sound_category_title" msgid="7899816751041939518">"आवाज"</string>
<string name="applications_category_title" msgid="7112019490898586223">"अॅप्स"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"डिव्हाइस प्राधान्ये"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"रिमोट आणि ॲक्सेसरी"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"कनेक्ट केलेली कोणतीही ब्लूटूथ डिव्हाइस नाहीत"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ॲक्सेसरी</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> ॲक्सेसरी</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"डिस्प्ले आणि आवाज"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"मदत आणि फीडबॅक"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"गोपनीयता"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"फॅक्टरी डेटा रीसेट"</string>
<string name="device_calibration" msgid="2907914144048739705">"कॅलिब्रेशन"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"एनर्जी सेव्हर"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"डिव्हाइस"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"फॉरमॅट निवडा"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"आसपासचा ध्वनी"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"सुरू केलेले फॉरमॅट"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"बंद केलेले फॉरमॅट"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"बंद करण्यासाठी, फॉरमॅट निवड हे मॅन्युअल वर बदला."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"रेझोल्यूशन"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"ऑटोमॅटिक"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"रिझोल्युशन बदलले आहे"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"यापुढे %1$s वापरण्यासाठी ओके निवडा."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"रद्द करा"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ओके"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"कॅशे केलेला डेटा साफ करायचा?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"हे सर्व ॲप्ससाठी कॅशे केलेला डेटा साफ करेल."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"उपसाधन जोडा"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"जोडत आहे…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"कनेक्ट करत आहे..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"अॅक्सेसरी"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"रिमोट कंट्रोल"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"रिमोट कंट्रोल सेटिंग्ज"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"रिमोटची बटणे सेट करा"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"टीव्ही, रीसीव्हर आणि साउंडबारवरील व्हॉल्यूम, पॉवर, इनपुट नियंत्रित करा"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"कनेक्ट करा"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s शी कनेक्ट करा"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"डिस्कनेक्ट करा"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"उपलब्ध नाही"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"डिव्हाइस अॅडमिन अॅप्स"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"सक्रिय अॅप्स नाहीत"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"प्रशासक, कूटबद्धीकरण धोरण किंवा क्रेडेन्शियल संचयनाद्वारे अक्षम केलेले"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"व्यवस्थापित डिव्हाइस माहिती"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"आपल्या संस्थेद्वारे व्यवस्थापित बदल आणि सेटिंग्ज"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"काहीही नाही"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"इंस्टॉल केलेली अॅप्स"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"अॅपची संख्या अंदाजित आहे. त्यामध्ये कदाचित Play Store च्या बाहेर इंस्टॉल केलेल्या अॅप्सचा समावेश नाही."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{किमान # ॲप}other{किमान # ॲप्स}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"स्थान परवानग्या"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"मायक्रोफोन परवानग्या"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"कॅमेरा परवानग्या"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"डीफॉल्ट अॅप्स"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# ॲप}other{# अॅप्स}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"डीफॉल्ट कीबोर्ड"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> वर सेट करा"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"नेहमी VPN सुरू असणे सक्रिय आहे"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"विश्वसनीय क्रेडेंशिअल"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"तुमच्या खाजगी प्रोफाइलमधील विश्वसनीय क्रेडेंशिअल"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"तुमच्या कार्य प्रोफाइलमधील विश्वसनीय क्रेडेंशिअल"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">किमान <xliff:g id="COUNT_1">%d</xliff:g> CA सर्टिफिकेट</item>
- <item quantity="one">किमान <xliff:g id="COUNT_0">%d</xliff:g> CA सर्टिफिकेट</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA प्रमाणपत्र}other{# CA प्रमाणपत्रे}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"प्रशासक डिव्हाइस लॉक करू शकतो आणि पासवर्ड रीसेट करू शकतो"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"प्रशासक डिव्हाइसवरील सर्व डेटा हटवू शकतो"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"सर्व डिव्हाइस डेटा हटवण्यापूर्वी अयशस्वी झालेले पासवर्ड प्रयत्न"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"सर्व कार्य प्रोफाइल डेटा हटवण्यापूर्वी अयशस्वी झालेले पासवर्ड प्रयत्न"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# प्रयत्न}other{# प्रयत्न}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"हे डिव्हाइस तुमच्या संस्थेने व्यवस्थापित केले आहे."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"हे डिव्हाइस <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> द्वारे व्यवस्थापित आहे."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"अधिक जाणून घ्या"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">कॅमेरा ॲप्स</item>
- <item quantity="one">कॅमेरा ॲप</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{कॅमेरा ॲप}other{कॅमेरा ॲप्स}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Calendar अॅप"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"संपर्क अॅप"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">ईमेल क्लायंट ॲप्स</item>
- <item quantity="one">ईमेल क्लायंट ॲप</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ईमेल क्लायंट ॲप}other{ईमेल क्लायंट ॲप्स}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"नकाशा अॅप"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">फोन ॲप्स</item>
- <item quantity="one">फोन अॅप</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{फोन अॅप}other{फोन अॅप्स}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"ब्राउझर अॅप"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS आवृत्ती"</string>
<string name="about_serial" msgid="3432319328808745459">"अनुक्रमांक"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS बिल्ड"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{तुम्ही आता डेव्हलपर होण्यापासून # पायरी दूर आहात}other{तुम्ही आता डेव्हलपर होण्यापासून # पायऱ्या दूर आहात}}"</string>
<string name="about_ads" msgid="7662896442040086522">"जाहिराती"</string>
<string name="ads_description" msgid="8081069475265061074">"जाहिरात आयडी रीसेट करण्यासारखी जाहिरात सेटिंग्ज व्यवस्थापित करा."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Ads, तुमचा जाहिरात आयडी रीसेट करण्यासारखी जाहिरात सेटिंग्ज व्यवस्थापित करा."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"अतिरिक्त सिस्टम अपडेट"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"नेटवर्कचे परीक्षण केले जाऊ शकते"</string>
<string name="done_button" msgid="616159688526431451">"पूर्ण झाले"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">सर्टिफिकेटवर विश्वास ठेवा किंवा काढून टाका</item>
- <item quantity="one">सर्टिफिकेटावर विश्वास ठेवा किंवा काढून टाका</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ने तुमच्या डिव्हाइसवर सर्टिफिकेटसंबंधित अधिकार इंस्टॉल केला आहे जो त्यांना ईमेल, अॅप्स आणि सुरक्षित वेबसाइट यांच्या समावेशासह डिव्हाइस नेटवर्क अॅक्टिव्हिटीचे परीक्षण करण्याची अनुमती देऊ शकतो.\n\nया सर्टिफिकेटसंबंधित अधिक माहितीसाठी तुमच्या ॲडमिनशी संपर्क साधा.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ने तुमच्या डिव्हाइसवर सर्टिफिकेटसंबंधित अधिकार इंस्टॉल केला आहे जो त्यांना ईमेल, अॅप्स आणि सुरक्षित वेबसाइट यांच्या समावेशासह डिव्हाइस नेटवर्क अॅक्टिव्हिटीचे परीक्षण करण्याची अनुमती देऊ शकतो.\n\nया सर्टिफिकेटसंबंधित अधिक माहितीसाठी तुमच्या ॲडमिनशी संपर्क साधा.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ने तुमच्या कार्य प्रोफाइलसाठी सर्टिफिकेटसंबंधित अधिकार इंस्टॉल केला आहे जो त्यांना ईमेल, अॅप्स आणि सुरक्षित वेबसाइट यांच्या समावेशासह कार्य नेटवर्क अॅक्टिव्हिटीचे परीक्षण करण्याची अनुमती देऊ शकतो.\n\nया सर्टिफिकेटसंबंधित अधिक माहितीसाठी तुमच्या ॲडमिनशी संपर्क साधा.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ने तुमच्या कार्य प्रोफाइलसाठी सर्टिफिकेटसंबंधित अधिकार इंस्टॉल केला आहे जो त्यांना ईमेल, अॅप्स आणि सुरक्षित वेबसाइट यांच्या समावेशासह कार्य नेटवर्क अॅक्टिव्हिटीचे परीक्षण करण्याची अनुमती देऊ शकतो.\n\nया सर्टिफिकेटसंबंधित अधिक माहितीसाठी तुमच्या ॲडमिनशी संपर्क साधा.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"एक तृतीय पक्ष ईमेल, अॅप्स आणि सुरक्षित वेबसाइट यासह, आपल्या नेटवर्क ॲक्टिव्हिटीचे परीक्षण करण्यास सक्षम आहे.\n\nआपल्या डीव्हाइसवर इंस्टॉल केलेले विश्वसनीय क्रेडेंशियल हे शक्य करते."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">सर्टिफिकेट तपासा</item>
- <item quantity="one">सर्टिफिकेट तपासा</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{प्रमाणपत्रावर विश्वास ठेवा किंवा काढून टाका}other{प्रमाणपत्रांवर विश्वास ठेवा किंवा काढून टाका}}"</string>
<string name="device_status" msgid="8266002761193692207">"स्थिती"</string>
<string name="device_status_summary" msgid="3270932829412434985">"नेटवर्क, अनुक्रमांक आणि इतर माहिती"</string>
<string name="manual" msgid="5683935624321864999">"व्यक्तिचलित"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"कनेक्ट करा"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"नेटवर्क विसरा"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"सेव्ह केलेल्या संकेतशब्दाच्या समावेशासह, या नेटवर्कशी कनेक्ट करण्यासाठी वापरलेली माहिती साफ करते"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"तुमच्या मोबाइल फोनवरून QR कोड स्कॅन करून वायफाय मध्ये सामील व्हा आणि सूचना फॉलो करा."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" मोबाइल फोनने QR कोड स्कॅन करून वाय-फायमध्ये सामील व्हा आणि सूचना फॉलो करा.\n \n "<b>"Android फोन"</b>" यामध्ये सेटिंग्ज > नेटवर्क आणि इंटरनेट > वाय-फाय > वाय-फाय निवडा > प्रगत > डिव्हाइस जोडा वर जा आणि त्यानंतर QR कोड स्कॅन करा."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"रद्द करण्यासाठी मागे जा बटण दाबा"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ठीक आहे"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"सुरू ठेवा"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"डिव्हाइस संचयन"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"काढण्यायोग्य संचयन"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"रीसेट करा"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"स्टोरेज मोकळे करा"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"कॅशे केलेला डेटा साफ करा"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> मोकळे करा"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"जागा घेणार्या तात्पुरत्या फाइल साफ करते. यामुळे अॅप प्राधान्ये किंवा ऑफलाइन व्हिडिओ यासारख्या सेव्ह केलेल्या डेटावर परिणाम होणार नाही आणि तुम्हाला अॅप्समध्ये पुन्हा साइन इन करावे लागणार नाही."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"कॅशे केलेला डेटा साफ करायचा का?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"हे सर्व ॲप्ससाठी कॅशे केलेला डेटा साफ करेल."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"अॅप्स अनइंस्टॉल करा"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> माउंट केले"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> माउंट करणे शक्य झाले नाही"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB संचयन पुन्हा कनेक्ट केले"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"मायक्रोफोन"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"मायक्रोफोनचा अॅक्सेस"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"ॲपला मायक्रोफोनचा असलेला अॅक्सेस"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"मायक्रोफोन अॅक्सेस ब्लॉक केलेला आहे"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"अनब्लॉक करण्यासाठी, तुमच्या डिव्हाइसवरील प्रायव्हसी स्विच हा मायक्रोफोन ॲक्सेस करण्याची अनुमती देण्यासाठी, मायक्रोफोन सुरू करण्याच्या स्थानावर आणा."</string>
<string name="camera" msgid="1226671478936288283">"Camera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"कॅमेराचा अॅक्सेस"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"ॲपला कॅमेराचा असलेला अॅक्सेस"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"कॅमेरा अॅक्सेस ब्लॉक केलेला आहे"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"अनब्लॉक करण्यासाठी, तुमच्या डिव्हाइसवरील प्रायव्हसी स्विच हा कॅमेरा ॲक्सेस करण्याची अनुमती देण्यासाठी, कॅमेरा सुरू करण्याच्या स्थानावर आणा."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"मायक्रोफोनचा अॅक्सेस: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"सुरू केलेले असेल तेव्हा, परवानगी असलेली सर्व ॲप्स आणि सेवा या डिव्हाइसवरील कोणताही मायक्रोफोन अॅक्सेस करू शकतात.\n\nकस्टम प्रोटोकॉल असलेल्या ऑडिओ पेरिफेरलवर या सेटिंगचा परिणाम होणार नाही."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"कॅमेराचा अॅक्सेस: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"निळसर"</string>
<string name="color_yellow" msgid="3519470952904560404">"पिवळा"</string>
<string name="color_magenta" msgid="2377854703399624607">"किरमिजी तांबडा"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"ऑडिओ वर्णन"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"सपोर्ट असलेल्या चित्रपट व शोमध्ये स्क्रीनवर काय होत आहे याचे वर्णन ऐका"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"सक्षम करा"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"कॉंफिगरेशन"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> वापरायची?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"परीक्षण करणे"</string>
<string name="system_apps" msgid="8481888654606868074">"अॅप्स"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"सक्रिय रहा"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"स्क्रीन कधीही स्लीप मोडवर जाणार नाही"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP तपासणी"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI ऑप्टिमायझेशन"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"आता रीस्टार्ट करायचे?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"टीव्ही सह HDMI डिव्हाइसेस बंद"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV स्वयं सुरू"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI डिव्हाइससह टीव्ही सुरू"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">कनेक्ट केलेले इनपुट</item>
- <item quantity="one">कनेक्ट केलेले इनपुट</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">स्टँडबाय इनपुट</item>
- <item quantity="one">स्टँडबाय इनपुट</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">कनेक्ट न केलेले इनपुट</item>
- <item quantity="one">कनेक्ट न केलेले इनपुट</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{कनेक्ट केलेले इनपुट}other{कनेक्ट केलेली इनपुट}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{स्टँडबाय इनपुट}other{स्टँडबाय इनपुट}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{कनेक्ट न केलेले इनपुट}other{कनेक्ट न केलेली इनपुट}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"आपल्या खात्यामधील अॅप्स आणि इतर सामग्रीवर प्रवेश प्रतिबंधित करा"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"प्रतिबंधित प्रोफाईल"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> द्वारे नियंत्रित"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"प्रतिबंधित प्रोफाईल तयार करा"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"सेटिंग्ज"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"अनुमती दिलेले अॅप्स"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d अॅप्सना अनुमती आहे</item>
- <item quantity="one">1 अॅपला अनुमती आहे</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"अनुमती दिली"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"अनुमती नाही"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"निर्बंध सानुकूल करा"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"तृतीय पक्ष स्रोत"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"परवानग्या"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"ॲप्लिकेशन अनुपलब्ध आहे"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"न वापरलेली अॅप्स"</string>
<string name="settings_ok" msgid="5950888975075541964">"ठीक"</string>
<string name="settings_confirm" msgid="4489126458677153411">"कन्फर्म करा"</string>
<string name="settings_cancel" msgid="576094334743686152">"रद्द करा"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"ही परवानगी ॲपला सिस्टम सेटिंग्जमध्ये बदल करण्याची अनुमती देते."</string>
<string name="write_settings_on" msgid="71675710746513956">"होय"</string>
<string name="write_settings_off" msgid="6730113471695092167">"नाही"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"सर्व फाइलचा अॅक्सेस"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"सर्व फाइल व्यवस्थापनासाठी अॅक्सेस द्या"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"या ॲपला या डिव्हाइसवरील किंवा कनेक्ट केलेल्या स्टोरेज व्हॉल्यूममधील सर्व फाइल वाचण्याची, सुधारित करण्याची आणि हटवण्याची अनुमती द्या. अनुमती दिली असल्यास, ॲप कदाचित तुम्हाला न विचारता फाइलला अॅक्सेस करू शकते"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"चित्रात चित्र"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"चित्रात-चित्राची अनुमती द्या"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"इंस्टॉल केलेली कोणतीही अॅप्स चित्रात चित्रला सपोर्ट करत नाहीत"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"अॅप उघडे असताना किंवा तुम्ही ते सोडल्यानंतर या अॅपला चित्रामध्ये चित्र विंडो तयार करण्याची परवानगी द्या (उदाहरणार्थ, व्हिडिओ पाहणे सुरू ठेवणे). ही विंडो तुम्ही वापरत असलेल्या इतर अॅप्सच्या वरती दिसते."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"ॲप्सना अलार्म सेट करण्याची किंवा वेळेनुसार संवेदनशील असलेल्या कृती शेड्युल करण्याची अनुमती द्या. हे ॲप्सना बॅकग्राउंडमध्ये रन होऊ देते, ज्यामुळे जास्त पॉवर वापरली जाऊ शकते.\n\nही परवानगी बंद असल्यास, सध्याचे अलार्म आणि ॲपद्वारे शेड्युल केलेले वेळेवर आधारित इव्हेंट काम करणार नाहीत."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"स्क्रीन सुरू करा"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"स्क्रीन सुरू करण्यासाठी अनुमती द्या"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"स्क्रीन सुरू करण्यासाठी ॲपला अनुमती द्या. मंजुरी दिल्यास, ॲप तुमच्या स्पष्ट हेतूशिवाय कधीही स्क्रीन सुरू करू शकते."</string>
<string name="special_access" msgid="21806055758289916">"विशेष ॲप ॲक्सेस"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"ऑडिओ"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"डेटा सेव्हर"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"कमी मोबाइल डेटा वापरण्यासाठी, व्हिडिओची गुणवत्ता आपोआप ॲडजस्ट करा"</string>
<string name="title_data_alert" msgid="8262081890052682475">"डेटा वापर आणि सूचना"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"तुम्ही वाय-फाय, इथरनेट किंवा तुमच्या फोनचे हॉटस्पॉट वापरून इंटरनेटशी कनेक्ट करू शकता. अधिक मदतीसाठी "<b>"g.co/network"</b>" येथे भेट द्या."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"तुम्ही वाय-फाय, इथरनेट किंवा तुमच्या फोनचे हॉटस्पॉट वापरून इंटरनेटशी कनेक्ट करू शकता."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"क्रियेस अनुमती नाही"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"व्हॉल्यूम बदलू शकत नाही"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"पॉवर आणि ऊर्जा"</string>
<string name="power_on_behavior" msgid="927607372303160716">"सुरू असतानाचे वर्तन"</string>
<string name="reset_options_title" msgid="7632580482285108955">"रीसेट करा"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"इथरनेट पेअरिंग कोड"</string>
</resources>
diff --git a/Settings/res/values-ms/strings.xml b/Settings/res/values-ms/strings.xml
index 8f44a72..9fd9813 100644
--- a/Settings/res/values-ms/strings.xml
+++ b/Settings/res/values-ms/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Tambah akaun"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Akaun & log masuk"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Tiada akaun"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> akaun</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> akaun</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# akaun}other{# akaun}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Perkhidmatan media, Assistant, Pembayaran"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Rangkaian & Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Bunyi"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apl"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Pilihan Peranti"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Alat Kawalan Jauh & aksesori"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Tiada peranti Bluetooth yang dihubungkan"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> aksesori</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> aksesori</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Paparan & Bunyi"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Bantuan & Maklum Balas"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privasi"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Tetapan semula data kilang"</string>
<string name="device_calibration" msgid="2907914144048739705">"Penentukuran"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Penjimat tenaga"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Peranti"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Pilih format"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Bunyi Keliling"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMAT DIDAYAKAN"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMAT DILUMPUHKAN"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Untuk melumpuhkan, tukar pilihan format ke Manual."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Peleraian"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatik"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Peleraian telah ditukar"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Pilih OK untuk menggunakan %1$s mulai sekarang."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Batal"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Padam bersih data cache?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Ini akan memadam bersih data cache semua apl."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Tambah aksesori"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Menggandingkan..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Menyambung…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Aksesori"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Alat Kawalan Jauh"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Tetapan kawalan jauh"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Sediakan butang jauh"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Kawal kelantangan, kuasa, input pada TV, penerima dan bar bunyi"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Sambung"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Sambung ke %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Putuskan sambungan"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Tidak tersedia"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Apl pentadbir peranti"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Tiada apl aktif"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apl aktif</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> apl aktif</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Dlumpuhkn pentadbir, dsr penyulitan/storan bukti klayakn"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Maklumat peranti terurus"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Perubahan & tetapan diurus oleh organisasi anda"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Tiada"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Apl dipasang"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Bilangan apl adalah anggaran. Kiraan ini mungkin tidak termasuk apl yang dipasang di luar Gedung Play."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> apl</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> apl</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum # apl}other{Minimum # apl}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Kebenaran lokasi"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Kebenaran mikrofon"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Kebenaran kamera"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Apl lalai"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apl</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> apl</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# apl}other{# apl}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Papan kekunci lalai"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Ditetapkan pada <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"VPN sentiasa hidup dihidupkan"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Bukti kelayakan dipercayai"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Bukti kelayakan dipercayai dalam profil peribadi anda"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Bukti kelayakan dipercayai dalam profil kerja anda"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> sijil CA</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> sijil CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# sijil CA}other{# sijil CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Pentadbir boleh mengunci peranti dan menetapkan semula kata laluan"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Pentadbir boleh memadamkan semua data peranti"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Percubaan kata laluan yang gagal sebelum memadamkan semua data peranti"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Percubaan kata laluan yang gagal sebelum memadamkan data profil kerja"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> percubaan</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> percubaan</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# percubaan}other{# percubaan}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Peranti ini diurus oleh organisasi anda."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Peranti ini diurus oleh <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Ketahui lebih lanjut"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Apl kamera</item>
- <item quantity="one">Apl kamera</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Apl kamera}other{Apl kamera}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Apl Kalendar"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Apl Kenalan"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Apl klien e-mel</item>
- <item quantity="one">Apl klien e-mel</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Apl klien e-mel}other{Apl klien e-mel}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Apl Peta"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Apl telefon</item>
- <item quantity="one">Apl telefon</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Apl telefon}other{Apl telefon}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Apl penyemak imbas"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Versi OS Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Nombor siri"</string>
<string name="about_build" msgid="8467840394761634575">"Binaan OS Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Kini tinggal <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> langkah lagi sebelum anda menjadi pembangun</item>
- <item quantity="one">Kini tinggal <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> langkah lagi sebelum anda menjadi pembangun</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Anda kini memerlukan # langkah lagi sebelum menjadi pembangun}other{Anda kini memerlukan # langkah lagi sebelum menjadi pembangun}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Iklan"</string>
<string name="ads_description" msgid="8081069475265061074">"Urus tetapan iklan e.g. tetapkan semula ID iklan"</string>
<string name="ads_content_description" msgid="1006489792324920289">"Iklan, Urus tetapan iklan anda, seperti menetapkan semula ID pengiklanan anda."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Kemas kini sistem tambahan"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Rangkaian mungkin dipantau"</string>
<string name="done_button" msgid="616159688526431451">"Selesai"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Percayai atau alih keluar sijil</item>
- <item quantity="one">Percayai atau alih keluar sijil</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> telah memasang sijil kuasa pada peranti anda yang mungkin membenarkan pemantauan aktiviti rangkaian peranti, termasuk e-mel, apl dan laman web selamat.\n\nUntuk mendapatkan maklumat lanjut tentang sijil ini, hubungi pentadbir anda.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> telah memasang sijil kuasa pada profil kerja anda yang mungkin membenarkan pemantauan aktiviti rangkaian peranti, termasuk e-mel, apl dan laman web selamat.\n\nUntuk mendapatkan maklumat lanjut tentang sijil ini, hubungi pentadbir anda.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> telah memasang sijil kuasa untuk profil kerja anda yang mungkin membenarkan pemantauan aktiviti rangkaian kerja, termasuk e-mel, apl dan laman web selamat.\n\nUntuk mendapatkan maklumat lanjut tentang sijil ini, hubungi pentadbir anda.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> telah memasang sijil kuasa untuk profil kerja anda yang mungkin membenarkan pemantauan aktiviti rangkaian kerja, termasuk e-mel, apl dan laman web selamat.\n\nUntuk mendapatkan maklumat lanjut tentang sijil ini, hubungi pentadbir anda.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Pihak ketiga berkeupayaan untuk memantau aktiviti rangkaian anda, termasuk e-mel, apl dan laman web selamat.\n\nBukti kelayakan dipercayai yang dipasang pada peranti anda yang membolehkan perkara ini."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Semak sijil</item>
- <item quantity="one">Semak sijil</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Percayai atau alih keluar sijil}other{Percayai atau alih keluar sijil}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Rangkaian, nombor siri dan maklumat lain"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Sambung"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Lupakan rangkaian"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Ini memadam bersih maklumat untuk bersambung ke rangkaian ini, termasuk kata laluan yang disimpan"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Sertai Wi-Fi dengan mengimbas kod QR daripada telefon mudah alih anda dan ikut arahan."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Sertai Wi-Fi dengan mengimbas kod QR daripada telefon mudah alih anda dan ikut arahan.\n \n Daripada "<b>"Telefon Android"</b>" pergi ke Tetapan -> Rangkaian & internet -> Wi-Fi -> Pilih Wi-Fi -> Lanjutan -> Tambah peranti dan kemudian imbas kod QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Tekan butang kembali untuk membatalkan"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Teruskan"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Storan peranti"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Storan boleh tanggal"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Tetapkan semula"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Kosongkan storan"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Padam bersih data cache"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Kosongkan <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Mengosongkan fail sementara yang menggunakan ruang. Tindakan ini tidak akan memberi kesan pada data yang disimpan seperti pilihan apl atau video di luar talian dan anda tidak perlu log masuk ke apl semula."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Padam bersih data cache?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Ini akan memadam bersih data cache semua apl."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Nyahpasang apl"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> dilekapkan"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Tidak dapat melekapkan <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Storan USB disambung semula"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Akses mikrofon"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Akses apl kepada mikrofon"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Akses mikrofon disekat"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Untuk menyahsekat mikrofon, gerakkan suis privasi pada peranti anda kepada kedudukan \"mikrofon hidup\" untuk membenarkan akses mikrofon."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Akses kamera"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Akses apl kepada kamera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Akses kamera disekat"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Untuk menyahsekat kamera, gerakkan suis privasi pada peranti anda kepada kedudukan \"kamera hidup\" untuk membenarkan akses kamera."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Akses Mikrofon: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Apabila dihidupkan, semua apl dan perkhidmatan yang mempunyai kebenaran boleh mengakses sebarang mikrofon pada peranti ini.\n\nPersisian audio dengan protokol tersuai tidak akan terjejas dengan tetapan ini."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Akses Kamera: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Biru kehijauan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Kuning"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Perihalan audio"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Dengar perihalan perkara pada skrin"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Dayakan"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfigurasi"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Gunakan <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Pemantauan"</string>
<string name="system_apps" msgid="8481888654606868074">"Apps"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Berjaga"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Skrin tidak sekali-kali akan tidur"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Penyemakan HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Pengoptimuman HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Mulakan semula sekarang?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Matikan peranti HDMI dengan TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Autohidup TV"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Hidupkan TV dengan peranti HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Input yang Disambungkan</item>
- <item quantity="one">Input yang Disambungkan</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Input Tunggu Sedia</item>
- <item quantity="one">Input Tunggu Sedia</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Input yang Tidak Disambungkan</item>
- <item quantity="one">Input yang Tidak Disambungkan</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Input yang Disambungkan}other{Input yang Disambungkan}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Input Tunggu Sedia}other{Input Tunggu Sedia}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Input yang Tidak Disambungkan}other{Input yang Tidak Disambungkan}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Hadkan akses kepada apl dan kandungan lain dalam akaun anda"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Profil Terhad"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Dikawal oleh <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Buat profil terhad"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Tetapan"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Apl yang dibenarkan"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d apl dibenarkan</item>
- <item quantity="one">1 apl dibenarkan</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Dibenarkan"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Tidak dibenarkan"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Sesuaikan sekatan"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Sumber Pihak Ketiga"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Kebenaran"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplikasi tidak tersedia"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Apl yang tidak digunakan"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Sahkan"</string>
<string name="settings_cancel" msgid="576094334743686152">"Batal"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Kebenaran ini membolehkan apl mengubah suai tetapan sistem."</string>
<string name="write_settings_on" msgid="71675710746513956">"Ya"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Tidak"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Akses semua fail"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Benarkan akses untuk mengurus semua fail"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Benarkan apl ini membaca, mengubah suai dan memadamkan semula fail pada peranti ini atau mana-mana unit storan yang disambungkan. Jika dibenarkan, apl mungkin mengakses fail tanpa pengetahuan anda secara jelas."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Gambar dalam gambar"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Benarkan gambar dalam gambar"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Tiada apl yang dipasang menyokong Gambar dalam gambar"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Benarkan apl ini membuat tetingkap gambar dalam gambar semasa apl ini dibuka atau setelah anda meninggalkan apl (contohnya, untuk meneruskan tontonan video). Tetingkap ini dipaparkan di sebelah atas apl lain yang anda gunakan."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Benarkan apl menetapkan penggera dan menjadualkan tindakan yang sensitif masa. Tindakan ini membolehkan apl berjalan di latar, yang mungkin menggunakan lebih banyak bateri.\n\nJika kebenaran ini dimatikan, penggera sedia ada dan acara berdasarkan masa yang dijadualkan oleh apl ini tidak akan berfungsi."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Hidupkan skrin"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Benarkan menghidupkan skrin"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Benarkan apl menghidupkan skrin. Jika dibenarkan, apl mungkin menghidupkan skrin pada bila-bila masa tanpa niat eksplisit anda."</string>
<string name="special_access" msgid="21806055758289916">"Akses apl khas"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Penjimat Data"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Laraskan kualiti video secara automatik untuk menggunakan kurang data mudah alih"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Penggunaan data dan makluman"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Anda boleh menyambung ke Internet dengan Wi-Fi, Ethernet atau tempat liputan telefon anda. Untuk mendapatkan bantuan lanjut, lawati "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Anda boleh menyambung ke Internet dengan Wi-Fi, Ethernet atau tempat liputan telefon anda."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Tindakan tidak dibenarkan"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Kelantangan tidak boleh ditukar"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Kuasa & Tenaga"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Gelagat kuasa dihidupkan"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Tetapkan semula"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Kod berpasangan Ethernet"</string>
</resources>
diff --git a/Settings/res/values-my/strings.xml b/Settings/res/values-my/strings.xml
index 8151b50..5f044cc 100644
--- a/Settings/res/values-my/strings.xml
+++ b/Settings/res/values-my/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"အကောင့်တစ်ခုထည့်ရန်"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"အကောင့်များနှင့် အကောင့်ဝင်ရောက်ခြင်း"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"အကောင့်မရှိ"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other">အကောင့် <xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> ခု</item>
- <item quantity="one">အကောင့် <xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> ခု</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{အကောင့် # ခု}other{အကောင့် # ခု}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"မီဒီယာဝန်ဆောင်မှုများ၊ Assistant၊ ပေးချေမှုများ"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"ကွန်ရက်နှင့် အင်တာနက်"</string>
<string name="sound_category_title" msgid="7899816751041939518">"အသံ"</string>
<string name="applications_category_title" msgid="7112019490898586223">"အက်ပ်များ"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"စက် ရွေးချယ်စရာများ"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"အဝေးထိန်းခလုတ်နှင့် ဆက်စပ်ပစ္စည်းများ"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"ချိတ်ဆက်ထားသည့် ဘလူးတုသ်စက်ပစ္စည်း မရှိပါ"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other">ဆက်စပ်ပစ္စည်း <xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ခု</item>
- <item quantity="one">ဆက်စပ်ပစ္စည်း <xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> ခု</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ဖန်သားပြင်ပြသမှုနှင့် အသံ"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"အကူအညီနှင့် အကြံပြုချက်"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"ကန့်သတ်ဆက်တင်"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"စက်ရုံထုတ် အခြေအနေ ပြန်ယူခြင်း"</string>
<string name="device_calibration" msgid="2907914144048739705">"စံကိုက်ညှိမှု"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"စွမ်းအင်ချွေတာမှု"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"စက်များ"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ပုံစံများ ရွေးရန်"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"ပတ်လည် အသံစနစ်"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby ဒစ်ဂျစ်တယ်"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ဖွင့်ထားသည့်ဖော်မက်များ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ပိတ်ထားသည့်ဖော်မက်များ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"ပိတ်ရန် ဖော်မက်ရွေးချယ်မှုကို ‘ကိုယ်တိုင်’ သို့ ပြောင်းပါ။"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"ပုံရိပ်ပြတ်သားကိန်း"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"အလိုအလျောက်"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"ပုံရိပ်ပြတ်သားကိန်းကို ပြောင်းပြီးပါပြီ"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"%1$s ကို ယခုမှစသုံးရန် OK ကိုရွေးပါ။"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"မလုပ်တော့"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"ကရှ်ဒေတာများကို ရှင်းမည်လား?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"apps အားလုံးအတွက် ကရှ်ဒေတာများကို ရှင်းမည်။"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"အသုံးအဆောင်များ ထည့်ရန်"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"တွဲချိတ်နေ…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"ချိတ်ဆက်နေ..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"ဆက်စပ်ပစ္စည်းများ"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"အဝေးထိန်းခလုတ်"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"အဝေးထိန်းခလုတ် ဆက်တင်များ"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"အဝေးထိန်း ခလုတ်များကို စနစ်ထည့်သွင်းခြင်း"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"TV၊ လက်ခံစက်နှင့် အသံဘားများတွင် အသံအတိုးအကျယ်၊ အဖွင့်အပိတ်၊ အဝင်တို့ကို ထိန်းချုပ်ပါ"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"ချိတ်ဆက်ရန်"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s သို့ ချိတ်ဆက်ပါ"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"ချိတ်ဆက်မှု ဖြုတ်ရန်"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"မရနိုင်ပါ"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"စက်စီမံအက်ပ်များ"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"ပွင့်နေသည့်အက်ပ် မရှိပါ"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"စီမံခန့်ခွဲသူ၊ အသွင်ဝှက်ခြင်း မူဝါဒ သို့မဟုတ် အထောက်အထား သိုလှောင်ခန်းက ပိတ်ထားပါသည်"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"စီမံခန့်ခွဲထားသည့် စက်ပစ္စည်း၏ အချက်အလက်များ"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"သင်၏ အဖွဲ့အစည်းက စီမံခန့်ခွဲထားသည့် အပြောင်းအလဲများနှင့် ဆက်တင်များ"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"မရှိ"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"ထည့်သွင်းထားသည့် အက်ပ်များ"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"အက်ပ်အရေအတွက်သည် ခန့်မှန်းခြေသာဖြစ်သည်။ ၎င်းတွင် Play Store ပြင်ပမှ ထည့်သွင်းထားသည့် အက်ပ်များ မပါဝင်ပါ။"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{အနည်းဆုံး အက်ပ် # ခု}other{အနည်းဆုံး အက်ပ် # ခု}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"တည်နေရာ ခွင့်ပြုချက်များ"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"မိုက်ခရိုဖုန်း ခွင့်ပြုချက်များ"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"ကင်မရာ ခွင့်ပြုချက်များ"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"မူလ အက်ပ်များ"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{အက်ပ် # ခု}other{အက်ပ် # ခု}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"မူရင်း ကီးဘုတ်"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> ဟု သတ်မှတ်ထားသည်"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"VPN အမြဲသုံးရန် ကို ဖွင့်ထားသည်"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"ယုံကြည်သော အထောက်အထားများ"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"သင့်ကိုယ်ပိုင်ပရိုဖိုင်ရှိ စိတ်ချရသော အထောက်အထားများ"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"သင့်အလုပ်ပရိုဖိုင်ရှိ စိတ်ချရသော အထောက်အထားများ"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">အနည်းဆုံး CA လက်မှတ် <xliff:g id="COUNT_1">%d</xliff:g> ခု</item>
- <item quantity="one">အနည်းဆုံး CA လက်မှတ် <xliff:g id="COUNT_0">%d</xliff:g> ခု</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{CA လက်မှတ် # စောင်}other{CA လက်မှတ် # စောင်}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"စီမံခန့်ခွဲသူသည် စက်ပစ္စည်းကို လော့ခ်ချနိုင်ပြီး စကားဝှက်ကို ပြင်ဆင်သတ်မှတ်နိုင်ပါသည်"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"စီမံခန့်ခွဲသူသည် စက်ပစ္စည်းဒေတာများအားလုံးကို ဖျက်နိုင်ပါသည်"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"စက်ပစ္စည်း၏ ဒေတာများအားလုံးကို မဖျက်မီ စကားဝှက်ထည့်ခြင်း မအောင်မြင်သည့်အကြိမ်များ"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"အလုပ်ပရိုဖိုင် ဒေတာများကိုမဖျက်မီ စကားဝှက်ထည့်ခြင်း မအောင်မြင်သည့် အကြိမ်များ"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{ကြိုးပမ်းမှု # ကြိမ်}other{ကြိုးပမ်းမှု # ကြိမ်}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"ဤစက်ပစ္စည်းကို သင်၏အဖွဲ့အစည်းက စီမံခန့်ခွဲထားသည်။"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"ဤစက်ပစ္စည်းကို <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> က စီမံခန့်ခွဲထားပါသည်။"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"ပိုမိုလေ့လာရန်"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">ကင်မရာအက်ပ်များ</item>
- <item quantity="one">ကင်မရာအက်ပ်</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{ကင်မရာအက်ပ်}other{ကင်မရာအက်ပ်များ}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"ပြက္ခဒိန်အက်ပ်"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"အဆက်အသွယ်အက်ပ်"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">အီးမေးလ် ကလိုင်းယင့်အက်ပ်များ</item>
- <item quantity="one">အီးမေးလ် ကလိုင်းယင့်အက်ပ်</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{အီးမေးလ်ကလိုင်းယင့်အက်ပ်}other{အီးမေးလ်ကလိုင်းယင့်အက်ပ်များ}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"မြေပုံအက်ပ်"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">ဖုန်း အက်ပ်များ</item>
- <item quantity="one">ဖုန်း အက်ပ်</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{ဖုန်းအက်ပ်}other{ဖုန်းအက်ပ်များ}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"ဘရောင်ဇာ အက်ပ်"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>၊ <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>၊ <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>၊ <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV အိုအက်စ် (OS) ဗားရှင်း"</string>
<string name="about_serial" msgid="3432319328808745459">"အမှတ်စဉ်"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV အိုအက်စ် (OS) တည်ဆောက်ပုံ"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{သင် ဆော့ဖ်ဝဲရေးသူဖြစ်ရန် ယခုအခါ အဆင့် # ဆင့်သာလိုပါသည်}other{သင် ဆော့ဖ်ဝဲရေးသူဖြစ်ရန် ယခုအခါ အဆင့် # ဆင့်သာလိုပါသည်}}"</string>
<string name="about_ads" msgid="7662896442040086522">"ကြော်ငြာများ"</string>
<string name="ads_description" msgid="8081069475265061074">"သင့်ကြော်ငြာ ID ကို ပြင်ဆင်သတ်မှတ်ခြင်းကဲ့သို့ ကြော်ငြာဆက်တင်များကို စီမံပါ။"</string>
<string name="ads_content_description" msgid="1006489792324920289">"ကြော်ငြာများ၊ သင့်ကြော်ငြာ ID ကို ပြင်ဆင်သတ်မှတ်ခြင်းကဲ့သို့ ကြော်ငြာဆက်တင်များကို စီမံသည်။"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"ထပ်တိုးစနစ်အပ်ဒိတ်များ"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"ကွန်ရက်ကို စောင့်ကြည့်စစ်ဆေးခံရနိုင်သည်"</string>
<string name="done_button" msgid="616159688526431451">"ပြီးပါပြီ"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">အသိအမှတ်ပြုလက်မှတ်များကို ထည့်ပါ (သို့) ဖယ်ရှားပါ</item>
- <item quantity="one">အသိအမှတ်ပြုလက်မှတ်ကို ထည့်ပါ (သို့) ဖယ်ရှားပါ</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> သည် သင့်စက်ပစ္စည်းတွင် အသိအမှတ်ပြုခွင့်များကို ထည့်သွင်းလိုက်ပါသည်။ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များအပါအဝင် သင့်စက်ပစ္စည်း၏ ကွန်ရက်လှုပ်ရှားမှုကို စောင့်ကြည့်ခြင်းနှင့် ဝဘ်ဆိုက်များကို လုံခြုံစေခြင်းတို့ ပြုလုပ်နိုင်ပါသည်။\n\nဤအသိအမှတ်ပြုလက်မှတ်အကြောင်း နောက်ထပ်အချက်အလက်များအတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> သည် သင့်စက်ပစ္စည်းတွင် အသိအမှတ်ပြုခွင့်ကို ထည့်သွင်းလိုက်ပါသည်။ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များအပါအဝင် သင့်စက်ပစ္စည်း၏ ကွန်ရက်လှုပ်ရှားမှုကို စောင့်ကြည့်ခြင်းနှင့် ဝဘ်ဆိုက်များကို လုံခြုံစေခြင်းတို့ ပြုလုပ်နိုင်ပါသည်။\n\nဤအသိအမှတ်ပြုလက်မှတ်အကြောင်း နောက်ထပ်အချက်အလက်များအတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> သည် သင့်အလုပ်ပရိုဖိုင်အတွက် အသိအမှတ်ပြုခွင့်များကို ထည့်သွင်းလိုက်ပါသည်။ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များအပါအဝင် အလုပ်ကွန်ရက်လှုပ်ရှားမှုကို စောင့်ကြည့်ခြင်းနှင့် ဝဘ်ဆိုက်များကို လုံခြုံစေခြင်းတို့ ပြုလုပ်နိုင်ပါသည်။\n\nဤအသိအမှတ်ပြုလက်မှတ်အကြောင်း နောက်ထပ်အချက်အလက်များအတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> သည် သင့်အလုပ်ပရိုဖိုင်အတွက် အသိအမှတ်ပြုခွင့်ကို ထည့်သွင်းလိုက်ပါသည်။ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များအပါအဝင် အလုပ်ကွန်ရက်လှုပ်ရှားမှုကို စောင့်ကြည့်ခြင်းနှင့် ဝဘ်ဆိုက်များကို လုံခြုံစေခြင်းတို့ ပြုလုပ်နိုင်ပါသည်။\n\nဤအသိအမှတ်ပြုလက်မှတ်အကြောင်း နောက်ထပ်အချက်အလက်များအတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"အီးမေးလ်များ၊ အပလီကေးရှင်းများနှင့် စိတ်ချရသောဝဘ်ဆိုက်များ အပါအဝင် ကွန်ရက်တွင်းလုပ်ဆောင်ချက်များကို ကြားလူမှ စောင့်ကြည့်နေနိုင်သည်။ \n\nသင့်စက်တွင် ယုံကြည်စိတ်ချရသောအထောက်အထားတစ်ခုကို ထည့်သွင်းခြင်းဖြင့် ဖြစ်နိုင်ပါသည်။"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">အသိအမှတ်ပြုလက်မှတ်များကို စစ်ဆေးရန်</item>
- <item quantity="one">အသိအမှတ်ပြုလက်မှတ်ကို စစ်ဆေးရန်</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{အသိအမှတ်ပြုလက်မှတ်ကို ယုံကြည်ပါ (သို့) ဖယ်ရှားပါ}other{အသိအမှတ်ပြုလက်မှတ်များကို ယုံကြည်ပါ (သို့) ဖယ်ရှားပါ}}"</string>
<string name="device_status" msgid="8266002761193692207">"အခြေအနေ"</string>
<string name="device_status_summary" msgid="3270932829412434985">"ကွန်ရက်၊ အမှတ်စဉ်များနှင့် အခြားအချက်အလက်များ"</string>
<string name="manual" msgid="5683935624321864999">"ကိုယ်တိုင်"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"ချိတ်ဆက်ရန်"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"ကွန်ရက်ကို မေ့ပစ်ရန်"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"၎င်းက ဒီကွန်ရက်ကို ချိတ်ဆက်စဉ် အသုံးပြုခဲ့သည့် အချက်အလက်များကို၊ သိမ်းဆည်းခဲ့သည့် စကားဝှက် တစ်ခုခု အပါအဝင်ကို၊ ရှင်းပစ်သည်။"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"သင့်မိုဘိုင်းဖုန်းမှ QR ကုဒ်ကို စကင်ဖတ်၍ ညွှန်ကြားချက်အတိုင်း လုပ်ဆောင်ခြင်းဖြင့် WiFi နှင့်ချိတ်ဆက်ပါ။"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" မိုဘိုင်းဖုန်းမှ QR ကုဒ်ကို စကင်ဖတ်၍ ညွှန်ကြားချက်များအတိုင်း လုပ်ဆောင်ခြင်းဖြင့် Wi-Fi နှင့်ချိတ်ဆက်ပါ။\n \n "<b>"Android ဖုန်း"</b>" မှ ‘ဆက်တင်များ -> ကွန်ရက်နှင့် အင်တာနက် -> Wi-Fi -> Wi-Fi ရွေးခြင်း -> အဆင့်မြင့် -> စက်ထည့်ခြင်း’ သို့ သွားပြီး QR ကုဒ်ကို စကင်ဖတ်ပါ။"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"ပယ်ဖျက်ရန် နောက်သို့ခလုတ်ကို နှိပ်ပါ"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"ရှေ့ဆက်ရန်"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"စက်ပစ္စည်းသိုလှောင်မှု"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"ဖြုတ်၍ရသည့် သိုလှောင်မှု"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"ပြင်ဆင်သတ်မှတ်ရန်"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"သိုလှောင်ခန်း နေရာလွတ်ပြုလုပ်ခြင်း"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"ကက်ရှ်ဒေတာကို ရှင်းခြင်း"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> နေရာလွတ်ပြုလုပ်ခြင်း"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"နေရာယူသော ယာယီဖိုင်များကို ရှင်းသည်။ အက်ပ်သတ်မှတ်ချက် (သို့) အော့ဖ်လိုင်းဗီဒီယိုများကဲ့သို့ သိမ်းထားသောဒေတာကို သက်ရောက်မှုမရှိပါ။ အက်ပ်များသို့ နောက်တစ်ကြိမ် လက်မှတ်ထိုးဝင်ရန် မလိုအပ်ပါ။"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"ကက်ရှ်ဒေတာကို ရှင်းမလား။"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"၎င်းက အက်ပ်အားလုံးအတွက် ကက်ရှ်ဒေတာကို ရှင်းမည်။"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"အက်ပ်များ ဖယ်ရှားခြင်း"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> ကိုတပ်ဆင်ထားသည်"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> ကိုတပ်ဆင်၍မရပါ"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USBသိုလှောင်ခြင်း ပြန်လည်ချိတ်ဆက်သည်"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"မိုက်ခရိုဖုန်း"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"မိုက်ခရိုဖုန်းသုံးခွင့်"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"မိုက်ခရိုဖုန်းသို့ အက်ပ် ဝင်သုံးခွင့်"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"မိုက်ခရိုဖုန်းသုံးခွင့် ပိတ်ထားသည်"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"ပြန်ဖွင့်ရန်အတွက် မိုက်ခရိုဖုန်းသုံးခွင့်ပေးရန် သင့်စက်ပေါ်ရှိ ကိုယ်ရေးအချက်အလက်လုံခြုံမှု ခလုတ်ကို မိုက်ခရိုဖုန်းဖွင့်သည့် အနေအထားသို့ ရွှေ့ရမည်။"</string>
<string name="camera" msgid="1226671478936288283">"ကင်မရာ"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"ကင်မရာသုံးခွင့်"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"ကင်မရာသို့ အက်ပ် ဝင်သုံးခွင့်"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"ကင်မရာသုံးခွင့် ပိတ်ထားသည်"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"ပြန်ဖွင့်ရန်အတွက် ကင်မရာသုံးခွင့်ပေးရန် သင့်စက်ပေါ်ရှိ ကိုယ်ရေးအချက်အလက်လုံခြုံမှု ခလုတ်ကို ကင်မရာဖွင့်သည့် အနေအထားသို့ ရွှေ့ရမည်။"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"မိုက်ခရိုဖုန်းသုံးခွင့်- <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"ဖွင့်ထားသည့်အခါ ခွင့်ပြုထားသည့် အက်ပ်နှင့် ဝန်ဆောင်မှုအားလုံးသည် ဤစက်ရှိ မည်သည့်မိုက်ခရိုဖုန်းကိုမဆို သုံးနိုင်သည်။\n\nစိတ်ကြိုက်ပရိုတိုကောပါသည့် အသံ ချိတ်ဆက်ပစ္စည်းများသည် ဤဆက်တင်ကြောင့် အကျိုးသက်ရောက်မှုမရှိပါ။"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"ကင်မရာသုံးခွင့်- <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"စိမ်းပြာ"</string>
<string name="color_yellow" msgid="3519470952904560404">"အဝါ"</string>
<string name="color_magenta" msgid="2377854703399624607">"ပန်းခရမ်း"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"အသံဖြင့် ရှင်းလင်းချက်"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"ပံ့ပိုးထားသော ရုပ်ရှင်နှင့် ရှိုးများတွင် ဘာဖြစ်နေကြောင်း စခရင်၌ဖော်ပြချက်ကို နားထောင်နိုင်သည်"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"ဖွင့်ပါ"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"စီစဉ်ဖွဲ့စည်းမှု"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g>ကိုသုံးမလား?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"စောင့်ကြပ်ခြင်း"</string>
<string name="system_apps" msgid="8481888654606868074">"အက်ပ်များ"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"ဖွင့်လျက် ရှိနေရန်"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"ဖန်သားပြင်က ဘယ်တော့မှ မှိတ်သွားမည်မဟုတ်"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP စစ်ဆေးနေ"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI ဆီလျော်အောင် လုပ်ပေးခြင်း"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"ယခု ပြန်စမလား။"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"တီဗီကို HDMI ကိရိယာများဖြင့် ပါဝါ ပိတ်ရန်"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"တီဗီ အော်တို ပါဝါ ဖွင့်ရန်"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"တီဗီကို HDMI ကိရိယာဖြင့် ပါဝါ ဖွင့်ရန်"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">ချိတ်ဆက်ထားသည့် ထည့်သွင်းမှုများ</item>
- <item quantity="one">ချိတ်ဆက်ထားသည့် ထည့်သွင်းမှု</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">အရန်သင့်ထည့်သွင်းမှုများ</item>
- <item quantity="one">အရန်သင့်ထည့်သွင်းမှု</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">ချိတ်ဆက်မထားသည့် ထည့်သွင်းမှုများ</item>
- <item quantity="one">ချိတ်ဆက်မထားသည့် ထည့်သွင်းမှု</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{ချိတ်ဆက်ထားသည့် ထည့်သွင်းမှု}other{ချိတ်ဆက်ထားသည့် ထည့်သွင်းမှုများ}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{အရန်သင့် ထည့်သွင်းမှု}other{အရန်သင့် ထည့်သွင်းမှုများ}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{ချိတ်ဆက်မထားသော ထည့်သွင်းမှု}other{ချိတ်ဆက်မထားသော ထည့်သွင်းမှုများ}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"သင့်အကောင့်ရှိ အက်ပ်များနှင့် တစ်ခြားအရာများအား ဝင်ခွင့်အကန့်အသတ်ရှိခြင်း"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"ကန့်သတ် ပရိုဖိုင်"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g>မှထိန်းချုပ်ထားသည်"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"အကန့်အသတ်ရှိသည့် ပရိုဖိုင်ကိုဖန်တီးပါ"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"ဆက်တင်များ"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"ခွင့်ပြုထားသော အက်ပ်များ"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">အက်ပ်%d ခု ခွင့်ပြုသည်</item>
- <item quantity="one">အက်ပ်၁ ခု ခွင့်ပြုသည်</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"ခွင့်ပြုသည်"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"ခွင့်မပြုပါ"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"ကန့်သတ်ချက်များ ပြင်ဆင်ရန်"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"ပြင်ပကုမ္ပဏီရင်းမြစ်"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"ခွင့်ပြုချက်များ"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"အက်ပ်ကိုဖွင့်၍မရပါ"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"အသုံးမပြုသော အက်ပ်များ"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"အတည်ပြုပါ"</string>
<string name="settings_cancel" msgid="576094334743686152">"မလုပ်တော့"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"ဤခွင့်ပြုချက်က အက်ပ်ကို စနစ်ဆက်တင်များ ပြင်ခွင့်ပေးသည်။"</string>
<string name="write_settings_on" msgid="71675710746513956">"Yes"</string>
<string name="write_settings_off" msgid="6730113471695092167">"No"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"ဖိုင်အားလုံး သုံးခွင့်"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"ဖိုင်အားလုံးကို စီမံရန် သုံးခွင့်ပေးပါ"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"ဤစက်ပစ္စည်း (သို့) ချိတ်ဆက်ထားသော သိုလှောင်နေရာရှိ ဖိုင်များအားလုံးကို ဖတ်ရန်၊ ပြင်ဆင်ရန်နှင့် ဖျက်ရန် ဤအက်ပ်ကို ခွင့်ပြုပါ။ ခွင့်ပြုပြီးပါက အက်ပ်သည် သင့်အား အသိမပေးဘဲ ဖိုင်များကို အသုံးပြုနိုင်ပါမည်။"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"နှစ်ခုထပ်၍ကြည့်ခြင်း"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"နှစ်ခုထပ်၍ကြည့်ခြင်း ခွင့်ပြုရန်"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"ထည့်သွင်းထားသည့် အက်ပ်တစ်ခုမျှ နှစ်ခုထပ်၍ကြည့်ခြင်းကို ခွင့်မပြုပါ"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"အက်ပ်ဖွင့်ထားစဉ် သို့မဟုတ် ထွက်လိုက်စဉ်တွင် အက်ပ်များအား နှစ်ခုထပ်၍ကြည့်သည့် ဝင်းဒိုးတစ်ခု ပြုလုပ်ခွင့်ပြုပါ (ဥပမာ ဗီဒီယိုဆက်ကြည့်ရန်)။ ဤဝင်းဒိုးကို သင်သုံးနေသော အခြားအက်ပ်များ၏အပေါ်တွင် ပြသပါလိမ့်မည်။"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"နှိုးစက်သတ်မှတ်ရန်နှင့် အချိန်တိကျရန် လိုအပ်သည့် လုပ်ဆောင်ချက်များ အစီအစဉ်ဆွဲရန် အက်ပ်များကို ခွင့်ပြုပါ။ ၎င်းက အက်ပ်များကို နောက်ခံတွင် လုပ်ဆောင်ခွင့်ပေးပြီး ပါဝါပိုသုံးနိုင်သည်။\n\nဤခွင့်ပြုချက်ကို ပိတ်ထားပါက ဤအက်ပ်ဖြင့် အစီအစဉ်ဆွဲထားသော လက်ရှိနှိုးစက်နှင့် အချိန်သတ်မှတ်ထားသည့် အစီအစဉ်များ အလုပ်လုပ်တော့မည် မဟုတ်ပါ။"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"ဖန်သားပြင် ဖွင့်ခြင်း"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"ဖန်သားပြင် ဖွင့်ခွင့်ပြုရန်"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"အက်ပ်ကို ဖန်သားပြင် ဖွင့်ခွင့်ပြုနိုင်သည်။ ခွင့်ပြုထားပါက အက်ပ်သည် သင့်ထံမှ တိကျသောရည်ရွယ်ချက် မလိုဘဲ ဖန်သားပြင်ကို အချိန်မရွေး ဖွင့်နိုင်သည်။"</string>
<string name="special_access" msgid="21806055758289916">"အက်ပ် အထူးအသုံးပြုခွင့်"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>၊ <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"အသံ"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"ဒေတာချွေတာမှု"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"မိုဘိုင်းဒေတာ လျှော့သုံးရန် ဗီဒီယို အရည်အသွေးကို အလိုအလျောက် ချိန်ညှိပေးသည်"</string>
<string name="title_data_alert" msgid="8262081890052682475">"ဒေတာအသုံးပြုမှုနှင့် သတိပေးချက်များ"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"သင်သည် Wi-Fi ၊ Ethernet (သို့) သင့်ဖုန်း၏ ဟော့စပေါ့ဖြင့် အင်တာနက် ချိတ်ဆက်နိုင်သည်။ အကူအညီယူရန် "<b>"g.co/network"</b>" သို့ ဝင်ကြည့်ပါ။"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"သင်သည် Wi-Fi၊ အီသာနက် (သို့) သင့်ဖုန်း၏ ဟော့စပေါ့ဖြင့် အင်တာနက် ချိတ်ဆက်နိုင်သည်။"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"လုပ်ဆောင်ချက်ကို ခွင့်မပြုပါ"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"အသံအတိုးအကျယ်ကို ပြောင်း၍မရပါ"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"ပါဝါနှင့် စွမ်းအင်"</string>
<string name="power_on_behavior" msgid="927607372303160716">"ပါဝါဖွင့်ထားချိန် အပြုအမူ"</string>
<string name="reset_options_title" msgid="7632580482285108955">"ပြင်ဆင်သတ်မှတ်ခြင်း"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"အီသာနက် အတူတွဲချိတ်ရန် ကုဒ်"</string>
</resources>
diff --git a/Settings/res/values-nb/strings.xml b/Settings/res/values-nb/strings.xml
index a4505c1..44d693b 100644
--- a/Settings/res/values-nb/strings.xml
+++ b/Settings/res/values-nb/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Legg til kontoer"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Kontoer og pålogging"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Ingen kontoer"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> kontoer</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> konto</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# konto}other{# kontoer}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Medietjenester, assistent, betalinger"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Nettverk og internett"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Lyd"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apper"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Enhetsinnstillinger"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Fjernkontroller og tilbehør"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Ingen tilkoblede Bluetooth-enheter"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> tilbehør</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> tilbehør</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Skjerm og lyd"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Hjelp og tilbakemelding"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Personvern"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Tilbakestilling til fabrikkstandard"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrering"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Strømsparing"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Enheter"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Velg formater"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Surround-lyd"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"AKTIVERTE FORMATER"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"DEAKTIVERTE FORMATER"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"For å deaktivere, endre formatvalget til Manuelt."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Oppløsning"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatisk"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Oppløsningen er endret"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Velg OK for å bruke %1$s fra nå av."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Avbryt"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Vil du slette bufrede data?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Dette sletter bufrede data for alle apper."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Legg til tilbehør"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Kobler til ..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Kobler til …"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Tilbehør"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Fjernkontroll"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Fjernkontroll-innstillinger"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Konfigurer fjernkontrollknapper"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Kontrollér volum, av/på-knappen og innenheter på TV-er, mottakere og lydplanker"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Koble til"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Koble til %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Koble fra"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Ikke tilgjengelig"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Apper for enhetsadministrator"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Ingen aktive apper"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktive apper</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aktiv app</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Avslått av admin, krypteringsregel eller legitimasjonslager"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informasjon om administrert enhet"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Endringer og innstillinger administreres av organisasjonen din"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Ingen"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Installerte apper"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Antall apper er anslått. Det inkluderer muligens ikke apper som er installert utenfor Play-butikken."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> apper</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum # app}other{Minimum # apper}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Posisjonstillatelser"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mikrofontillatelser"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Kameratillatelser"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Standardapper"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apper</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}other{# apper}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Standardtastatur"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Satt til <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Alltid-på VPN-er slått på"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Pålitelig legitimasjon"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Pålitelig legitimasjon i den personlige profilen din"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Pålitelig legitimasjon i jobbprofilen din"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Minimum <xliff:g id="COUNT_1">%d</xliff:g> CA-sertifikater</item>
- <item quantity="one">Minimum <xliff:g id="COUNT_0">%d</xliff:g> CA-sertifikat</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA-sertifikat}other{# CA-sertifikater}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administratoren kan låse enheten og tilbakestille passordet"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administratoren kan slette alle enhetsdata"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Antall mislykkede forsøk på å oppgi passordet før alle enhetsdataene slettes"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Antall mislykkede forsøk på å oppgi passordet før jobbprofildataene slettes"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> forsøk</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> forsøk</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# forsøk}other{# forsøk}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Denne enheten administreres av organisasjonen din."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Denne enheten administreres av <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Finn ut mer"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Kamera-apper</item>
- <item quantity="one">Kamera-app</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Kameraapp}other{Kameraapper}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Kalender-app"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Kontakter-app"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">E-postapper</item>
- <item quantity="one">E-postapp</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{E-postapp}other{E-postapper}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Kart-app"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Telefon-apper</item>
- <item quantity="one">Telefon-app</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Telefonapp}other{Telefonapper}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Nettleserapp"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS-versjon"</string>
<string name="about_serial" msgid="3432319328808745459">"Serienummer"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS-delversjon"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Du er nå <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> trinn fra å bli utvikler</item>
- <item quantity="one">Du er nå <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> trinn fra å bli utvikler</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Du er nå # trinn fra å bli utvikler}other{Nå er du # trinn fra å bli utvikler}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Annonser"</string>
<string name="ads_description" msgid="8081069475265061074">"Admin. annonseinnst., f.eks. tilbakestilling av annonserings-ID."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Annonser, Administrer annonseinnstillinger, f.eks. tilbakestilling av annonserings-ID-en din."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Flere systemoppdateringer"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Nettverket blir muligens overvåket"</string>
<string name="done_button" msgid="616159688526431451">"Ferdig"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Stol på eller fjern sertifikatene</item>
- <item quantity="one">Stol på eller fjern sertifikatet</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> har installert sertifiseringsinstanser på enheten din. Dette kan gi disse instansene tillatelse til å overvåke nettverksaktiviteten på enheten, inkludert e-poster, apper og sikre nettsteder.\n\nKontakt administratoren din for å få mer informasjon om disse sertifikatene.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> har installert en sertifiseringsinstans på enheten din. Dette kan gi denne instansen tillatelse til å overvåke nettverksaktiviteten på enheten, inkludert e-poster, apper og sikre nettsteder.\n\nKontakt administratoren din for å få mer informasjon om dette sertifikatet.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> har installert sertifiseringsinstanser for jobbprofilen din. Dette kan gi disse instansene tillatelse til å overvåke nettverksaktiviteten på jobben, inkludert e-poster, apper og sikre nettsteder.\n\nKontakt administratoren din for å få mer informasjon om disse sertifikatene.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> har installert en sertifiseringsinstans for jobbprofilen din. Dette kan gi denne instansen tillatelse til å overvåke nettverksaktiviteten på jobben, inkludert e-poster, apper og sikre nettsteder.\n\nKontakt administratoren din for å få mer informasjon om dette sertifikatet.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"En utenforstående kan overvåke nettverksaktiviteten din, inkludert e-poster, apper og sikre nettsteder.\n\nPålitelig legitimasjon, som er installert på enheten din, gjør dette mulig."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Sjekk sertifikatene</item>
- <item quantity="one">Sjekk sertifikatet</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Stol på eller fjern sertifikatet}other{Stol på eller fjern sertifikatene}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Nettverk, serienumre og annen informasjon"</string>
<string name="manual" msgid="5683935624321864999">"Brukerveiledning"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Koble til"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Glem nettverket"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Dette sletter informasjonen som brukes til å koble til dette nettverket, inkludert lagrede passord"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Koble til et Wi-Fi-nettverk ved å skanne QR-koden fra mobiltelefonen og følge veiledningen."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Koble til et Wi-Fi-nettverk ved å skanne QR-koden fra en mobiltelefon og følge veiledningen.\n \n Fra en "<b>"Android-telefon"</b>" går du til Innstillinger -> Nettverk og internett -> Wi-Fi -> Velg et Wi-Fi-nettverk -> Avansert -> Legg til en enhet og skanner QR-koden."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Trykk på tilbakeknappen for å avbryte"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Fortsett"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Lagring på enheten"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Flyttbar lagring"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Tilbakestill"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Frigjør lagringsplass"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Slett bufrede data"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Frigjør <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Sletter midlertidige filer som tar opp plass. Dette påvirker ikke lagrede data som appinnstillinger eller videoer uten nett, og du trenger ikke å logge på apper igjen."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Vil du slette bufrede data?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Dette sletter bufrede data for alle apper."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Avinstaller apper"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> er satt inn"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Kunne ikke sette inn <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB-lagringen er koblet til på nytt"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Mikrofontilgang"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Apptilgang til mikrofon"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Mikrofontilgang er blokkert"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"For å oppheve blokkeringen, sett personvernbryteren på enheten til mikrofon på-posisjonen for å gi mikrofontilgang."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Kameratilgang"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Apptilgang til kamera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Kameratilgang er blokkert"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"For å oppheve blokkeringen, sett personvernbryteren på enheten til kamera på-posisjonen for å gi kameratilgang."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Mikrofontilgang: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Når dette er slått på, har alle apper og tjenester med tillatelse tilgang til alle mikrofoner på denne enheten.\n\nEksterne lydenheter med egendefinert protokoll blir ikke påvirket av denne innstillingen."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Kameratilgang: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Gul"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Lydbeskrivelse"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Få beskrivelse av det som skjer på skjermen, i filmer og TV-serier som støttes"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Aktivér"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfigurasjon"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Vil du bruke <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Overvåking"</string>
<string name="system_apps" msgid="8481888654606868074">"Apper"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Hold våken"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Skjermen starter aldri hvilemodus"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP-kontroll"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI-optimalisering"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Vil du starte på nytt nå?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Slå av HDMI-enheter med TV-en"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Automatisk påslåing av TV"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Slå på TV-en med HDMI-enheter"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Inngangene er tilkoblet</item>
- <item quantity="one">Inngangen er tilkoblet</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Venter på inngangene</item>
- <item quantity="one">Venter på inngangen</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Inngangene er ikke tilkoblet</item>
- <item quantity="one">Inngangen er ikke tilkoblet</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Tilkoblet innenhet}other{Tilkoblede innenheter}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Innenhet i hvilemodus}other{Innenheter i hvilemodus}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Ikke-tilkoblet innenhet}other{Ikke-tilkoblede innenheter}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Begrens tilgangen til apper og annet innhold i kontoen din"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Begrenset profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Kontrollert av <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Opprett en begrenset profil"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Innstillinger"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Tillatte apper"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d apper tillatt</item>
- <item quantity="one">1 app tillatt</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Tillatt"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Ikke tillatt"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Tilpass begrensninger"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Tredjepartskilde"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Tillatelser"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Appen er utilgjengelig"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Ubrukte apper"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Bekreft"</string>
<string name="settings_cancel" msgid="576094334743686152">"Avbryt"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Med denne tillatelsen kan apper endre systeminnstillingene."</string>
<string name="write_settings_on" msgid="71675710746513956">"Ja"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Nei"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Tilgang til alle filer"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Kan administrere alle filer"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Gi denne appen tillatelse til å lese, endre og slette alle filer på denne enheten eller tilkoblede lagringsvolum. Hvis du gir appen denne tillatelsen, kan den få tilgang til filer uten at du er klar over det."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Bilde-i-bilde"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Tillat bilde-i-bilde"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Ingen av de installerte appene støtter bilde-i-bilde"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"La apper opprette et bilde-i-bilde-vindu mens appen er åpen, eller etter at du har gått ut av den (for eksempel for å fortsette å se en video). Dette vinduet vises over andre apper du bruker."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Gi apper tillatelse til å angi alarmer og planlegge tidssensitive handlinger. Dette gir appene tillatelse til å kjøre i bakgrunnen, noe som kan bruke mer batteri.\n\nHvis denne tillatelsen er av, fungerer ikke eksisterende alarmer og tidsbaserte hendelser som er planlagt av appene."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Slå på skjermen"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Tillat å slå på skjermen"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Tillat at en app slår på skjermen. Hvis tillatelsen gis, kan appen slå på skjermen når som helst uten din eksplisitte intensjon."</string>
<string name="special_access" msgid="21806055758289916">"Spesiell apptilgang"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Lyd"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Datasparing"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Juster videokvalitet automatisk for å bruke mindre mobildata"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Databruk og -varsler"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Du kan koble til internett med Wi-Fi, Ethernet eller telefonens Wi-Fi-sone. Hvis du trenger mer hjelp, kan du gå til "<b>"g.co/network"</b>","</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Du kan koble til internett med Wi-Fi, Ethernet eller telefonens Wi-Fi-sone."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Handlingen er ikke tillatt"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Kan ikke endre volumet"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Kraft og energi"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Funksjonalitet ved oppstart"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Tilbakestill"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Tilkoblingskode for Ethernet"</string>
</resources>
diff --git a/Settings/res/values-ne/strings.xml b/Settings/res/values-ne/strings.xml
index e2ef41a..d7e7b64 100644
--- a/Settings/res/values-ne/strings.xml
+++ b/Settings/res/values-ne/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"खाता थप्नुहोस्"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"खाता र साइन इनका गर्ने कार्यहरू"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"कुन पनि खाता छैन"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> खाताहरू</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> खाता</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# खाता}other{# वटा खाता}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"मिडिया सेवा, सहायक, भुक्तानी"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"नेटवर्क र इन्टरनेट"</string>
<string name="sound_category_title" msgid="7899816751041939518">"ध्वनि"</string>
<string name="applications_category_title" msgid="7112019490898586223">"एपहरू"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"डिभाइसका प्राथमिकताहरू"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"रिमोट तथा सहायक उपकरणहरू"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"ब्लुटुथ जडान गरिएको कुनै पनि यन्त्र छैन"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> सामग्रीहरू</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> सामग्री</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"डिस्प्ले तथा ध्वनि"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"मद्दत र प्रतिक्रिया"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"गोपनीयता"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"कारखाना डेटा रिसेट"</string>
<string name="device_calibration" msgid="2907914144048739705">"क्यालिब्रेसन"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"इनर्जी सेभर"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"डिभाइसहरू"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ढाँचाहरू चयन गर्नुहोस्"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"सराउन्ड साउन्ड"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"सक्षम पारिएका फर्म्याटहरू"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"असक्षम पारिएका फर्म्याटहरू"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"यो फर्म्याट असक्षम पार्न फर्म्याटको छनौटसम्बन्धी सेटिङ परिवर्तन गरी \'म्यानुअल\' बनाउनुहोस्।"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"रिजोल्युसन"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"स्वतः"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"रिजोल्युसन परिवर्तन गरिएको छ"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"अबदेखि %1$s प्रयोग गर्न \'ठिक छ\' चयन गर्नुहोस्।"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"रद्द गर्नुहोस्"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ठिक छ"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"हर्ज"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"केस गरिएको डेटा हटाउने हो?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"यसले सबै अनुप्रयोगहरूको लागि केस गरिएको डेटा हटाउँछ।"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"अतिरक्त सामानहरू थप्नुहोस्"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"कनेक्ट गरिँदै छ..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"जडान हुँदै..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"सहायक उपकरणहरू"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"रिमोट कन्ट्रोल"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"रिमोट कन्ट्रोलसम्बन्धी सेटिङ"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"रिमोटका बटनहरू सेटअप गर्नुहोस्"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"टिभी, रिसिभर र साउन्डबारको भोल्युम, पावर र इनपुट नियन्त्रण गर्नुहोस्"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"कनेक्ट गर्नुहोस्"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s मा कनेक्ट गर्नुहोस्"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"डिस्कनेक्ट गर्नुहोस्"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"उपलब्ध छैन"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"डिभाइसका एडमिन एपहरू"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"कुनै सक्रिय एपहरू छैनन्"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"प्रशासक, इन्क्रिप्सन नीति वा प्रामाणिक भण्डारणद्वारा असक्षम पारिएको छ"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"व्यवस्थित गरिएको यन्त्रको जानकारी"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"तपाईंको संगठनले व्यवस्थापन गरेका परिवर्तन र सेटिङहरू"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"कुनै पनि होइन"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"एपहरू इन्स्टल गरियो"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"एपको सङ्ख्या अनुमान गरिएर निकालिएको हो। यसमा Play Store भन्दा बाहिरबाट इन्स्टल गरिएका एपहरू समावेश नगरिएका हुन सक्छन्।"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{न्यूनतम # एप}other{न्यूनतम # वटा एप}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"स्थानसम्बन्धी अनुमतिहरू"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"माइक्रोफोनसम्बन्धी अनुमतिहरू"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"क्यामेरा सम्बन्धी अनुमतिहरू"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"डिफल्ट एपहरू"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# एप}other{# वटा एप}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"डिफल्ट किबोर्ड"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> मा सेट गरिएको छ"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"सधैँ-सक्रिय रहने VPN सेवा सक्रिय गरिएको छ"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"विश्वसनीय प्रमाणपत्रहरू"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"तपाईंको व्यक्तिगत प्रोफाइलमा रहेका विश्वसनीय प्रमाणपत्रहरू"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"तपाईंको कार्य प्रोफाइलमा रहेका विश्वसनीय प्रमाणपत्रहरू"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">न्यूनतम <xliff:g id="COUNT_1">%d</xliff:g> वटा CA सर्टिफिकेट</item>
- <item quantity="one">न्यूनतम <xliff:g id="COUNT_0">%d</xliff:g> CA सर्टिफिकेट</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA प्रमाणपत्र}other{# वटा CA प्रमाणपत्र}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"प्रशासकले यन्त्र लक गर्न र पासवर्ड रिसेट गर्न सक्नुहुन्छ"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"प्रशासकले डिभाइसका सबै डेटा मेट्न सक्नुहुन्छ"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"यन्त्रको सबै डेटा मेट्नुअघि पासवर्ड प्रविष्ट गर्ने असफल प्रयासहरूको संख्या"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"कार्य प्रोफाइलको डेटा मेट्नुअघि पासवर्ड प्रविष्ट गर्ने असफल प्रयासहरूको संख्या"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# औँ प्रयास}other{# औँ प्रयास}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"तपाईंको संगठनले यस यन्त्रलाई व्यवस्थापन गर्दछ।"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"यो डिभाइस <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ले व्यवस्थापन गर्दछ।"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"थप जान्नुहोस्"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">क्यामेरा एपहरू</item>
- <item quantity="one">क्यामेरा एप</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{क्यामेरा एप}other{क्यामेरा एपहरू}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"पात्रो एप"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"सम्पर्क एप"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">इमेल क्लाइन्ट एपहरू</item>
- <item quantity="one">इमेल क्लाइन्ट एप</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{इमेल क्लाइन्ट एप}other{इमेल क्लाइन्ट एपहरू}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"नक्सा एप"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">फोन एपहरू</item>
- <item quantity="one">फोन एप</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{फोन एप}other{फोन एपहरू}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"ब्राउजर एप"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV को OS संस्करण"</string>
<string name="about_serial" msgid="3432319328808745459">"क्रम संख्या"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV को OS बिल्ड"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{तपाईं अब # चरण पूरा गरेपछि विकासकर्ता बन्नु हुने छ}other{तपाईं अब # वटा चरण पूरा गरेपछि विकासकर्ता बन्नु हुने छ}}"</string>
<string name="about_ads" msgid="7662896442040086522">"विज्ञापनहरू"</string>
<string name="ads_description" msgid="8081069475265061074">"आफ्नो विज्ञापन ID रिसेट गर्ने कार्यलगायत विज्ञापनका सेटिङ व्यवस्थापन गर्नुहोस्।"</string>
<string name="ads_content_description" msgid="1006489792324920289">"विज्ञापन, विज्ञापन ID रिसेट गर्ने कार्यलगायत विज्ञापनका सेटिङ व्यवस्थापन गर्नुहोस्।"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"थप सिस्टम अपडेट"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"सञ्जाल अनुगमित हुन सक्छ"</string>
<string name="done_button" msgid="616159688526431451">"सम्पन्न भयो"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">प्रमाणपत्रहरू विश्वसनीय भएको जनाउनुहोस् वा हटाउनुहोस्</item>
- <item quantity="one">प्रमाणपत्र विश्वसनीय भएको जनाउनुहोस् वा हटाउनुहोस्</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ले तपाईंको डिभाइसमा CA सर्टिफिकेट इन्स्टल गर्नुभएको छ। ती प्रमाणपत्रको सहायताले उहाँ इमेल, एप र सुरक्षित वेबसाइटलगायतका तपाईंको डिभाइसमा गरिने नेटवर्कसम्बन्धी क्रियाकलापको निगरानी गर्न सक्नुहुन्छ। \n\nयी प्रमाणपत्रका बारेमा थप जानकारी पाउन आफ्ना एड्मिनलाई सम्पर्क गर्नुहोस्।</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ले तपाईंको डिभाइसमा CA सर्टिफिकेट इन्स्टल गर्नुभएको छ। उक्त प्रमाणपत्रको सहायताले उहाँ इमेल, एप र सुरक्षित वेबसाइटलगायतका तपाईंको डिभाइसमा गरिने नेटवर्कसम्बन्धी क्रियाकलापको निगरानी गर्न सक्नुहुन्छ। \n\nयो प्रमाणपत्रका बारेमा थप जानकारी पाउन आफ्ना एड्मिनलाई सम्पर्क गर्नुहोस्।</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ले तपाईंको कार्य प्रोफाइलमा CA सर्टिफिकेट इन्स्टल गर्नुभएको छ। ती प्रमाणपत्रको सहायताले उहाँ इमेल, एप र सुरक्षित वेबसाइटलगायतका कार्यस्थलमा गरिने नेटवर्कसम्बन्धी क्रियाकलापको निगरानी गर्न सक्नुहुन्छ। \n\nयी प्रमाणपत्रका बारेमा थप जानकारी पाउन आफ्ना एड्मिनलाई सम्पर्क गर्नुहोस्।</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ले तपाईंको कार्य प्रोफाइलमा CA सर्टिफिकेट इन्स्टल गर्नुभएको छ। उक्त प्रमाणपत्रको सहायताले उहाँ इमेल, एप र सुरक्षित वेबसाइटलगायतका कार्यस्थलमा गरिने नेटवर्कसम्बन्धी क्रियाकलापको निगरानी गर्न सक्नुहुन्छ। \n\nयो प्रमाणपत्रका बारेमा थप जानकारी पाउन आफ्ना एड्मिनलाई सम्पर्क गर्नुहोस्।</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"तपाईँको सञ्जाल गतिविधिको साथ इमेल, एप र सुरक्षित वेबसाइटहरू सहितको अनुगमन गर्न तेस्रो पक्ष सक्षम छ। \n \n तपाईँको उपकरणमा स्थापित भएको बिश्वस्त गोप्य डेटाले गर्दा यो सम्भव भएको हो।"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">प्रमाणपत्रहरू जाँच्नुहोस्</item>
- <item quantity="one">प्रमाणपत्र जाँच्नुहोस्</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{प्रमाणपत्र विश्वसनीय छ भन्ने कुरा स्वीकार गर्नुहोस् वा उक्त प्रमाणपत्र हटाउनुहोस्}other{प्रमाणपत्रहरू विश्वसनीय छन् भन्ने कुरा स्वीकार गर्नुहोस् वा ती प्रमाणपत्र हटाउनुहोस्}}"</string>
<string name="device_status" msgid="8266002761193692207">"स्थिति"</string>
<string name="device_status_summary" msgid="3270932829412434985">"नेटवर्क, सिरियल संख्या र अन्य जानकारी"</string>
<string name="manual" msgid="5683935624321864999">"म्यानुअल"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"कनेक्ट गर्नुहोस्"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"सञ्जाल बिर्सनुहोस्"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"यसले यो नेटवर्कमा सुरक्षित भएका पासवर्ड सहित जडान गर्न प्रयोग हुने जानकरीलाई क्लियर गर्दछ।"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"आफ्नो मोबाइल फोनमार्फत QR कोड स्क्यान गरेर आफ्नो फोन Wi-Fi मा कनेक्ट गर्नुहोस् अनि दिइएको निर्देशन पालना गर्नुहोस्।"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" कुनै मोबाइल फोनमार्फत QR कोड स्क्यान गरेर उक्त फोन Wi-Fi मा कनेक्ट गर्नुहोस् अनि दिइएका निर्देशनहरूको पालना गर्नुहोस्।\n \n"<b>"Android फोन"</b>" प्रयोग गरी \'सेटिङ -> नेटवर्क तथा इन्टरनेट -> Wi-Fi -> Wi-Fi नेटवर्क चयन गर्नुहोस् -> उन्नत -> डिभाइस थप्नुहोस्\' मा जानुहोस् अनि QR कोड स्क्यान गर्नुहोस्।"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"रद्द गर्न \'पछाडि\' बटन थिच्नुहोस्"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ठिक छ"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"जारी राख्नुहोस्"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"यन्त्र भण्डारण"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"हटाउन योग्य भण्डारण"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"रिसेट गर्नुहोस्"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"भण्डारणमा ठाउँ खाली गर्नुहोस्"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"क्यास गरिएका डेटा हटाउनुहोस्"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> खाली गर्नुहोस्"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"तपाईंले यसो गर्नुभयो भने तपाईंको भण्डारणमा ठाउँ ओगटिरहेका अस्थायी फाइलहरू हटाइन्छ। यो कार्यले एपसम्बन्धी प्राथमिकता वा अफलाइन भिडियोलगायतका सेभ गरिएका डेटामा प्रभाव पार्दैन र तपाईंले एपहरूमा फेरि साइन इन गर्नु पर्दैन।"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"क्यास गरिएका डेटा हटाउने हो?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"तपाईंले यसो गर्नुभयो भने सबै एपका क्यास गरिएका डेटा हटाइने छ।"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"एपहरू अनइन्स्टल गर्नुहोस्"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> माउन्ट गरियो"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> माउन्ट गर्न सकेन"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB भण्डारण पुनः जडान गरियो"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"माइक्रोफोन"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"माइक्रोफोन प्रयोग गर्ने अनुमति"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"एपलाई दिइएको माइक्रोफोन प्रयोग गर्ने अनुमति"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"माइक्रोफोन प्रयोग गर्ने अनुमति ब्लक गरिएको छ"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"अनब्लक गर्नका लागि माइक्रोफोन प्रयोग गर्ने अनुमति दिनु पर्ने हुन्छ। उक्त अनुमति दिन डिभाइसको \"गोपनीयता\" स्विचमा गई सेटिङ बदलेर \"माइक्रोफोन अन छ\" बनाउनुहोस्।"</string>
<string name="camera" msgid="1226671478936288283">"क्यामेरा"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"क्यामेरा प्रयोग गर्ने अनुमति"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"एपलाई क्यामेरा प्रयोग गर्ने अनुमति"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"क्यामेरा प्रयोग गर्ने अनुमति ब्लक गरिएको छ"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"अनब्लक गर्नका लागि क्यामेरा प्रयोग गर्ने अनुमति दिनु पर्ने हुन्छ। उक्त अनुमति दिन डिभाइसको \"गोपनीयता\" स्विचमा गई सेटिङ बदलेर \"क्यामेरा अन छ\" बनाउनुहोस्।"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"माइक्रोफोन प्रयोग गर्ने अनुमति: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"यो सेटिङ अन गरिएका बेला क्यामेरा प्रयोग गर्ने अनुमति दिइएका सबै एप तथा सेवाहरूले यो डिभाइसमा भएको जुनसुकै माइक्रोफोन प्रयोग गर्न पाउँछन्।\n\nप्रयोगकर्ताको आवश्यकताअनुसारको प्रोटोकल भएका अडियोसम्बन्धी सहायक डिभाइसहरूमा भने यो सेटिङ लागू हुँदैन।"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"क्यामेरा प्रयोग गर्ने अनुमति: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"सायन"</string>
<string name="color_yellow" msgid="3519470952904560404">"पहेंलो"</string>
<string name="color_magenta" msgid="2377854703399624607">"म्याgeन्टा"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"अडियोको वर्णन"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"यो सुविधा भएका चलचित्र र सोहरू प्ले भइरहेका बेला स्क्रिनमा के भइरहेको छ भन्ने कुरा वर्णन गरिएको अडियो सुन्नुहोस्"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"अन गर्नुहोस्"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"कन्फिगरेसन"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g>प्रयोग गर्ने ?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"अनुगमन गरिँदै छ"</string>
<string name="system_apps" msgid="8481888654606868074">"एपहरू"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"डिस्प्ले अफ नहोस्"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"स्क्रिन कहिल्यै स्लिप मोडमा जाने छैन"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP जाँच"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI आफू अनुकूल"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"अब सुरु गर्ने?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"टिभीसँग HDMI उपकरणहरू पावर बन्द गर्नुहोस्"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"टिभी ओटो पावर खुला"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI उपकरणसँग टिभी पावर खोल्नुहोस्"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">जडान गरिएका इनपुटहरू</item>
- <item quantity="one">जडान गरिएको इनपुट</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">स्ट्यान्डबाइ इनपुटहरू</item>
- <item quantity="one">स्ट्यान्डबाइ इनपुट</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">जडान नगरिएका इनपुटहरू</item>
- <item quantity="one">जडान नगरिएको इनपुट</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{कनेक्ट गरिएको इनपुट}other{कनेक्ट गरिएका इनपुटहरू}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{स्ट्यान्डबाइ इनपुट}other{स्ट्यान्डबाइ इनपुटहरू}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{कनेक्ट नगरिएको इनपुट}other{कनेक्ट नगरिएका इनपुटहरू}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"एपमा र आफ्नो खातामा अन्य सामाग्रीहरूको पहुँच प्रतिबन्ध गर्नुहोस्"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"प्रतिबन्धित प्रोफाइल"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> द्वारा नियन्त्रित"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"सीमित प्रोफाइल सिर्जना गर्नुहोस्"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"सेटिङहरू"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"अनुमति दिएका एपहरू"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d एपहरूलाई अनुमति दिइयो</item>
- <item quantity="one">1 एपलाई अनुमति दिइयो</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"अनुमति गरिएको"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"अनुमति छैन"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"प्रतिबन्धहरू आफू अनुकूल गर्नुहोस्"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"तेस्रो पक्षीय स्रोत"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"अनुमतिहरू"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"एप उपलब्ध छैन"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"प्रयोग नगरिएका एपहरू"</string>
<string name="settings_ok" msgid="5950888975075541964">"ठिक छ"</string>
<string name="settings_confirm" msgid="4489126458677153411">"पुष्टि गर्नुहोस्"</string>
<string name="settings_cancel" msgid="576094334743686152">"रद्द गर्नुहोस्"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"यस अनुमतिले एपलाई प्रणालीसम्बन्धी सेटिङहरू परिमार्जन गर्न दिन्छ।"</string>
<string name="write_settings_on" msgid="71675710746513956">"छ"</string>
<string name="write_settings_off" msgid="6730113471695092167">"छैन"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"सबै फाइल हेर्ने तथा प्रयोग गर्ने अनुमति"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"सबै फाइलहरूको व्यवस्थापन गर्ने अनुमति दिइयोस्"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"यो एपलाई यो डिभाइस वा जोडिएको कुनै भण्डारणमा रहेका सबै फाइलहरू पढ्ने, परिमार्जन गर्ने तथा मेट्ने अनुमति दिनुहोस्। अनुमति दिइएका खण्डमा यो एपले तपाईंको स्पष्ट अनुमतिविनै फाइलहरू प्रयोग गर्नसक्छ।"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Picture-in-picture लाई अनुमति दिइयोस्"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"स्थापना गरिएको कुनै पनि अनुप्रयोगले Picture-in-picture मोडलाई समर्थन गर्दैन"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"यो एप खुला रहेको अवस्थामा वा तपाईंले यसलाई छाडेपछि (उदाहरणका लागि, भिडियो हेर्ने कार्य जारी राख्न) यस एपलाई picture-in-picture विन्डो सिर्जना गर्ने अनुमति दिनुहोस्। यो विन्डो तपाईंले प्रयोग गरिरहनुभएका अन्य एपहरूको माथि देखिन्छ।"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"यी एपहरूलाई अलार्म सेट गर्ने र समयमै पूरा गर्नु पर्ने कारबाहीहरूको रुटिन तय गर्ने अनुमति दिनुहोस्। यो अनुमति दिइएको छ भने यी एप ब्याकग्राउन्डमा चल्छन्। त्यसैले, यी एपले धेरै ब्याट्री खपत गर्न सक्छन्।\n\nयो अनुमति दिइएको छैन भने समय तोकिएका अलार्म र यी एपले तय गरेका समयअनुसार चल्ने कार्यक्रमहरूले काम गर्दैनन्।"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"स्क्रिन अन गर्नुहोस्"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"स्क्रिन अन गर्ने अनुमति दिइयोस्"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"कुनै एपलाई स्क्रिन अन गर्ने अनुमति दिइयोस्। यो अनुमति दिइएका खण्डमा तपाईंले अन गर्न नखोजेका बेलामा पनि एपले जुनसुकै बेला स्क्रिन अन गर्न सक्छ।"</string>
<string name="special_access" msgid="21806055758289916">"एपलाई विशेष पहुँच"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"अडियो"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"डेटा सेभर"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"कम मोबाइल डेटा प्रयोग गर्न भिडियोको गुणस्तर स्वतः समायोजन गर्नुहोस्"</string>
<string name="title_data_alert" msgid="8262081890052682475">"डेटाको प्रयोग र सतर्कताहरू"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"तपाईं Wi-Fi, इथरनेट वा आफ्नो फोनको हटस्पटमार्फत इन्टरनेटमा जोडिन सक्नुहुन्छ। थप मद्दतका लागि "<b>"g.co/network"</b>" मा जानुहोस्।"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"तपाईं Wi-Fi, इथरनेट केबल वा आफ्नो फोनको हटस्पटमार्फत इन्टरनेटमा जोडिन सक्नुहुन्छ।"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"यो कार्य गर्न मिल्दैन"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"भोल्युम परिवर्तन गर्न सकिँदैन"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"पावर तथा इनर्जी"</string>
<string name="power_on_behavior" msgid="927607372303160716">"पावर अन हुँदा देखिने मोड"</string>
<string name="reset_options_title" msgid="7632580482285108955">"रिसेट गर्नुहोस्"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"इथरनेट कनेक्सन कोड"</string>
</resources>
diff --git a/Settings/res/values-nl/strings.xml b/Settings/res/values-nl/strings.xml
index f53a13c..7515e2f 100644
--- a/Settings/res/values-nl/strings.xml
+++ b/Settings/res/values-nl/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Account toevoegen"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Accounts en inloggen"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Geen accounts"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> accounts</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> account</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# account}other{# accounts}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Mediaservices, Assistent, betalingen"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Netwerk en internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Geluid"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apps"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Apparaatvoorkeuren"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Afstandsbedieningen en accessoires"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Geen verbonden Bluetooth-apparaten"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accessoires</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> accessoire</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Weergave en geluid"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Hulp en feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacy"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Terugzetten op fabrieksinstellingen"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibratie"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Energiebesparing"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Apparaten"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Indelingen selecteren"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Surround sound"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"AANGEZETTE INDELINGEN"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"UITGEZETTE INDELINGEN"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Als je de indeling wilt uitzetten, wijzig je de indelingsselectie in Handmatig."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolutie"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatisch"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Resolutie is gewijzigd"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Selecteer OK om vanaf nu %1$s te gebruiken."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Annuleren"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Gecachte gegevens wissen?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"De gecachte gegevens voor alle apps wissen."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Accessoire toevoegen"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Koppelen..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Verbinden…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accessoires"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Afstandsbediening"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Instellingen voor afstandsbediening"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Afstandsbedieningsknoppen instellen"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Volume bedienen, aan- en uitzetten en invoer selecteren op tv\'s, ontvangers en soundbars"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Koppelen"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Koppelen met %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Ontkoppelen"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Niet beschikbaar"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Apps voor apparaatbeheer"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Geen actieve apps"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> actieve apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> actieve app</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Uitgezet door beheerder, versleutelingsbeleid of opslag certificaatgegevens"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informatie over beheerd apparaat"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Wijzigingen en instellingen beheerd door je organisatie"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Geen"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Geïnstalleerde apps"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Het aantal apps is een schatting die misschien geen apps omvat die zijn geïnstalleerd buiten de Play Store om."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Minimaal <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one">Minimaal <xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimaal # app}other{Minimaal # apps}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Toegang tot locatie"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Toegang tot microfoon"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Toegang tot camera"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Standaard-apps"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}other{# apps}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Standaardtoetsenbord"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Ingesteld op <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Always-on VPN aangezet"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Vertrouwde certificaatgegevens"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Vertrouwde certificaatgegevens in je persoonlijke profiel"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Vertrouwde certificaatgegevens in je werkprofiel"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Minimaal <xliff:g id="COUNT_1">%d</xliff:g> CA-certificaten</item>
- <item quantity="one">Minimaal <xliff:g id="COUNT_0">%d</xliff:g> CA-certificaat</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA-certificaat}other{# CA-certificaten}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Beheerder kan het apparaat vergrendelen en het wachtwoord resetten"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Beheerder kan alle apparaatgegevens verwijderen"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Aantal mislukte wachtwoordpogingen voordat alle apparaatgegevens worden verwijderd"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Aantal mislukte wachtwoordpogingen voordat de gegevens van het werkprofiel worden verwijderd"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> pogingen</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> poging</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# poging}other{# pogingen}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Dit apparaat wordt beheerd door je organisatie."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Dit apparaat wordt beheerd door <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Meer informatie"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Camera-apps</item>
- <item quantity="one">Camera-app</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Camera-app}other{Camera-apps}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Agenda-app"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Contacten-app"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">E-mailclient-apps</item>
- <item quantity="one">E-mailclient-app</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{E-mailclient-app}other{E-mailclient-apps}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Kaart-app"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Telefoon-apps</item>
- <item quantity="one">Telefoon-app</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Telefoon-app}other{Telefoon-apps}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Browser-app"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"OS-versie van Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Serienummer"</string>
<string name="about_build" msgid="8467840394761634575">"OS-build van Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{Nog # stap en je bent ontwikkelaar}other{Nog # stappen en je bent ontwikkelaar}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Advertenties"</string>
<string name="ads_description" msgid="8081069475265061074">"Je advertentie-instellingen beheren, zoals je advertentie-ID resetten."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Advertenties, je advertentie-instellingen beheren, zoals je advertentie-ID resetten."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Aanvullende systeemupdates"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Netwerk kan worden gemonitord"</string>
<string name="done_button" msgid="616159688526431451">"Klaar"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Certificaten vertrouwen of verwijderen</item>
- <item quantity="one">Certificaat vertrouwen of verwijderen</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> heeft certificeringsinstanties (CA\'s) op je apparaat geïnstalleerd, waardoor dit domein de netwerkactiviteit van je apparaat kan bijhouden, waaronder e-mails, apps en beveiligde websites.\n\nNeem contact op met je beheerder voor meer informatie.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> heeft een certificeringsinstantie (CA) op je apparaat geïnstalleerd, waardoor dit domein de netwerkactiviteit van je apparaat kan bijhouden, waaronder e-mails, apps en beveiligde websites.\n\nNeem contact op met je beheerder voor meer informatie.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> heeft certificeringsinstanties (CA\'s) voor je werkprofiel geïnstalleerd, waardoor dit domein activiteit in het werknetwerk kan bijhouden, waaronder e-mails, apps en beveiligde websites.\n\nNeem contact op met je beheerder voor meer informatie.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> heeft een certificeringsinstantie (CA) voor je werkprofiel geïnstalleerd, waardoor dit domein activiteit in het werknetwerk kan bijhouden, waaronder e-mails, apps en beveiligde websites.\n\nNeem contact op met je beheerder voor meer informatie.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Een derde partij kan je netwerkactiviteit, waaronder e-mails, apps en beveiligde websites, bijhouden.\n\nDit is mogelijk omdat je een vertrouwd certificaat op je apparaat hebt opgeslagen."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Certificaten checken</item>
- <item quantity="one">Certificaat checken</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Certificaat vertrouwen of verwijderen}other{Certificaten vertrouwen of verwijderen}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Netwerk, serienummers en andere informatie"</string>
<string name="manual" msgid="5683935624321864999">"Handleiding"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Verbinding maken"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Netwerk vergeten"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Hierdoor wordt de gebruikte info voor verbinding met dit netwerk gewist, waaronder een opgeslagen ww"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Maak verbinding met een wifi-netwerk door de QR-code te scannen op je mobiele telefoon en de instructies te volgen."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Maak verbinding met een wifi-netwerk door de QR-code te scannen op een mobiele telefoon en de instructies te volgen.\n \n Ga op een "<b>"Android-telefoon"</b>" naar Instellingen -> Netwerk en internet -> Wifi -> Een wifi-netwerk selecteren -> Geavanceerd -> Apparaat toevoegen en scan de QR-code."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Druk op de terugknop om te annuleren"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Doorgaan"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Apparaatopslag"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Verwijderbare opslag"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Opnieuw instellen"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Opslag vrijmaken"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Gecachte gegevens wissen"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> vrijmaken"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Hiermee worden tijdelijke bestanden gewist die ruimte innemen. Dit is niet van invloed op opgeslagen gegevens zoals app-voorkeuren of offline video\'s en je hoeft niet opnieuw in te loggen bij apps."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Gecachte gegevens wissen?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"De gecachte gegevens voor alle apps wissen."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Apps verwijderen"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> is gekoppeld"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Kan <xliff:g id="NAME">%1$s</xliff:g> niet koppelen"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB-opslag weer verbonden"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Microfoon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Microfoontoegang"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"App-toegang tot microfoon"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Microfoontoegang geblokkeerd"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Als je de blokkering wilt opheffen, zet je de privacyschakelaar op je apparaat op de positie Microfoon aan om microfoontoegang toe te staan."</string>
<string name="camera" msgid="1226671478936288283">"Camera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Cameratoegang"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"App-toegang tot camera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Cameratoegang geblokkeerd"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Als je de blokkering wilt opheffen, zet je de privacyschakelaar op je apparaat op de positie Camera aan om cameratoegang toe te staan."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Microfoontoegang: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Als deze schakelaar aanstaat, hebben alle apps en services met toestemming toegang tot elke microfoon op dit apparaat.\n\nDeze instelling is niet van invloed op audiorandapparaten met een aangepast protocol."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Cameratoegang: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyaan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Geel"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audiobeschrijving"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Een beschrijving van wat er op het scherm gebeurt horen in ondersteunde films en series"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Aanzetten"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuratie"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> gebruiken?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Controleren"</string>
<string name="system_apps" msgid="8481888654606868074">"Apps"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Stand-by"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Het scherm gaat nooit uit"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP-controle"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI-optimalisatie"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Nu opnieuw opstarten?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"HDMI-apparaten samen uitzetten met de tv"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Tv automatisch aan"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"De tv aanzetten samen met het HDMI-apparaat"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Aangesloten ingangen</item>
- <item quantity="one">Aangesloten ingang</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Stand-by-ingangen</item>
- <item quantity="one">Stand-by-ingang</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Niet-aangesloten ingangen</item>
- <item quantity="one">Niet-aangesloten ingang</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Aangesloten ingang}other{Aangesloten ingangen}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Stand-by-ingang}other{Stand-by-ingangen}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Niet-aangesloten ingang}other{Niet-aangesloten ingangen}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Toegang tot apps en andere content in je account beperken"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Beperkt profiel"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Beheerd door <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Beperkt profiel maken"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Instellingen"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Apps die zijn toegestaan"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d apps toegestaan</item>
- <item quantity="one">1 app toegestaan</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Toegestaan"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Niet toegestaan"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Beperkingen aanpassen"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Externe bron"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Machtigingen"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"App niet beschikbaar"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Niet-gebruikte apps"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Bevestigen"</string>
<string name="settings_cancel" msgid="576094334743686152">"Annuleren"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Met deze rechten kan een app de systeeminstellingen aanpassen."</string>
<string name="write_settings_on" msgid="71675710746513956">"Ja"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Nee"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Toegang tot alle bestanden"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Toegang geven om alle bestanden te beheren"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Toestaan dat deze app alle bestanden op dit apparaat of gekoppelde opslagvolumes kan lezen, aanpassen of verwijderen. Indien verleend, kan de app zonder jouw medeweten toegang tot bestanden krijgen."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Scherm-in-scherm"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Scherm-in-scherm toestaan"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Geen geïnstalleerde apps die Scherm-in-scherm ondersteunen"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Geef apps toestemming om een scherm-in-scherm-venster te maken als de app open is of als je de app verlaat (bijvoorbeeld om een video te blijven kijken). Dit venster wordt weergegeven vóór andere apps die je gebruikt."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Sta toe dat apps wekkers zetten en tijdgevoelige acties plannen. De apps kunnen hierdoor op de achtergrond worden uitgevoerd, waardoor je misschien meer batterijlading verbruikt.\n\nAls dit recht uitstaat, werken door deze app geplande bestaande wekkers en tijdgebaseerde afspraken niet."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Scherm aanzetten"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Scherm aanzetten toestaan"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Toestaan dat een app het scherm aanzet. Indien toegestaan, kan de app het scherm op elk moment aanzetten zonder jouw expliciete intentie."</string>
<string name="special_access" msgid="21806055758289916">"Speciale app-toegang"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Databesparing"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Videokwaliteit automatisch aanpassen om minder mobiele data te gebruiken"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Datagebruik en meldingen"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Je kunt verbinding maken met internet via wifi, ethernet of de hotspot van je telefoon. Ga naar "<b>"g.co/network"</b>" voor meer hulp."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Je kunt verbinding maken met internet via wifi, ethernet of de hotspot van je telefoon."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Actie niet toegestaan"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Kan het volume niet wijzigen"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Voeding en energie"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Startscherm na aanzetten"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Resetten"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Koppelingscode voor ethernet"</string>
</resources>
diff --git a/Settings/res/values-or/strings.xml b/Settings/res/values-or/strings.xml
index 03c13dd..b569fb8 100644
--- a/Settings/res/values-or/strings.xml
+++ b/Settings/res/values-or/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"ଗୋଟିଏ ଆକାଉଣ୍ଟ ଯୋଡ଼ନ୍ତୁ"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"ଆକାଉଣ୍ଟଗୁଡ଼ିକ ଏବଂ ସାଇନ୍ ଇନ୍"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"କୌଣସି ଆକାଉଣ୍ଟ ନାହିଁ"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> ଆକାଉଣ୍ଟ</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> ଆକାଉଣ୍ଟ</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{#ଟି ଆକାଉଣ୍ଟ}other{#ଟି ଆକାଉଣ୍ଟ}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"ମିଡିଆ ସେବାଗୁଡ଼ିକ, Assistant, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"ନେଟ୍ୱର୍କ ଓ ଇଣ୍ଟର୍ନେଟ୍"</string>
<string name="sound_category_title" msgid="7899816751041939518">"ସାଉଣ୍ଡ"</string>
<string name="applications_category_title" msgid="7112019490898586223">"ଆପ୍"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"ନିଜ ପସନ୍ଦର ଡିଭାଇସ୍"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"ରିମୋଟ୍ ଓ ଆସୋସରିଗୁଡ଼ିକ"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"କୌଣସି କନେକ୍ଟ ହୋଇଥିବା ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସ୍ ନାହିଁ"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ଆସେସୋରୀଗୁଡିକ</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> ଆସେରୋରୀ</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ଡିସପ୍ଲେ ଓ ସାଉଣ୍ଡ"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"ସହାୟତା ଓ ମତାମତ"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"ଗୋପନୀୟତା"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"ଫ୍ୟାକ୍ଟୋରୀ ଡାଟା ରିସେଟ୍"</string>
<string name="device_calibration" msgid="2907914144048739705">"କାଲିବ୍ରାସନ୍"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"ଏନର୍ଜି ସେଭର୍"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"ଡିଭାଇସଗୁଡ଼ିକ"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ଫର୍ମାଟ୍ ବାଛନ୍ତୁ"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"ପରିପାର୍ଶ୍ଵର ଶଦ୍ଦ"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"ଡଲ୍ବି ଡିଜିଟାଲ୍"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ସକ୍ଷମ କରାଯାଇଥିବା ଫର୍ମାଟଗୁଡ଼ିକ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ଅକ୍ଷମ କରାଯାଇଥିବା ଫର୍ମାଟଗୁଡ଼ିକ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"ଅକ୍ଷମ କରିବା ପାଇଁ, ଫର୍ମାଟର ଚୟନକୁ ମାନୁଆଲରେ ବଦଳାନ୍ତୁ।"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"ରିଜୋଲ୍ୟୁସନ୍"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"ସ୍ୱଚାଳିତ"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"ରିଜୋଲ୍ୟୁସନକୁ ପରିବର୍ତ୍ତନ କରାଯାଇଛି"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"ବର୍ତ୍ତମାନଠାରୁ %1$sକୁ ବ୍ୟବହାର କରିବା ପାଇଁ \"ଠିକ୍ ଅଛି\"କୁ ଚୟନ କରନ୍ତୁ।"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"ବାତିଲ୍ କରନ୍ତୁ"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ଠିକ୍ ଅଛି"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"କ୍ୟାଶ୍ ହୋଇଥିବା ଡାଟା ଖାଲି କରିବେ?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"ଏହା, ସମସ୍ତ ଡାଟା ପାଇଁ କ୍ୟାଶ୍ ହୋଇଥିବା ଡାଟାକୁ ଖାଲି କରିଦେବ"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"ଆସେସୋରୀ ଯୋଡନ୍ତୁ"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"ପେୟାର୍ କରୁଛି…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"ସଂଯୋଗ କରୁଛି…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"ଆକସେସୋରୀଗୁଡ଼ିକ"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"ରିମୋଟ୍ କଣ୍ଟ୍ରୋଲ୍"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"ରିମୋଟ କଣ୍ଟ୍ରୋଲ ସେଟିଂସ"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"ରିମୋଟ୍ ବଟନଗୁଡ଼ିକୁ ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"ଟିଭି, ରିସିଭର୍ ଏବଂ ସାଉଣ୍ଡବାରଗୁଡ଼ିକରେ ଭଲ୍ୟୁମ୍, ପାୱାର, ଇନପୁଟକୁ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"ସଂଯୋଗ କରନ୍ତୁ"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s ସହ ସଂଯୋଗ କରନ୍ତୁ"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"ଉପଲବ୍ଧ ନାହିଁ"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"ଡିଭାଇସ୍ ଆଡମିନ୍ ଆପ୍"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"କୌଣସି ସକ୍ରିୟ ଆପ୍ ନାହିଁ"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"ପ୍ରଶାସକ, ଏନକ୍ରିପ୍ଶନ୍ ନୀତି, କିମ୍ବା କ୍ରେଡେନ୍ଶିଆଲ୍ ଷ୍ଟୋରେଜ୍ ଦ୍ୱାରା ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"ପରିଚାଳିତ ଡିଭାଇସ୍ ସୂଚନା"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ପରିବର୍ତ୍ତନ ଓ ସେଟିଂସ ପରିଚାଳନା କରାଯାଏ"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"କିଛି ନାହିଁ"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"ଆପ୍ଗୁଡ଼ିକ ଇନ୍ଷ୍ଟଲ୍ ହୋଇଗଲା"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"ଆପଗୁଡ଼ିକର ସଂଖ୍ୟା ଅନୁମାନ କରାଯାଇଛି। Play Store ବାହାରେ ଇନଷ୍ଟଲ୍ ହୋଇଥିବା ଆପଗୁଡ଼ିକ ଏଥିରେ ସାମିଲ ହୋଇନଥାଇପାରେ।"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{ସର୍ବନିମ୍ନ #ଟି ଆପ}other{ସର୍ବନିମ୍ନ #ଟି ଆପ}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"ଲୋକେସନ୍ ସମ୍ପର୍କିତ ଅନୁମତିଗୁଡ଼ିକ"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"ମାଇକ୍ରୋଫୋନ୍ ପାଇଁ ଅନୁମତି"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"କ୍ୟାମେରା ଅନୁମତିଗୁଡିକ"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"ଡିଫଲ୍ଟ ଏପ୍ସ"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{#ଟି ଆପ}other{#ଟି ଆପ}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ କୀବୋର୍ଡ"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> କୁ ସେଟ୍ କରନ୍ତୁ"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"ସଦାସକ୍ରିୟ VPN ଚାଲୁ ହେଲା"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"ବିଶ୍ୱସ୍ତ ତଥ୍ୟ"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"ଆପଣଙ୍କ ବ୍ୟକ୍ତିଗତ ପ୍ରୋଫାଇଲ୍ରେ ବିଶ୍ୱସନୀୟ କ୍ରେଡେନଶିଆଲ୍"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"ଆପଣଙ୍କର କାର୍ଯ୍ୟ ପ୍ରୋଫାଇଲ୍ରେ ବିଶ୍ୱସନୀୟ କ୍ରେଡେନ୍ଶିଆଲ୍"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">ସର୍ବନିମ୍ନ <xliff:g id="COUNT_1">%d</xliff:g>ଟି CA ସାର୍ଟିଫିକେଟ୍</item>
- <item quantity="one">ସର୍ବନିମ୍ନ <xliff:g id="COUNT_0">%d</xliff:g>ଟି CA ସାର୍ଟିଫିକେଟ୍</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{#ଟି CA ସାର୍ଟିଫିକେଟ}other{#ଟି CA ସାର୍ଟିଫିକେଟ}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"ଆଡମିନ୍ ଡିଭାଇସ୍ଟି ଲକ୍ ଏବଂ ପାସୱାର୍ଡ୍ ପୁନଃସେଟ୍ କରିପାରେ"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"ସମସ୍ତ ଡିଭାଇସ୍ ଡାଟାକୁ ଆଡମିନ୍ ଡିଲିଟ୍ କରିପାରିବେ"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"ସମସ୍ତ ଡିଭାଇସ୍ ଡାଟା ବିଲୋପ କରିବା ପୂର୍ବରୁ ପାସୱାର୍ଡ ଦେବା ଉଦ୍ୟମଗୁଡିକରେ ବିଫଳ ହେଲା"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"କାର୍ଯ୍ୟ ପ୍ରୋଫାଇଲ୍ ଡାଟା ଡିଲିଟ୍ ହେବା ପୂର୍ବରୁ ବିଫଳ ପାସ୍ୱର୍ଡ ପ୍ରୟାସମାନ"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{#ଟି ପ୍ରଚେଷ୍ଟା}other{#ଟି ପ୍ରଚେଷ୍ଟା}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"ଏହି ଡିଭାଇସ୍ ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ପରିଚାଳିତ"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"ଏହି ଡିଭାଇସ୍ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି।"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"ଅଧିକ ଜାଣନ୍ତୁ"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">କ୍ୟାମେରା ଆପ୍</item>
- <item quantity="one">କ୍ୟାମେରା ଆପ୍</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{କ୍ୟାମେରା ଆପ}other{କ୍ୟାମେରା ଆପ୍ସ}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"କ୍ୟାଲେଣ୍ଡର ଏପ"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"ଯୋଗାଯୋଗ ଆପ୍"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">ଇମେଲ୍ କ୍ଲାଏଣ୍ଟ ଆପ୍</item>
- <item quantity="one">ଇମେଲ୍ କ୍ଲାଏଣ୍ଟ ଆପ୍</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ଇମେଲ କ୍ଲାଏଣ୍ଟ ଆପ}other{ଇମେଲ କ୍ଲାଏଣ୍ଟ ଆପ୍ସ}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"ନକ୍ସା ଆପ୍"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">ଫୋନ୍ ଆପ୍</item>
- <item quantity="one">ଫୋନ୍ ଆପ୍</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{ଫୋନ ଆପ}other{ଫୋନ ଆପ୍ସ}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"ବ୍ରାଉଜର୍ ଆପ୍"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS ସଂସ୍କରଣ"</string>
<string name="about_serial" msgid="3432319328808745459">"କ୍ରମିକ ସଂଖ୍ୟା"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS ବିଲ୍ଡ"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{ଆପଣ ଜଣେ ଡେଭେଲପର ହେବା ପାଇଁ ବର୍ତ୍ତମାନ #ଟି ଷ୍ଟେପ ଦୂରରେ ଅଛନ୍ତି}other{ଆପଣ ଜଣେ ଡେଭେଲପର ହେବା ପାଇଁ ବର୍ତ୍ତମାନ #ଟି ଷ୍ଟେପ ଦୂରରେ ଅଛନ୍ତି}}"</string>
<string name="about_ads" msgid="7662896442040086522">"ବିଜ୍ଞାପନ"</string>
<string name="ads_description" msgid="8081069475265061074">"ବିଜ୍ଞାପନ IDକୁ ରିସେଟ କରିବା ଭଳି ବିଜ୍ଞାପନ ସେଟିଂସ ପରିଚାଳନା କରନ୍ତୁ।"</string>
<string name="ads_content_description" msgid="1006489792324920289">"ବିଜ୍ଞାପନ, ଆପଣଙ୍କର ବିଜ୍ଞାପନ IDକୁ ରିସେଟ କରିବା ପରି, ଆପଣଙ୍କ ବିଜ୍ଞାପନ ସେଟିଂସକୁ ପରିଚାଳନା କରେ।"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"ଅତିରିକ୍ତ ସିଷ୍ଟମ୍ ଅପଡେଟ୍ଗୁଡ଼ିକ"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"ନେଟୱାର୍କ ନୀରିକ୍ଷଣ କରାଯାଇ ପାରେ"</string>
<string name="done_button" msgid="616159688526431451">"ହୋଇଗଲା"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">ସାର୍ଟିଫିକେଟଗୁଡ଼ିକୁ ବିଶ୍ୱାସ କରନ୍ତୁ କିମ୍ବା କାଢ଼ି ଦିଅନ୍ତୁ</item>
- <item quantity="one">ସାର୍ଟିଫିକେଟକୁ ବିଶ୍ୱାସ କରନ୍ତୁ କିମ୍ବା କାଢ଼ି ଦିଅନ୍ତୁ</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ଆପଣଙ୍କ ଡିଭାଇସରେ ସାଟିଫିକେଟ୍ କର୍ତ୍ତୃପକ୍ଷଗୁଡ଼ିକ ଇନଷ୍ଟଲ୍ କରିଛନ୍ତି, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ସୁରକ୍ଷିତ ୱେବସାଇଟଗୁଡ଼ିକ ସମେତ, ଆପଣଙ୍କ ଡିଭାଇସର ନେଟୱାର୍କ କାର୍ଯ୍ୟକଳାପକୁ ମନିଟର୍ କରିବା ପାଇଁ ତାଙ୍କୁ ଅନୁମତି ଦେଇପାରେ।\n\nଏହି ସାର୍ଟିଫିକେଟଗୁଡ଼ିକ ବିଷୟରେ ଅଧିକ ସୂଚନା ପାଇଁ, ଆପଣଙ୍କ ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ଆପଣଙ୍କ ଡିଭାଇସରେ ଏକ ସାଟିଫିକେଟ୍ କର୍ତ୍ତୃପକ୍ଷ ଇନଷ୍ଟଲ୍ କରିଛନ୍ତି, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ସୁରକ୍ଷିତ ୱେବସାଇଟଗୁଡ଼ିକ ସମେତ, ଆପଣଙ୍କ ଡିଭାଇସର ନେଟୱାର୍କ କାର୍ଯ୍ୟକଳାପକୁ ମନିଟର୍ କରିବା ପାଇଁ ତାଙ୍କୁ ଅନୁମତି ଦେଇପାରେ।\n\nଏହି ସାର୍ଟିଫିକେଟ୍ ବିଷୟରେ ଅଧିକ ସୂଚନା ପାଇଁ, ଆପଣଙ୍କ ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ପାଇଁ ସାଟିଫିକେଟ୍ କର୍ତ୍ତୃପକ୍ଷଗୁଡ଼ିକ ଇନଷ୍ଟଲ୍ କରିଛନ୍ତି, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ସୁରକ୍ଷିତ ୱେବସାଇଟଗୁଡ଼ିକ ସମେତ, ୱାର୍କ ନେଟୱାର୍କର କାର୍ଯ୍ୟକଳାପକୁ ମନିଟର୍ କରିବା ପାଇଁ ତାଙ୍କୁ ଅନୁମତି ଦେଇପାରେ।\n\nଏହି ସାର୍ଟିଫିକେଟଗୁଡ଼ିକ ବିଷୟରେ ଅଧିକ ସୂଚନା ପାଇଁ, ଆପଣଙ୍କ ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ପାଇଁ ଏକ ସାଟିଫିକେଟ୍ କର୍ତ୍ତୃପକ୍ଷ ଇନଷ୍ଟଲ୍ କରିଛନ୍ତି, ଯାହା ଇମେଲ୍, ଆପ୍ ଓ ସୁରକ୍ଷିତ ୱେବସାଇଟଗୁଡ଼ିକ ସମେତ, ୱାର୍କ ନେଟୱାର୍କର କାର୍ଯ୍ୟକଳାପକୁ ମନିଟର୍ କରିବା ପାଇଁ ତାଙ୍କୁ ଅନୁମତି ଦେଇପାରେ।\n\nଏହି ସାର୍ଟିଫିକେଟ୍ ବିଷୟରେ ଅଧିକ ସୂଚନା ପାଇଁ, ଆପଣଙ୍କ ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"ଇମେଲ୍, ଆପ୍ ଏବଂ ନିରାପଦ ୱେବ୍ସାଇଟ୍ଗୁଡ଼ିକ ଅନ୍ତର୍ଭୂକ୍ତ କରି ଏକ ତୃତୀୟ ପକ୍ଷ ଆପଣଙ୍କ ନେଟୱାର୍କ୍ ଗତିବିଧି ମନିଟର୍ କରିପାରିବେ।\n\nଆପଣଙ୍କ ଡିଭାଇସ୍ରେ ଇନ୍ଷ୍ଟଲ୍ କରାଯାଇଥିବା ତଥ୍ୟ ଏହା କରାଇବାରେ ସମ୍ଭବ କରାଉଛି।"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">ସାର୍ଟିଫିକେଟଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରନ୍ତୁ</item>
- <item quantity="one">ସାର୍ଟିଫିକେଟକୁ ଯାଞ୍ଚ କରନ୍ତୁ</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{ସାର୍ଟିଫିକେଟକୁ ବିଶ୍ୱାସ କରନ୍ତୁ କିମ୍ବା କାଢ଼ି ଦିଅନ୍ତୁ}other{ସାର୍ଟିଫିକେଟଗୁଡ଼ିକୁ ବିଶ୍ୱାସ କରନ୍ତୁ କିମ୍ବା କାଢ଼ି ଦିଅନ୍ତୁ}}"</string>
<string name="device_status" msgid="8266002761193692207">"ସ୍ଥିତି"</string>
<string name="device_status_summary" msgid="3270932829412434985">"ନେଟ୍ୱର୍କ୍, ସିରିଏଲ୍ ନମ୍ଵର୍, ଏବଂ ଅନ୍ଯ ସୂଚନା"</string>
<string name="manual" msgid="5683935624321864999">"ମାନୁଆଲ୍"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"କନେକ୍ଟ କରନ୍ତୁ"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"ନେଟୱର୍କକୁ ଡିଲିଟ କରିଦିଅନ୍ତୁ"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"ସେଭ୍ ହୋଇଥିବା ପାସୱାର୍ଡ୍ ସହିତ, ଏହି ନେଟୱର୍କ୍କୁ କନେକ୍ଟ କରିବାକୁ ବ୍ୟବହୃତ ହୋଇଥିବା ସୂଚନାକୁ ଏହା ଖାଲି କରେ"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"ଆପଣଙ୍କ ମୋବାଇଲ ଫୋନରୁ QR କୋଡ୍ ସ୍କାନ୍ କରି ଏକ ୱାଇଫାଇରେ ଯୋଗ ଦେଇ ନିର୍ଦ୍ଦେଶ ଅନୁସରଣ କରନ୍ତୁ।"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" ଏକ ମୋବାଇଲ ଫୋନରୁ QR କୋଡ ସ୍କାନ କରି ୱାଇ-ଫାଇରେ ଯୋଗ କରିବା ପରେ ନିର୍ଦ୍ଦେଶାବଳୀର ଅନୁସରଣ କରନ୍ତୁ।\n \n ଏକ "<b>"Android ଫୋନ"</b>"ରୁ \"ସେଟିଂସ -> ନେଟୱାର୍କ ଏବଂ ଇଣ୍ଟରନେଟ -> ୱାଇ-ଫାଇ -> ଏକ ୱାଇ-ଫାଇ ଚୟନ କରନ୍ତୁ -> ଆଡଭାନ୍ସ -> ଡିଭାଇସ ଯୋଗ କରନ୍ତୁ\"କୁ ଯାଆନ୍ତୁ ଏବଂ ତା\'ପରେ QR କୋଡ ସ୍କାନ୍ କରନ୍ତୁ।"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"ବାତିଲ୍ କରିବା ପାଇଁ \'ପଛକୁ ଫେରନ୍ତୁ\' ବଟନ୍ ଦବାନ୍ତୁ"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ଠିକ୍ ଅଛି"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"ଜାରି ରଖନ୍ତୁ"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"ଡିଭାଇସ୍ ଷ୍ଟୋରେଜ୍"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"ରିମୁଭ୍ କରିହେଉଥିବା ଷ୍ଟୋରେଜ୍"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"ରିସେଟ୍ କରନ୍ତୁ"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"ଷ୍ଟୋରେଜ୍ ଖାଲି କରନ୍ତୁ"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"କ୍ୟାଶ୍ ହୋଇଥିବା ଡାଟା ଖାଲି କରନ୍ତୁ"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> ଖାଲି କରନ୍ତୁ"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"ସ୍ଥାନ ନେଉଥିବା ଅସ୍ଥାୟୀ ଫାଇଲଗୁଡ଼ିକୁ ଖାଲି କରେ। ଏହା, ଆପ୍ ପସନ୍ଦ କିମ୍ବା ଅଫଲାଇନ୍ ଭିଡିଓଗୁଡ଼ିକ ପରି ସେଭ୍ କରାଯାଇଥିବା ଡାଟା ଉପରେ ପ୍ରଭାବ ପକାଇବ ନାହିଁ ଏବଂ ଆପଣଙ୍କୁ ଆପଗୁଡ଼ିକରେ ପୁଣି ସାଇନ୍ ଇନ୍ କରିବାର ଆବଶ୍ୟକତା ହେବ ନାହିଁ।"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"କ୍ୟାଶ୍ ହୋଇଥିବା ଡାଟା ଖାଲି କରିବେ?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"ଏହା, ସବୁ ଆପ ପାଇଁ କ୍ୟାଶ ହୋଇଥିବା ଡାଟାକୁ ଖାଲି କରିଦେବ।"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"ଆପଗୁଡ଼ିକୁ ଅନଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> ମାଉଣ୍ଟ ହୋଇଛି"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g>ମାଉଣ୍ଟ କରିପାରିବ ନାହିଁ"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB ଷ୍ଟୋରେଜ୍ ପୁଣି କନେକ୍ଟ ହୋଇଛି"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"ମାଇକ୍ରୋଫୋନ୍"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"ମାଇକ୍ରୋଫୋନ୍ ଆକ୍ସେସ୍"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"ଆପର ମାଇକ୍ରୋଫୋନକୁ ଆକ୍ସେସ୍"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"ମାଇକ୍ରୋଫୋନ ଆକ୍ସେସ ବ୍ଲକ କରାଯାଇଛି"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"ଅନବ୍ଲକ କରିବା ପାଇଁ, ଆପଣଙ୍କ ଡିଭାଇସରେ ଗୋପନୀୟତା ସ୍ୱିଚକୁ \"ମାଇକ୍ରୋଫୋନ ଚାଲୁ\" ସ୍ଥିତିକୁ ମୁଭ କରି ମାଇକ୍ରୋଫୋନ ଆକ୍ସେସ ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string>
<string name="camera" msgid="1226671478936288283">"କ୍ୟାମେରା"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"କ୍ୟାମେରା ଆକ୍ସେସ୍"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"ଆପର କ୍ୟାମେରାକୁ ଆକ୍ସେସ୍"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"କ୍ୟାମେରା ଆକ୍ସେସ ବ୍ଲକ କରାଯାଇଛି"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"ଅନବ୍ଲକ କରିବା ପାଇଁ, ଆପଣଙ୍କ ଡିଭାଇସରେ ଗୋପନୀୟତା ସ୍ୱିଚକୁ \"କ୍ୟାମେରା ଚାଲୁ\" ସ୍ଥିତିକୁ ମୁଭ କରି କ୍ୟାମେରା ଆକ୍ସେସ ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"ମାଇକ୍ରୋଫୋନ୍ ଆକ୍ସେସ୍: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"ଚାଲୁ କରାଗଲେ, ଅନୁମତି ଥିବା ସମସ୍ତ ଆପ୍ ଓ ସେବା ଏହି ଡିଭାଇସରେ ଯେ କୌଣସି ମାଇକ୍ରୋଫୋନକୁ ଆକ୍ସେସ୍ କରିପାରିବ।\n\nକଷ୍ଟମ୍ ପ୍ରୋଟୋକଲ୍ ଥିବା ଅଡିଓ ପେରିଫେରାଲଗୁଡ଼ିକ ଏହି ସେଟିଂ ଦ୍ୱାରା ପ୍ରଭାବିତ ହେବ ନାହିଁ।"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"କ୍ୟାମେରା ଆକ୍ସେସ୍: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"ସାୟାନ୍"</string>
<string name="color_yellow" msgid="3519470952904560404">"ହଳଦିଆ"</string>
<string name="color_magenta" msgid="2377854703399624607">"ମାଜେଣ୍ଟା"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"ଅଡିଓର ବର୍ଣ୍ଣନା"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"ସମର୍ଥିତ ମୁଭି ଏବଂ ଶୋ\'ଗୁଡ଼ିକରେ ସ୍କ୍ରିନରେ କଣ ହେଉଛି ତା\'ର ଏକ ବର୍ଣ୍ଣନା ଶୁଣନ୍ତୁ"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"ସକ୍ଷମ"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"କନଫିଗରେସନ୍"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> ବ୍ୟବହାର କରିବେ?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"ତଦାରଖ କରିବା"</string>
<string name="system_apps" msgid="8481888654606868074">"ଆପ୍"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"ସତର୍କ ରୁହନ୍ତୁ"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"ସ୍କ୍ରିନ କେବେ ବି ସ୍ଲିପ ମୋଡକୁ ଯିବ ନାହିଁ"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP ଯାଞ୍ଚ କରୁଛି"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI ଅନୁକୂଳତା"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"ଏବେ ରିଷ୍ଟାର୍ଟ କରିବେ?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"ଟିଭି ସହିତ HDMI ଡିଭାଇସ୍ ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"ଟିଭି ସ୍ଵତଃ ପାୱାର୍ ଅଫ୍"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI ଡିଭାଇସ୍ ସହିତ TVରେ ପାୱାର୍"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">କନେକ୍ଟ ହୋଇଥିବା ଇନ୍ପୁଟ୍ଗୁଡିକ</item>
- <item quantity="one">କନେକ୍ଟ ହୋଇଥିବା ଇନପୁଟ୍</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">ଷ୍ଟାଣ୍ଡବାଏ ଇନ୍ପୁଟ୍</item>
- <item quantity="one">ଷ୍ଟାଣ୍ଡବାଏ ଇନ୍ପୁଟ୍</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">କନେକ୍ଟ ହୋଇନଥିବା ଇନ୍ପୁଟ୍</item>
- <item quantity="one">କନେକ୍ଟ ହୋଇନଥିବା ଇନ୍ପୁଟ୍</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{ସଂଯୁକ୍ତ ହୋଇଥିବା ଇନପୁଟ}other{ସଂଯୁକ୍ତ ହୋଇଥିବା ଇନପୁଟଗୁଡ଼ିକ}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{ଷ୍ଟାଣ୍ଡବାଏ ଇନପୁଟ}other{ଷ୍ଟାଣ୍ଡବାଏ ଇନପୁଟଗୁଡ଼ିକ}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{ସଂଯୁକ୍ତ ହୋଇନଥିବା ଇନପୁଟ}other{ସଂଯୁକ୍ତ ହୋଇନଥିବା ଇନପୁଟଗୁଡ଼ିକ}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"ଆପଣଙ୍କ ଆକାଉଣ୍ଟରେ ଅନ୍ୟ ବିଷୟବସ୍ତୁ ଏବଂ ଆପ୍ ଆକ୍ସେସ ପ୍ରତିବନ୍ଧ କରନ୍ତୁ"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"ପ୍ରତିବନ୍ଧିତ ପ୍ରୋଫାଇଲ୍"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> ଦ୍ୱାରା ନିୟନ୍ତ୍ରିତ ଅଟେ"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"ପ୍ରତିବନ୍ଧିତ ପ୍ରୋଫାଇଲ୍ ତିଆରି କରନ୍ତୁ"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"ସେଟିଂସ"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"ଅନୁମତିପ୍ରାପ୍ତ ଆପ୍ଗୁଡ଼ିକ"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d ଆପ୍ ଅନୁମୋଦିତ ଅଟେ</item>
- <item quantity="one">1 ଆପ୍ ଅନୁମୋଦିତ ଅଟେ</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"ଅନୁମତି ଦିଆଯାଇଛି"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"ଅନୁମତି ଦିଆଯାଇନାହିଁ"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"ପ୍ରତିବନ୍ଧଗୁଡିକୁ କଷ୍ଟୋମାଇଜ୍ କରନ୍ତୁ"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"ତୃତୀୟ-ପକ୍ଷ ସୋର୍ସ"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"ଅନୁମତିଗୁଡ଼ିକ"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"ଆପ୍ଲିକେସନ୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"ଅବ୍ୟବହୃତ ଆପଗୁଡ଼ିକ"</string>
<string name="settings_ok" msgid="5950888975075541964">"ଠିକ୍ ଅଛି"</string>
<string name="settings_confirm" msgid="4489126458677153411">"ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string>
<string name="settings_cancel" msgid="576094334743686152">"ବାତିଲ୍ କରନ୍ତୁ"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"ଏହି ଅନୁମତି ଗୋଟିଏ ଆପକୁ ସିଷ୍ଟମ ସେଟିଂସରେ ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="write_settings_on" msgid="71675710746513956">"ହଁ"</string>
<string name="write_settings_off" msgid="6730113471695092167">"ନାହିଁ"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"ସମସ୍ତ ଫାଇଲକୁ ଆକ୍ସେସ୍"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"ସମସ୍ତ ଫାଇଲକୁ ପରିଚାଳନା ପାଇଁ ଆକ୍ସେସ୍ ଦିଅନ୍ତୁ"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"ଏହି ଡିଭାଇସ୍ କିମ୍ବା ଯେ କୌଣସି ସଂଯୁକ୍ତ ଥିବା ଷ୍ଟୋରେଜ୍ ଭଲ୍ୟୁମରେ ଥିବା ସମସ୍ତ ଫାଇଲକୁ ପଢ଼ିବା, ପରିବର୍ତ୍ତନ କରିବା ଏବଂ ଡିଲିଟ୍ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ। ଯଦି ଅନୁମତି ଦିଆଯାଏ, ତେବେ ଆପ୍ ଆପଣଙ୍କୁ ସ୍ପଷ୍ଟ ନକରି ଫାଇଲଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିପାରେ।"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"ପିକଚର୍-ଇନ୍-ପିକଚର୍"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"ପିକଚର୍-ଇନ୍-ପିକଚରର ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"ଛବି-ଭିତରେ-ଛବିକୁ ଇନ୍ଷ୍ଟଲ୍ ହୋଇଥିବା କୌଣସି ଆପ୍ ସପୋର୍ଟ କରୁନାହିଁ"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"ଆପ୍ ଖୋଲା ଥିବାବେଳେ କିମ୍ୱା ଏହାକୁ ଆପଣ ଛାଡ଼ିବା ପରେ (ଉଦାହରଣସ୍ୱରୂପ, ଏକ ଭିଡିଓ ଦେଖିବା ଜାରି ରଖିବାକୁ) ଏକ ପିକଚର୍-ଇନ-ପିକଚର୍ ୱିଣ୍ଡୋ ତିଆରି କରିବା ପାଇଁ ଏହି ଆପ୍କୁ ଅନୁମତି ଦିଅନ୍ତୁ। ଏହି ୱିଣ୍ଡୋ, ଆପଣ ବ୍ୟବହାର କରୁଥିବା ଅନ୍ୟ ଆପ୍ଗୁଡ଼ିକ ଉପରେ ଦେଖାଦେବ।"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"ଆପଗୁଡ଼ିକୁ ଆଲାରାମ୍ ସେଟ୍ କରିବାକୁ ଏବଂ ସମୟ-ସମ୍ବେଦନଶୀଳ କାର୍ଯ୍ୟଗୁଡ଼ିକ ସିଡୁଲ୍ କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ। ଏହା ଆପଗୁଡ଼ିକୁ ପୃଷ୍ଠପଟରେ ଚାଲିବାକୁ ଦେଇଥାଏ, ଯାହା ଅଧିକ ପାୱାର୍ ବ୍ୟବହାର କରିପାରେ।\n\nଯଦି ଏହି ଅନୁମତି ବନ୍ଦ ଅଛି, ତେବେ ଏହି ଆପ୍ ଦ୍ୱାରା ସିଡୁଲ୍ କରାଯାଇଥିବା ପୂର୍ବରୁ ଥିବା ଆଲାରାମ୍ ଏବଂ ସମୟ-ଆଧାରିତ ଇଭେଣ୍ଟଗୁଡ଼ିକ କାମ କରିବ ନାହିଁ।"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"ସ୍କ୍ରିନକୁ ଚାଲୁ କରନ୍ତୁ"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"ସ୍କ୍ରିନକୁ ଚାଲୁ କରିବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"ସ୍କ୍ରିନକୁ ଚାଲୁ କରିବା ପାଇଁ ଏକ ଆପକୁ ଅନୁମତି ଦିଅନ୍ତୁ। ଯଦି ଅନୁମତି ଦିଆଯାଏ, ତେବେ ଆପଟି ଆପଣଙ୍କ ସ୍ପଷ୍ଟ ଇଣ୍ଟେଣ୍ଟ ବିନା ଯେ କୌଣସି ସମୟରେ ସ୍କ୍ରିନକୁ ଚାଲୁ କରିପାରେ।"</string>
<string name="special_access" msgid="21806055758289916">"ସ୍ୱତନ୍ତ୍ର ଆପ୍ ଆକ୍ସେସ୍"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"ଅଡିଓ"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"ଡାଟା ସେଭର୍"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"ମୋବାଇଲ୍ ଡାଟା କମ୍ ବ୍ୟବହାର କରିବାକୁ ଭିଡିଓ ଗୁଣବତ୍ତାକୁ ସ୍ୱଚାଳିତ ଭାବେ ଆଡ୍ଜଷ୍ଟ କରନ୍ତୁ"</string>
<string name="title_data_alert" msgid="8262081890052682475">"ଡାଟା ବ୍ୟବହାର ଏବଂ ଆଲର୍ଟଗୁଡ଼ିକ"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"ଆପଣ ୱାଇ-ଫାଇ, ଇଥରନେଟ୍, ବା ଆପଣଙ୍କ ଫୋନର ହଟସ୍ପଟ୍ ସହ ଇଣ୍ଟର୍ନେଟକୁ ସଂଯୋଗ କରିପାରିବେ। ଅଧିକ ସହାୟତା ପାଇଁ "<b>"g.co/network"</b>"କୁ ଯାଆନ୍ତୁ।"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"ଆପଣ ୱାଇ-ଫାଇ, ଇଥରନେଟ କିମ୍ବା ଆପଣଙ୍କ ଫୋନର ହଟସ୍ପଟ ସହ ଇଣ୍ଟରନେଟକୁ ସଂଯୋଗ କରିପାରିବେ।"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"କାର୍ଯ୍ୟଟି ଅନୁମୋଦିତ ନୁହେଁ"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"ଭଲ୍ୟୁମ୍କୁ ବଦଳାଇହେବ ନାହିଁ"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"ପାୱାର ଓ ଏନର୍ଜି"</string>
<string name="power_on_behavior" msgid="927607372303160716">"ପାୱାର ଚାଲୁ ହେବା ସମୟରେ ବ୍ୟବହାର"</string>
<string name="reset_options_title" msgid="7632580482285108955">"ରିସେଟ୍ କରନ୍ତୁ"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"ଇଥରନେଟ ପେୟାରିଂ କୋଡ"</string>
</resources>
diff --git a/Settings/res/values-pa/strings.xml b/Settings/res/values-pa/strings.xml
index 8592a89..0cbc80d 100644
--- a/Settings/res/values-pa/strings.xml
+++ b/Settings/res/values-pa/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"ਇੱਕ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"ਖਾਤੇ ਅਤੇ ਸਾਈਨ-ਇਨ"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"ਕੋਈ ਖਾਤੇ ਨਹੀਂ"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> ਖਾਤਾ</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> ਖਾਤੇ</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# ਖਾਤਾ}one{# ਖਾਤਾ}other{# ਖਾਤੇ}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"ਮੀਡੀਆ ਸੇਵਾਵਾਂ, Assistant, ਭੁਗਤਾਨ"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ"</string>
<string name="sound_category_title" msgid="7899816751041939518">"ਧੁਨੀ"</string>
<string name="applications_category_title" msgid="7112019490898586223">"ਐਪਾਂ"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"ਡੀਵਾਈਸ ਤਰਜੀਹਾਂ"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"ਰਿਮੋਟ ਅਤੇ ਸਹਾਇਕ ਉਪਕਰਣ"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"ਕੋਈ ਕਨੈਕਟ ਕੀਤੇ ਹੋਏ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਨਹੀਂ ਹਨ"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ਐਕਸੈਸਰੀ</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ਐਕਸੈਸਰੀਆਂ</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ਡਿਸਪਲੇ ਅਤੇ ਧੁਨੀ"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"ਮਦਦ ਅਤੇ ਵਿਚਾਰ"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"ਪਰਦੇਦਾਰੀ"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"ਫੈਕਟਰੀ ਡਾਟਾ ਰੀਸੈੱਟ"</string>
<string name="device_calibration" msgid="2907914144048739705">"ਕੈਲੀਬਰੇਸ਼ਨ"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"ਊਰਜਾ ਸੇਵਰ"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"ਡੀਵਾਈਸ"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ਫਾਰਮੈਟ ਚੁਣੋ"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"ਆਲੇ-ਦੁਆਲੇ ਸੰਬੰਧੀ ਧੁਨੀ"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ਚਾਲੂ ਕੀਤੇ ਫਾਰਮੈਟ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ਬੰਦ ਕੀਤੇ ਫਾਰਮੈਟ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"ਬੰਦ ਕਰਨ ਲਈ, ਫਾਰਮੈਟ ਦੀ ਚੋਣ ਨੂੰ \'ਹੱਥੀਂ\' ਵਿੱਚ ਬਦਲੋ।"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"ਰੈਜ਼ੋਲਿਊਸ਼ਨ"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"ਸਵੈਚਲਿਤ"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਨੂੰ ਬਦਲ ਦਿੱਤਾ ਗਿਆ ਹੈ"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"ਹੁਣ ਤੋਂ %1$s ਵਰਤਣ ਲਈ \'ਠੀਕ ਹੈ\' ਚੁਣੋ।"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"ਰੱਦ ਕਰੋ"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ਠੀਕ ਹੈ"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"ਕੀ ਕੈਸ਼ ਕੀਤਾ ਡਾਟਾ ਹਟਾਉਣਾ ਹੈ?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"ਇਹ ਸਾਰੀਆਂ ਐਪਾਂ ਲਈ ਕੈਸ਼ ਕੀਤਾ ਡਾਟਾ ਕਲੀਅਰ ਕਰ ਦੇਵੇਗਾ।"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"ਉਪਸਾਧਨ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"ਜੋੜਾਬੱਧ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"ਐਕਸੈਸਰੀਆਂ"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"ਰਿਮੋਟ ਕੰਟਰੋਲ"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"ਰਿਮੋਟ ਕੰਟਰੋਲ ਸੈਟਿੰਗਾਂ"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"ਰਿਮੋਟ ਦੇ ਬਟਨਾਂ ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"ਟੀਵੀ, ਰਿਸੀਵਰ ਅਤੇ ਸਾਊਂਡਬਾਰ \'ਤੇ ਅਵਾਜ਼, ਪਾਵਰ ਅਤੇ ਇਨਪੁੱਟ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"ਕਨੈਕਟ ਕਰੋ"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"ਉਪਲਬਧ ਨਹੀਂ"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"ਡੀਵਾਈਸ ਪ੍ਰਸ਼ਾਸਕ ਐਪਾਂ"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"ਕੋਈ ਕਿਰਿਆਸ਼ੀਲ ਐਪਾਂ ਨਹੀਂ"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"ਪ੍ਰਸ਼ਾਸਕ, ਇਨਕ੍ਰਿਪਸ਼ਨ ਨੀਤੀ ਜਾਂ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲ ਸਟੋਰੇਜ ਵੱਲੋਂ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"ਪ੍ਰਬੰਧਿਤ ਕੀਤੇ ਡੀਵਾਈਸ ਬਾਰੇ ਜਾਣਕਾਰੀ"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"ਤਬਦੀਲੀਆਂ ਅਤੇ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੇ ਸੰਗਠਨ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"ਕੋਈ ਨਹੀਂ"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"ਐਪਾਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਗਈਆਂ"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"ਐਪਾਂ ਦੀ ਗਿਣਤੀ ਅਨੁਮਾਨਿਤ ਹੈ। ਹੋ ਸਕਦਾ ਹੈ ਇਸ ਵਿੱਚ Play Store ਤੋਂ ਬਾਹਰੋਂ ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਾਂ ਸ਼ਾਮਲ ਨਾ ਹੋਣ।"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{ਘੱਟੋ-ਘੱਟ # ਐਪ}one{ਘੱਟੋ-ਘੱਟ # ਐਪ}other{ਘੱਟੋ-ਘੱਟ # ਐਪਾਂ}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"ਟਿਕਾਣਾ ਇਜਾਜ਼ਤਾਂ"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਇਜਾਜ਼ਤਾਂ"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"ਕੈਮਰਾ ਇਜਾਜ਼ਤਾਂ"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਐਪਾਂ"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# ਐਪ}one{# ਐਪ}other{# ਐਪਾਂ}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਕੀ-ਬੋਰਡ"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> \'ਤੇ ਸੈੱਟ ਹੈ"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"\'ਹਮੇਸ਼ਾ-ਚਾਲੂ VPN\' ਵਿਕਲਪ ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਹੋਇਆ ਹੈ"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"ਭਰੋਸੇਯੋਗ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲ"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"ਤੁਹਾਡੇ ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਭਰੋਸੇਯੋਗ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲ"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"ਤੁਹਾਡੇ ਕਾਰਜ-ਸਥਾਨ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਭਰੋਸੇਯੋਗ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲ"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT_1">%d</xliff:g> CA ਪ੍ਰਮਾਣ-ਪੱਤਰ</item>
- <item quantity="other">ਘੱਟੋ-ਘੱਟ <xliff:g id="COUNT_1">%d</xliff:g> CA ਪ੍ਰਮਾਣ-ਪੱਤਰ</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA ਪ੍ਰਮਾਣ-ਪੱਤਰ}one{# CA ਪ੍ਰਮਾਣ-ਪੱਤਰ}other{# CA ਪ੍ਰਮਾਣ-ਪੱਤਰ}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"ਪ੍ਰਸ਼ਾਸਕ ਡੀਵਾਈਸ ਨੂੰ ਲਾਕ ਅਤੇ ਪਾਸਵਰਡ ਨੂੰ ਰੀਸੈੱਟ ਕਰ ਸਕਦਾ ਹੈ"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"ਪ੍ਰਸ਼ਾਸਕ ਡੀਵਾਈਸ ਦਾ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾ ਸਕਦਾ ਹੈ"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"ਸਾਰਾ ਡੀਵਾਈਸ ਡਾਟਾ ਮਿਟਾਏ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰਨ ਦੀਆਂ ਅਸਫਲ ਕੋਸ਼ਿਸ਼ਾਂ ਦੀ ਗਿਣਤੀ"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਡਾਟਾ ਮਿਟਾਏ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰਨ ਦੀਆਂ ਅਸਫਲ ਕੋਸ਼ਿਸ਼ਾਂ ਦੀ ਗਿਣਤੀ"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# ਕੋਸ਼ਿਸ਼}one{# ਕੋਸ਼ਿਸ਼}other{# ਕੋਸ਼ਿਸ਼ਾਂ}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੇ ਸੰਗਠਨ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"ਹੋਰ ਜਾਣੋ"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">ਕੈਮਰਾ ਐਪ</item>
- <item quantity="other">ਕੈਮਰਾ ਐਪਾਂ</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{ਕੈਮਰਾ ਐਪ}one{ਕੈਮਰਾ ਐਪ}other{ਕੈਮਰਾ ਐਪਾਂ}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"ਕੈਲੰਡਰ ਐਪ"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"ਸੰਪਰਕ ਐਪ"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">ਈਮੇਲ ਕਲਾਇੰਟ ਐਪ</item>
- <item quantity="other">ਈਮੇਲ ਕਲਾਇੰਟ ਐਪਾਂ</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ਈਮੇਲ ਕਲਾਇੰਟ ਐਪ}one{ਈਮੇਲ ਕਲਾਇੰਟ ਐਪ}other{ਈਮੇਲ ਕਲਾਇੰਟ ਐਪਾਂ}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"ਨਕਸ਼ਾ ਐਪ"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">ਫ਼ੋਨ ਐਪ</item>
- <item quantity="other">ਫ਼ੋਨ ਐਪਾਂ</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{ਫ਼ੋਨ ਐਪ}one{ਫ਼ੋਨ ਐਪ}other{ਫ਼ੋਨ ਐਪਾਂ}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"ਬ੍ਰਾਊਜ਼ਰ ਐਪ"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS ਵਰਜਨ"</string>
<string name="about_serial" msgid="3432319328808745459">"ਕ੍ਰਮ ਸੰਖਿਆ"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS ਬਿਲਡ"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{ਤੁਸੀਂ ਹੁਣ ਵਿਕਾਸਕਾਰ ਬਣਨ ਤੋਂ # ਕਦਮ ਦੂਰ ਹੋ}one{ਤੁਸੀਂ ਹੁਣ ਵਿਕਾਸਕਾਰ ਬਣਨ ਤੋਂ # ਕਦਮ ਦੂਰ ਹੋ}other{ਤੁਸੀਂ ਹੁਣ ਵਿਕਾਸਕਾਰ ਬਣਨ ਤੋਂ # ਕਦਮ ਦੂਰ ਹੋ}}"</string>
<string name="about_ads" msgid="7662896442040086522">"ਵਿਗਿਆਪਨ"</string>
<string name="ads_description" msgid="8081069475265061074">"ਵਿਗਿਆਪਨ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ, ਜਿਵੇਂ ਕਿ ਵਿਗਿਆਪਨ ਆਈਡੀ ਨੂੰ ਰੀਸੈੱਟ ਕਰਨਾ।"</string>
<string name="ads_content_description" msgid="1006489792324920289">"ਵਿਗਿਆਪਨ, ਆਪਣੀਆਂ ਵਿਗਿਆਪਨ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ, ਜਿਵੇਂ ਕਿ ਆਪਣੀ ਵਿਗਿਆਪਨ ਆਈਡੀ ਨੂੰ ਰੀਸੈੱਟ ਕਰਨਾ।"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"ਵਾਧੂ ਸਿਸਟਮ ਅੱਪਡੇਟ"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"ਨੈੱਟਵਰਕ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ"</string>
<string name="done_button" msgid="616159688526431451">"ਹੋ ਗਿਆ"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">ਪ੍ਰਮਾਣ-ਪੱਤਰ \'ਤੇ ਭਰੋਸਾ ਕਰੋ ਜਾਂ ਇਸ ਨੂੰ ਹਟਾਓ</item>
- <item quantity="other">ਪ੍ਰਮਾਣ-ਪੱਤਰਾਂ \'ਤੇ ਭਰੋਸਾ ਕਰੋ ਜਾਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਓ</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ਨੇ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਿਟੀ ਨੂੰ ਸਥਾਪਤ ਕੀਤਾ ਹੈ, ਜਿਸ ਨਾਲ ਉਹਨਾਂ ਨੂੰ ਈਮੇਲਾਂ, ਐਪਾਂ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮਿਲ ਸਕਦੀ ਹੈ।\n\nਇਸ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ਨੇ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਿਟੀਆਂ ਨੂੰ ਸਥਾਪਤ ਕੀਤਾ ਹੈ, ਜਿਸ ਨਾਲ ਉਹਨਾਂ ਨੂੰ ਈਮੇਲਾਂ, ਐਪਾਂ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮਿਲ ਸਕਦੀ ਹੈ।\n\nਇਸ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ਨੇ ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਲਈ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਿਟੀ ਨੂੰ ਸਥਾਪਤ ਕੀਤਾ ਹੈ, ਜਿਸ ਨਾਲ ਉਹਨਾਂ ਨੂੰ ਈਮੇਲਾਂ, ਐਪਾਂ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਕਾਰਜ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮਿਲ ਸਕਦੀ ਹੈ।\n\nਇਹਨਾਂ ਪ੍ਰਮਾਣ-ਪੱਤਰਾਂ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ਨੇ ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਲਈ ਪ੍ਰਮਾਣ-ਪੱਤਰ ਅਥਾਰਿਟੀਆਂ ਨੂੰ ਸਥਾਪਤ ਕੀਤਾ ਹੈ, ਜਿਸ ਨਾਲ ਉਹਨਾਂ ਨੂੰ ਈਮੇਲਾਂ, ਐਪਾਂ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਕਾਰਜ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮਿਲ ਸਕਦੀ ਹੈ।\n\nਇਹਨਾਂ ਪ੍ਰਮਾਣ-ਪੱਤਰਾਂ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"ਇੱਕ ਤੀਜੀ ਪਾਰਟੀ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰਨ ਵਿੱਚ ਸਮਰੱਥ ਹੈ, ਈਮੇਲਾਂ, ਐਪਾਂ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ।\n\nਤੁਹਾਡੇ ਡੀਵਾਈਸ ਤੇ ਸਥਾਪਤ ਕੀਤਾ ਇੱਕ ਭਰੋਸੇਯੋਗ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲ ਇਸਨੂੰ ਸੰਭਵ ਬਣਾ ਰਿਹਾ ਹੈ।"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਦੀ ਜਾਂਚ ਕਰੋ</item>
- <item quantity="other">ਪ੍ਰਮਾਣ-ਪੱਤਰਾਂ ਦੀ ਜਾਂਚ ਕਰੋ</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{ਪ੍ਰਮਾਣ-ਪੱਤਰ \'ਤੇ ਭਰੋਸਾ ਕਰੋ ਜਾਂ ਇਸ ਨੂੰ ਹਟਾਓ}one{ਪ੍ਰਮਾਣ-ਪੱਤਰ \'ਤੇ ਭਰੋਸਾ ਕਰੋ ਜਾਂ ਇਸ ਨੂੰ ਹਟਾਓ}other{ਪ੍ਰਮਾਣ-ਪੱਤਰਾਂ \'ਤੇ ਭਰੋਸਾ ਕਰੋ ਜਾਂ ਇਨ੍ਹਾਂ ਨੂੰ ਹਟਾਓ}}"</string>
<string name="device_status" msgid="8266002761193692207">"ਸਥਿਤੀ"</string>
<string name="device_status_summary" msgid="3270932829412434985">"ਨੈੱਟਵਰਕ, ਸੀਰੀਅਲ ਨੰਬਰ ਅਤੇ ਹੋਰ ਜਾਣਕਾਰੀ"</string>
<string name="manual" msgid="5683935624321864999">"ਹੱਥੀਂ"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"ਕਨੈਕਟ ਕਰੋ"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"ਨੈੱਟਵਰਕ ਭੁੱਲ ਜਾਓ"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"ਇਹ ਇਸ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਲਈ ਵਰਤੀ ਜਾਂਦੀ ਜਾਣਕਾਰੀ ਨੂੰ ਕਲੀਅਰ ਕਰ ਦਿੰਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਪਾਸਵਰਡ ਵੀ ਸ਼ਾਮਲ ਹੈ"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"ਆਪਣੇ ਮੋਬਾਈਲ ਫ਼ੋਨ ਤੋਂ QR ਕੋਡ ਸਕੈਨ ਕਰਕੇ ਵਾਈ-ਫਾਈ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ ਅਤੇ ਹਿਦਾਇਤਾਂ ਦੀ ਪਾਲਣਾ ਕਰੋ।"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" ਮੋਬਾਈਲ ਫ਼ੋਨ ਤੋਂ QR ਕੋਡ ਸਕੈਨ ਕਰਕੇ ਵਾਈ-ਫਾਈ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ ਅਤੇ ਹਿਦਾਇਤਾਂ ਦੀ ਪਾਲਣਾ ਕਰੋ।\n \n ਕਿਸੇ "<b>"Android ਫ਼ੋਨ"</b>" ਤੋਂ ਸੈਟਿੰਗਾਂ -> ਨੈੱਟਵਰਕ & ਇੰਟਰਨੈੱਟ -> ਵਾਈ-ਫਾਈ -> ਕੋਈ ਵਾਈ-ਫਾਈ ਚੁਣੋ -> ਉੱਨਤ -> ਡੀਵਾਈਸ ਸ਼ਾਮਲ ਕਰੋ \'ਤੇ ਜਾਓ ਅਤੇ ਫਿਰ QR ਕੋਡ ਸਕੈਨ ਕਰੋ।"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"ਰੱਦ ਕਰਨ ਲਈ \'ਪਿੱਛੇ\' ਬਟਨ ਨੂੰ ਦਬਾਓ"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ਠੀਕ ਹੈ"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"ਜਾਰੀ ਰੱਖੋ"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"ਡੀਵਾਈਸ ਸਟੋਰੇਜ"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"ਹਟਾਉਣਯੋਗ ਸਟੋਰੇਜ"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"ਰੀਸੈੱਟ ਕਰੋ"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"ਸਟੋਰੇਜ ਖਾਲੀ ਕਰੋ"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"ਕੈਸ਼ ਕੀਤਾ ਡਾਟਾ ਕਲੀਅਰ ਕਰੋ"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> ਜਗ੍ਹਾ ਖਾਲੀ ਕਰੋ"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"ਇਸ ਨਾਲ ਜਗ੍ਹਾ ਘੇਰਨ ਵਾਲੀਆਂ ਅਸਥਾਈ ਫ਼ਾਈਲਾਂ ਕਲੀਅਰ ਹੋ ਜਾਂਦੀਆਂ ਹਨ। ਐਪ ਤਰਜੀਹਾਂ ਜਾਂ ਆਫ਼ਲਾਈਨ ਵੀਡੀਓ ਵਰਗਾ ਰੱਖਿਅਤ ਕੀਤਾ ਡਾਟਾ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਵੇਗਾ ਅਤੇ ਤੁਹਾਨੂੰ ਐਪਾਂ \'ਤੇ ਦੁਬਾਰਾ ਸਾਈਨ-ਇਨ ਕਰਨ ਦੀ ਲੋੜ ਨਹੀਂ ਪਵੇਗੀ।"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"ਕੀ ਕੈਸ਼ ਕੀਤਾ ਡਾਟਾ ਕਲੀਅਰ ਕਰਨਾ ਹੈ?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"ਇਸ ਨਾਲ ਸਾਰੀਆਂ ਐਪਾਂ ਲਈ ਕੈਸ਼ ਕੀਤਾ ਡਾਟਾ ਕਲੀਅਰ ਹੋ ਜਾਵੇਗਾ।"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"ਐਪਾਂ ਨੂੰ ਅਣਸਥਾਪਤ ਕਰੋ"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> ਨੂੰ ਮਾਊਂਟ ਕੀਤਾ ਗਿਆ ਹੈ"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> ਨੂੰ ਮਾਊਂਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB ਸਟੋਰੇਜ ਨੂੰ ਮੁੜ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਪਹੁੰਚ"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"ਐਪ ਦੀ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਤੱਕ ਪਹੁੰਚ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"ਅਣਬਲਾਕ ਕਰਨ ਲਈ, ਆਪਣੇ ਡੀਵਾਈਸ ਦੇ ਪਰਦੇਦਾਰੀ ਸਵਿੱਚ ਨੂੰ \'ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਚਾਲੂ ਹੈ\' ਵਾਲੀ ਸਥਿਤੀ \'ਤੇ ਲਿਜਾਓ ਤਾਂ ਜੋ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਤੱਕ ਪਹੁੰਚ ਦਿੱਤੀ ਜਾ ਸਕੇ।"</string>
<string name="camera" msgid="1226671478936288283">"ਕੈਮਰਾ"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"ਕੈਮਰਾ ਪਹੁੰਚ"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"ਐਪ ਦੀ ਕੈਮਰੇ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"ਕੈਮਰੇ ਤੱਕ ਪਹੁੰਚ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"ਅਣਬਲਾਕ ਕਰਨ ਲਈ, ਆਪਣੇ ਡੀਵਾਈਸ ਦੇ ਪਰਦੇਦਾਰੀ ਸਵਿੱਚ ਨੂੰ \'ਕੈਮਰਾ ਚਾਲੂ ਹੈ\' ਵਾਲੀ ਸਥਿਤੀ \'ਤੇ ਲਿਜਾਓ ਤਾਂ ਜੋ ਕੈਮਰੇ ਤੱਕ ਪਹੁੰਚ ਦਿੱਤੀ ਜਾ ਸਕੇ।"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਪਹੁੰਚ: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"ਚਾਲੂ ਕੀਤੇ ਜਾਣ \'ਤੇ, ਇਜਾਜ਼ਤ ਵਾਲੀਆਂ ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਸੇਵਾਵਾਂ ਇਸ ਡੀਵਾਈਸ ਦੇ ਕਿਸੇ ਵੀ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀਆਂ ਹਨ।\n\nਇਸ ਸੈਟਿੰਗ ਨਾਲ ਵਿਉਂਤੇ ਪ੍ਰੋਟੋਕੋਲ ਵਾਲੇ ਆਡੀਓ ਪੈਰੀਫੈਰਲ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਹੋਣਗੇ।"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"ਕੈਮਰਾ ਪਹੁੰਚ: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"ਹਰਾ ਨੀਲਾ"</string>
<string name="color_yellow" msgid="3519470952904560404">"ਪੀਲਾ"</string>
<string name="color_magenta" msgid="2377854703399624607">"ਮਜੈਂਟਾ"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"ਆਡੀਓ ਦਾ ਵਰਣਨ"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"ਸਮਰਥਿਤ ਫ਼ਿਲਮਾਂ ਅਤੇ ਸ਼ੋਆਂ ਵਿੱਚ ਸਕ੍ਰੀਨ \'ਤੇ ਜੋ ਚੱਲ ਰਿਹਾ ਹੈ, ਉਸਦਾ ਵਰਣਨ ਸੁਣੋ"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"ਚਾਲੂ ਕਰੋ"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"ਸੰਰੂਪਣ"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"ਕੀ <xliff:g id="SERVICE">%1$s</xliff:g> ਨੂੰ ਵਰਤਣਾ ਹੈ?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"ਨਿਗਰਾਨੀ ਕਰਨਾ"</string>
<string name="system_apps" msgid="8481888654606868074">"ਐਪਾਂ"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"ਸੁਚੇਤ ਰਹੋ"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"ਸਕ੍ਰੀਨ ਕਦੇ ਵੀ ਸਲੀਪ ਮੋਡ ਵਿੱਚ ਨਹੀਂ ਜਾਵੇਗੀ"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP ਜਾਂਚ"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI ਸੁਯੋਗਤਾ"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"ਕੀ ਹੁਣੇ ਮੁੜ-ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"ਟੀਵੀ ਨਾਲ HDMI ਡੀਵਾਈਸਾਂ ਨੂੰ ਬੰਦ ਕਰੋ"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"ਟੀਵੀ ਸਵੈ ਚਾਲੂ ਕਰੋ"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI ਡੀਵਾਈਸ ਨਾਲ ਟੀਵੀ ਚਾਲੂ ਕਰੋ"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">ਕਨੈਕਟ ਕੀਤੀ ਇਨਪੁੱਟ</item>
- <item quantity="other">ਕਨੈਕਟ ਕੀਤੀਆਂ ਇਨਪੁੱਟਾਂ</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">ਸਟੈਂਡਬਾਏ ਇਨਪੁੱਟ</item>
- <item quantity="other">ਸਟੈਂਡਬਾਏ ਇਨਪੁੱਟਾਂ</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">ਕਨੈਕਟ ਨਾ ਕੀਤੀ ਇਨਪੁੱਟ</item>
- <item quantity="other">ਕਨੈਕਟ ਨਾ ਕੀਤੀਆਂ ਇਨਪੁੱਟਾਂ</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{ਕਨੈਕਟ ਕੀਤਾ ਇਨਪੁੱਟ}one{ਕਨੈਕਟ ਕੀਤਾ ਇਨਪੁੱਟ}other{ਕਨੈਕਟ ਕੀਤੇ ਇਨਪੁੱਟ}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{ਸਟੈਂਡਬਾਈ ਇਨਪੁੱਟ}one{ਸਟੈਂਡਬਾਈ ਇਨਪੁੱਟ}other{ਸਟੈਂਡਬਾਈ ਇਨਪੁੱਟ}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{ਕਨੈਕਟ ਨਾ ਕੀਤਾ ਇਨਪੁੱਟ}one{ਕਨੈਕਟ ਨਾ ਕੀਤਾ ਇਨਪੁੱਟ}other{ਕਨੈਕਟ ਨਾ ਕੀਤੇ ਇਨਪੁੱਟ}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"ਆਪਣੇ ਖਾਤੇ ਵਿੱਚ ਐਪਾਂ ਅਤੇ ਹੋਰ ਸਮੱਗਰੀ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਮਨਾਹੀ ਕਰੋ"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"ਮਨਾਹੀਆ ਪ੍ਰੋਫ਼ਾਈਲ"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> ਦੁਆਰਾ ਕੰਟਰੋਲ ਕੀਤਾ"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"ਮਨਾਹੀਆ ਪ੍ਰੋਫਾਈਲ ਬਣਾਓ"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"ਸੈਟਿੰਗਾਂ"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"ਇਜਾਜ਼ਤ ਪ੍ਰਾਪਤ ਐਪਾਂ"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d ਐਪ ਦੀ ਇਜਾਜ਼ਤ ਹੈ</item>
- <item quantity="other">%d ਐਪਾਂ ਦੀ ਇਜਾਜ਼ਤ ਹੈ</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"ਇਜਾਜ਼ਤ ਹੈ"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"ਇਜਾਜ਼ਤ ਨਹੀਂ"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"ਮਨਾਹੀਆਂ ਨੂੰ ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਰੋ"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"ਤੀਜੀ-ਧਿਰ ਦਾ ਸਰੋਤ"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"ਇਜਾਜ਼ਤਾਂ"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"ਐਪਲੀਕੇਸ਼ਨ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"ਅਣਵਰਤੀਆਂ ਐਪਾਂ"</string>
<string name="settings_ok" msgid="5950888975075541964">"ਠੀਕ"</string>
<string name="settings_confirm" msgid="4489126458677153411">"ਤਸਦੀਕ ਕਰੋ"</string>
<string name="settings_cancel" msgid="576094334743686152">"ਰੱਦ ਕਰੋ"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"ਇਹ ਇਜਾਜ਼ਤ ਐਪ ਨੂੰ ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ ਸੋਧਣ ਦਿੰਦੀ ਹੈ।"</string>
<string name="write_settings_on" msgid="71675710746513956">"ਹਾਂ"</string>
<string name="write_settings_off" msgid="6730113471695092167">"ਨਹੀਂ"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਦਿਓ"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"ਇਸ ਐਪ ਨੂੰ ਇਸ ਡੀਵਾਈਸ ਜਾਂ ਇਸ ਨਾਲ ਕਨੈਕਟ ਕਿਸੇ ਵੀ ਸਟੋਰੇਜ ਭਾਗ ਦੀਆਂ ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਪੜ੍ਹਨ, ਸੋਧਣ ਅਤੇ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ। ਜੇ ਇਜਾਜ਼ਤ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਐਪ ਤੁਹਾਨੂੰ ਸੂਚਿਤ ਕੀਤੇ ਬਿਨਾਂ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ ਮੋਡ"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ ਮੋਡ ਵਰਤਣ ਦਿਓ"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਾਂ ਵਿੱਚੋਂ ਕੋਈ ਵੀ ਐਪ ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ ਮੋਡ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"ਐਪ ਖੁੱਲ੍ਹੇ ਹੋਣ ਜਾਂ ਤੁਹਾਡੇ ਵੱਲੋਂ ਉਸ ਤੋਂ ਬਾਹਰ ਜਾਣ ਵੇਲੇ ਐਪਾਂ ਨੂੰ ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ ਵਿੰਡੋ ਬਣਾਉਣ ਦਿਓ (ਉਦਾਹਰਨ ਵਜੋਂ, ਕਿਸੇ ਵੀਡੀਓ ਨੂੰ ਦੇਖਣਾ ਜਾਰੀ ਰੱਖਣ ਲਈ)। ਇਹ ਵਿੰਡੋ ਤੁਹਾਡੇ ਵੱਲੋਂ ਵਰਤੀਆਂ ਜਾ ਰਹੀਆਂ ਹੋਰਾਂ ਐਪਾਂ ਉੱਤੇ ਦਿਖਾਈ ਦੇਵੇਗੀ।"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"ਐਪਾਂ ਨੂੰ ਅਲਾਰਮ ਸੈੱਟ ਕਰਨ ਜਾਂ ਸਮਾਂ-ਸੰਵੇਦਨਸ਼ੀਲ ਕਾਰਵਾਈਆਂ ਨਿਯਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ। ਇਸ ਨਾਲ ਉਹਨਾਂ ਐਪਾਂ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚਲਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਮਿਲਦੀ ਹੈ, ਜੋ ਜ਼ਿਆਦਾ ਬੈਟਰੀ ਵਰਤ ਸਕਦੀਆਂ ਹਨ।\n\nਜੇ ਇਹ ਇਜਾਜ਼ਤ ਬੰਦ ਹੈ, ਤਾਂ ਮੌਜੂਦਾ ਅਲਾਰਮ ਅਤੇ ਐਪ ਰਾਹੀਂ ਨਿਯਤ ਕੀਤੇ ਸਮਾਂ-ਆਧਾਰਿਤ ਇਵੈਂਟ ਕੰਮ ਨਹੀਂ ਕਰਨਗੇ।"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"ਸਕ੍ਰੀਨ ਚਾਲੂ ਕਰੋ"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"ਸਕ੍ਰੀਨ ਚਾਲੂ ਕਰਨ ਦਿਓ"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"ਐਪ ਨੂੰ ਸਕ੍ਰੀਨ ਚਾਲੂ ਕਰਨ ਦਿਓ। ਇਜਾਜ਼ਤ ਦਿੱਤੇ ਜਾਣ \'ਤੇ, ਇਹ ਐਪ ਤੁਹਾਡੇ ਸਪਸ਼ਟ ਇਰਾਦੇ ਦੇ ਬਿਨਾਂ ਕਦੇ ਵੀ ਸਕ੍ਰੀਨ ਨੂੰ ਚਾਲੂ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="special_access" msgid="21806055758289916">"ਵਿਸ਼ੇਸ਼ ਐਪ ਪਹੁੰਚ"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"ਆਡੀਓ"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"ਡਾਟਾ ਸੇਵਰ"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"ਮੋਬਾਈਲ ਡਾਟਾ ਦੀ ਬੱਚਤ ਕਰਨ ਲਈ ਵੀਡੀਓ ਕੁਆਲਿਟੀ ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਵਿਵਸਥਿਤ ਕਰੋ"</string>
<string name="title_data_alert" msgid="8262081890052682475">"ਡਾਟਾ ਵਰਤੋਂ ਅਤੇ ਸੁਚੇਤਨਾਵਾਂ"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"ਤੁਸੀਂ ਵਾਈ-ਫਾਈ, ਈਥਰਨੈੱਟ ਜਾਂ ਆਪਣੇ ਫ਼ੋਨ ਦੇ ਹੌਟਸਪੌਟ ਰਾਹੀਂ ਇੰਟਰਨੈੱਟ ਨਾਲ ਕਨੈਕਟ ਕਰ ਸਕਦੇ ਹੋ। ਹੋਰ ਮਦਦ ਲਈ, "<b>"g.co/network"</b>" \'ਤੇ ਜਾਓ।"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"ਤੁਸੀਂ ਵਾਈ-ਫਾਈ, ਈਥਰਨੈੱਟ ਜਾਂ ਆਪਣੇ ਫ਼ੋਨ ਦੇ ਹੌਟਸਪੌਟ ਰਾਹੀਂ ਇੰਟਰਨੈੱਟ ਨਾਲ ਕਨੈਕਟ ਕਰ ਸਕਦੇ ਹੋ।"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"ਕਾਰਵਾਈ ਦੀ ਆਗਿਆ ਨਹੀਂ"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"ਤੁਸੀਂ ਅਵਾਜ਼ ਨੂੰ ਬਦਲ ਨਹੀਂ ਸਕਦੇ"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"ਪਾਵਰ ਅਤੇ ਊਰਜਾ"</string>
<string name="power_on_behavior" msgid="927607372303160716">"ਪਾਵਰ ਚਾਲੂ ਹੋਣ \'ਤੇ ਵਰਤਾਅ"</string>
<string name="reset_options_title" msgid="7632580482285108955">"ਰੀਸੈੱਟ ਕਰੋ"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"ਈਥਰਨੈੱਟ ਜੋੜਾਬੱਧਕਰਨ ਕੋਡ"</string>
</resources>
diff --git a/Settings/res/values-pl/strings.xml b/Settings/res/values-pl/strings.xml
index 0ddde83..6bf53e2 100644
--- a/Settings/res/values-pl/strings.xml
+++ b/Settings/res/values-pl/strings.xml
@@ -45,25 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Dodaj konto"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Konta i logowanie"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Brak kont"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> konta</item>
- <item quantity="many"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> kont</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> konta</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> konto</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# konto}few{# konta}many{# kont}other{# konta}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Usługi multimedialne, Asystent, płatności"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Sieć i internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Dźwięk"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplikacje"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Ustawienia urządzenia"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Piloty i akcesoria"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Brak podłączonych urządzeń Bluetooth"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> akcesoria</item>
- <item quantity="many"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> akcesoriów</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> akcesorium</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> akcesorium</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Wyświetlacz i dźwięk"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Pomoc i opinie"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Prywatność"</string>
@@ -122,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Przywracanie danych fabrycznych"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibracja"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Oszczędzanie energii"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Urządzenia"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Wybierz formaty"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Dźwięk przestrzenny"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -189,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"WŁĄCZONE FORMATY"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"WYŁĄCZONE FORMATY"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Aby wyłączyć tę opcję, zmień wybór formatu na Ręcznie."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Rozdzielczość"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatycznie"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Rozdzielczość została zmieniona"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Kliknij OK, aby od teraz używać rozdzielczości %1$s."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Anuluj"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Wyczyścić dane z pamięci podręcznej?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Usuwasz dane z pamięci podr. wszystkich aplikacji."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Dodaj akcesoria"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Paruję…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Łączę…"</string>
@@ -228,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Urządzenia współpracujące"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Pilot"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Ustawienia pilota"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Skonfiguruj przyciski pilota"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Steruj głośnością, zasilaniem i źródłem sygnału na telewizorach, amplitunerach i soundbarach"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Połącz"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Połącz z: %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Odłącz"</string>
@@ -266,12 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Niedostępne"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Aplikacje do zarządzania urządzeniem"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Brak aktywnych aplikacji"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aktywne aplikacje</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> aktywnych aplikacji</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktywnej aplikacji</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aktywna aplikacja</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Wyłączone przez administratora lub ze względu na zasady szyfrowania albo magazyn danych logowania"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informacje o urządzeniu zarządzanym"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Zmiany i ustawienia, którymi zarządza Twoja organizacja"</string>
@@ -289,22 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Brak"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Zainstalowane aplikacje"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Liczba aplikacji jest przybliżona. Może nie uwzględniać aplikacji zainstalowanych spoza Sklepu Play."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="few">Co najmniej <xliff:g id="COUNT_1">%d</xliff:g> aplikacje</item>
- <item quantity="many">Co najmniej <xliff:g id="COUNT_1">%d</xliff:g> aplikacji</item>
- <item quantity="other">Co najmniej <xliff:g id="COUNT_1">%d</xliff:g> aplikacji</item>
- <item quantity="one">Co najmniej <xliff:g id="COUNT_0">%d</xliff:g> aplikacja</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Co najmniej # aplikacja}few{Co najmniej # aplikacje}many{Co najmniej # aplikacji}other{Co najmniej # aplikacji}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Dostęp do lokalizacji"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Uprawnienia do mikrofonu"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Uprawnienia do aparatu"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Aplikacje domyślne"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aplikacje</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> aplikacji</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikacji</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplikacja</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplikacja}few{# aplikacje}many{# aplikacji}other{# aplikacji}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Klawiatura domyślna"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Ustaw: <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Włączono stały VPN"</string>
@@ -314,47 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Zaufane dane logowania"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Zaufane dane logowania w Twoim profilu osobistym"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Zaufane dane logowania w Twoim profilu służbowym"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="few">Co najmniej <xliff:g id="COUNT_1">%d</xliff:g> certyfikaty CA</item>
- <item quantity="many">Co najmniej <xliff:g id="COUNT_1">%d</xliff:g> certyfikatów CA</item>
- <item quantity="other">Co najmniej <xliff:g id="COUNT_1">%d</xliff:g> certyfikatu CA</item>
- <item quantity="one">Co najmniej <xliff:g id="COUNT_0">%d</xliff:g> certyfikat CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certyfikat CA}few{# certyfikaty CA}many{# certyfikatów CA}other{# certyfikatu CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administrator może zablokować urządzenie i zresetować hasło"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administrator może usunąć wszystkie dane z urządzenia"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Nieudane próby podania hasła przed usunięciem wszystkich danych z urządzenia"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Nieudane próby podania hasła przed usunięciem danych z profilu służbowego"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> próby</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> prób</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> próby</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> próba</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# próba}few{# próby}many{# prób}other{# próby}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Tym urządzeniem zarządza Twoja organizacja."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Tym urządzeniem zarządza <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Więcej informacji"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="few">Aplikacje aparatu</item>
- <item quantity="many">Aplikacje aparatu</item>
- <item quantity="other">Aplikacje aparatu</item>
- <item quantity="one">Aplikacja aparatu</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Aplikacja aparatu}few{Aplikacje aparatu}many{Aplikacje aparatu}other{Aplikacje aparatu}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Aplikacja kalendarza"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplikacja do obsługi kontaktów"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="few">Aplikacje klienta poczty e-mail</item>
- <item quantity="many">Aplikacje klienta poczty e-mail</item>
- <item quantity="other">Aplikacje klienta poczty e-mail</item>
- <item quantity="one">Aplikacja klienta poczty e-mail</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Klient poczty e-mail}few{Klienty poczty e-mail}many{Klienty poczty e-mail}other{Klienty poczty e-mail}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Aplikacja do map"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="few">Aplikacje telefonu</item>
- <item quantity="many">Aplikacje telefonu</item>
- <item quantity="other">Aplikacje telefonu</item>
- <item quantity="one">Aplikacja telefonu</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Aplikacja telefonu}few{Aplikacje telefonu}many{Aplikacje telefonu}other{Aplikacje telefonu}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Przeglądarka"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -373,12 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Wersja systemu operacyjnego Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Numer seryjny"</string>
<string name="about_build" msgid="8467840394761634575">"Kompilacja systemu operacyjnego Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Reklamy"</string>
<string name="ads_description" msgid="8081069475265061074">"Zarządzaj ustawieniami reklam, np. resetowaniem identyfikatora wyświetlania reklam."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Reklamy, zarządzaj ustawieniami reklam, na przykład resetowaniem identyfikatora wyświetlania reklam."</string>
@@ -392,31 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Dodatkowe aktualizacje systemu"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Sieć może być monitorowana"</string>
<string name="done_button" msgid="616159688526431451">"Gotowe"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="few">Zaufaj certyfikatom lub je usuń</item>
- <item quantity="many">Zaufaj certyfikatom lub je usuń</item>
- <item quantity="other">Zaufaj certyfikatom lub je usuń</item>
- <item quantity="one">Zaufaj certyfikatowi lub go usuń</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="few">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> zainstalowała na Twoim urządzeniu certyfikaty CA, które mogą zezwolić jej na monitorowanie aktywności urządzenia w sieci, w tym e-maili, aplikacji i bezpiecznych stron internetowych.\n\nAby dowiedzieć się więcej o tych certyfikatach, skontaktuj się ze swoim administratorem.</item>
- <item quantity="many">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> zainstalowała na Twoim urządzeniu certyfikaty CA, które mogą zezwolić jej na monitorowanie aktywności urządzenia w sieci, w tym e-maili, aplikacji i bezpiecznych stron internetowych.\n\nAby dowiedzieć się więcej o tych certyfikatach, skontaktuj się ze swoim administratorem.</item>
- <item quantity="other">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> zainstalowała na Twoim urządzeniu certyfikaty CA, które mogą zezwolić jej na monitorowanie aktywności urządzenia w sieci, w tym e-maili, aplikacji i bezpiecznych stron internetowych.\n\nAby dowiedzieć się więcej o tych certyfikatach, skontaktuj się ze swoim administratorem.</item>
- <item quantity="one">Domena <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> zainstalowała na Twoim urządzeniu certyfikat CA, który może zezwolić jej na monitorowanie aktywności urządzenia w sieci, w tym e-maili, aplikacji i bezpiecznych stron internetowych.\n\nAby dowiedzieć się więcej o tym certyfikacie, skontaktuj się ze swoim administratorem.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="few">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> zainstalowała w Twoim profilu służbowym certyfikaty CA, które mogą zezwolić jej na monitorowanie aktywności profilu w sieci, w tym e-maili, aplikacji i bezpiecznych stron internetowych.\n\nAby dowiedzieć się więcej o tych certyfikatach, skontaktuj się ze swoim administratorem.</item>
- <item quantity="many">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> zainstalowała w Twoim profilu służbowym certyfikaty CA, które mogą zezwolić jej na monitorowanie aktywności profilu w sieci, w tym e-maili, aplikacji i bezpiecznych stron internetowych.\n\nAby dowiedzieć się więcej o tych certyfikatach, skontaktuj się ze swoim administratorem.</item>
- <item quantity="other">Domena <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> zainstalowała w Twoim profilu służbowym certyfikaty CA, które mogą zezwolić jej na monitorowanie aktywności profilu w sieci, w tym e-maili, aplikacji i bezpiecznych stron internetowych.\n\nAby dowiedzieć się więcej o tych certyfikatach, skontaktuj się ze swoim administratorem.</item>
- <item quantity="one">Domena <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> zainstalowała w Twoim profilu służbowym certyfikat CA, który może zezwolić jej na monitorowanie aktywności profilu w sieci, w tym e-maili, aplikacji i bezpiecznych stron internetowych.\n\nAby dowiedzieć się więcej o tym certyfikacie, skontaktuj się ze swoim administratorem.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Podmiot zewnętrzny może monitorować Twoją aktywność w sieci (np. e-maile, aplikacje i bezpieczne strony).\n\nUmożliwiają to dane uwierzytelniające zainstalowane na Twoim urządzeniu."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="few">Sprawdź certyfikaty</item>
- <item quantity="many">Sprawdź certyfikaty</item>
- <item quantity="other">Sprawdź certyfikaty</item>
- <item quantity="one">Sprawdź certyfikat</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Zaufaj certyfikatowi lub go usuń}few{Zaufaj certyfikatom lub je usuń}many{Zaufaj certyfikatom lub je usuń}other{Zaufaj certyfikatom lub je usuń}}"</string>
<string name="device_status" msgid="8266002761193692207">"Stan"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Sieć, numery seryjne i inne informacje"</string>
<string name="manual" msgid="5683935624321864999">"Ręcznie"</string>
@@ -508,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Połącz"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Zapomnij sieć"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Powoduje to wyczyszczenie informacji używanych do łączenia z tą siecią, w tym zapisanego hasła"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Jeśli chcesz się połączyć z Wi-Fi, zeskanuj telefonem kod QR i postępuj zgodnie z instrukcjami."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Jeśli chcesz połączyć się z Wi-Fi, zeskanuj telefonem kod QR i postępuj zgodnie z instrukcjami.\n \n Na "<b>"telefonie z Androidem"</b>" otwórz Ustawienia > Sieć i internet > Wi-Fi > wybierz Wi-Fi > Zaawansowane > dodaj urządzenie i zeskanuj kod QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Aby anulować, naciśnij przycisk Wstecz"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Dalej"</string>
@@ -577,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Pamięć urządzenia"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Pamięć wymienna"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Resetuj"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Zwalnianie miejsca na dane"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Czyszczenie danych z pamięci podręcznej"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Zwolnij <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Zostaną usunięte pliki tymczasowe, które zajmują miejsce. Nie wpłynie to na zapisane dane, takie jak ustawienia aplikacji czy filmy offline, i nie będzie trzeba ponownie logować się w aplikacjach."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Wyczyścić dane z pamięci podręcznej?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Spowoduje to usunięcie danych aplikacji z pamięci."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Odinstalowywanie aplikacji"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Podłączono: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Nie udało się podłączyć: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Ponownie podłączono pamięć USB"</string>
@@ -654,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Dostęp do mikrofonu"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Dostęp aplikacji do mikrofonu"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Dostęp do mikrofonu jest zablokowany"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Aby odblokować, zezwól na dostęp do mikrofonu, ustawiając przełącznik prywatności na urządzeniu w pozycji włączenia mikrofonu."</string>
<string name="camera" msgid="1226671478936288283">"Aparat"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Dostęp do aparatu"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Dostęp aplikacji do aparatu"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Dostęp do aparatu jest zablokowany"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Aby odblokować, zezwól na dostęp do aparatu, ustawiając przełącznik prywatności na urządzeniu w pozycji włączenia aparatu."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Dostęp do mikrofonu: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Gdy włączysz tę opcję, wszystkie aplikacje i usługi z przyznanymi uprawnieniami będą mogły korzystać z dowolnego mikrofonu tego urządzenia.\n\nTo ustawienie nie ma wpływu na peryferyjne urządzenia audio używające niestandardowego protokołu."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Dostęp do aparatu: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -728,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyjan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Żółty"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audiodeskrypcja"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Słuchaj opisu tego, co się dzieje na ekranie w filmach i serialach"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Włączono"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfiguracja"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Użyć <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -748,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitorowanie"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplikacje"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Pozostaw włączony ekran"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Ekran nigdy nie będzie usypiany"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Sprawdzanie HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Optymalizacja HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Uruchomić ponownie teraz?"</string>
@@ -868,24 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Wyłączanie urządzeń HDMI za pomocą TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Autom. wyłączanie TV włączone"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Włączanie TV za pomocą urządzenia HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="few">Podłączone wejścia</item>
- <item quantity="many">Podłączone wejścia</item>
- <item quantity="other">Podłączone wejścia</item>
- <item quantity="one">Podłączone wejście</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="few">Wejścia zapasowe</item>
- <item quantity="many">Wejścia zapasowe</item>
- <item quantity="other">Wejścia zapasowe</item>
- <item quantity="one">Wejście zapasowe</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="few">Niepodłączone wejścia</item>
- <item quantity="many">Niepodłączone wejścia</item>
- <item quantity="other">Niepodłączone wejścia</item>
- <item quantity="one">Niepodłączone wejście</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Podłączone wejście}few{Podłączone wejścia}many{Podłączone wejścia}other{Podłączone wejścia}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Wejście zapasowe}few{Wejścia zapasowe}many{Wejścia zapasowe}other{Wejścia zapasowe}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Niepodłączone wejście}few{Niepodłączone wejścia}many{Niepodłączone wejścia}other{Niepodłączone wejścia}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Ogranicz dostęp do aplikacji i innych treści na swoim koncie"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Profil ograniczony"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Kontrolowane przez <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -899,12 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Utwórz profil z ograniczonym dostępem"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Ustawienia"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Dozwolone aplikacje"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="few">%d dozwolone aplikacje</item>
- <item quantity="many">%d dozwolonych aplikacji</item>
- <item quantity="other">Dozwolone aplikacje: %d</item>
- <item quantity="one">1 dozwolona aplikacja</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Dozwolone"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Niedozwolone"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Dostosuj ograniczenia"</string>
@@ -949,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Źródło zewnętrzne"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Uprawnienia"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplikacja niedostępna"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Nieużywane aplikacje"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Potwierdź"</string>
<string name="settings_cancel" msgid="576094334743686152">"Anuluj"</string>
@@ -1032,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"To uprawnienie umożliwia aplikacji modyfikowanie ustawień systemu."</string>
<string name="write_settings_on" msgid="71675710746513956">"Tak"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Nie"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Dostęp do wszystkich plików"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Zezwól na zarządzanie wszystkimi plikami"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Zezwól tej aplikacji na odczytywanie, modyfikowanie i usuwanie plików na tym urządzeniu oraz wszelkich połączonych woluminach pamięci. Aplikacje z tymi uprawnieniami mogą korzystać z dostępu do plików bez konieczności wyraźnego informowania Cię o tym."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Obraz w obrazie"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Pozwól na tryb obraz w obrazie"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Żadna zainstalowana aplikacja nie obsługuje trybu obrazu w obrazie"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Pozwala aplikacjom na tworzenie okna typu obraz w obrazie, gdy są otwarte lub gdy je opuścisz (np. aby kontynuować oglądanie filmu). To okno wyświetla się nad innymi używanymi aplikacjami."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Zezwalaj aplikacjom na ustawianie alarmów i planowanie działań, w przypadku których istotny jest czas. Aplikacje będą mogły działać w tle, co może zwiększyć wykorzystanie baterii.\n\nJeśli nie włączysz tych uprawnień, dotychczas ustawione alarmy i zaplanowane wydarzenia z aplikacji nie będą działać."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Włączanie ekranu"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Zezwalaj na włączanie ekranu"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Zezwalaj aplikacji na włączanie ekranu. Gdy przyznasz te uprawnienia, aplikacja będzie mogła w dowolnym momencie włączyć ekran bez Twojego wyraźnego działania."</string>
<string name="special_access" msgid="21806055758289916">"Aplikacje ze specjalnym dostępem"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Dźwięk"</string>
@@ -1053,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Oszczędzanie danych"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Automatycznie dostosuj jakość, by ograniczyć mobilną transmisję danych"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Użycie danych i alerty"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Z internetem możesz połączyć się przez Wi-Fi, Ethernet lub hotspot na telefonie. Aby dowiedzieć się więcej, wejdź na "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Z internetem możesz połączyć się przez Wi-Fi, Ethernet lub hotspot na telefonie."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Niedozwolona czynność"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Nie można zmienić głośności"</string>
@@ -1103,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Zasilanie i energia"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Działanie po włączeniu"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Resetowanie"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Kod parowania Ethernetu"</string>
</resources>
diff --git a/Settings/res/values-pt-rBR/strings.xml b/Settings/res/values-pt-rBR/strings.xml
index 9ac1dca..439ad49 100644
--- a/Settings/res/values-pt-rBR/strings.xml
+++ b/Settings/res/values-pt-rBR/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Adicionar uma conta"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Contas e login"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Nenhuma conta"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> conta</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> contas</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# conta}one{# conta}other{# contas}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Serviços de mídia, Assistente, pagamentos"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Rede e Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Som"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apps"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Preferências do dispositivo"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Controles remotos e acessórios"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Nenhum dispositivo Bluetooth conectado"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> acessório</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> acessórios</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Tela e som"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Ajuda e feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacidade"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Redefinição para configuração original"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibração"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Economia de energia"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Dispositivos"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Selecionar formatos"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Som surround"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMATOS ATIVADOS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMATOS DESATIVADOS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Para desativar, mude a seleção de formato para \"Manual\"."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolução"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automática"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"A resolução mudou"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Selecione \"Ok\" para usar a resolução %1$s de agora em diante."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Cancelar"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Limpar os dados em cache?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Esta ação limpa dados em cache de todos os apps."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Adicionar acessório"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Pareando…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Conectando..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Acessórios"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Controle remoto"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Configurações de controle remoto"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Configurar botões de controle remoto"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Controle o volume, a função liga/desliga e a entrada em TVs, receptores e soundbars"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Conectar"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Conectar a %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Desconectar"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Indisponível"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Apps do administrador do dispositivo"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Nenhum app ativo"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> app ativo</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps ativos</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Desativada pelo admin, política de criptografia ou armazenamento de credenciais"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informações do dispositivo gerenciado"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Alterações e configurações gerenciadas pela sua organização"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Nenhuma"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Apps instalados"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"O número de apps é aproximado e pode não incluir apps instalados fora da Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="one">No mínimo, <xliff:g id="COUNT_1">%d</xliff:g> app</item>
- <item quantity="other">No mínimo, <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{No mínimo # app}one{No mínimo # app}other{No mínimo # apps}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Permissões de localização"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Permissões do microfone"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Permissões da câmera"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Apps padrão"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> app</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}one{# app}other{# apps}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Teclado padrão"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Definir como <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"\"VPN sempre ativa\" ativada"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Credenciais confiáveis"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Credenciais confiáveis no seu perfil pessoal"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Credenciais confiáveis no seu perfil de trabalho"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">No mínimo, <xliff:g id="COUNT_1">%d</xliff:g> certificado de CA</item>
- <item quantity="other">No mínimo, <xliff:g id="COUNT_1">%d</xliff:g> certificados de CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certificado de CA}one{# certificado de CA}other{# certificados de CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"O administrador pode bloquear o dispositivo e redefinir a senha"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"O administrador pode excluir todos os dados do dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Tentativas de senha falhas antes de excluir todos os dados do dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Tentativas de senha falhas antes de excluir os dados do perfil de trabalho"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> tentativa</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tentativas</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# tentativa}one{# tentativa}other{# tentativas}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Este dispositivo é gerenciado pela sua organização."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Este dispositivo é gerenciado por <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Saiba mais"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">App de câmera</item>
- <item quantity="other">Apps de câmera</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{App de câmera}one{App de câmera}other{Apps de câmera}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"App Calendário"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"App Contatos"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">App de cliente de e-mail</item>
- <item quantity="other">Apps de cliente de e-mail</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{App de cliente de e-mail}one{App de cliente de e-mail}other{Apps de cliente de e-mail}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"App Mapa"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">App de telefone</item>
- <item quantity="other">Apps de telefone</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{App de telefone}one{App de telefone}other{Apps de telefone}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"App de navegação"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Versão do SO do Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Número de série"</string>
<string name="about_build" msgid="8467840394761634575">"Build do SO do Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="one">Agora faltam <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> etapas para você se tornar um desenvolvedor</item>
- <item quantity="other">Agora 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="4064986225625409361">"{count,plural, =1{Falta # etapa para você ativar as configurações de desenvolvedor}one{Falta # etapa para você ativar as configurações de desenvolvedor}other{Faltam # etapas para você ativar as configurações de desenvolvedor}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Anúncios"</string>
<string name="ads_description" msgid="8081069475265061074">"Gerencie as Configurações de anúncios, por exemplo, redefinindo seu ID de publicidade."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Anúncios: gerencie suas Configurações de anúncios, por exemplo, redefinindo seu ID de publicidade."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Mais atualiz. do sistema"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"A rede pode ser monitorada"</string>
<string name="done_button" msgid="616159688526431451">"Concluído"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Confiar no certificado ou removê-lo</item>
- <item quantity="other">Confiar nos certificados ou removê-los</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalou uma autoridade de certificação no seu dispositivo, o que pode permitir que essa pessoa monitore a atividade na rede dele, incluindo e-mails, apps e sites seguros.\n\nPara ver mais informações sobre esse certificado, entre em contato com o administrador.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalou autoridades de certificação no seu dispositivo, o que pode permitir que essa pessoa monitore a atividade na rede dele, incluindo e-mails, apps e sites seguros.\n\nPara ver mais informações sobre esses certificados, entre em contato com o administrador.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalou uma autoridade de certificação para seu perfil de trabalho, o que pode permitir que essa pessoa monitore sua atividade profissional na rede, incluindo e-mails, apps e sites seguros.\n\nPara ver mais informações sobre o certificado, entre em contato com o administrador.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalou autoridades de certificação para seu perfil de trabalho, o que pode permitir que essa pessoa monitore sua atividade profissional na rede, incluindo e-mails, apps e sites seguros.\n\nPara ver mais informações sobre os certificados, entre em contato com o administrador.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Sua atividade na rede, incluindo e-mails, apps e websites seguros, pode ser monitorada por terceiros.\n\nUma credencial confiável instalada no dispositivo permite isso."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Verificar certificado</item>
- <item quantity="other">Verificar certificados</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Confiar no certificado ou removê-lo}one{Confiar no certificado ou removê-lo}other{Confiar nos certificados ou removê-los}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Rede, números de série e outras informações"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Conectar"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Esquecer a rede"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Esta ação limpa as informações usadas para se conectar a esta rede, incluindo uma senha salva."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Leia o código QR no seu smartphone e siga as instruções para se conectar a uma rede Wi-Fi."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Leia o código QR em um smartphone e siga as instruções para se conectar a uma rede Wi-Fi.\n \n Em um "<b>"smartphone Android"</b>", acesse Configurações -> Rede e Internet -> Wi-Fi -> Selecionar Wi-Fi -> Avançado -> adicione o dispositivo e leia o código QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Pressione o botão \"Voltar\" para cancelar"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continuar"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Armazenamento do dispositivo"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Armazenamento removível"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Redefinir"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Liberar espaço de armazenamento"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Limpar os dados em cache"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Liberar <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Limpa os arquivos temporários que estão ocupando espaço. Esta ação não afetará dados, como as preferências de apps ou vídeos off-line, e você não precisará fazer login nos apps novamente."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Limpar os dados em cache?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Limpará os dados em cache de todos os apps."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Desinstalar apps"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Ativação de <xliff:g id="NAME">%1$s</xliff:g> concluída"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Falha ao montar <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Armazenamento USB reconectado"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Microfone"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Acesso ao microfone"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Acesso dos apps ao microfone"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Acesso ao microfone bloqueado"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Para desbloquear, mude a chave de privacidade do dispositivo para autorizar o acesso ao microfone."</string>
<string name="camera" msgid="1226671478936288283">"Câmera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Acesso à câmera"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Acesso dos apps à câmera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Acesso à câmera bloqueado"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Para desbloquear, mude a chave de privacidade do dispositivo para autorizar o acesso à câmera."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Acesso ao microfone: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Quando essa opção está ativada, todos os apps e serviços que têm permissão podem acessar qualquer microfone no dispositivo.\n\nOs periféricos de áudio com protocolo personalizado não são afetados."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Acesso à câmera: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Ciano"</string>
<string name="color_yellow" msgid="3519470952904560404">"Amarelo"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audiodescrição"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Ouça a descrição do que acontece na tela em filmes e programas com suporte"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Ativar"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuração"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Usar <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitoramento"</string>
<string name="system_apps" msgid="8481888654606868074">"Apps"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Permanecer ativo"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"A tela nunca vai entrar em suspensão"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Verificação HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Otimização para HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Reiniciar agora?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Desligar dispositivos HDMI com a TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Ligar automaticamente a TV"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Ligar a TV com o dispositivo HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Entradas conectadas</item>
- <item quantity="other">Entradas conectadas</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Entradas em espera</item>
- <item quantity="other">Entradas em espera</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Entradas não conectadas</item>
- <item quantity="other">Entradas não conectadas</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Entrada conectada}one{Entrada conectada}other{Entradas conectadas}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Entrada em espera}one{Entrada em espera}other{Entradas em espera}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Entrada não conectada}one{Entrada não conectada}other{Entradas não conectadas}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Restringir o acesso a apps e outros tipos de conteúdo em sua conta"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Perfil restrito"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controlado por <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Criar perfil restrito"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Configurações"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Apps permitidos"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d apps permitidos</item>
- <item quantity="other">%d apps permitidos</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Permitido"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Não permitido"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Personalizar restrições"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Fonte de terceiros"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Permissões"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"App indisponível"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Apps não usados"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirmar"</string>
<string name="settings_cancel" msgid="576094334743686152">"Cancelar"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Permite que um app modifique configurações do sistema."</string>
<string name="write_settings_on" msgid="71675710746513956">"Sim"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Não"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Acesso a todos os arquivos"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Acesso para gerenciar todos os arquivos"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Permitir que o app leia, modifique e exclua todos os arquivos deste dispositivo ou de qualquer volume de armazenamento conectado. Se a permissão for concedida, o app poderá acessar arquivos sem nenhum aviso prévio."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Permitir picture-in-picture"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Nenhum dos apps instalados é compatível com picture-in-picture"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Permite que apps abram uma janela picture-in-picture enquanto o app está aberto ou depois que você sai dele (por exemplo, para continuar a assistir um vídeo). Essa janela é sobreposta a outros apps que você esteja usando."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Permitir que apps definam alarmes e programem ações. Essa opção autoriza a execução de apps em segundo plano, o que pode consumir mais bateria.\n\nSe a permissão for desativada, os alarmes e eventos programados pelo app não funcionarão."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Ligar tela"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Permitir que a tela seja ligada"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Permitir que um app ligue a tela. Se permitido, o app vai poder ligar a tela a qualquer momento sem uma intent explícita."</string>
<string name="special_access" msgid="21806055758289916">"Acesso especial a apps"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Áudio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Economia de dados"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Ajusta automaticamente a qualidade de vídeo para usar menos dados móveis"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Alertas e uso de dados"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"É possível se conectar à Internet por Wi-Fi, Ethernet ou pelo ponto de acesso do smartphone. Para receber mais ajuda, acesse "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"É possível se conectar à Internet por Wi-Fi, Ethernet ou pelo ponto de acesso do smartphone."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Ação não permitida"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Não é possível alterar o volume"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Energia"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Comportamento ao ligar"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Reiniciar"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Código de pareamento Ethernet"</string>
</resources>
diff --git a/Settings/res/values-pt-rPT/strings.xml b/Settings/res/values-pt-rPT/strings.xml
index 7b6dd9a..954ba19 100644
--- a/Settings/res/values-pt-rPT/strings.xml
+++ b/Settings/res/values-pt-rPT/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Adicionar uma conta"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Contas e início de sessão"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Sem contas."</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> contas</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> conta</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# conta}other{# contas}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Serviços multimédia, Assistente, Pagamentos"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Rede e Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Som"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apps"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Preferências do dispositivo"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Controlos remotos e acessórios"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Sem dispositivos Bluetooth ligados."</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> acessórios</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> acessório</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Ecrã e som"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Ajuda e comentários"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacidade"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Reposição de dados de fábrica"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibração"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Poupança de energia"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Dispositivos"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Selecionar formatos"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Som surround"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMATOS ATIVADOS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMATOS DESATIVADOS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Para desativar, altere a seleção do formato para Manual."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolução"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automática"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"A resolução foi alterada"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Selecione OK para utilizar %1$s a partir de agora."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Cancelar"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Pretende limpar os dados em cache?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Isto limpa os dados em cache de todas as app"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Adicionar acessório"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"A sincronizar..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"A ligar..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Acessórios"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Comando"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Definições do comando"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Configure os botões do comando"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Controle o volume, o botão ligar/desligar, a entrada em TVs, os recetores e as barras de som"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Associar"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Associar a %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Desassociar"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Não disponível"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Apps de administração do dispositivo"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Sem apps ativas"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps ativas</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app ativa</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Desativada pelo gestor, política de encriptação ou armazenamento de credenciais"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informações do dispositivo gerido"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Alterações e definições geridas pela sua entidade"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Nenhuma"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Apps instaladas"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"O número de apps é uma estimativa. Pode não incluir as apps instaladas fora da Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">No mínimo, <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one">No mínimo, <xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{No mínimo, # app}other{No mínimo, # apps}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Autoriz. de Localização"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Autorizações do microfone"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Autorizações da câmara"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Apps predefinidas"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}other{# apps}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Teclado predefinido"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Definido como <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"A opção VPN sempre ligada está ativada"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Credenciais fidedignas"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Credenciais fidedignas no seu perfil pessoal"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Credenciais fidedignas no seu perfil de trabalho"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">No mínimo, <xliff:g id="COUNT_1">%d</xliff:g> certificados da AC (autoridade de certificação)</item>
- <item quantity="one">No mínimo, <xliff:g id="COUNT_0">%d</xliff:g> certificado da AC (autoridade de certificação)</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certificado da AC (autoridade de certificação)}other{# certificados da AC (autoridade de certificação)}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"O gestor pode bloquear o dispositivo e repor a palavra-passe"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"O gestor pode eliminar todos os dados do dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Tentativas de introdução da palavra-passe falhadas antes da eliminação de todos os dados do dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Tentativas de introdução da palavra-passe falhadas antes da eliminação de todos os dados do perfil de trabalho"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tentativas</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> tentativa</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# tentativa}other{# tentativas}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Este dispositivo é gerido pela sua entidade."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Este dispositivo é gerido por <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Saiba mais"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Apps de câmara</item>
- <item quantity="one">App de câmara</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{App de câmara}other{Apps de câmara}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Aplicação de calendário"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplicação de contactos"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Apps de cliente de email</item>
- <item quantity="one">App de cliente de email</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{App de cliente de email}other{Apps de cliente de email}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Aplicação de mapas"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Apps de telefone</item>
- <item quantity="one">App de telefone</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{App de telefone}other{Apps de telefone}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"App do navegador"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Versão do SO do Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Número de série"</string>
<string name="about_build" msgid="8467840394761634575">"Compilação do SO do Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Está agora a <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> passos de se tornar um programador</item>
- <item quantity="one">Está agora a <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> passo de se tornar um programador</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Está agora a # passo de se tornar um programador}other{Está agora a # passos de se tornar um programador}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Anúncios"</string>
<string name="ads_description" msgid="8081069475265061074">"Gira as Definições dos anúncios, como repor o ID de publicidade."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Anúncios, Faça a gestão das Definições dos anúncios, como repor o ID de publicidade."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Atualiz. do sistema adic."</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"A rede pode ser monitorizada"</string>
<string name="done_button" msgid="616159688526431451">"Concluído"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Confie nos certificados ou remova-os</item>
- <item quantity="one">Confie no certificado ou remova-o</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalou autoridades de certificação no seu dispositivo, o que pode permitir monitorizar a atividade na rede do dispositivo, incluindo emails, apps e Websites seguros.\n\nPara obter mais informações acerca destes certificados, contacte o administrador.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> instalou uma autoridade de certificação no seu dispositivo, o que pode permitir monitorizar a atividade na rede do dispositivo, incluindo emails, apps e Websites seguros.\n\nPara obter mais informações acerca deste certificado, contacte o administrador.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalou autoridades de certificação para o seu perfil de trabalho, o que pode permitir monitorizar a atividade na rede de trabalho, incluindo emails, apps e Websites seguros.\n\nPara obter mais informações acerca destes certificados, contacte o administrador.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> instalou uma autoridade de certificação para o seu perfil de trabalho, o que pode permitir monitorizar a atividade na rede de trabalho, incluindo emails, apps e Websites seguros.\n\nPara obter mais informações acerca deste certificado, contacte o administrador.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"A sua atividade de rede, incluindo emails, aplicações e Sites seguros, pode ser monitorizada por terceiros.\n\nIsto é possível através de uma credencial fidedigna instalada no seu dispositivo."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Verificar certificados</item>
- <item quantity="one">Verificar certificado</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Confie no certificado ou remova-o}other{Confie nos certificados ou remova-os}}"</string>
<string name="device_status" msgid="8266002761193692207">"Estado"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Rede, números de série e outras informações"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Ligar"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Esquecer rede"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Esta ação limpa as info. utilizadas para se ligar a esta rede, incluindo palavras-passe guardadas"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Adira a uma rede Wi-Fi ao ler o código QR com o seu telemóvel e siga a instrução."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Adira a uma rede Wi-Fi ao ler o código QR com um telemóvel e seguir as instruções.\n \n Num "<b>"telemóvel Android"</b>", aceda a Definições -> Rede e Internet -> Wi-Fi -> selecione uma rede Wi-Fi -> Avançadas -> Adicionar dispositivo e, em seguida, leia o código QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Prima o botão anterior para cancelar."</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continuar"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Armazenamento do dispositivo"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Armazenamento amovível"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Repor"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Liberte armazenamento"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Limpe os dados em cache"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Liberte <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Limpa ficheiros temporários que ocupam espaço. Não afeta os dados guardados, como preferências de apps ou vídeos offline, e não precisa de iniciar sessão nas apps novamente."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Pretende limpar os dados em cache?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Irá limpar os dados em cache de todas as apps."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Desinstale apps"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> está montado"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Não foi possível montar <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Memória USB novamente ligada"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Microfone"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Acesso ao microfone"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Acesso da app ao microfone"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Acesso ao microfone bloqueado"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Para desbloquear, mova o interruptor de privacidade do dispositivo relativo ao microfone para a posição de autorização de acesso à câmara."</string>
<string name="camera" msgid="1226671478936288283">"Câmara"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Acesso à câmara"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Acesso da app à câmara"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Acesso à câmara bloqueado"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Para desbloquear, mova o interruptor de privacidade do dispositivo relativo à câmara para a posição de autorização de acesso à câmara."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Acesso ao microfone: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Quando a opção está ativada, todos os serviços e apps com autorização podem aceder a qualquer microfone neste dispositivo.\n\nOs periféricos de áudio com um protocolo personalizado não são afetados por esta definição."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Acesso à câmara: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Azul-turquesa"</string>
<string name="color_yellow" msgid="3519470952904560404">"Amarelo"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Descrição áudio"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Ouça uma descrição do que se passa no ecrã em filmes e programas suportados"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Ativar"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuração"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Utilizar <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitorizar"</string>
<string name="system_apps" msgid="8481888654606868074">"Apps"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Manter ativo"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"O ecrã nunca entrará em suspensão"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Verificação HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Otimização HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Pretende reiniciar agora?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Desligue os dispositivos HDMI com a TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Ligação automática TV ativada"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Ligue a TV com o dispositivo HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Entradas ligadas</item>
- <item quantity="one">Entrada ligada</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Entradas em espera</item>
- <item quantity="one">Entrada em espera</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Entradas não ligadas</item>
- <item quantity="one">Entrada não ligada</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Entrada ligada}other{Entradas ligadas}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Entrada em espera}other{Entradas em espera}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Entrada não ligada}other{Entradas não ligadas}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Restringir o acesso a apps e a outro conteúdo na sua conta"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Perfil restrito"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controlado por <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Criar perfil restrito"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Definições"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Apps autorizadas"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d aplicações permitidas</item>
- <item quantity="one">1 aplicação permitida</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Permitido"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Não permitido"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Personalizar restrições"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Origem de terceiros"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Autorizações"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplicação indisponível"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Apps não utilizadas"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirmar"</string>
<string name="settings_cancel" msgid="576094334743686152">"Cancelar"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Esta autorização permite que uma aplicação modifique as definições do sistema."</string>
<string name="write_settings_on" msgid="71675710746513956">"Sim"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Não"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Acesso a todos os ficheiros"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Permitir acesso para gerir todos os ficheiros"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Permita que esta app leia, modifique e elimine todos os ficheiros neste dispositivo ou em qualquer volume de armazenamento ligado. Se a autorização for concedida, a app poderá aceder aos ficheiros sem o seu conhecimento explícito."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Ecrã no ecrã"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Permitir ecrã no ecrã"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Nenhuma app instalada é compatível com Ecrã no ecrã."</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Permitir que as apps criem uma janela de ecrã no ecrã enquanto as aplicações estão abertas ou depois de sair das mesmas (por exemplo, para continuar a ver um vídeo). Esta janela é apresentada sobre as outras aplicações que estiver a utilizar."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Permita que as apps definam alarmes e agendem outras ações com base no tempo. Esta ação permite que as apps sejam executadas em segundo plano, o que pode utilizar mais energia.\n\nSe esta autorização estiver desativada, os alarmes existentes e os eventos com base no tempo agendados pela app não funcionam."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Ativar o ecrã"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Permitir a ativação do ecrã"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Permita que uma app ative o ecrã. Se a autorização for concedida, a app pode ativar o ecrã em qualquer altura sem a sua intenção explícita."</string>
<string name="special_access" msgid="21806055758289916">"Acesso especial a aplicações"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Áudio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Poupança de dados"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Ajuste automaticamente a qualidade do vídeo para utilizar menos dados móveis."</string>
<string name="title_data_alert" msgid="8262081890052682475">"Utilização de dados e alertas"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Pode estabelecer ligação à Internet através de uma rede Wi-Fi, Ethernet ou da zona Wi-Fi do seu telemóvel. Para obter mais ajuda, visite "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Pode estabelecer ligação à Internet através de uma rede Wi-Fi, Ethernet ou da zona Wi-Fi do seu telemóvel."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Ação não permitida"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Impossível alterar o volume"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Alimentação e energia"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Comportamento ao ligar"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Reposição"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Código de sincronização da Ethernet"</string>
</resources>
diff --git a/Settings/res/values-pt/strings.xml b/Settings/res/values-pt/strings.xml
index 9ac1dca..439ad49 100644
--- a/Settings/res/values-pt/strings.xml
+++ b/Settings/res/values-pt/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Adicionar uma conta"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Contas e login"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Nenhuma conta"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> conta</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> contas</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# conta}one{# conta}other{# contas}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Serviços de mídia, Assistente, pagamentos"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Rede e Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Som"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Apps"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Preferências do dispositivo"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Controles remotos e acessórios"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Nenhum dispositivo Bluetooth conectado"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> acessório</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> acessórios</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Tela e som"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Ajuda e feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacidade"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Redefinição para configuração original"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibração"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Economia de energia"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Dispositivos"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Selecionar formatos"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Som surround"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMATOS ATIVADOS"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMATOS DESATIVADOS"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Para desativar, mude a seleção de formato para \"Manual\"."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolução"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automática"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"A resolução mudou"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Selecione \"Ok\" para usar a resolução %1$s de agora em diante."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Cancelar"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Limpar os dados em cache?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Esta ação limpa dados em cache de todos os apps."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Adicionar acessório"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Pareando…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Conectando..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Acessórios"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Controle remoto"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Configurações de controle remoto"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Configurar botões de controle remoto"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Controle o volume, a função liga/desliga e a entrada em TVs, receptores e soundbars"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Conectar"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Conectar a %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Desconectar"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Indisponível"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Apps do administrador do dispositivo"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Nenhum app ativo"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> app ativo</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps ativos</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Desativada pelo admin, política de criptografia ou armazenamento de credenciais"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informações do dispositivo gerenciado"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Alterações e configurações gerenciadas pela sua organização"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Nenhuma"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Apps instalados"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"O número de apps é aproximado e pode não incluir apps instalados fora da Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="one">No mínimo, <xliff:g id="COUNT_1">%d</xliff:g> app</item>
- <item quantity="other">No mínimo, <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{No mínimo # app}one{No mínimo # app}other{No mínimo # apps}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Permissões de localização"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Permissões do microfone"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Permissões da câmera"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Apps padrão"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> app</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}one{# app}other{# apps}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Teclado padrão"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Definir como <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"\"VPN sempre ativa\" ativada"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Credenciais confiáveis"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Credenciais confiáveis no seu perfil pessoal"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Credenciais confiáveis no seu perfil de trabalho"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">No mínimo, <xliff:g id="COUNT_1">%d</xliff:g> certificado de CA</item>
- <item quantity="other">No mínimo, <xliff:g id="COUNT_1">%d</xliff:g> certificados de CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certificado de CA}one{# certificado de CA}other{# certificados de CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"O administrador pode bloquear o dispositivo e redefinir a senha"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"O administrador pode excluir todos os dados do dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Tentativas de senha falhas antes de excluir todos os dados do dispositivo"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Tentativas de senha falhas antes de excluir os dados do perfil de trabalho"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> tentativa</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tentativas</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# tentativa}one{# tentativa}other{# tentativas}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Este dispositivo é gerenciado pela sua organização."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Este dispositivo é gerenciado por <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Saiba mais"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">App de câmera</item>
- <item quantity="other">Apps de câmera</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{App de câmera}one{App de câmera}other{Apps de câmera}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"App Calendário"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"App Contatos"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">App de cliente de e-mail</item>
- <item quantity="other">Apps de cliente de e-mail</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{App de cliente de e-mail}one{App de cliente de e-mail}other{Apps de cliente de e-mail}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"App Mapa"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">App de telefone</item>
- <item quantity="other">Apps de telefone</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{App de telefone}one{App de telefone}other{Apps de telefone}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"App de navegação"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Versão do SO do Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Número de série"</string>
<string name="about_build" msgid="8467840394761634575">"Build do SO do Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="one">Agora faltam <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> etapas para você se tornar um desenvolvedor</item>
- <item quantity="other">Agora 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="4064986225625409361">"{count,plural, =1{Falta # etapa para você ativar as configurações de desenvolvedor}one{Falta # etapa para você ativar as configurações de desenvolvedor}other{Faltam # etapas para você ativar as configurações de desenvolvedor}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Anúncios"</string>
<string name="ads_description" msgid="8081069475265061074">"Gerencie as Configurações de anúncios, por exemplo, redefinindo seu ID de publicidade."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Anúncios: gerencie suas Configurações de anúncios, por exemplo, redefinindo seu ID de publicidade."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Mais atualiz. do sistema"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"A rede pode ser monitorada"</string>
<string name="done_button" msgid="616159688526431451">"Concluído"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Confiar no certificado ou removê-lo</item>
- <item quantity="other">Confiar nos certificados ou removê-los</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalou uma autoridade de certificação no seu dispositivo, o que pode permitir que essa pessoa monitore a atividade na rede dele, incluindo e-mails, apps e sites seguros.\n\nPara ver mais informações sobre esse certificado, entre em contato com o administrador.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalou autoridades de certificação no seu dispositivo, o que pode permitir que essa pessoa monitore a atividade na rede dele, incluindo e-mails, apps e sites seguros.\n\nPara ver mais informações sobre esses certificados, entre em contato com o administrador.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalou uma autoridade de certificação para seu perfil de trabalho, o que pode permitir que essa pessoa monitore sua atividade profissional na rede, incluindo e-mails, apps e sites seguros.\n\nPara ver mais informações sobre o certificado, entre em contato com o administrador.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> instalou autoridades de certificação para seu perfil de trabalho, o que pode permitir que essa pessoa monitore sua atividade profissional na rede, incluindo e-mails, apps e sites seguros.\n\nPara ver mais informações sobre os certificados, entre em contato com o administrador.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Sua atividade na rede, incluindo e-mails, apps e websites seguros, pode ser monitorada por terceiros.\n\nUma credencial confiável instalada no dispositivo permite isso."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Verificar certificado</item>
- <item quantity="other">Verificar certificados</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Confiar no certificado ou removê-lo}one{Confiar no certificado ou removê-lo}other{Confiar nos certificados ou removê-los}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Rede, números de série e outras informações"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Conectar"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Esquecer a rede"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Esta ação limpa as informações usadas para se conectar a esta rede, incluindo uma senha salva."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Leia o código QR no seu smartphone e siga as instruções para se conectar a uma rede Wi-Fi."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Leia o código QR em um smartphone e siga as instruções para se conectar a uma rede Wi-Fi.\n \n Em um "<b>"smartphone Android"</b>", acesse Configurações -> Rede e Internet -> Wi-Fi -> Selecionar Wi-Fi -> Avançado -> adicione o dispositivo e leia o código QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Pressione o botão \"Voltar\" para cancelar"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continuar"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Armazenamento do dispositivo"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Armazenamento removível"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Redefinir"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Liberar espaço de armazenamento"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Limpar os dados em cache"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Liberar <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Limpa os arquivos temporários que estão ocupando espaço. Esta ação não afetará dados, como as preferências de apps ou vídeos off-line, e você não precisará fazer login nos apps novamente."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Limpar os dados em cache?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Limpará os dados em cache de todos os apps."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Desinstalar apps"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Ativação de <xliff:g id="NAME">%1$s</xliff:g> concluída"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Falha ao montar <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Armazenamento USB reconectado"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Microfone"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Acesso ao microfone"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Acesso dos apps ao microfone"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Acesso ao microfone bloqueado"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Para desbloquear, mude a chave de privacidade do dispositivo para autorizar o acesso ao microfone."</string>
<string name="camera" msgid="1226671478936288283">"Câmera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Acesso à câmera"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Acesso dos apps à câmera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Acesso à câmera bloqueado"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Para desbloquear, mude a chave de privacidade do dispositivo para autorizar o acesso à câmera."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Acesso ao microfone: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Quando essa opção está ativada, todos os apps e serviços que têm permissão podem acessar qualquer microfone no dispositivo.\n\nOs periféricos de áudio com protocolo personalizado não são afetados."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Acesso à câmera: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Ciano"</string>
<string name="color_yellow" msgid="3519470952904560404">"Amarelo"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audiodescrição"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Ouça a descrição do que acontece na tela em filmes e programas com suporte"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Ativar"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuração"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Usar <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitoramento"</string>
<string name="system_apps" msgid="8481888654606868074">"Apps"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Permanecer ativo"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"A tela nunca vai entrar em suspensão"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Verificação HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Otimização para HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Reiniciar agora?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Desligar dispositivos HDMI com a TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Ligar automaticamente a TV"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Ligar a TV com o dispositivo HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Entradas conectadas</item>
- <item quantity="other">Entradas conectadas</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Entradas em espera</item>
- <item quantity="other">Entradas em espera</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Entradas não conectadas</item>
- <item quantity="other">Entradas não conectadas</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Entrada conectada}one{Entrada conectada}other{Entradas conectadas}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Entrada em espera}one{Entrada em espera}other{Entradas em espera}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Entrada não conectada}one{Entrada não conectada}other{Entradas não conectadas}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Restringir o acesso a apps e outros tipos de conteúdo em sua conta"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Perfil restrito"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controlado por <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Criar perfil restrito"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Configurações"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Apps permitidos"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d apps permitidos</item>
- <item quantity="other">%d apps permitidos</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Permitido"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Não permitido"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Personalizar restrições"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Fonte de terceiros"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Permissões"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"App indisponível"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Apps não usados"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirmar"</string>
<string name="settings_cancel" msgid="576094334743686152">"Cancelar"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Permite que um app modifique configurações do sistema."</string>
<string name="write_settings_on" msgid="71675710746513956">"Sim"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Não"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Acesso a todos os arquivos"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Acesso para gerenciar todos os arquivos"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Permitir que o app leia, modifique e exclua todos os arquivos deste dispositivo ou de qualquer volume de armazenamento conectado. Se a permissão for concedida, o app poderá acessar arquivos sem nenhum aviso prévio."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Permitir picture-in-picture"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Nenhum dos apps instalados é compatível com picture-in-picture"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Permite que apps abram uma janela picture-in-picture enquanto o app está aberto ou depois que você sai dele (por exemplo, para continuar a assistir um vídeo). Essa janela é sobreposta a outros apps que você esteja usando."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Permitir que apps definam alarmes e programem ações. Essa opção autoriza a execução de apps em segundo plano, o que pode consumir mais bateria.\n\nSe a permissão for desativada, os alarmes e eventos programados pelo app não funcionarão."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Ligar tela"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Permitir que a tela seja ligada"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Permitir que um app ligue a tela. Se permitido, o app vai poder ligar a tela a qualquer momento sem uma intent explícita."</string>
<string name="special_access" msgid="21806055758289916">"Acesso especial a apps"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Áudio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Economia de dados"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Ajusta automaticamente a qualidade de vídeo para usar menos dados móveis"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Alertas e uso de dados"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"É possível se conectar à Internet por Wi-Fi, Ethernet ou pelo ponto de acesso do smartphone. Para receber mais ajuda, acesse "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"É possível se conectar à Internet por Wi-Fi, Ethernet ou pelo ponto de acesso do smartphone."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Ação não permitida"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Não é possível alterar o volume"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Energia"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Comportamento ao ligar"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Reiniciar"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Código de pareamento Ethernet"</string>
</resources>
diff --git a/Settings/res/values-ro/strings.xml b/Settings/res/values-ro/strings.xml
index cd42a13..bd138f9 100644
--- a/Settings/res/values-ro/strings.xml
+++ b/Settings/res/values-ro/strings.xml
@@ -45,23 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Adăugați un cont"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Conturi și conectare"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Niciun cont"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> conturi</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> de conturi</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> cont</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# cont}few{# conturi}other{# de conturi}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Servicii media, Asistent, Plăți"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Rețea și internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Sunet"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplicații"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Preferințe privind dispozitivul"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Telecomenzi și accesorii"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Niciun dispozitiv Bluetooth conectat"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accesorii</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> de accesorii</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> accesoriu</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Afișare și sunet"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Ajutor și feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Confidențialitate"</string>
@@ -120,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Revenire la setările din fabrică"</string>
<string name="device_calibration" msgid="2907914144048739705">"Calibrare"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Economizor de energie"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Dispozitive"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Selectați formatele"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Sunet surround"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -187,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMATE ACTIVATE"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMATE DEZACTIVATE"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Pentru a dezactiva opțiunea, schimbați selecția pentru format la Manuală."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Rezoluție"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automată"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Rezoluția a fost schimbată"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Selectați OK pentru a folosi %1$s de acum înainte"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Anulați"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Ștergeți datele memorate în cache?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Datele din cache ale aplicațiilor vor fi șterse."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Adăugați un accesoriu"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Se asociază…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Se conectează…"</string>
@@ -226,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Accesorii"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Telecomandă"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Setări pentru telecomandă"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Configurați butoanele telecomenzii"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Controlați volumul, alimentarea și intrarea pentru televizoare, receivere și bare de sunet"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Conectați"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Conectați-vă la %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Deconectați"</string>
@@ -264,11 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Indisponibilă"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Aplicații pentru administratorul dispozitivului"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Nicio aplicație activă"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aplicații active</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> de aplicații active</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplicație activă</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Dezactivat de administrator, politica de criptare sau spațiul de stocare a certificatelor"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informații privind dispozitivul gestionat"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Modificări și setări gestionate de organizația dvs."</string>
@@ -286,20 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Nicio acțiune"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Aplicații instalate"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Numărul de aplicații este estimat. Este posibil ca acesta să nu includă aplicațiile instalate în afara Magazinului Play."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="few">Cel puțin <xliff:g id="COUNT_1">%d</xliff:g> aplicații</item>
- <item quantity="other">Cel puțin <xliff:g id="COUNT_1">%d</xliff:g> de aplicații</item>
- <item quantity="one">Cel puțin <xliff:g id="COUNT_0">%d</xliff:g> aplicație</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum # aplicație}few{Minimum # aplicații}other{Minimum # de aplicații}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Permisiuni pentru locație"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Permisiuni pentru microfon"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Permisiuni pentru camera foto"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Aplicații prestabilite"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aplicații</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> de aplicații</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplicație</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplicație}few{# aplicații}other{# de aplicații}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Tastatură prestabilită"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Setat la <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Rețeaua VPN activată permanent a fost activată"</string>
@@ -309,42 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Acreditări de încredere"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Acreditări de încredere în profilul personal"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Acreditări de încredere în profilul de serviciu"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="few">Cel puțin <xliff:g id="COUNT_1">%d</xliff:g> certificate CA</item>
- <item quantity="other">Cel puțin <xliff:g id="COUNT_1">%d</xliff:g> de certificate CA</item>
- <item quantity="one">Cel puțin <xliff:g id="COUNT_0">%d</xliff:g> certificat CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certificat CA}few{# certificate CA}other{# de certificate CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administratorul poate să blocheze dispozitivul și să reseteze parola"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administratorul poate să șteargă toate datele dispozitivului"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Încercări nereușite de introducere a parolei înainte de a șterge toate datele dispozitivului"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Încercări nereușite de introducere a parolei înainte de a șterge datele din profilul de serviciu"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> încercări</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> de încercări</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> încercare</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# încercare}few{# încercări}other{# de încercări}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Acest dispozitiv este gestionat de organizația dvs."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Acest dispozitiv este gestionat de <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Aflați mai multe"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="few">Aplicațiile Cameră foto</item>
- <item quantity="other">Aplicațiile Cameră foto</item>
- <item quantity="one">Aplicația Cameră foto</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Aplicația Cameră foto}few{Aplicațiile Cameră foto}other{Aplicațiile Cameră foto}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Aplicația Calendar"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplicația Agendă"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="few">Aplicațiile Client de e-mail</item>
- <item quantity="other">Aplicațiile Client de e-mail</item>
- <item quantity="one">Aplicația Client de e-mail</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Aplicația Client de e-mail}few{Aplicațiile Client de e-mail}other{Aplicațiile Client de e-mail}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Aplicația Harta"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="few">Aplicațiile Telefon</item>
- <item quantity="other">Aplicațiile Telefon</item>
- <item quantity="one">Aplicația Telefon</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Aplicația Telefon}few{Aplicațiile Telefon}other{Aplicațiile Telefon}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Aplicația browser"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -363,11 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Versiunea SO Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Număr de serie"</string>
<string name="about_build" msgid="8467840394761634575">"Versiunea SO Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="few">Mai aveți <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> pași pentru a deveni dezvoltator</item>
- <item quantity="other">Mai aveți <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> de pași pentru a deveni dezvoltator</item>
- <item quantity="one">Mai aveți <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> pas pentru a deveni dezvoltator</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Anunțuri"</string>
<string name="ads_description" msgid="8081069475265061074">"Gestionați setările pentru anunțuri, de exemplu, resetați ID-ul publicitar."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Anunțuri, Gestionați setările pentru anunțuri, de exemplu, resetați ID-ul publicitar."</string>
@@ -381,27 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Actualizări de sistem suplimentare"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Rețeaua poate fi monitorizată"</string>
<string name="done_button" msgid="616159688526431451">"Terminat"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="few">Setați ca fiind de încredere sau eliminați certificatele</item>
- <item quantity="other">Setați ca fiind de încredere sau eliminați certificatele</item>
- <item quantity="one">Setați ca fiind de încredere sau eliminați certificatul</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="few"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a instalat autorități de certificare pe dispozitivul dvs., ceea ce le poate permite să monitorizeze activitatea în rețeaua dispozitivului, inclusiv e-mailurile, aplicațiile și site-urile securizate.\n\nPentru mai multe informații despre aceste certificate, contactați administratorul.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a instalat autorități de certificare pe dispozitivul dvs., ceea ce le poate permite să monitorizeze activitatea în rețeaua dispozitivului, inclusiv e-mailurile, aplicațiile și site-urile securizate.\n\nPentru mai multe informații despre aceste certificate, contactați administratorul.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> a instalat o autoritate de certificare pe dispozitivul dvs., ceea ce îi poate permite să monitorizeze activitatea în rețeaua dispozitivului, inclusiv e-mailurile, aplicațiile și site-urile securizate.\n\nPentru mai multe informații despre acest certificat, contactați administratorul.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="few"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a instalat autorități de certificare pentru profilul dvs. de serviciu, ceea ce le poate permite să monitorizeze activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile securizate.\n\nPentru mai multe informații despre aceste certificate, contactați administratorul.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> a instalat autorități de certificare pentru profilul dvs. de serviciu, ceea ce le poate permite să monitorizeze activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile securizate.\n\nPentru mai multe informații despre aceste certificate, contactați administratorul.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> a instalat o autoritate de certificare pentru profilul dvs. de serviciu, ceea ce îi poate permite să monitorizeze activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile securizate.\n\nPentru mai multe informații despre acest certificat, contactați administratorul.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"O terță parte vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile securizate.\n\nAcest lucru este posibil datorită unui certificat de încredere instalat pe dispozitivul dvs."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="few">Verificați certificatele</item>
- <item quantity="other">Verificați certificatele</item>
- <item quantity="one">Verificați certificatul</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Setați ca fiind de încredere sau eliminați certificatul}few{Setați ca fiind de încredere sau eliminați certificatele}other{Setați ca fiind de încredere sau eliminați certificatele}}"</string>
<string name="device_status" msgid="8266002761193692207">"Stare"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Rețea, numere de serie și alte informații"</string>
<string name="manual" msgid="5683935624321864999">"Manual"</string>
@@ -493,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Conectați-vă"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Eliminați rețeaua"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Vor fi șterse informațiile utilizate pentru conectarea la această rețea, inclusiv parolele salvate"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Conectați-vă la o rețea Wi-Fi scanând codul QR de pe telefonul mobil și urmați instrucțiunile."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Conectați-vă la o rețea Wi-Fi scanând codul QR de pe telefonul mobil și urmați instrucțiunile.\n \n Pe un "<b>"telefon Android"</b>", accesați Setări -> Rețea și internet -> Wi-Fi -> Selectați o rețea Wi-Fi -> Avansat -> Adăugați dispozitivul și scanați codul QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Apăsați butonul Înapoi pentru a anula"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Continuați"</string>
@@ -562,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Stocare pe dispozitiv"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Stocare amovibilă"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Resetați"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Eliberați spațiu de stocare"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Ștergeți datele memorate în cache"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Eliberați <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Șterge fișierele temporare care ocupă spațiu. Nu va afecta datele salvate, precum preferințele din aplicații sau videoclipurile offline; nu va trebui să vă conectați din nou la aplicații."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Ștergeți datele memorate în cache?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Datele din cache ale aplicațiilor se vor șterge."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Dezinstalați aplicațiile"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> s-a montat"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> nu s-a putut monta"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Stocarea USB a fost reconectată"</string>
@@ -639,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Microfon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Acces la microfon"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Accesul aplicațiilor la microfon"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Accesul la microfon este blocat"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Pentru deblocare, deplasați comutatorul de confidențialitate de pe dispozitiv în poziția Microfon activat pentru a permite accesul la microfon."</string>
<string name="camera" msgid="1226671478936288283">"Cameră"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Acces la cameră"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Accesul aplicațiilor la cameră"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Accesul la camera foto este blocat"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Pentru deblocare, deplasați comutatorul de confidențialitate de pe dispozitiv în poziția Cameră foto activată, pentru a permite accesul la cameră."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Acces la microfon: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Când opțiunea este activată, toate aplicațiile și serviciile care au permisiunea respectivă pot accesa orice microfon asociat acestui dispozitiv.\n\nPerifericele audio cu protocol personalizat nu vor fi afectate de această setare."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Acces la cameră: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -713,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Galben"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Descriere audio"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Auziți o descriere a conținutului de pe ecran în filmele și serialele acceptate"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Activați"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configurare"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Utilizați <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -733,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitorizare"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplicații"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Activ permanent"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Ecranul nu va deveni niciodată inactiv"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Verificare HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Optimizare HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Reporniți acum?"</string>
@@ -853,21 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Închideți dispozitivele HDMI cu televizorul"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Deschidere automată TV"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Deschideți televizorul cu dispozitivul HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="few">Intrări conectate</item>
- <item quantity="other">Intrări conectate</item>
- <item quantity="one">Intrare conectată</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="few">Intrări în standby</item>
- <item quantity="other">Intrări în standby</item>
- <item quantity="one">Intrare în standby</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="few">Intrări neconectate</item>
- <item quantity="other">Intrări neconectate</item>
- <item quantity="one">Intrare neconectată</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Intrare conectată}few{Intrări conectate}other{Intrări conectate}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Intrare în standby}few{Intrări în standby}other{Intrări în standby}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Intrare neconectată}few{Intrări neconectate}other{Intrări neconectate}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Restricționați accesul la aplicații și la alte tipuri de conținut din contul dvs."</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Profil cu acces limitat"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Controlate de <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -881,11 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Creați un profil cu acces limitat"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Setări"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Aplicații permise"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="few">%d aplicații permise</item>
- <item quantity="other">%d de aplicații permise</item>
- <item quantity="one">O aplicație permisă</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Permis"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Nepermis"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Personalizați restricții"</string>
@@ -930,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Sursă terță parte"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Permisiuni"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplicația nu este disponibilă"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Aplicații nefolosite"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Confirmați"</string>
<string name="settings_cancel" msgid="576094334743686152">"Anulați"</string>
@@ -1013,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Având această permisiune, o aplicație poate să modifice setările de sistem."</string>
<string name="write_settings_on" msgid="71675710746513956">"Da"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Nu"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Acces la toate fișierele"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Permiteți gestionarea fișierelor"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Permiteți aplicației să citească, să modifice și să șteargă toate fișierele de pe dispozitiv sau din spațiile de stocare conectate. Dacă îi permiteți, aplicația poate accesa fișierele fără consimțământul dvs. explicit."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Permiteți modul picture-in-picture"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Niciuna dintre aplicațiile instalate nu acceptă picture-in-picture"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Permiteți aplicațiilor să creeze o fereastră picture-in-picture în timp ce aplicația este deschisă sau după ce ieșiți (de exemplu, pentru a continua vizionarea unui videoclip). Această fereastră se afișează peste alte aplicații pe care le folosiți."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Permiteți aplicațiilor să stabilească alarme și să planifice acțiuni dependente de timp. Astfel, aplicațiile pot să ruleze în fundal, fapt care ar putea consuma mai multă baterie.\n\nDacă permisiunea este dezactivată, alarmele și evenimentele dependente de timp planificate de aplicații nu vor funcționa."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Activați ecranul"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Permiteți activarea ecranului"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Permiteți unei aplicații să activeze ecranul. Dacă acordați permisiunea, aplicația poate să activeze oricând ecranul, fără intenția dvs. explicită."</string>
<string name="special_access" msgid="21806055758289916">"Acces special pentru aplicații"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1034,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Economizor de date"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Ajustează automat calitatea video pentru a folosi mai puține date mobile"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Utilizarea datelor și alerte"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Puteți să vă conectați la internet prin Wi-Fi, Ethernet sau hotspotul telefonului. Pentru ajutor suplimentar, accesați "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Puteți să vă conectați la internet prin Wi-Fi, Ethernet sau hotspotul telefonului."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Acțiunea nu este permisă"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Nu se poate modifica volumul"</string>
@@ -1084,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Alimentare și energie"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Comportament la pornire"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Resetați"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Codul de conectare prin Ethernet"</string>
</resources>
diff --git a/Settings/res/values-ru/strings.xml b/Settings/res/values-ru/strings.xml
index e31fc0e..9c7709a 100644
--- a/Settings/res/values-ru/strings.xml
+++ b/Settings/res/values-ru/strings.xml
@@ -45,25 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Добавьте аккаунт"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Аккаунты и вход"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Нет аккаунтов"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> аккаунт</item>
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> аккаунта</item>
- <item quantity="many"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> аккаунтов</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> аккаунта</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# аккаунт}one{# аккаунт}few{# аккаунта}many{# аккаунтов}other{# аккаунта}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Медиасервисы, Ассистент, платежные данные"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Сеть и интернет"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Звук"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Приложения"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Настройки устройства"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Пульты и аксессуары"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Нет подключенных устройств Bluetooth"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> устройство</item>
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> устройства</item>
- <item quantity="many"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> устройств</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> устройства</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Экран и звук"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Справка/отзыв"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Конфиденциальность"</string>
@@ -122,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Сброс настроек"</string>
<string name="device_calibration" msgid="2907914144048739705">"Калибровка"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Режим энергосбережения"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Устройства"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Выбор форматов"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Объемный звук"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -189,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ВКЛЮЧЕННЫЕ ФОРМАТЫ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ОТКЛЮЧЕННЫЕ ФОРМАТЫ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Чтобы отключить эту функцию, выберите параметр \"Вручную\"."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Разрешение"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Автоматически"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Разрешение изменено"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Нажмите ОК, чтобы использовать разрешение %1$s."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Отмена"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ОК"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Гц"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Очистить кеш?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Будут удалены данные всех приложений."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Добавить устройство"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Подключение…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Подключение…"</string>
@@ -228,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Аксессуары"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Пульт ДУ"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Настройки пульта ДУ"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Настройка кнопок на пульте ДУ"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Управляйте громкостью и питанием, а также выбирайте источники сигнала на телевизорах, ресиверах и саундбарах"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Подключить"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Подключиться к этому устройству: %1$s?"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Отключить"</string>
@@ -266,12 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Недоступно"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Приложения администратора устройства"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Нет активных приложений"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Запрещено администратором или иными правилами"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Информация об управляемом устройстве"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Изменения и настройки, управляемые организацией"</string>
@@ -289,22 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Нет"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Установленные приложения"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Количество приложений является приблизительным и может не включать установки вне Google Play"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Как минимум # приложение}one{Как минимум # приложение}few{Как минимум # приложения}many{Как минимум # приложений}other{Как минимум # приложения}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Доступ к геоданным"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Доступ к микрофону"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Доступ к камере"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Приложения по умолчанию"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# приложение}one{# приложение}few{# приложения}many{# приложений}other{# приложения}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Клавиатура по умолчанию"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Постоянная VPN включена"</string>
@@ -314,47 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Надежные сертификаты"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Надежные сертификаты в персональном профиле"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Надежные сертификаты в рабочем профиле"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <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="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# сертификат ЦС}one{# сертификат ЦС}few{# сертификата ЦС}many{# сертификатов ЦС}other{# сертификата ЦС}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Администратор может заблокировать устройство и сбросить пароль"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Администратор может удалить все данные с устройства"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Количество неудачных попыток ввода пароля, после которого данные на устройстве будут удалены"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Количество неудачных попыток ввода пароля, после которого данные рабочего профиля будут удалены"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# попытка}one{# попытка}few{# попытки}many{# попыток}other{# попытки}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Этим устройством управляет ваша организация."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Этим устройством управляет <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Подробнее"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Приложения для камеры</item>
- <item quantity="few">Приложения для камеры</item>
- <item quantity="many">Приложения для камеры</item>
- <item quantity="other">Приложения для камеры</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Приложение камеры}one{Приложения камеры}few{Приложения камеры}many{Приложения камеры}other{Приложения камеры}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Календарь"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Контакты"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Почтовые клиенты</item>
- <item quantity="few">Почтовые клиенты</item>
- <item quantity="many">Почтовые клиенты</item>
- <item quantity="other">Почтовые клиенты</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Почтовый клиент}one{Почтовые клиенты}few{Почтовые клиенты}many{Почтовые клиенты}other{Почтовые клиенты}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Карты"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Приложения для звонков</item>
- <item quantity="few">Приложения для звонков</item>
- <item quantity="many">Приложения для звонков</item>
- <item quantity="other">Приложения для звонков</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Приложение для звонков}one{Приложения для звонков}few{Приложения для звонков}many{Приложения для звонков}other{Приложения для звонков}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Браузер"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g> и <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g> и <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -373,12 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Версия ОС Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Серийный номер"</string>
<string name="about_build" msgid="8467840394761634575">"Сборка ОС Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{Вы почти у цели. Остался # шаг.}one{Вы почти у цели. Остался # шаг.}few{Вы почти у цели. Осталось # шага.}many{Вы почти у цели. Осталось # шагов.}other{Вы почти у цели. Осталось # шага.}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Реклама"</string>
<string name="ads_description" msgid="8081069475265061074">"Управление настройками (например, сброс рекламного идентификатора)."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Реклама, управление настройками, такими как сброс рекламного идентификатора."</string>
@@ -392,31 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Доп. обновления системы"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Сеть может отслеживаться"</string>
<string name="done_button" msgid="616159688526431451">"Готово"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Одобрите или удалите сертификаты</item>
- <item quantity="few">Одобрите или удалите сертификаты</item>
- <item quantity="many">Одобрите или удалите сертификаты</item>
- <item quantity="other">Одобрите или удалите сертификаты</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one">Администратор домена <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установил на ваше устройство сертификаты ЦС. Это позволяет ему отслеживать ваши действия в рабочей сети, включая использование электронной почты и приложений, а также просмотр защищенных сайтов.\n\nЗа дополнительной информацией обращайтесь к администратору.</item>
- <item quantity="few">Администратор домена <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установил на ваше устройство сертификаты ЦС. Это позволяет ему отслеживать ваши действия в рабочей сети, включая использование электронной почты и приложений, а также просмотр защищенных сайтов.\n\nЗа дополнительной информацией обращайтесь к администратору.</item>
- <item quantity="many">Администратор домена <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установил на ваше устройство сертификаты ЦС. Это позволяет ему отслеживать ваши действия в рабочей сети, включая использование электронной почты и приложений, а также просмотр защищенных сайтов.\n\nЗа дополнительной информацией обращайтесь к администратору.</item>
- <item quantity="other">Администратор домена <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установил на ваше устройство сертификаты ЦС. Это позволяет ему отслеживать ваши действия в рабочей сети, включая использование электронной почты и приложений, а также просмотр защищенных сайтов.\n\nЗа дополнительной информацией обращайтесь к администратору.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one">Администратор домена <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установил сертификаты ЦС для вашего рабочего профиля. Это позволяет ему отслеживать ваши действия в рабочей сети, включая использование электронной почты и приложений, а также просмотр защищенных сайтов.\n\nЗа дополнительной информацией обращайтесь к администратору.</item>
- <item quantity="few">Администратор домена <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установил сертификаты ЦС для вашего рабочего профиля. Это позволяет ему отслеживать ваши действия в рабочей сети, включая использование электронной почты и приложений, а также просмотр защищенных сайтов.\n\nЗа дополнительной информацией обращайтесь к администратору.</item>
- <item quantity="many">Администратор домена <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установил сертификаты ЦС для вашего рабочего профиля. Это позволяет ему отслеживать ваши действия в рабочей сети, включая использование электронной почты и приложений, а также просмотр защищенных сайтов.\n\nЗа дополнительной информацией обращайтесь к администратору.</item>
- <item quantity="other">Администратор домена <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установил сертификаты ЦС для вашего рабочего профиля. Это позволяет ему отслеживать ваши действия в рабочей сети, включая использование электронной почты и приложений, а также просмотр защищенных сайтов.\n\nЗа дополнительной информацией обращайтесь к администратору.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Третья сторона может отслеживать ваши действия в сети. (например, просматривать ваши письма, приложения и список посещенных сайтов).\n\nЭто возможно благодаря надежному сертификату, установленному на устройстве."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Проверить сертификаты</item>
- <item quantity="few">Проверить сертификаты</item>
- <item quantity="many">Проверить сертификаты</item>
- <item quantity="other">Проверить сертификаты</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Одобрите или удалите сертификат}one{Одобрите или удалите сертификаты}few{Одобрите или удалите сертификаты}many{Одобрите или удалите сертификаты}other{Одобрите или удалите сертификаты}}"</string>
<string name="device_status" msgid="8266002761193692207">"Статус"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Сеть, серийные номера и другие сведения"</string>
<string name="manual" msgid="5683935624321864999">"Руководство"</string>
@@ -508,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Подключиться"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Удалить эту сеть"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Данные, которые использовались для подключения к этой сети (включая пароль), будут удалены"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Чтобы подключиться к сети Wi-Fi, отсканируйте QR-код с помощью телефона и следуйте инструкциям на экране."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Чтобы подключиться к сети Wi-Fi, отсканируйте QR-код с помощью мобильного телефона и следуйте инструкциям на экране.\n \n На "<b>"телефоне Android"</b>" нажмите \"Настройки -> Сеть и Интернет -> Wi-Fi\" -> выберите сеть Wi-Fi -> \"Дополнительные функции -> Добавить устройство\" и отсканируйте QR-код."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Чтобы отменить действие, нажмите кнопку \"Назад\"."</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ОК"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Далее"</string>
@@ -577,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Хранилище устройства"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Съемный накопитель"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Сброс"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Освободите место в хранилище"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Очистите кеш"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Освободите <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Будут удалены временные файлы, которые занимают место. Это не затронет сохраненные данные, например настройки приложений и скачанные видео. Входить в приложения заново не придется."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Очистить кеш?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Будут удалены кешированные данные всех приложений."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Удалите некоторые приложения"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Подключено: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Ошибка подключения: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB-накопитель снова подключен"</string>
@@ -654,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Микрофон"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Доступ к микрофону"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Доступ приложений к микрофону"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Доступ к микрофону заблокирован"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Чтобы открыть доступ к микрофону, переместите переключатель конфиденциальности на устройстве в положение включения микрофона."</string>
<string name="camera" msgid="1226671478936288283">"Камера"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Доступ к камере"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Доступ приложений к камере"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Доступ к камере заблокирован"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Чтобы открыть доступ к камере, переместите переключатель конфиденциальности на устройстве в положение включения камеры."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Доступ к микрофону: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Если этот параметр включен, все приложения и сервисы, имеющие разрешение, могут использовать любой микрофон на этом устройстве.\n\nЭта настройка не затрагивает периферийные аудиоустройства с пользовательским протоколом."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Доступ к камере: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -728,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Голубой"</string>
<string name="color_yellow" msgid="3519470952904560404">"Желтый"</string>
<string name="color_magenta" msgid="2377854703399624607">"Пурпурный"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Аудиодескрипция"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Аудиосопровождение в фильмах и сериалах поможет вам понять, что происходит на экране"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Включить"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Конфигурация"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Включить <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -748,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Отслеживание"</string>
<string name="system_apps" msgid="8481888654606868074">"Приложения"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Оставить включенным"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Экран не будет переходить в спящий режим"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Проверка HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI-оптимизация"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Перезагрузить устройство?"</string>
@@ -868,24 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Отключать HDMI-устройства вместе с телевизором"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Автомат. включать телевизор"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Автом. включать телевизор с HDMI-устройством"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Подключенные входы</item>
- <item quantity="few">Подключенные входы</item>
- <item quantity="many">Подключенные входы</item>
- <item quantity="other">Подключенные входы</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Резервные входы</item>
- <item quantity="few">Резервные входы</item>
- <item quantity="many">Резервные входы</item>
- <item quantity="other">Резервные входы</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Отключенные входы</item>
- <item quantity="few">Отключенные входы</item>
- <item quantity="many">Отключенные входы</item>
- <item quantity="other">Отключенные входы</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Подключенный вход}one{Подключенные входы}few{Подключенные входы}many{Подключенные входы}other{Подключенные входы}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Резервный вход}one{Резервные входы}few{Резервные входы}many{Резервные входы}other{Резервные входы}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Отключенный вход}one{Отключенные входы}few{Отключенные входы}many{Отключенные входы}other{Отключенные входы}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Ограничить доступ к приложениям и другому контенту в аккаунте"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Профиль с ограничен. доступом"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Под управлением приложения \"<xliff:g id="APP">%1$s</xliff:g>\""</string>
@@ -899,12 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Создать профиль с ограниченным доступом"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Настройки"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Разрешенные приложения"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">Разрешено %d приложение</item>
- <item quantity="few">Разрешены %d приложения</item>
- <item quantity="many">Разрешено %d приложений</item>
- <item quantity="other">Разрешены %d приложения</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Разрешено"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Запрещено"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Установить ограничения"</string>
@@ -949,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Сторонний источник"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Разрешения"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Приложение недоступно"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Неиспользуемые приложения"</string>
<string name="settings_ok" msgid="5950888975075541964">"ОК"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Подтвердить"</string>
<string name="settings_cancel" msgid="576094334743686152">"Отмена"</string>
@@ -1032,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Приложение сможет изменять системные настройки."</string>
<string name="write_settings_on" msgid="71675710746513956">"Да"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Нет"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Доступ ко всем файлам"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Разрешить доступ к управлению всеми файлами"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Приложение сможет читать, изменять и удалять все файлы на этом устройстве и любых подключенных носителях. Доступ к файлам будет осуществляться без дополнительного уведомления."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Картинка в картинке"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Картинка в картинке"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Установленные приложения не поддерживают режим \"Картинка в картинке\"."</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Когда приложение открыто или когда вы выходите из него, оно может создавать окно \"Картинка в картинке\". Так вы можете, например, продолжить просмотр видео. Это окно отображается поверх остальных приложений."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Если вы разрешите приложениям устанавливать будильники и планировать на определенное время действия, то эти приложения будут работать в фоновом режиме. В таком случае заряд батареи может расходоваться быстрее.\n\nЕсли отключить эту настройку, текущие будильники и созданные приложением мероприятия перестанут запускаться."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Включение экрана"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Разрешить приложению включать экран"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Приложение сможет в любое время включать экран без явного согласия с вашей стороны"</string>
<string name="special_access" msgid="21806055758289916">"Специальный доступ"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Аудио"</string>
@@ -1053,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Экономия трафика"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Автоматически изменять качество видео для экономии трафика"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Передача данных и оповещения"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Вы можете подключить устройство к Интернету с помощью Wi-Fi, сети Ethernet или точки доступа на телефоне. Узнайте больше на странице "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Вы можете подключить устройство к интернету с помощью Wi-Fi, сети Ethernet или точки доступа на телефоне"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Действие запрещено"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Невозможно изменить громкость"</string>
@@ -1103,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Питание и энергопотребление"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Состояние при включении"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Сброс"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Код подключения к Ethernet"</string>
</resources>
diff --git a/Settings/res/values-si/strings.xml b/Settings/res/values-si/strings.xml
index a60901d..919ebec 100644
--- a/Settings/res/values-si/strings.xml
+++ b/Settings/res/values-si/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"ගිණුමක් එක් කරන්න"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"ගිණුම් සහ පුරනය වීම"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"ගිණුම් නොමැත"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one">ගිණුම් <xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g></item>
- <item quantity="other">ගිණුම් <xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g></item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{ගිණුම් #}one{ගිණුම් #}other{ගිණුම් #}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"මාධ්ය සේවා, සහකරු, ගෙවීම්"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"ජාලය සහ අන්තර්ජාලය"</string>
<string name="sound_category_title" msgid="7899816751041939518">"හඬ"</string>
<string name="applications_category_title" msgid="7112019490898586223">"යෙදුම්"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"උපාංග අභිරුචි"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"දුරස්ථ පාලක සහ අමතර උපාංග"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"සම්බන්ධිත බ්ලූටූත් උපාංග නොමැත"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one">ආයිත්තම් <xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g></item>
- <item quantity="other">ආයිත්තම් <xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g></item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"සංදර්ශකය හා ශබ්දය"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"උදවු සහ ප්රතිපෝෂණය"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"පෞද්ගලිකත්වය"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"කර්මාන්ත ශාලා දත්ත යළි සැකසීම"</string>
<string name="device_calibration" msgid="2907914144048739705">"ක්රමාංකණය"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"බලශක්ති සුරැකුම"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"උපාංග"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ආකෘති තෝරන්න"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"වට ශබ්දය"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"ඩොල්බි ඩිජිටල්"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"සබල කළ ආකෘති"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"අබල කළ ආකෘති"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"අබල කිරීමට, ආකෘතිය තේරීම හස්තීය ලෙස වෙනස් කරන්න."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"විභේදනය"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"ස්වයංක්රිය"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"විභේදනය වෙනස් කර ඇත"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"දැන් සිට %1$s භාවිත කිරීමට හරි තෝරන්න."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"අවලංගු කරන්න"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"හරි"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"හැඹිලිගත කළ දත්ත හිස් කරන්න ද?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"මෙය සියලුම යෙදුම් සඳහා හැඹිලිගත කළ දත්ත හිස් කරනු ඇත."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"උපකරණය එකතු කරන්න"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"යුගල කරමින්…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"සම්බන්ධ වෙමින්…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"අමතර උපාංග"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"දුරස්ථ පාලකය"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"දුරස්ථ පාලක සැකසීම්"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"දුරස්ථ පාලක බොත්තම් පිහිටුවන්න"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"TV, ග්රාහක සහ හඬ තීරුවල හඬ පරිමාව, බලය, ආදානය පාලනය කරන්න"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"සම්බන්ධ වන්න"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s වෙත සම්බන්ධ වන්න"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"විසන්ධි කරන්න"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"නොමැත"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"උපාංග පරිපාලක යෙදුම්"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"ක්රියාකාරී යෙදුම් නොමැත"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"පරිපාලකයා, සංකේතන ප්රතිපත්තිය, හෝ අක්තපත්ර ආචයනය මඟින් අබල කර ඇත"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"කළමනාකරණය කළ උපාංග තොරතුරු"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"ඔබගේ සංවිධානය විසින් වෙනස් කිරීම් සහ සැකසීම් කළමනාකරණය කරනු ලැබේ"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"කිසිවක් නැත"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"ස්ථාපනය කළ යෙදුම්"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"යෙදුම් ගණන ඇස්තමේන්තු කර ඇත. එයට Play Store වෙතින් පිටත ස්ථාපනය කර ඇති යෙදුම් අඩංගු නොවිය හැකිය."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{අඩුම වශයෙන් යෙදුම් #}one{අඩුම වශයෙන් යෙදුම් #}other{අඩුම වශයෙන් යෙදුම් #}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"ස්ථාන අවසර"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"මයික්රොෆෝන අවසර"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"කැමරා අවසර"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"පෙරනිමි යෙදුම්"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{යෙදුම් #}one{යෙදුම් #}other{යෙදුම් #}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"පෙරනිමි යතුරු පුවරුව"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> වෙත සකසන්න"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"සැම විට ක්රියාත්මක VPN ක්රියාත්මකයි"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"විශ්වාසි අක්තපත්ර"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"ඔබගේ පුද්ගලික පැතිකඩෙහි විශ්වාසී අක්තපත්ර"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"ඔබගේ වැඩ පැතිකඩෙහි විශ්වාසී අක්තපත්ර"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">අඩුම වශයෙන් CA සහතික <xliff:g id="COUNT_1">%d</xliff:g>ක්</item>
- <item quantity="other">අඩුම වශයෙන් CA සහතික <xliff:g id="COUNT_1">%d</xliff:g>ක්</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{CA සහතික #}one{CA සහතික #}other{CA සහතික #}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"පරිපාලකට උපාංගය අගුලු දැමීමට සහ මුරපදය යළි සැකසීමට හැකිය"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"පරිපාලකට සියලු උපාංග දත්ත මැකීමට හැකිය"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"සියලු උපාංග දත්ත මකාදැමීමට පෙර අසාර්ථක මුරපද උත්සහ"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"කාර්යාල පැතිකඩ දත්ත මකාදැමීමට පෙර අසාර්ථක මුරපද උත්සහ"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{උත්සාහයන් #}one{උත්සාහයන් #}other{උත්සාහයන් #}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"මෙම උපාංගය ඔබගේ සංවිධානය විසින් කළමනාකරණය කරනු ලැබේ."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"මෙම උපාංගය <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> මගින් කළමනාකරණය කෙරේ"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"තව දැන ගන්න"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">කැමරා යෙදුම්</item>
- <item quantity="other">කැමරා යෙදුම්</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{කැමරා යෙදුම}one{කැමරා යෙදුම්}other{කැමරා යෙදුම්}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"දින දර්ශන යෙදුම"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"සම්බන්ධතා යෙදුම"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">ඉ-තැපැල් සේවාලාභී යෙදුම්</item>
- <item quantity="other">ඉ-තැපැල් සේවාලාභී යෙදුම්</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ඉ-තැපැල් සේවාලාභී යෙදුම}one{ඉ-තැපැල් සේවාලාභී යෙදුම්}other{ඉ-තැපැල් සේවාලාභී යෙදුම්}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"සිතියම් යෙදුම"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">දුරකථන යෙදුම්</item>
- <item quantity="other">දුරකථන යෙදුම්</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{දුරකථන යෙදුම}one{දුරකථන යෙදුම්}other{දුරකථන යෙදුම්}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"බ්රව්සර යෙදුම"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS අනුවාදය"</string>
<string name="about_serial" msgid="3432319328808745459">"අනුක්රමාංකය"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS තැනුම"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{ඔබට දැන් සංවර්ධකයෙක් වීමට ඇත්තේ පියවර #කි}one{ඔබට දැන් සංවර්ධකයෙක් වීමට ඇත්තේ පියවර #කි}other{ඔබට දැන් සංවර්ධකයෙක් වීමට ඇත්තේ පියවර #කි}}"</string>
<string name="about_ads" msgid="7662896442040086522">"දැන්වීම්"</string>
<string name="ads_description" msgid="8081069475265061074">"ප්රචාරණ ID යළි සැකසීම වැනි දැන්වීම් සැකසීම් කළම."</string>
<string name="ads_content_description" msgid="1006489792324920289">"වෙළඳ දැන්වීම්, ප්රචාරණ ID යළි සැකසීම වැනි, ඔබගේ වෙළඳ දැන්වීම් සැකසීම් කළමනාකරණය කරයි."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"අමතර පද්ධති යාවත්කාල කිරීම්"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"ඇතැම් විට ජාලය නිරීක්ෂණය විය හැක"</string>
<string name="done_button" msgid="616159688526431451">"අවසන්"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">සහතික විශ්වාස කරන්න හෝ ඉවත් කරන්න</item>
- <item quantity="other">සහතික විශ්වාස කරන්න හෝ ඉවත් කරන්න</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ඔබගේ උපාංගයෙහි සහතික අධිකාරීන් ස්ථාපනය කර ඇත, එය ඔවුන්ට ඉ-තැපැල්, යෙදුම් සහ ආරක්ෂිත වෙබ් අඩවි ඇතුළු, කාර්යාල ජාල ක්රියාකාරකම් නිරීක්ෂණය කිරීමට ඉඩ දිය හැකිය.\n\nමෙම සහතික පිළිබඳ වැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ඔබගේ උපාංගයෙහි සහතික අධිකාරීන් ස්ථාපනය කර ඇත, එය ඔවුන්ට ඉ-තැපැල්, යෙදුම් සහ ආරක්ෂිත වෙබ් අඩවි ඇතුළු, කාර්යාල ජාල ක්රියාකාරකම් නිරීක්ෂණය කිරීමට ඉඩ දිය හැකිය.\n\nමෙම සහතික පිළිබඳ වැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ඔබගේ කාර්යාල පැතිකඩ සඳහා සහතික අධිකාරීන් ස්ථාපනය කර ඇත, එය ඔවුන්ට ඉ-තැපැල්, යෙදුම් සහ ආරක්ෂිත වෙබ් අඩවි ඇතුළු, කාර්යාල ජාල ක්රියාකාරකම් නිරීක්ෂණය කිරීමට ඉඩ දිය හැකිය.\n\nමෙම සහතික පිළිබඳ වැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ඔබගේ කාර්යාල පැතිකඩ සඳහා සහතික අධිකාරීන් ස්ථාපනය කර ඇත, එය ඔවුන්ට ඉ-තැපැල්, යෙදුම් සහ ආරක්ෂිත වෙබ් අඩවි ඇතුළු, කාර්යාල ජාල ක්රියාකාරකම් නිරීක්ෂණය කිරීමට ඉඩ දිය හැකිය.\n\nමෙම සහතික පිළිබඳ වැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"ඊ-තැපැල්, යෙදුම්, සහ ආරක්ෂිත වෙබ් අඩවි ඇතුලත්ව ඔබේ ජාල ක්රියාකාරකම්, අධීක්ෂණය කිරීමට තෙවන පාර්ශවයට ඇත.\n\nඔබගේ උපාංගයේ ස්ථාපිත විශ්වාසී අක්තපත්ර මෙය සිදුවීම කරයි."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">සහතික පරීක්ෂා කරන්න</item>
- <item quantity="other">සහතික පරීක්ෂා කරන්න</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{සහතිකය විශ්වාස කරන්න හෝ ඉවත් කරන්න}one{සහතික විශ්වාස කරන්න හෝ ඉවත් කරන්න}other{සහතික විශ්වාස කරන්න හෝ ඉවත් කරන්න}}"</string>
<string name="device_status" msgid="8266002761193692207">"තත්ත්වය"</string>
<string name="device_status_summary" msgid="3270932829412434985">"ජාලය, අනුක්රමික අංක සහ වෙනත් තොරතුරු"</string>
<string name="manual" msgid="5683935624321864999">"අත්පොත"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"සම්බන්ධ කරන්න"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"ජාලය අමතක කරන්න"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"සුරකින ලද මුරපදය ඇතුළත්ව, මෙම ජාලයට සම්බන්ධ වීමට භාවිතා කළ තොරතුරු සියල්ල මෙය ඉවත් කරයි"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"ඔබගේ ජංගම දුරකථනයෙන් QR කේතය ස්කෑන් කිරීමෙන් Wi-Fi වෙත සම්බන්ධ වී උපදෙස් අනුගමනය කරන්න."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" ජංගම දුරකථනයකින් QR කේතය ස්කෑන් කිරීමෙන් Wi-Fi වෙත සම්බන්ධ වී උපදෙස් අනුගමනය කරන්න.\n \n "<b>"Android දුරකථනයකින්"</b>" සැකසීම් -> ජාලය සහ අන්තර්ජාලය -> Wi-Fi -> වෙත ගොස් Wi-Fi -> උසස් -> තෝරා උපාංගය එක් කර අනතුරුව QR කේතය ස්කෑන් කරන්න."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"අවලංගු කිරීමට ආපසු බොත්තම ඔබන්න"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"හරි"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"ඉදිරියට යන්න"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"උපාංග ගබඩාව"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"ඉවත් කළ හැකි ගබඩාව"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"යළි පිහිටුවන්න"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"ගබඩාව නිදහස් කර ගන්න"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"හැඹිලිගත කළ දත්ත හිස් කරන්න"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> නිදහස් කරන්න"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"ඉඩ ලබා ගන්නා තාවකාලික ගොනු හිස් කරයි. යෙදුම් මනාප හෝ නොබැඳි වීඩියෝ වැනි සුරැකි දත්තවලට බලපෑමක් සිදු නොවනු ඇති අතර, ඔබට නැවත යෙදුම්වලට පිරීම අවශ්ය නොවනු ඇත."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"හැඹිලිගත කළ දත්ත හිස් කරන්නද?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"මෙය සියලු යෙදුම් සඳහා හැඹිලිගත දත්ත හිස් කරනු ඇත."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"යෙදුම් අස්ථාපනය කරන්න"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> සවි කරන ලදි"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> සවි කිරීමට නොහැකි විය"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB ගබඩාව යළි සබඳින ලදී"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"මයික්රෆෝනය"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"මයික්රෆෝන ප්රවේශය"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"මයික්රෆෝනයට යෙදුම් ප්රවේශය"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"මයික්රෆෝන ප්රවේශය අවහිර කර ඇත"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"අවහිර කිරීම ඉවත් කිරීමට, මයික්රෆෝන ප්රවේශයට ඉඩ දීම සඳහා ඔබගේ උපාංගයේ පෞද්ගලිකත්ව ස්විචය මයික්රෆෝනය තිබෙන ස්ථානයට ගෙන යන්න."</string>
<string name="camera" msgid="1226671478936288283">"කැමරාව"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"කැමරා ප්රවේශය"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"කැමරාවට යෙදුම් ප්රවේශය"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"කැමරා ප්රවේශය අවහිර කර ඇත"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"අවහිර කිරීම ඉවත් කිරීමට, කැමරා ප්රවේශයට ඉඩ දීම සඳහා ඔබගේ උපාංගයේ පෞද්ගලිකත්ව ස්විචය කැමරාව තිබෙන ස්ථානයට ගෙන යන්න."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"මයික්රෆෝන ප්රවේශය: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"ක්රියාත්මක විට, අවසරය ඇති සියලු යෙදුම් සහ සේවා මෙම උපාංගයේ ඕනෑම මයික්රෆෝනයකට ප්රවේශ විය හැකිය.\n\nඅභිරුචි ප්රොටොකෝලයක් සහිත ශ්රව්ය උපාංගවලට මෙම සැකසීම මගින් බලපෑමක් ඇති නොවනු ඇත."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"කැමරා ප්රවේශය: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"මයුර නිල්"</string>
<string name="color_yellow" msgid="3519470952904560404">"කහ"</string>
<string name="color_magenta" msgid="2377854703399624607">"දම්පාට තද රතු"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"ශ්රව්ය විස්තරය"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"සහාය දක්වන චිත්රපට සහ සංදර්ශනවල තිරය මත සිදු වන දේ පිළිබඳ විස්තරයක් අසන්න"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"සබල කරන්න"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"වින්යාසය"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> භාවිත කරන්න ද?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"නිරීක්ෂණය"</string>
<string name="system_apps" msgid="8481888654606868074">"යෙදුම්"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"අවදියෙන් සිටින්න"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"තිරය කිසිදා නිද්රාවට පත් නොවනු ඇත"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP පරික්ෂාව"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI ප්රශස්තිකරණය"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"දැන් නැවත අරඹන්න ද?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"රූපවාහිනීය සමඟ HDMI උපාංග වල බලය අක්රිය කර ඇත"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"රූපවාහිනීයේ ස්වයංක්රීය බලය සක්රිය"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI උපාංගය සමඟ රූපවාහිනීයේ බලය සක්රිය කරන්න"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">සම්බන්ධිත ආදාන</item>
- <item quantity="other">සම්බන්ධිත ආදාන</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">සූදානම්ව ඇති ආදාන</item>
- <item quantity="other">සූදානම්ව ඇති ආදාන</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">සම්බන්ධිත නැති ආදාන</item>
- <item quantity="other">සම්බන්ධිත නැති ආදාන</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{සම්බන්ධිත ආදානය}one{සම්බන්ධිත ආදාන}other{සම්බන්ධිත ආදාන}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{සූදානම්ව ඇති ආදානය}one{සූදානම්ව ඇති ආදාන}other{සූදානම්ව ඇති ආදාන}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{සම්බන්ධිත නැති ආදානය}one{සම්බන්ධිත නැති ආදාන}other{සම්බන්ධිත නැති ආදාන}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"ඔබගේ ගිණුම තුළ යෙදුම් සහ අන්තර්ගත වෙත පිවිසීම සීමා කරන්න"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"සීමා කළ පැතිකඩ"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> මඟින් පාලනය කරන ලදී"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"සීමා කළ පැතිකඩක් සෑදීම"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"සැකසීම්"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"යෙදුම් වලට ඉඩ දෙන්න"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">යෙදුම් %d කට ඉඩ දෙන ලදි</item>
- <item quantity="other">යෙදුම් %d කට ඉඩ දෙන ලදි</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"අවසරලත්"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"අවසර නැත"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"අභිරුචිකරණ කළ සීමා කීරීම"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"තෙවන පාර්ශ්ව මූලාශ්රය"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"අවසර"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"යෙදුම ලබා ගත නොහැකිය"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"භාවිත නොකළ යෙදුම්"</string>
<string name="settings_ok" msgid="5950888975075541964">"හරි"</string>
<string name="settings_confirm" msgid="4489126458677153411">"තහවුරු කරන්න"</string>
<string name="settings_cancel" msgid="576094334743686152">"අවලංගු කරන්න"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"මෙම අවසරය යෙදුමකට පද්ධති සැකසීම් වෙනස් කිරීමට ඉඩ දෙයි."</string>
<string name="write_settings_on" msgid="71675710746513956">"ඔව්"</string>
<string name="write_settings_off" msgid="6730113471695092167">"නැත"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"සියලු ගොනු ප්රවේශය"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"සියලු ගොනු කළමනාකරණය කිරීමට ප්රවේශය ඉඩ දෙන්න"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"මෙම යෙදුමට මෙම උපාංගයේ හෝ ඕනෑම සබැඳුණු ගබඩා ධාරිතාවක ඇති සියලු ගොනු කියවීමට, වෙනස් කිරීමට සහ මැකීමට ඉඩ දෙන්න. ප්රදානය කළහොත්, ඔබේ ප්රකාශිත දැනුම රහිතව යෙදුමට ගොනු වෙත ප්රවේශ විය හැකිය."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"පින්තූරය-තුළ-පින්තූරය"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"පින්තූරයේ පින්තූරයට ඉඩ දෙන්න"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"පින්තූරය-තුළ-පින්තූරය සඳහා ස්ථාපනය කළ යෙදුම් සහාය නොදක්වයි"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"මෙම යෙදුම විවෘතව තිබෙන අතරතුර හෝ එයින් ඉවත් වන විට පින්තූරය-තුළ-පින්තූරය කවුළුවක් සැදීමට ඉඩ දෙන්න (උදාහරණයකට, වීඩියෝව දිගටම බැලීමට). මෙම කවුළුව ඔබ භාවිතා කරන අනෙක් යෙදුම් උඩින් පෙන්වයි."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"එලාම සැකසීමට සහ කාල සංවේදී ක්රියා කාල සටහන්ගත කිරීමට යෙදුම්වලට ඉඩ දෙන්න. මෙය පසුබිමේ ධාවනය වීමට යෙදුම්වලට ඉඩ දෙයි, එය වැඩි බලය වැඩියෙන් භාවිත කළ හැකිය.\n\nමෙම අවසරය ක්රියාවිරහිත නම්, යෙදුම මඟින් සැලසුම් කර ඇති තිබෙන එලාම සහ වේලාව පදනම් කර ගත් සිදුවීම් ක්රියා නොකරනු ඇත."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"තිරය ක්රියාත්මක කරන්න"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"තිරය ක්රියාත්මක කිරීමට ඉඩ දෙන්න"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"යෙදුමකට තිරය ක්රියාත්මක කිරීමට ඉඩ දෙන්න. ඉඩ දුනහොත්, යෙදුම ඔබගේ පැහැදිලි අභිප්රායෙන් තොරව ඕනෑම වේලාවක තිරය ක්රියාත්මක කළ හැකිය."</string>
<string name="special_access" msgid="21806055758289916">"විශේෂ යෙදුම් ප්රවේශය"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"ශ්රව්ය"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"දත්ත සුරැකුම"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"ජංගම දත්ත අඩුවෙන් භාවිත කිරීමට වීඩියෝ ගුණත්වය ස්වයංක්රීයව ගළපන්න"</string>
<string name="title_data_alert" msgid="8262081890052682475">"දත්ත භාවිතය සහ ඇඟවීම්"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"ඔබට Wi-Fi, ඊතර්නෙට් හෝ ඔබේ දුරකථනයෙහි හොට්ස්පොට් සමග අන්තර්ජාලයට සම්බන්ධ විය හැක. වැඩිදුර උදවු සඳහා, "<b>"g.co/network"</b>" වෙත පිවිසෙන්න."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"ඔබට Wi-Fi, ඊතර්නෙට් හෝ ඔබගේ දුරකථනයෙහි හොට්ස්පොට් සමග අන්තර්ජාලයට සම්බන්ධ විය හැකිය."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"ක්රියාවට ඉඩ නොදේ"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"හඬ පරිමාව වෙනස් කළ නොහැකිය"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"බලය සහ ශක්තිය"</string>
<string name="power_on_behavior" msgid="927607372303160716">"බලය ක්රියාත්මක කිරීමේ චර්යාව"</string>
<string name="reset_options_title" msgid="7632580482285108955">"යළි සකසන්න"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"ඊතර්නෙට් යුගලන කේතය"</string>
</resources>
diff --git a/Settings/res/values-sk/strings.xml b/Settings/res/values-sk/strings.xml
index e631dd3..3ae888d 100644
--- a/Settings/res/values-sk/strings.xml
+++ b/Settings/res/values-sk/strings.xml
@@ -45,25 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Pridanie účtu"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Účty a prihlasovanie"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Žiadne účty"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> účty</item>
- <item quantity="many"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> účtu</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> účtov</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> účet</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# účet}few{# účty}many{# accounts}other{# účtov}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Mediálne služby, Asistent, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Sieť a internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Zvuk"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplikácie"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Predvoľby zariadenia"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Diaľkové ovládanie a príslušenstvo"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Žiadne pripojené zariadenia Bluetooth"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> príslušenstvá</item>
- <item quantity="many"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> príslušenstva</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> príslušenstiev</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> príslušenstvo</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Zobrazenie a zvuk"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Pomocník a spätná väzba"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Ochrana súkromia"</string>
@@ -122,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Obnovenie výrobných nastavení"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrácia"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Šetrič energie"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Zariadenia"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Vybrať formáty"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Priestorový zvuk"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -189,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"AKTIVOVANÉ FORMÁTY"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"DEAKTIVOVANÉ FORMÁTY"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Ak chcete deaktivovať, zmeňte výber formátu za manuálny."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Rozlíšenie"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatické"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Rozlíšenie bolo zmenené"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Ak chcete odteraz používať rozlíšenie %1$s, vyberte OK."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Zrušiť"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Vymazať údaje vo vyrovnávacej pamäti?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Vymažú sa údaje v pamäti pre všetky aplikácie"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Pridať príslušenstvo"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Prebieha párovanie..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Prebieha pripájanie…"</string>
@@ -228,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Príslušenstvo"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Diaľkové ovládanie"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Nastavenia diaľkového ovládania"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Nastavenie tlačidiel diaľkového ovládania"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Ovládanie hlasitosti, vypínača a vstupu v televízoroch, prijímačoch a soundbaroch"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Pripojiť"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Pripojiť k zariadeniu %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Odpojiť"</string>
@@ -266,12 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Nie je k dispozícii"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Aplikácie na správu zariadenia"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Žiadne aktívne aplikácie"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aktívne aplikácie</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> active apps</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktívnych aplikácií</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aktívna aplikácia</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Zakázané správcom, pravidlom šifrovania alebo úložiskom poverení"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informácie o spravovanom zariadení"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Zmeny a nastavenia spravované vašou organizáciou"</string>
@@ -289,22 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Žiadne"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Nainštalované aplikácie"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Počet aplikácií je odhadnutý. Nemusí zahrnovať aplikácie nainštalované mimo Obchodu Play."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="few">Minimálne <xliff:g id="COUNT_1">%d</xliff:g> aplikácie</item>
- <item quantity="many">Minimum <xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="other">Minimálne <xliff:g id="COUNT_1">%d</xliff:g> aplikácií</item>
- <item quantity="one">Minimálne <xliff:g id="COUNT_0">%d</xliff:g> aplikácia</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimálne # aplikácia}few{Minimálne # aplikácie}many{Minimum # apps}other{Minimálne # aplikácií}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Miestne povolenia"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Povolenia mikrofónu"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Povolenia fotoaparátu"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Predvolené aplikácie"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aplikácie</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> apps</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikácií</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplikácia</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplikácia}few{# aplikácie}many{# apps}other{# aplikácií}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Predvolená klávesnica"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Nastavené na možnosť <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Trvalé pripojenie k sieti VPN je zapnuté"</string>
@@ -314,47 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Dôveryhodné poverenia"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Dôveryhodné poverenia vo vašom osobnom profile"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Dôveryhodné poverenia vo vašom pracovnom profile"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="few">Minimálne <xliff:g id="COUNT_1">%d</xliff:g> certifikáty CA</item>
- <item quantity="many">Minimum <xliff:g id="COUNT_1">%d</xliff:g> CA certificates</item>
- <item quantity="other">Minimálne <xliff:g id="COUNT_1">%d</xliff:g> certifikátov CA</item>
- <item quantity="one">Minimálne <xliff:g id="COUNT_0">%d</xliff:g> certifikát CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certifikát CA}few{# certifikáty CA}many{# CA certificates}other{# certifikátov CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Správca môže uzamknúť zariadenie a obnoviť heslo"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Správca môže zo zariadenia odstrániť všetky údaje"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Počet nesprávnych zadaní hesla pred odstránením všetkých dát zariadenia"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Počet nesprávnych zadaní hesla pred odstránením dát pracovného profilu"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> pokusy</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> attempts</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> pokusov</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> pokus</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# pokus}few{# pokusy}many{# attempts}other{# pokusov}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Toto zariadenie spravuje vaša organizácia."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Toto zariadenie spravuje organizácia <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Ďalšie informácie"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="few">Aplikácie na fotografovanie</item>
- <item quantity="many">Aplikácie na fotografovanie</item>
- <item quantity="other">Aplikácie na fotografovanie</item>
- <item quantity="one">Aplikácia na fotografovanie</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Aplikácia kamery}few{Aplikácie kamery}many{Aplikácie kamery}other{Aplikácie kamery}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Aplikácia Kalendár"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplikácia Kontakty"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="few">E‑mailové aplikácie</item>
- <item quantity="many">E‑mailové aplikácie</item>
- <item quantity="other">E‑mailové aplikácie</item>
- <item quantity="one">E‑mailová aplikácia</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Aplikácia e‑mailového klienta}few{Aplikácie e‑mailového klienta}many{Aplikácie e‑mailového klienta}other{Aplikácie e‑mailového klienta}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Aplikácia Mapa"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="few">Telefónne aplikácie</item>
- <item quantity="many">Telefónne aplikácie</item>
- <item quantity="other">Telefónne aplikácie</item>
- <item quantity="one">Telefónna aplikácia</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Telefónna aplikácia}few{Telefónne aplikácie}many{Telefónne aplikácie}other{Telefónne aplikácie}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Prehliadač"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -373,12 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Verzia operačného systému Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Sériové číslo"</string>
<string name="about_build" msgid="8467840394761634575">"Zostava operačného systému Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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">Ešte <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> kroku a bude z vás vývojár</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="4064986225625409361">"{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{You are now # steps away from being a developer}other{Ešte # krokov a bude z vás vývojár}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Reklamy"</string>
<string name="ads_description" msgid="8081069475265061074">"Spravujte nastavenia reklám (napr. resetovanie reklamného identifikátora)."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Reklamy, spravujte nastavenia reklám, napríklad resetovanie reklamného identifikátora."</string>
@@ -392,31 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Iné aktualizácie systému"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Sieť môže byť monitorovaná"</string>
<string name="done_button" msgid="616159688526431451">"Hotovo"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="few">Nastavte certifikáty ako dôveryhodné alebo ich odstráňte</item>
- <item quantity="many">Nastavte certifikáty ako dôveryhodné alebo ich odstráňte</item>
- <item quantity="other">Nastavte certifikáty ako dôveryhodné alebo ich odstráňte</item>
- <item quantity="one">Nastavte certifikát ako dôveryhodný alebo ho odstráňte</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="few">Doména <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> nainštalovala do vášho zariadenia certifikačnú autoritu, ktorá jej umožní monitorovať aktivitu v sieti zariadenia vrátane pošty, aplikácií a zabezpečených webov.\n\nViac o týchto certifikátoch sa dozviete od svojho správcu.</item>
- <item quantity="many">Doména <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> nainštalovala do vášho zariadenia certifikačnú autoritu, ktorá jej umožní monitorovať aktivitu v sieti zariadenia vrátane pošty, aplikácií a zabezpečených webov.\n\nViac o týchto certifikátoch sa dozviete od svojho správcu.</item>
- <item quantity="other">Doména <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> nainštalovala do vášho zariadenia certifikačnú autoritu, ktorá jej umožní monitorovať aktivitu v sieti zariadenia vrátane pošty, aplikácií a zabezpečených webov.\n\nViac o týchto certifikátoch sa dozviete od svojho správcu.</item>
- <item quantity="one">Doména <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> nainštalovala do vášho zariadenia certifikačnú autoritu, ktorá jej umožní monitorovať aktivitu v sieti zariadenia vrátane pošty, aplikácií a zabezpečených webov.\n\nViac o tomto certifikáte sa dozviete od svojho správcu.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="few">Doména <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> nainštalovala pre váš pracovný profil certifikačnú autoritu, ktorá jej môže umožniť monitorovať aktivitu v pracovnej sieti vrátane pošty, aplikácií a zabezpečených webov.\n\nViac o týchto certifikátoch sa dozviete od svojho správcu.</item>
- <item quantity="many">Doména <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> nainštalovala pre váš pracovný profil certifikačnú autoritu, ktorá jej môže umožniť monitorovať aktivitu v pracovnej sieti vrátane pošty, aplikácií a zabezpečených webov.\n\nViac o týchto certifikátoch sa dozviete od svojho správcu.</item>
- <item quantity="other">Doména <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> nainštalovala pre váš pracovný profil certifikačnú autoritu, ktorá jej môže umožniť monitorovať aktivitu v pracovnej sieti vrátane pošty, aplikácií a zabezpečených webov.\n\nViac o týchto certifikátoch sa dozviete od svojho správcu.</item>
- <item quantity="one">Doména <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> nainštalovala pre váš pracovný profil certifikačnú autoritu, ktorá jej môže umožniť monitorovať aktivitu v pracovnej sieti vrátane pošty, aplikácií a zabezpečených webov.\n\nViac o tomto certifikáte sa dozviete od svojho správcu.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Vaša aktivita v sieti, vrátane e-mailov, aplikácií a zabezpečených webov môže byť monitorovaná treťou stranou.\n\nUmožňujú to dôveryhodné poverenia nainštalované vo vašom zariadení."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="few">Skontrolovať certifikáty</item>
- <item quantity="many">Skontrolovať certifikáty</item>
- <item quantity="other">Skontrolovať certifikáty</item>
- <item quantity="one">Skontrolovať certifikát</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Nastavte certifikát ako dôveryhodný alebo ho odstráňte}few{Nastavte certifikáty ako dôveryhodné alebo ich odstráňte}many{Nastavte certifikáty ako dôveryhodné alebo ich odstráňte}other{Nastavte certifikáty ako dôveryhodné alebo ich odstráňte}}"</string>
<string name="device_status" msgid="8266002761193692207">"Stav"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Sieť, sériové čísla a ďalšie informácie"</string>
<string name="manual" msgid="5683935624321864999">"Ručne"</string>
@@ -508,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Pripojiť"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Odstrániť záznam siete"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Táto akcia vymaže informácie používané na pripojenie k tejto sieti vrátane uloženého hesla."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Pripojte sa k sieti Wi‑Fi naskenovaním QR kódu z mobilného telefónu a postupovaním podľa pokynov."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Pripojte sa k sieti Wi-Fi naskenovaním QR kódu z mobilného telefónu a postupujte podľa pokynov.\n \n V "<b>"telefóne s Androidom"</b>" prejdite do sekcie Nastavenia -> Sieť a internet -> Wi-Fi -> Vybrať Wi-Fi -> Rozšírené -> Pridať zariadenie a potom naskenujte QR kód."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Ak to chcete zrušiť, stlačte tlačidlo Späť"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Pokračovať"</string>
@@ -577,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Úložisko zariadenia"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Vymeniteľné úložisko"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Resetovanie"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Uvoľnenie priestoru"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Vymazanie údajov vo vyrovnávacej pamäti"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Uvoľnenie <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Vymažú sa dočasné súbory, ktoré zaberajú priestor. Neovplyvní to uložené údaje, ako sú predvoľby aplikácií alebo offline videá, a do aplikácií sa nebude potrebné znova prihlásiť."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Chcete vymazať údaje vo vyrovnávacej pamäti?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Vymažú sa údaje všetkých aplikácií v pamäti."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Odinštalovanie aplikácií"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Úložisko <xliff:g id="NAME">%1$s</xliff:g> je pripojené"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Úložisko <xliff:g id="NAME">%1$s</xliff:g> sa nepodarilo pripojiť"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Úložisko USB bolo znova pripojené"</string>
@@ -654,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofón"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Prístup k mikrofónu"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Prístup aplikácií k mikrofónu"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Prístup k mikrofónu je blokovaný"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Ak ho chcete odblokovať, posuňte prepínač ochrany súkromia vo svojom zariadení do polohy Mikrofón je zapnutý, čím povolíte prístup k mikrofónu."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Prístup ku kamere"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Prístup aplikácií ku kamere"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Prístup ku kamere je blokovaný"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Ak ho chcete odblokovať, posuňte prepínač ochrany súkromia vo svojom zariadení do polohy Kamera je zapnutá, čím povolíte prístup ku kamere."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Prístup k mikrofónu: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Keď zapnete toto nastavenie, všetky aplikácie aj služby s povolením budú mať prístup ku ktorémukoľvek mikrofónu tohto zariadenia.\n\nNeovplyvní periférie zvuku s vlastným protokolom."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Prístup ku kamere: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -728,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Azúrová"</string>
<string name="color_yellow" msgid="3519470952904560404">"Žltá"</string>
<string name="color_magenta" msgid="2377854703399624607">"Purpurová"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Zvukový opis"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Vypočujte si opis toho, čo sa deje na obrazovke v podporovaných filmoch a reláciách"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Zapnúť"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfigurácia"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Používať službu <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -748,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Sledovanie"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplikácie"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Nevypínať obrazovku"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Obrazovka nikdy neprejde do režimu spánku"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Kontrola HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Optimalizácia rozhrania HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Reštartovať?"</string>
@@ -868,24 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Vypnúť zariadenia HDMI s televízorom"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Auto. zapnutie televízora"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Zapnúť televízor so zariadením HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="few">Pripojené vstupy</item>
- <item quantity="many">Pripojené vstupy</item>
- <item quantity="other">Pripojené vstupy</item>
- <item quantity="one">Pripojený vstup</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="few">Vstupy v úspornom režime</item>
- <item quantity="many">Vstupy v úspornom režime</item>
- <item quantity="other">Vstupy v úspornom režime</item>
- <item quantity="one">Vstup v úspornom režime</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="few">Nepripojené vstupy</item>
- <item quantity="many">Nepripojené vstupy</item>
- <item quantity="other">Nepripojené vstupy</item>
- <item quantity="one">Nepripojený vstup</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Pripojený vstup}few{Pripojené vstupy}many{Pripojené vstupy}other{Pripojené vstupy}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Vstup v pohotovostnom režime}few{Vstupy v pohotovostnom režime}many{Vstupy v pohotovostnom režime}other{Vstupy v pohotovostnom režime}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Nepripojený vstup}few{Nepripojené vstupy}many{Nepripojené vstupy}other{Nepripojené vstupy}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Obmedziť prístup k aplikáciám a ďalšiemu obsahu vášho účtu"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Obmedzený profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Ovládané aplikáciou <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -899,12 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Vytvoriť obmedzený profil"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Nastavenia"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Povolené aplikácie"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="few">Boli povolené %d aplikácie</item>
- <item quantity="many">Bolo povolenej %d aplikácie</item>
- <item quantity="other">Bolo povolených %d aplikácií</item>
- <item quantity="one">Bola povolená 1 aplikácia</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Povolené"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Nie je povolené"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Prispôsobiť obmedzenia"</string>
@@ -949,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Zdroj tretej strany"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Povolenia"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplikácia nie je k dispozícii"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Nepoužívané aplikácie"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Potvrdiť"</string>
<string name="settings_cancel" msgid="576094334743686152">"Zrušiť"</string>
@@ -1032,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Toto povolenie umožňuje aplikácii upravovať nastavenia systému."</string>
<string name="write_settings_on" msgid="71675710746513956">"Áno"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Nie"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Prístup k všetkým súborom"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Povoliť prístup na správu všetkých súborov"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Povoľte tejto aplikácii čítať, upravovať a odstraňovať všetky súbory v tomto zariadení alebo akýchkoľvek pripojených úložiskách. Po udelení tohto povolenia bude môcť aplikácia používať súbory bez vášho vedomia."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Obraz v obraze"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Povoliť obraz v obraze"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Žiadna z nainštalovaných aplikácií nepodporuje obraz v obraze"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Povoľte aplikáciám vytvoriť okno v režime obraz v obraze, kým je aplikácia otvorená alebo potom, čo ju opustíte (napríklad aby ste mohli pokračovať v pozeraní videa). Toto okno sa zobrazuje nad ostatnými aplikáciami, ktoré používate."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Povoľte aplikáciám nastavovať budíky a plánovať akcie s časovým obmedzením. Aplikáciám to umožní pracovať na pozadí, čo môže zvýšiť spotrebu energie.\n\nAk je toto povolenie vypnuté, súčasné budíky a udalosti s časovým obmedzením naplánované aplikáciou nebudú fungovať."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Zapínanie obrazovky"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Povoľte zapínanie obrazovky"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Povoľte aplikácii zapínať obrazovku. Ak to urobíte, daná aplikácia bude môcť zapínať obrazovku kedykoľvek, a to aj vtedy, keď to nebudete mať v úmysle."</string>
<string name="special_access" msgid="21806055758289916">"Špeciálny prístup aplikácií"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Zvuk"</string>
@@ -1053,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Šetrič dát"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Automaticky upravovať kvalitu videí na zníženie spotreby mobilných dát"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Spotreba dát a upozornenia"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"K internetu sa môžete pripojiť cez sieť Wi-Fi, ethernet alebo hotspot telefónu. Ďalšiu pomoc získate na "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"K internetu sa môžete pripojiť cez sieť Wi-Fi, ethernet alebo hotspot telefónu."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Akcia nie je povolená"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Hlasitosť sa nedá zmeniť"</string>
@@ -1103,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Výkon a energia"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Správanie pri zapnutí"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Obnoviť"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Párovací kód ethernetu"</string>
</resources>
diff --git a/Settings/res/values-sl/strings.xml b/Settings/res/values-sl/strings.xml
index 48adb3f..1eefc70 100644
--- a/Settings/res/values-sl/strings.xml
+++ b/Settings/res/values-sl/strings.xml
@@ -45,25 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Dodajanje računa"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Računi in prijava"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Ni računov"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> račun</item>
- <item quantity="two"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> računa</item>
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> računi</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> računov</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# račun}one{# račun}two{# računa}few{# računi}other{# računov}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Predstavnostne storitve, Pomočnik, Google Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Omrežje in internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Zvok"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplikacije"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Nastavitve naprave"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Daljinsko upravljanje in dodatki"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Ni povezanih naprav Bluetooth"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> dodatek</item>
- <item quantity="two"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> dodatka</item>
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> dodatki</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> dodatkov</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Slika in zvok"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Pomoč in povratne informacije"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Zasebnost"</string>
@@ -122,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Ponastavitev na tovarniške nastavitve"</string>
<string name="device_calibration" msgid="2907914144048739705">"Umerjanje"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Varčevanje z energijo"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Naprave"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Izbira oblik zvoka"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Prostorski zvok"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -189,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"OMOGOČENE OBLIKE"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ONEMOGOČENE OBLIKE"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Če želite onemogočiti, izbor oblike spremenite na »Ročno«."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Ločljivost"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Samodejno"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Ločljivost je spremenjena"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Izberite »V redu«, če želite od zdaj naprej uporabljati %1$s."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Prekliči"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"V redu"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Želite izbrisati predpomnjene podatke?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Izbrisali boste predpomn. pod. vseh aplikacij."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Dodaj pripomoček"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Seznanjanje ..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Povezovanje …"</string>
@@ -228,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Dodatki"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Daljinski upravljalnik"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Nastavitve daljinskega upravljalnika"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Nastavitev gumbov daljinskega upravljalnika"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Nadziranje glasnosti, vklopa/izklopa in vhodov v televizorjih, sprejemnikih ter zvočniških modulih"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Poveži"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Povezava s/z: %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Prekini povezavo"</string>
@@ -266,12 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Ni na voljo"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Skrbniške aplikacije naprave"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Ni aktivnih aplikacij"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> aktivna aplikacija</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> aktivni aplikaciji</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aktivne aplikacije</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktivnih aplikacij</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Onemogočil skrbnik, pravilnik za šifriranje ali shramba poverilnic"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Podatki o upravljani napravi"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Spremembe in nastavitve, ki jih upravlja vaša organizacija"</string>
@@ -289,22 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Brez"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Nameščene aplikacije"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"To je ocena števila aplikacij. Morda ne vključuje aplikacij, nameščenih zunaj Trgovine Play."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="one">Najmanj <xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- <item quantity="two">Najmanj <xliff:g id="COUNT_1">%d</xliff:g> aplikaciji</item>
- <item quantity="few">Najmanj <xliff:g id="COUNT_1">%d</xliff:g> aplikacije</item>
- <item quantity="other">Najmanj <xliff:g id="COUNT_1">%d</xliff:g> aplikacij</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Najmanj # aplikacija}one{Najmanj # aplikacija}two{Najmanj # aplikaciji}few{Najmanj # aplikacije}other{Najmanj # aplikacij}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Dovoljenja za lokacijo"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Dovoljenja za mikrofon"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Dovoljenja za fotoaparat"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Privzete aplikacije"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> aplikacija</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> aplikaciji</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> aplikacije</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikacij</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplikacija}one{# aplikacija}two{# aplikaciji}few{# aplikacije}other{# aplikacij}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Privzeta tipkovnica"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Nastavljeno na <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Stalno vklopljen VPN je vklopljen"</string>
@@ -314,47 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Zaupanja vredne poverilnice"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Zaupanja vredne poverilnice v vašem osebnem profilu"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Zaupanja vredne poverilnice v vašem delovnem profilu"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Najmanj <xliff:g id="COUNT_1">%d</xliff:g> potrdilo overitelja potrdil</item>
- <item quantity="two">Najmanj <xliff:g id="COUNT_1">%d</xliff:g> potrdili overitelja potrdil</item>
- <item quantity="few">Najmanj <xliff:g id="COUNT_1">%d</xliff:g> potrdila overitelja potrdil</item>
- <item quantity="other">Najmanj <xliff:g id="COUNT_1">%d</xliff:g> potrdil overitelja potrdil</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# potrdilo overitelja potrdil}one{# potrdilo overitelja potrdil}two{# potrdili overitelja potrdil}few{# potrdila overitelja potrdil}other{# potrdil overitelja potrdil}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Skrbnik lahko zaklene napravo in ponastavi geslo"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Skrbnik lahko izbriše vse podatke v napravi"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Število neuspešnih poskusov vpisa gesla, preden se izbrišejo vsi podatki v napravi"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Število neuspešnih poskusov vpisa gesla, preden se izbrišejo podatki delovnega profila"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> poskus</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> poskusa</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> poskusi</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> poskusov</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# poskus}one{# poskus}two{# poskusa}few{# poskusi}other{# poskusov}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"To napravo upravlja vaša organizacija."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"To napravo upravlja <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Več o tem"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Fotografske aplikacije</item>
- <item quantity="two">Fotografske aplikacije</item>
- <item quantity="few">Fotografske aplikacije</item>
- <item quantity="other">Fotografske aplikacije</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Fotografska aplikacija}one{Fotografske aplikacije}two{Fotografske aplikacije}few{Fotografske aplikacije}other{Fotografske aplikacije}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Aplikacija za koledar"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplikacija za stike"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">E-poštni odjemalci</item>
- <item quantity="two">E-poštni odjemalci</item>
- <item quantity="few">E-poštni odjemalci</item>
- <item quantity="other">E-poštni odjemalci</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{E-poštni odjemalec}one{E-poštni odjemalci}two{E-poštni odjemalci}few{E-poštni odjemalci}other{E-poštni odjemalci}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Aplikacija za zemljevide"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Aplikacije za klicanje</item>
- <item quantity="two">Aplikacije za klicanje</item>
- <item quantity="few">Aplikacije za klicanje</item>
- <item quantity="other">Aplikacije za klicanje</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Aplikacija za klicanje}one{Aplikacije za klicanje}two{Aplikacije za klicanje}few{Aplikacije za klicanje}other{Aplikacije za klicanje}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Brskalnik"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -373,12 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Različica operacijskega sistema Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Serijska številka"</string>
<string name="about_build" msgid="8467840394761634575">"Delovna različica operacijskega sistema Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Oglasi"</string>
<string name="ads_description" msgid="8081069475265061074">"Upravljanje nastavitev oglasov, kot je ponastavitev oglaševalskega ID-ja."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Oglasi, upravljanje nastavitev oglasov, kot je ponastavitev oglaševalskega ID-ja."</string>
@@ -392,31 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Dodatne posodobitve sist."</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Omrežje je lahko nadzorovano"</string>
<string name="done_button" msgid="616159688526431451">"Končano"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Označevanje potrdil kot zaupanja vrednih ali odstranitev potrdil</item>
- <item quantity="two">Označevanje potrdil kot zaupanja vrednih ali odstranitev potrdil</item>
- <item quantity="few">Označevanje potrdil kot zaupanja vrednih ali odstranitev potrdil</item>
- <item quantity="other">Označevanje potrdil kot zaupanja vrednih ali odstranitev potrdil</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one">Skrbnik domene <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je namestil overitelje potrdil v vaši napravi, s čimer morda lahko spremlja omrežno dejavnost naprave, vključno z e-pošto, aplikacijami in varnimi spletnimi mesti.\n\nČe želite več informacij o tem potrdilih, se obrnite na skrbnika.</item>
- <item quantity="two">Skrbnik domene <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je namestil overitelje potrdil v vaši napravi, s čimer morda lahko spremlja omrežno dejavnost naprave, vključno z e-pošto, aplikacijami in varnimi spletnimi mesti.\n\nČe želite več informacij o tem potrdilih, se obrnite na skrbnika.</item>
- <item quantity="few">Skrbnik domene <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je namestil overitelje potrdil v vaši napravi, s čimer morda lahko spremlja omrežno dejavnost naprave, vključno z e-pošto, aplikacijami in varnimi spletnimi mesti.\n\nČe želite več informacij o tem potrdilih, se obrnite na skrbnika.</item>
- <item quantity="other">Skrbnik domene <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je namestil overitelje potrdil v vaši napravi, s čimer morda lahko spremlja omrežno dejavnost naprave, vključno z e-pošto, aplikacijami in varnimi spletnimi mesti.\n\nČe želite več informacij o tem potrdilih, se obrnite na skrbnika.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one">Skrbnik domene <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je namestil overitelje potrdil za vaš delovni profil, s čimer morda lahko spremlja dejavnost v službenem omrežju, vključno z e-pošto, aplikacijami in varnimi spletnimi mesti.\n\nČe želite več informacij o teh potrdilih, se obrnite na skrbnika.</item>
- <item quantity="two">Skrbnik domene <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je namestil overitelje potrdil za vaš delovni profil, s čimer morda lahko spremlja dejavnost v službenem omrežju, vključno z e-pošto, aplikacijami in varnimi spletnimi mesti.\n\nČe želite več informacij o teh potrdilih, se obrnite na skrbnika.</item>
- <item quantity="few">Skrbnik domene <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je namestil overitelje potrdil za vaš delovni profil, s čimer morda lahko spremlja dejavnost v službenem omrežju, vključno z e-pošto, aplikacijami in varnimi spletnimi mesti.\n\nČe želite več informacij o teh potrdilih, se obrnite na skrbnika.</item>
- <item quantity="other">Skrbnik domene <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> je namestil overitelje potrdil za vaš delovni profil, s čimer morda lahko spremlja dejavnost v službenem omrežju, vključno z e-pošto, aplikacijami in varnimi spletnimi mesti.\n\nČe želite več informacij o teh potrdilih, se obrnite na skrbnika.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Tretja oseba lahko nadzira vašo omrežno dejavnost, vključno z e-poštnimi sporočili, aplikacijami in varnimi spletnimi mesti.\n\nTo ji omogoča zaupanja vredna poverilnica, ki je nameščena v vaši napravi."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Preveri potrdila</item>
- <item quantity="two">Preveri potrdila</item>
- <item quantity="few">Preveri potrdila</item>
- <item quantity="other">Preveri potrdila</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Označevanje potrdila kot zaupanja vrednega ali odstranitev potrdila}one{Označevanje potrdil kot zaupanja vrednih ali odstranitev potrdil}two{Označevanje potrdil kot zaupanja vrednih ali odstranitev potrdil}few{Označevanje potrdil kot zaupanja vrednih ali odstranitev potrdil}other{Označevanje potrdil kot zaupanja vrednih ali odstranitev potrdil}}"</string>
<string name="device_status" msgid="8266002761193692207">"Stanje"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Omrežje, serijske številke in drugi podatki"</string>
<string name="manual" msgid="5683935624321864999">"Priročnik"</string>
@@ -508,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Poveži se"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Pozabi omrežje"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"S tem se izbrišejo podatki za povezavo s tem omrežjem, vključno s shranjenim geslom"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Pridružite se omrežju Wi-Fi, tako da optično preberete kodo QR iz mobilnega telefona in upoštevate navodila."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Pridružite se omrežju Wi-Fi, tako da optično preberete kodo QR iz mobilnega telefona in upoštevate navodila.\n \n V "<b>"telefonu Android"</b>" odprite »Nastavitve -> Omrežje in internet -> Wi-Fi -> Izberite omrežje Wi-Fi -> Dodatno -> Dodajanje naprave« in nato optično preberite kodo QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Pritisnite gumb za nazaj, če želite preklicati."</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"V redu"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Naprej"</string>
@@ -577,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Shramba naprave"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Izmenljiva shramba"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Ponastavitev"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Sprostitev prostora v shrambi"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Brisanje predpomnjenih podatkov"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Sprostitev <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Izbrisani so predpomnjeni podatki, ki zasedajo prostor. To ne vpliva na shranjene podatke, kot so nastavitve aplikacij ali videoposnetki za ogled brez povezave, in ne bo se vam treba znova prijaviti v aplikacije."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Želite izbrisati predpomnjene podatke?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Izbrisali boste predpomn. podatke vseh aplikacij."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Odmestitev aplikacij"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Vpeto: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Tega ni bilo mogoče vpeti: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Shramba USB je znova priključena"</string>
@@ -654,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Dostop do mikrofona"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Dostop aplikacije do mikrofona"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Dostop do mikrofona je blokiran"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Če želite odblokirati, dovolite dostop do mikrofona tako, da pri njem premaknete stikalo za zasebnost v napravi v vklopljen položaj."</string>
<string name="camera" msgid="1226671478936288283">"Fotoaparat"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Dostop do fotoaparata"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Dostop aplikacije do fotoaparata"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Dostop do kamere je blokiran"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Če želite odblokirati, dovolite dostop do kamere tako, da pri njej premaknete stikalo za zasebnost v napravi v vklopljen položaj."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Dostop do mikrofona: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Ko je v vklopljenem položaju, lahko vse aplikacije in storitve z dovoljenjem dostopajo do poljubnega mikrofona v tej napravi.\n\nTa nastavitev ne vpliva na zunanje zvočne naprave s protokolom po meri."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Dostop do fotoaparata: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -728,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cianova"</string>
<string name="color_yellow" msgid="3519470952904560404">"Rumena"</string>
<string name="color_magenta" msgid="2377854703399624607">"Škrlatna"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Zvočni opis"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Poslušajte opis dogodkov na zaslonu za podprte filme in oddaje."</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Omogoči"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfiguracija"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Želite uporabiti <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -748,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Nadzor"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplikacije"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Brez stanja pripravljenosti"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Zaslon ne bo preklopil v stanje pripravljenosti"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Preverjanje HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Optimizacija HDMI-ja"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Želite znova zagnati napravo?"</string>
@@ -868,24 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Izklop naprav HDMI prek televizorja"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Samodejni vklop televizorja"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Vklop televizorja z napravo HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Povezani vhodi</item>
- <item quantity="two">Povezani vhodi</item>
- <item quantity="few">Povezani vhodi</item>
- <item quantity="other">Povezani vhodi</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Vhodi v pripravljenosti</item>
- <item quantity="two">Vhodi v pripravljenosti</item>
- <item quantity="few">Vhodi v pripravljenosti</item>
- <item quantity="other">Vhodi v pripravljenosti</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Nepovezani vhodi</item>
- <item quantity="two">Nepovezani vhodi</item>
- <item quantity="few">Nepovezani vhodi</item>
- <item quantity="other">Nepovezani vhodi</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Povezani vhod}one{Povezani vhodi}two{Povezani vhodi}few{Povezani vhodi}other{Povezani vhodi}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Vhod v pripravljenosti}one{Vhodi v pripravljenosti}two{Vhodi v pripravljenosti}few{Vhodi v pripravljenosti}other{Vhodi v pripravljenosti}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Nepovezan vhod}one{Nepovezani vhodi}two{Nepovezani vhodi}few{Nepovezani vhodi}other{Nepovezani vhodi}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Omejitev dostopa do aplikacij in druge vsebine v računu"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Omejeni profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Pod nadzorom aplikacije <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -899,12 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Ustvarjanje omejenega profila"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Nastavitve"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Dovoljene aplikacije"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d dovoljena aplikacija</item>
- <item quantity="two">%d dovoljeni aplikaciji</item>
- <item quantity="few">%d dovoljene aplikacije</item>
- <item quantity="other">%d dovoljenih aplikacij</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Dovoljeno"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Ni dovoljeno"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Prilagoditev omejitev"</string>
@@ -949,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Vir tretje osebe"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Dovoljenja"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplikacija ni na voljo"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Neuporabljene aplikacije"</string>
<string name="settings_ok" msgid="5950888975075541964">"V redu"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Potrdi"</string>
<string name="settings_cancel" msgid="576094334743686152">"Prekliči"</string>
@@ -1032,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"To dovoljenje aplikaciji dovoljuje spreminjanje sistemskih nastavitev."</string>
<string name="write_settings_on" msgid="71675710746513956">"Da"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Ne"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Dostop do vseh datotek"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Dovoli dostop za upravljanje vseh datotek"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Tej aplikaciji dovolite, da bere, spreminja in briše vse datoteke v tej napravi ali drugih povezanih nosilcih za shranjevanje. Če daste to dovoljenje, bo aplikacija morda dostopala do datotek brez vaše vednosti."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Slika v sliki"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Dovoli sliko v sliki"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Nobena aktivna aplikacija ne podpira načina slike v sliki"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Dovolite aplikacijam, da ustvarijo okno s sliko v sliki, medtem ko je aplikacija odprta ali potem ko jo zapustite (na primer, da nadaljujete z ogledom videoposnetka). To okno prekrije druge aplikacije, ki jih uporabljate."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Aplikacijam dovolite nastavljanje alarmov in načrtovanje časovno občutljivih dejanj. S tem aplikacijam omogočite izvajanje v ozadju, kar bo morda povečalo porabo energije baterije.\n\nČe je to dovoljenje izklopljeno, obstoječi alarmi in časovno občutljivi dogodki, ki jih nastavi aplikacija, ne bodo delovali."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Vklop zaslona"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Omogočanje vklopa zaslona"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Omogočite aplikaciji, da vklopi zaslon. Če ji to odobrite, lahko aplikacija kadar koli brez vašega eksplicitnega namena vklopi zaslon."</string>
<string name="special_access" msgid="21806055758289916">"Posebni dostop za aplikacije"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Zvok"</string>
@@ -1053,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Varčevanje s podatki"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Samodejno prilagajanje kakovosti videa za manj prenosa podatkov v mob. omrežju"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Prenesena količina podatkov in opozorila"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Z internetom se lahko povežete z omrežjem Wi-Fi, ethernetom ali dostopno točko telefona. Več pomoči je na voljo na "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Z internetom se lahko povežete z omrežjem Wi-Fi, ethernetom ali dostopno točko telefona."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Dejanje ni dovoljeno"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Spreminjanje glasnosti ni mogoče"</string>
@@ -1103,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Napajanje in energija"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Delovanje ob vklopu"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Ponastavi"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Koda za seznanjanje za ethernet"</string>
</resources>
diff --git a/Settings/res/values-sq/strings.xml b/Settings/res/values-sq/strings.xml
index fd5895e..e945b78 100644
--- a/Settings/res/values-sq/strings.xml
+++ b/Settings/res/values-sq/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Shto një llogari"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Llogaritë dhe identifikimi"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Asnjë llogari"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> llogari</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> llogari</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# llogari}other{# llogari}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Shërbimet e medias, \"Asistenti\", pagesat"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Rrjeti dhe interneti"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Tingulli"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Aplikacionet"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Preferencat e pajisjes"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Telekomandat dhe aksesorët"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Nuk ka pajisje të lidhura Bluetooth"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> aksesorë</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> aksesor</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Ekrani dhe tingulli"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Ndihmë dhe komente"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privatësia"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Rivendosja e të dhënave të fabrikës"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrimi"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Kursyesi i energjisë"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Pajisjet"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Zgjidh formatet"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Tingulli rrethues"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"FORMATET E AKTIVIZUARA"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"FORMATET E ÇAKTIVIZUARA"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Për ta çaktivizuar, ndryshoje përzgjedhjen e formatit në \"Manuale\"."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Rezolucioni"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatik"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Rezolucioni është ndryshuar"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Zgjidh \"Në rregull\" për të përdorur %1$s nga tani e tutje."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Anulo"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Në rregull"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Të pastrohen të dhënat e memories specifike?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Kjo do të pastrojë të dhënat e memories specifike për të gjitha aplikacionet."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Shto një aksesor"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Po çiftohet..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Po lidhet..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Aksesorët"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Telekomanda"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Cilësimet e telekomandës"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Konfiguro butonat e telekomandës"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Kontrollo volumin, energjinë dhe hyrjen në televizorë, marrës dhe soundbar-ë"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Lidh"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Lidhe me %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Shkëput"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Nuk ofrohet"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Apl. e admin. të pajisjes"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Asnjë aplikacion aktiv"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikacione aktive</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplikacion aktiv</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Çaktivizuar nga administratori, politika e enkriptimit ose hapësira ruajtëse e kredencialeve"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Informacioni i pajisjes së menaxhuar"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Ndryshimet dhe cilësimet menaxhohen nga organizata jote"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Asnjë"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Aplikacione të instaluara"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Numri i aplikacioneve është i përafërt. Ai mund të mos përfshijë aplikacionet e instaluara jashtë \"Dyqanit të Play\"."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Minimumi <xliff:g id="COUNT_1">%d</xliff:g> aplikacione</item>
- <item quantity="one">Minimumi <xliff:g id="COUNT_0">%d</xliff:g> aplikacion</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimumi # aplikacion}other{Minimumi # aplikacione}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Lejet e vendndodhjes"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Lejet e mikrofonit"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Lejet e kamerës"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Apl. e parazgjedhura"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aplikacione</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aplikacion</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# aplikacion}other{# aplikacione}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Tastiera e parazgjedhur"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Caktuar në <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Rrjeti VPN gjithmonë aktiv i aktivizuar"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Kredencialet e besuara"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Kredencialet e besuara në profilin tënd personal"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Kredencialet e besuara në profilin tënd të punës"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Minimumi <xliff:g id="COUNT_1">%d</xliff:g> certifikata CA</item>
- <item quantity="one">Minimumi <xliff:g id="COUNT_0">%d</xliff:g> certifikatë CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# certifikatë CA}other{# certifikata CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administratori mund ta kyçë pajisjen dhe rivendosë fjalëkalimin"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administratori mund të fshijë të gjitha të dhënat e pajisjes"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Përpjekje të dështuara për fjalëkalimin përpara se të fshihen të gjitha të dhënat e pajisjes"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Përpjekje të dështuara për fjalëkalimin përpara se të fshihen të dhënat e profilit të punës"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> përpjekje</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> përpjekje</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# përpjekje}other{# përpjekje}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Kjo pajisje menaxhohet nga organizata jote."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Kjo pajisje menaxhohet nga <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Mëso më shumë"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Aplikacionet e kamerës</item>
- <item quantity="one">Aplikacioni i kamerës</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Aplikacioni i kamerës}other{Aplikacionet e kamerës}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Aplikacioni i kalendarit"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Aplikacioni i kontakteve"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Aplikacionet e klientit të email-it</item>
- <item quantity="one">Aplikacioni i klientit të email-it</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{App i klientit të email-it}other{App të klientit të email-it}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Aplikacioni i hartës"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Aplikacionet e telefonatave</item>
- <item quantity="one">Aplikacioni i telefonatave</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Aplikacioni i telefonatave}other{Aplikacionet e telefonatave}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Aplikacioni i shfletuesit"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Versioni i sistemit operativ të Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Numri i serisë"</string>
<string name="about_build" msgid="8467840394761634575">"Ndërtimi i sistemit operativ të Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{Tani të duhet edhe # hap që të bëhesh zhvillues}other{Tani të duhen edhe # hapa që të bëhesh zhvillues}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Reklamat"</string>
<string name="ads_description" msgid="8081069475265061074">"Menaxho cilësimet e reklamave, si rivendosjen e ID-së sate reklamuese."</string>
<string name="ads_content_description" msgid="1006489792324920289">"\"Reklamat\", menaxho cilësimet e reklamave, si rivendosjen e ID-së sate reklamuese."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Përditësime shtesë të sistemit"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Rrjeti mund të jetë i monitoruar"</string>
<string name="done_button" msgid="616159688526431451">"U krye"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Besoji ose hiqi certifikatat</item>
- <item quantity="one">Besoje ose hiqe certifikatën</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ka instaluar autoritete certifikatash në pajisjen tënde, të cilat mund ta lejojë atë të monitorojë aktivitetin e rrjetit të pajisjes, duke përfshirë email-et, aplikacionet dhe sajtet e sigurta të uebit.\n\nPër më shumë informacione rreth këtyre certifikatave, kontakto me administratorin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ka instaluar një autoritet certifikate në pajisjen tënde, i cili mund ta lejojë atë të monitorojë aktivitetin e rrjetit të pajisjes, duke përfshirë email-et, aplikacionet dhe sajtet e sigurta të uebit.\n\nPër më shumë informacione rreth kësaj certifikate, kontakto me administratorin.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ka instaluar autoritete certifikate për profilin tënd të punës që mund ta lejojnë atë të monitorojë aktivitetin tënd të rrjetit të punës, duke përfshirë email-et, aplikacionet dhe sajtet e sigurta të uebit.\n\nPër më shumë informacione rreth këtyre certifikatave, kontakto me administratorin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ka instaluar një autoritet certifikate për profilin tënd të punës që mund ta lejojë atë të monitorojë aktivitetin tënd të rrjetit të punës, duke përfshirë email-et, aplikacionet dhe sajtet e sigurta të uebit.\n\nPër më shumë informacione rreth kësaj certifikate, kontakto me administratorin.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Një palë e tretë është në gjendje të monitorojë aktivitetin e rrjetit, përfshirë mail-in, aplikacionet dhe faqet e sigurta të internetit.\n\nKëtë po e bën këtë të mundur një kredencial i besuar i instaluar në pajisjen tënde."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Kontrollo certifikatat</item>
- <item quantity="one">Kontrollo certifikatën</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Besoje ose hiqe certifikatën}other{Besoji ose hiqi certifikatat}}"</string>
<string name="device_status" msgid="8266002761193692207">"Statusi"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Rrjeti, numrat e serisë dhe informacione të tjera"</string>
<string name="manual" msgid="5683935624321864999">"Manuale"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Lidh"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Harroje rrjetin"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Kjo pastron informacionet e përdorura për t\'u lidhur me këtë rrjet, duke përfshirë një fjalëkalim të ruajtur"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Bashkohu me një rrjet Wi-Fi duke skanuar kodin QR nga telefoni celular dhe ndiq udhëzimet."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Bashkohu me një rrjet Wi-Fi duke skanuar kodin QR nga një telefon celular dhe ndiq udhëzimet.\n \n Nga "<b>"një telefon Android"</b>", shko te Cilësimet -> Rrjeti dhe interneti -> Wi-Fi -> Zgjidh një rrjet Wi-Fi -> Të përparuara -> Shto një pajisje dhe më pas skano kodin QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Shtyp butonin \"Prapa\" për ta anuluar"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Në rregull"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Vazhdo"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Hapësira ruajtëse e pajisjes"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Hapësira ruajtëse e lëvizshme"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Rivendos"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Liro hapësirën ruajtëse"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Pastro të dhënat e memories specifike"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Liro <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Pastron skedarët e përkohshëm që zënë hapësirë. Të dhënat e ruajtura si preferencat e aplikacioneve apo videot jashtë linje nuk do të ndikohen dhe nuk do të të duhet të identifikohesh më në aplikacione."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Të pastrohen të dhënat e memories specifike?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Pastron memorien specifike për aplikacionet."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Çinstalo aplikacione"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> u montua"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> nuk mund të montohej"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Hapësira ruajtëse USB u lidh përsëri"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofoni"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Qasja te mikrofoni"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Qasja e aplikacionit te mikrofoni"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Qasja te mikrofoni u bllokua"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Për ta zhbllokuar, lëviz çelësin e privatësisë në pajisjen tënde në pozicionin e ndezjes së mikrofonit për të lejuar qasjen te mikrofoni."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Qasja te kamera"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Qasja e aplikacionit te kamera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Qasja te kamera u bllokua"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Për ta zhbllokuar, lëviz çelësin e privatësisë në pajisjen tënde në pozicionin e ndezjes së kamerës për të lejuar qasjen te kamera."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Qasja te mikrofoni: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Kur kjo është e aktivizuar, të gjitha aplikacionet dhe shërbimet që kanë lejen mund të kenë qasje te çdo mikrofon në këtë pajisje.\n\nPajisjet periferike të kamerës me një protokoll të personalizuar nuk do të preken nga ky cilësim."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Qasja te kamera: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Gurkali"</string>
<string name="color_yellow" msgid="3519470952904560404">"E verdhë"</string>
<string name="color_magenta" msgid="2377854703399624607">"E purpurt"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Përshkrimi i audios"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Dëgjo një përshkrim të asaj që ndodh në ekran te filmat dhe shfaqjet e mbështetura"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Aktivizo"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfigurimi"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Të përdoret <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Monitorimi"</string>
<string name="system_apps" msgid="8481888654606868074">"Aplikacionet"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Qëndro zgjuar"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Ekrani nuk do të kalojë asnjëherë në gjumë"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Kontrolli i HDCP-së"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Optimizimi i HDMI-së"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Të riniset tani?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Fik pajisjet HDMI me televizorin"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Ndezja automatike e televizorit"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Ndize televizorin me pajisjen HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Hyrje të lidhura</item>
- <item quantity="one">Hyrje e lidhur</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Hyrje në gatishmëri</item>
- <item quantity="one">Hyrje në gatishmëri</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Hyrje të palidhura</item>
- <item quantity="one">Hyrje e palidhur</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Hyrje e lidhur}other{Hyrje të lidhura}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Hyrje në gatishmëri}other{Hyrje në gatishmëri}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Nuk ka hyrje të lidhur}other{Nuk ka hyrje të lidhura}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Kufizo qasjen tek aplikacionet dhe përmbajtjet e tjera në llogarinë tënde"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Profil i kufizuar"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Kontrollohet nga <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Krijo një profil të kufizuar"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Cilësimet"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Aplikacionet e lejuara"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d aplikacione të lejuara</item>
- <item quantity="one">1 aplikacion i lejuar</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Lejohet"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Nuk lejohet"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Personalizo kufizimet"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Kodi burimor nga një palë e tretë"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Lejet"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Aplikacioni nuk disponohet"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Aplikacionet e papërdorura"</string>
<string name="settings_ok" msgid="5950888975075541964">"Në rregull"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Konfirmo"</string>
<string name="settings_cancel" msgid="576094334743686152">"Anulo"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Ky autorizim e lejon një aplikacion të modifikojë cilësimet e sistemit"</string>
<string name="write_settings_on" msgid="71675710746513956">"Po"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Jo"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Qasje te të gjithë skedarët"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Lejo qasjen për të menaxhuar të gjithë skedarët"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Lejo që ky aplikacion të lexojë, modifikojë dhe fshijë të gjithë skedarët në këtë pajisje ose në çdo volum hapësire ruajtjeje të lidhur. Nëse lejohet, aplikacioni mund të ketë qasje te skedarët pa dijeninë tënde të qartë."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Figurë brenda figurës"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Lejo figurë brenda figurës"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Asnjë aplikacion i instaluar nuk e mbështet figurën brenda figurës"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Lejo aplikacionet të krijojnë dritare \"figurë brenda figure\" ndërkohë që aplikacioni është i hapur ose pasi të dalësh prej tij (për shembull, për të vazhduar shikimin e një videoje). Kjo dritare shfaqet mbi aplikacionet e tjera që po përdor."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Lejo që aplikacionet të caktojnë alarmet dhe të planifikojnë veprime që kanë një afat të caktuar. Kjo lejon që aplikacionet të ekzekutohen në sfond, gjë që mund të përdorë më shumë energji.\n\nNëse kjo leje është caktuar si joaktive, alarmet ekzistuese dhe ngjarjet me bazë kohore të planifikuara nga aplikacionet nuk do të funksionojnë."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Ndiz ekranin"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Lejo ndezjen e ekranit"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Lejo një aplikacion të ndezë ekranin. Nëse lejohet, aplikacioni mund ta ndezë ekranin në çdo kohë pa synimin tënd të shprehur."</string>
<string name="special_access" msgid="21806055758289916">"Qasja e veçantë e apl."</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audioja"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Kursyesi i të dhënave"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Rregullo automatikisht cilësinë e videos për të përdorur më pak të dhëna celulare"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Përdorimi i të dhënave dhe sinjalizimet"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Mund të lidhesh me internetin me Wi-Fi, eternetin ose zonën e qasjes për internet të telefonit tënd. Për më shumë ndihmë, vizito "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Mund të lidhesh me internetin me Wi-Fi, Ethernet ose me zonën e qasjes për internet të telefonit tënd."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Veprimi nuk lejohet"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Volumi nuk mund të ndryshohet"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Fuqia dhe energjia"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Sjellja pas ndezjes"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Rivendos"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Kodi i çiftimit i ethernet-it"</string>
</resources>
diff --git a/Settings/res/values-sr/strings.xml b/Settings/res/values-sr/strings.xml
index d11de8a..45d8dfb 100644
--- a/Settings/res/values-sr/strings.xml
+++ b/Settings/res/values-sr/strings.xml
@@ -45,23 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Додајте налог"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Налози и пријављивање"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Нема налога"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> налог</item>
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> налога</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> налога</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# налог}one{# налог}few{# налога}other{# налога}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Медијске услуге, Помоћник, Плаћања"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Мрежа и интернет"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Звук"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Апликације"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Подешавања уређаја"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Даљински управљачи и додатна опрема"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Ниједан Bluetooth уређај није повезан"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> уређај додатне опреме</item>
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> уређаја додатне опреме</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> уређаја додатне опреме</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Приказ и звук"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Помоћ и повратне информације"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Приватност"</string>
@@ -120,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Ресетовање на фабричка подешавања"</string>
<string name="device_calibration" msgid="2907914144048739705">"Калибрација"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Уштеда енергије"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Уређаји"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Изаберите формате"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Просторни звук"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -187,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ОМОГУЋЕНИ ФОРМАТИ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ОНЕМОГУЋЕНИ ФОРМАТИ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Да бисте онемогућили ово, промените избор формата у Ручно."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Резолуција"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Аутоматски"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Резолуција је промењена"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Изаберите Потврди да бисте користили %1$s од сада."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Откажи"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Потврди"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Желите ли да обришете кеширане податке?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Биће обрисани кеширани подаци за све апликације."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Додај помоћни уређај"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Упаривање..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Повезивање…"</string>
@@ -226,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Додаци"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Даљински управљач"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Подешавања даљинског управљања"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Подесите дугмад на даљинском управљачу"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Контролишите јачину звука, напајање и улаз ТВ-а, пријемника и саундбарова"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Повежи"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Повежите са уређајем %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Прекини везу"</string>
@@ -264,11 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Није доступно"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Апл. за администратора уређаја"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Нема активних апликација"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Онемогућио администратор, смернице за шифровање или складиште акредитива"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Информације о уређају којим се управља"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Промене и подешавања којима управља организација"</string>
@@ -286,20 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Ништа"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Апликације су инсталиране"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Број апликација представља процену. Можда не обухвата апликације инсталиране изван Play продавнице."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Најмање # апликација}one{Најмање # апликација}few{Најмање # апликације}other{Најмање # апликација}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Дозволе за локацију"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Дозволе за микрофон"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Дозволе за камеру"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Подразумеване апликације"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# апликација}one{# апликација}few{# апликације}other{# апликација}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Подразумевана тастатура"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Подешено је на <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Стално укључен VPN је укључен"</string>
@@ -309,42 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Поуздани акредитиви"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Поуздани акредитиви на личном профилу"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Поуздани акредитиви на пословном профилу"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Најмање <xliff:g id="COUNT_1">%d</xliff:g> CA сертификат</item>
- <item quantity="few">Најмање <xliff:g id="COUNT_1">%d</xliff:g> CA сертификата</item>
- <item quantity="other">Најмање <xliff:g id="COUNT_1">%d</xliff:g> CA сертификата</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA сертификат}one{# CA сертификат}few{# CA сертификата}other{# CA сертификата}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Администратор може да закључава уређај и ресетује лозинку"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Администратор може да брише све податке са уређаја"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Неуспели покушаји уноса лозинке пре брисања свих података са уређаја"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Неуспели покушаји уноса лозинке пре брисања података са пословног профила"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# покушај}one{# покушај}few{# покушаја}other{# покушаја}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Овим уређајем управља организација."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Овим уређајем управља <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Сазнајте више"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Апликације за камеру</item>
- <item quantity="few">Апликације за камеру</item>
- <item quantity="other">Апликације за камеру</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Апликација за камеру}one{Апликације за камеру}few{Апликације за камеру}other{Апликације за камеру}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Апликација Календар"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Апликација Контакти"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Апликације имејл клијента</item>
- <item quantity="few">Апликације имејл клијента</item>
- <item quantity="other">Апликације имејл клијента</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Апликација имејл клијента}one{Апликације имејл клијента}few{Апликације имејл клијента}other{Апликације имејл клијента}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Апликација за мапе"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Апликације за телефон</item>
- <item quantity="few">Апликације за телефон</item>
- <item quantity="other">Апликације за телефон</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Апликација за телефон}one{Апликације за телефон}few{Апликације за телефон}other{Апликације за телефон}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Апликација прегледача"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -363,11 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Верзија оперативног система Android TV-а"</string>
<string name="about_serial" msgid="3432319328808745459">"Серијски број"</string>
<string name="about_build" msgid="8467840394761634575">"Верзија оперативног система Android TV-а"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{Треба да обавите још # корак да бисте постали програмер}one{Треба да обавите још # корак да бисте постали програмер}few{Треба да обавите још # корака да бисте постали програмер}other{Треба да обавите још # корака да бисте постали програмер}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Огласи"</string>
<string name="ads_description" msgid="8081069475265061074">"Управљајте подешавањима огласа попут ресетовања ИД-а оглашавања."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Огласи, Управљајте подешавањима огласа попут ресетовања ИД-а оглашавања."</string>
@@ -381,27 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Додатна ажурирања система"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Мрежа се можда надгледа"</string>
<string name="done_button" msgid="616159688526431451">"Готово"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Означите сертификате као поуздане или их уклоните</item>
- <item quantity="few">Означите сертификате као поуздане или их уклоните</item>
- <item quantity="other">Означите сертификате као поуздане или их уклоните</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> је инсталирао ауторитете за издавање сертификата на уређају, што може да му омогући да прати активности на пословној мрежи, укључујући имејлове, апликације и безбедне веб-сајтове.\n\nОбратите се администратору да бисте добили више информација о овом сертификату.</item>
- <item quantity="few"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> је инсталирао ауторитете за издавање сертификата на уређају, што може да му омогући да прати активности на пословној мрежи, укључујући имејлове, апликације и безбедне веб-сајтове.\n\nОбратите се администратору да бисте добили више информација о овом сертификату.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> је инсталирао ауторитете за издавање сертификата на уређају, што може да му омогући да прати активности на пословној мрежи, укључујући имејлове, апликације и безбедне веб-сајтове.\n\nОбратите се администратору да бисте добили више информација о овом сертификату.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> је инсталирао ауторитете за издавање сертификата за пословни профил, што може да му омогући да прати активности на пословној мрежи, укључујући имејлове, апликације и безбедне веб-сајтове.\n\nОбратите се администратору да бисте добили више информација о овом сертификату.</item>
- <item quantity="few"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> је инсталирао ауторитете за издавање сертификата за пословни профил, што може да му омогући да прати активности на пословној мрежи, укључујући имејлове, апликације и безбедне веб-сајтове.\n\nОбратите се администратору да бисте добили више информација о овом сертификату.</item>
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> је инсталирао ауторитете за издавање сертификата за пословни профил, што може да му омогући да прати активности на пословној мрежи, укључујући имејлове, апликације и безбедне веб-сајтове.\n\nОбратите се администратору да бисте добили више информација о овом сертификату.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Трећа страна може да прати вашу активност на мрежи, укључујући е-пошту, апликације и безбедне веб-сајтове.\n\nТо омогућава поуздани акредитив који је инсталиран на уређају."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Провери сертификате</item>
- <item quantity="few">Провери сертификате</item>
- <item quantity="other">Провери сертификате</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Означите сертификат као поуздан или га уклоните}one{Означите сертификате као поуздане или их уклоните}few{Означите сертификате као поуздане или их уклоните}other{Означите сертификате као поуздане или их уклоните}}"</string>
<string name="device_status" msgid="8266002761193692207">"Статус"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Мрежа, серијски бројеви и друге информације"</string>
<string name="manual" msgid="5683935624321864999">"Упутство"</string>
@@ -493,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Повежи"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Заборави мрежу"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Овако ћете обрисати информације за повезивање на ову мрежу, укључујући и сачувану лозинку"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Придружите се WiFi мрежи тако што ћете скенирати QR кôд помоћу мобилног телефона и пратити упутства."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Придружите се WiFi мрежи тако што ћете скенирати QR кôд помоћу мобилног телефона и пратити упутства.\n \n На "<b>"Android телефону"</b>" идите у Подешавања -> Мрежа и интернет -> WiFi -> Изаберите WiFi -> Напредно -> Додајте уређај и скенирајте QR кôд."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Притисните дугме Назад да бисте отказали"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Потврди"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Настави"</string>
@@ -562,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Меморија уређаја"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Преносива меморија"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Ресетовање"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Ослободите меморијски простор"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Обришите кеширане податке"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Ослободите <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Брише привремене фајлове који заузимају простор. Не утиче на сачуване податке, попут подешавања апликације или офлајн видео снимака и нећете морати да се поново пријављујете у апликације"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Желите ли да обришете кеширане податке?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Биће обрисани кеширани подаци за све апликације."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Деинсталирај апликације"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Уређај <xliff:g id="NAME">%1$s</xliff:g> је прикључен"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Прикључивање уређаја <xliff:g id="NAME">%1$s</xliff:g> није успело"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB меморија је поново повезана"</string>
@@ -639,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Микрофон"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Приступ микрофону"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Приступ апликације микрофону"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Приступ микрофону је блокиран"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Да бисте одблокирали, померите прекидач за приватност на уређају на позицију укључено за микрофон како бисте омогућили приступ микрофону."</string>
<string name="camera" msgid="1226671478936288283">"Камера"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Приступ камери"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Приступ апликације камери"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Приступ камери је блокиран"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Да бисте одблокирали, померите прекидач за приватност на уређају на позицију укључено за камеру како бисте омогућили приступ камери."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Приступ микрофону: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Када је укључено, све апликације и услуге са дозволом могу да приступају сваком микрофону на овом уређају.\n\nОво подешавање не утиче на периферне аудио уређаје са прилагођеним протоколом."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Приступ камери: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -713,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Тиркизна"</string>
<string name="color_yellow" msgid="3519470952904560404">"Жута"</string>
<string name="color_magenta" msgid="2377854703399624607">"Магента"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Звучни опис"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Слушајте опис тренутних дешавања на екрану у подржаним филмовима и серијама"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Омогући"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Конфигурација"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Желите ли да користите <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -733,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Надгледање"</string>
<string name="system_apps" msgid="8481888654606868074">"Апликације"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Не закључавај"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Екран никада неће бити у режиму спавања"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP провера"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI оптимизација"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Желите ли поново да покренете одмах?"</string>
@@ -853,21 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Гашење HDMI уређаја помоћу ТВ-а"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Аутоматски укључи ТВ"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Укључи ТВ помоћу HDMI уређаја"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Повезани улази</item>
- <item quantity="few">Повезани улази</item>
- <item quantity="other">Повезани улази</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Улази у режиму приправности</item>
- <item quantity="few">Улази у режиму приправности</item>
- <item quantity="other">Улази у режиму приправности</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Неповезани улази</item>
- <item quantity="few">Неповезани улази</item>
- <item quantity="other">Неповезани улази</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Повезани улаз}one{Повезани улази}few{Повезани улази}other{Повезани улази}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Улаз у режиму мировања}one{Улази у режиму мировања}few{Улази у режиму мировања}other{Улази у режиму мировања}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Неповезани улаз}one{Неповезани улази}few{Неповезани улази}other{Неповезани улази}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Ограничите приступ апликацијама и другом садржају на налогу"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Ограничени профил"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Контролише <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -881,11 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Направите профил са ограниченим приступом"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Подешавања"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Дозвољене апликације"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">Дозвољена је %d апликација</item>
- <item quantity="few">Дозвољене су %d апликације</item>
- <item quantity="other">Дозвољено је %d апликација</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Дозвољено"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Није дозвољено"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Прилагоди ограничења"</string>
@@ -930,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Независни извор"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Дозволе"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Апликација није доступна"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Апликације које се не користе"</string>
<string name="settings_ok" msgid="5950888975075541964">"Потврди"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Потврди"</string>
<string name="settings_cancel" msgid="576094334743686152">"Откажи"</string>
@@ -1013,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Ова дозвола дозвољава апликацији да мења подешавања система."</string>
<string name="write_settings_on" msgid="71675710746513956">"Да"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Не"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Приступ свим датотекама"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Дозволи приступ за управљање свим датотекама"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Дозволите да ова апликација чита, мења и брише све датотеке на овом уређају или свим повезаним уређајима за складиштење. Ако то дозволите, апликација може да приступа датотекама без вашег знања."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Слика у слици"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Дозволи слику у слици"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Ниједна инсталирана апликација не подржава слику у слици"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Дозволите апликацијама да праве прозор слике у слици док је апликација отворена или када изађете из ње (на пример, да бисте наставили да гледате видео). Овај прозор се приказује преко других апликација које користите."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Омогућите апликацијама да подешавају аларме и заказују временски осетљиве радње. То омогућава да апликације буду покренуте у позадини, што може да троши више енергије.\n\nАко је ова дозвола искључена, постојећи аларми и догађаји засновани на времену заказани помоћу апликације неће радити."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Укључите екран"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Дозволи укључивање екрана"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Дозвољава апликацији да укључи подешавање. Ако се омогући, апликација може да укључи екран у било ком тренутку без ваше експлицитне намере."</string>
<string name="special_access" msgid="21806055758289916">"Посебан приступ апликација"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Звук"</string>
@@ -1034,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Уштеда података"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Аутоматски прилагођава квалитет видеа ради уштеде мобилних података"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Потрошња података и обавештења"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Можете да се повежете на интернет помоћу WiFi-а, етернета или хотспота на телефону. Додатну помоћ потражите на "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Можете да се повежете на интернет помоћу WiFi-ја, етернета или хотспота на телефону."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Радња није дозвољена"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Не можете да промените јачину звука"</string>
@@ -1084,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Напајање и енергија"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Понашање при укључивању"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Ресетуј"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Кôд за упаривање за етернет"</string>
</resources>
diff --git a/Settings/res/values-sv/strings.xml b/Settings/res/values-sv/strings.xml
index 58f0aaf..27a10ad 100644
--- a/Settings/res/values-sv/strings.xml
+++ b/Settings/res/values-sv/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Lägg till ett konto"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Konton och inloggning"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Inga konton"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> konton</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> konto</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# konto}other{# konton}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Medietjänster, Assistent, betalningar"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Nätverk och internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Ljud"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Appar"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Enhetsinställningar"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Fjärrkontroller och tillbehör"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Inga anslutna Bluetooth-enheter"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> tillbehör</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> tillbehör</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Skärm och ljud"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Hjälp och feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Integritet"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Återställ standardinställningarna"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrering"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Strömsparläge"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Enheter"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Välj format"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Surroundljud"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"AKTIVERADE FORMAT"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"INAKTIVERADE FORMAT"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Inaktivera genom att ändra formatval till Manuellt."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Upplösning"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Automatisk"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Upplösningen har ändrats"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Välj OK om du vill använda %1$s i fortsättningen."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Avbryt"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Vill du ta bort cachelagrad data?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Cachelagrad data tas bort i alla appar."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Lägg till tillbehör"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Kopplas …"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Ansluter …"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Tillbehör"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Fjärrkontroll"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Inställningar för fjärrstyrning"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Konfigurera fjärrkontrollsknappar"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Styr volymen, strömbrytaren och val av ingångskälla på tv:ar, mottagare och soundbar-högtalare"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Anslut"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Anslut till %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Koppla från"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Inte tillgängligt"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Appar för enhetsadministratör"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Inga aktiva appar"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> aktiva appar</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> aktiv app</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Inaktiverad p.g.a. admin., kryptering eller uppgiftslagring"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Information om hanterad enhet"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Ändringar och inställningar som hanteras av organisationen"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Inga"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Installerade appar"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Antalet appar är en uppskattning. Appar som har installerats utanför Play Butik är kanske inte inräknade."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Minst <xliff:g id="COUNT_1">%d</xliff:g> appar</item>
- <item quantity="one">Minst <xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minst # app}other{Minst # appar}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Platsbehörigheter"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mikrofonbehörigheter"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Kamerabehörigheter"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Standardappar"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> appar</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}other{# appar}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Standardtangentbord"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Inställt på <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Always-on för VPN har aktiverats"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Tillförlitlig autentisering"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Tillförlitlig autentisering i din personliga profil"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Tillförlitlig autentisering i din jobbprofil"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Minst <xliff:g id="COUNT_1">%d</xliff:g> CA-certifikat</item>
- <item quantity="one">Minst <xliff:g id="COUNT_0">%d</xliff:g> CA-certifikat</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA-certifikat}other{# CA-certifikat}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administratören kan låsa enheten och återställa lösenordet"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administratören kan radera all data på enheten"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Misslyckade försök att ange lösenordet innan all data på enheten raderas"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Misslyckade försök att ange lösenordet innan data i jobbprofilen raderas"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> försök</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> försök</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# försök}other{# försök}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Den här enheten hanteras av organisationen."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Den här enheten hanteras av <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Läs mer"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Kameraappar</item>
- <item quantity="one">Kameraapp</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Kameraapp}other{Kameraappar}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Kalenderapp"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Kontaktapp"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">E-postklientappar</item>
- <item quantity="one">E-postklientapp</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{E-postklientapp}other{E-postklientappar}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Kartapp"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Telefonappar</item>
- <item quantity="one">Telefonapp</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Telefonapp}other{Telefonappar}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Webbläsarapp"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Version av Android TV:s operativsystem"</string>
<string name="about_serial" msgid="3432319328808745459">"Serienummer"</string>
<string name="about_build" msgid="8467840394761634575">"Underversion av Android TV:s operativsystem"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Annonser"</string>
<string name="ads_description" msgid="8081069475265061074">"Hantera annonsinställningarna, t.ex. återställning av reklam-id."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Annonser: Hantera annonsinställningarna, t.ex. återställning av reklam-id."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Ytterligare systemuppdateringar"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Nätverket kan vara övervakat"</string>
<string name="done_button" msgid="616159688526431451">"Klart"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Lita på eller ta bort certifikaten</item>
- <item quantity="one">Lita på eller ta bort certifikatet</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> har installerat certifikatutfärdare på din enhet. Detta innebär att nätverksaktivitet på enheten, som e-postmeddelanden, appar och säkra webbplatser, kan övervakas.\n\nKontakta administratören om du vill veta mer om certifikaten.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> har installerat en certifikatutfärdare på din enhet. Detta innebär att nätverksaktivitet på enheten, som e-postmeddelanden, appar och säkra webbplatser, kan övervakas.\n\nKontakta administratören om du vill veta mer om certifikatet.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> har installerat certifikatutfärdare för jobbprofilen. Detta innebär att nätverksaktivitet på jobbet, som e-postmeddelanden, appar och säkra webbplatser, kan övervakas.\n\nKontakta administratören om du vill veta mer om certifikaten.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> har installerat en certifikatutfärdare för jobbprofilen. Detta innebär att nätverksaktivitet på jobbet, som e-postmeddelanden, appar och säkra webbplatser, kan övervakas.\n\nKontakta administratören om du vill veta mer om certifikatet.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Din nätverksaktivitet, inklusive e-post, appar och säkra webbplatser, kan övervakas av tredje part.\n\nDetta är möjligt eftersom betrodda autentiseringsuppgifter har installerats på enheten."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Kontrollera certifikaten</item>
- <item quantity="one">Kontrollera certifikatet</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Lita på eller ta bort certifikatet}other{Lita på eller ta bort certifikaten}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Nätverk, serienummer och andra uppgifter"</string>
<string name="manual" msgid="5683935624321864999">"Handbok"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Anslut"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Glöm nätverk"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Uppgifterna som används för att ansluta till det här nätverket tas bort, inklusive sparade lösenord"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Anslut till ett wifi-nätverk genom att skanna QR-koden med telefonen och följa anvisningarna."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Anslut till ett wifi-nätverk genom att skanna QR-koden med en telefon och följa anvisningarna.\n \n På en "<b>"Android-telefon"</b>" öppnar du Inställningar -> Nätverk och internet -> wifi -> Välj ett wifi-nätverk -> Avancerat -> Lägg till en enhet och skannar sedan QR-koden."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Avbryt genom att trycka på bakåtknappen"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Fortsätt"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Lagring på enhet"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Flyttbara lagringsenheter"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Återställ"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Frigöra utrymme"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Ta bort cachelagrad data"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Frigör <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Tillfälliga filer som tar upp utrymme tas bort. Detta påverkar inte sparad data som appinställningar eller offlinevideor, och du behöver inte logga in i appar igen."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Vill du ta bort cachelagrad data?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Cachelagrad data tas bort i alla appar."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Avinstallera appar"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> har monterats"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Det gick inte att montera <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB-lagringsenheten har anslutits igen"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Mikrofonåtkomst"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Appåtkomst till mikrofonen"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Mikrofonåtkomst är blockerad"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Du återaktiverar genom att flytta integritetsreglaget på enheten till läget för aktiverad mikrofon och ge åtkomst till mikrofonen."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Kameraåtkomst"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Appåtkomst till kameran"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Kameraåtkomst är blockerad"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Du återaktiverar genom att flytta integritetsreglaget på enheten till läget för aktiverad kamera och ge åtkomst till kameran."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Mikrofonåtkomst: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"När funktionen är aktiverad får alla appar och tjänster med behörighet åtkomst till mikrofonerna på den här enheten.\n\nExterna ljudenheter med anpassat protokoll påverkas inte av inställningen."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Kameraåtkomst: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Gul"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Ljudbeskrivning"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Få en beskrivning av vad som händer på skärmen i filmer och program som stöds"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Aktivera"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfiguration"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Vill du använda <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Bevakning"</string>
<string name="system_apps" msgid="8481888654606868074">"Appar"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Lås inte"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Skärmen vilar aldrig"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP-kontroll"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI-optimering"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Vill du starta om nu?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Stänga av HDMI-enheter med tv:n"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Slå på tv:n automatiskt"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Slå på tv:n med en HDMI-enhet"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Anslutna ingångskällor</item>
- <item quantity="one">Ansluten ingångskälla</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Standby-ingångskällor</item>
- <item quantity="one">Standby-ingångskälla</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Ej anslutna ingångskällor</item>
- <item quantity="one">Ej ansluten ingångskälla</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Ansluten ingångskälla}other{Anslutna ingångskällor}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Standby-ingångskälla}other{Standby-ingångskällor}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Ej ansluten ingångskälla}other{Ej anslutna ingångskällor}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Begränsa åtkomst till appar och annat innehåll i kontot"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Begränsad profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Styrs av <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Skapa en begränsad profil"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Inställningar"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Tillåtna appar"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d appar tillåts</item>
- <item quantity="one">1 app tillåts</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Tillåts"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Inte tillåtet"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Anpassa begränsingar"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Extern källa"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Behörigheter"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Appen är inte tillgänglig"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Appar som inte används"</string>
<string name="settings_ok" msgid="5950888975075541964">"Ok"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Bekräfta"</string>
<string name="settings_cancel" msgid="576094334743686152">"Avbryt"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Med den här behörigheten kan appen ändra systeminställningar."</string>
<string name="write_settings_on" msgid="71675710746513956">"Ja"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Nej"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Åtkomst till alla filer"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Tillåt hanteringsåtkomst för alla filer"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Tillåt att den här appen får läsa, redigera och radera alla filer på enheten och eventuella anslutna lagringsutrymmen. Om du beviljar behörigheten kan appen komma åt filer utan att du informeras."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Bild-i-bild"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Tillåt bild-i-bild"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Inga installerade appar stöder bild-i-bild"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Tillåt att ett bild-i-bild-fönster skapas av appen medan den är öppen eller när du har slutat att använda den (till exempel när du fortsätter att titta på en video). Detta fönster visas ovanpå andra appar du använder."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Tillåt att appar ställer in alarm och schemalägger tidskänsliga åtgärder. Om du tillåter detta kan appar köras i bakgrunden, vilket kan dra mer ström.\n\nOm behörigheten är inaktiverad fungerar inte befintliga alarm och tidsbaserade händelser som schemalagts av appen."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Aktivera skärmen"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Tillåt att skärmen aktiveras"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Tillåt att en app aktiverar skärmen. Om du ger tillåtelse kan appen aktivera skärmen när som helst utan din uttryckliga avsikt."</string>
<string name="special_access" msgid="21806055758289916">"Särskild appåtkomst"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Ljud"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Databesparing"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Justera videokvaliteten automatiskt för att använda mindre mobildata"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Dataanvändning och aviseringar"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Du kan ansluta till internet med wifi, Ethernet eller telefonens surfzon. Besök "<b>"g.co/network"</b>" om du vill ha mer hjälp."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Du kan ansluta till internet med wifi, Ethernet eller telefonens surfzon."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Åtgärden är inte tillåten"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Det gick inte att ändra volymen"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Ström och energi"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Beteende när tv:n slås på"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Återställ"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet-kopplingskod"</string>
</resources>
diff --git a/Settings/res/values-sw/strings.xml b/Settings/res/values-sw/strings.xml
index c7abeb9..ba06af7 100644
--- a/Settings/res/values-sw/strings.xml
+++ b/Settings/res/values-sw/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Ongeza akaunti"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Akaunti na kuingia katika akaunti"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Hakuna akaunti"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other">Akaunti <xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g></item>
- <item quantity="one">Akaunti <xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g></item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{Akaunti #}other{Akaunti #}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Huduma za maudhui, Mratibu wa Google, Malipo"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Mtandao na Intaneti"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Sauti"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Programu"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Mapendeleo ya Kifaa"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Vidhibiti mbali na vifaa vya ziada"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Hakuna vifaa vya Bluetooth vilivyounganishwa"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other">Vifaa <xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> vya ziada</item>
- <item quantity="one">Kifaa <xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> cha ziada</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Onyesho na Sauti"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Usaidizi na Maoni"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Faragha"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Kurejesha data iliyotoka nayo kiwandani"</string>
<string name="device_calibration" msgid="2907914144048739705">"Marekebisho"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Kiokoa nishati"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Vifaa"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Chagua miundo"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Sauti inayozingira"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"MIUNDO INAYOTUMIKA"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"MIUNDO ISIYOTUMIKA"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Ili uzime, badilisha uteuzi wa muundo kuwa \'Teua Mwenyewe\'."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Ubora"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Otomatiki"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Umebadilisha ubora"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Chagua Sawa ili utumie %1$s kuanzia sasa."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Ghairi"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Sawa"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Ungependa kufuta data iliyo kwenye akiba?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Hii itafuta data iliyo kwenye akiba ya programu zote."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Ongeza kifaa"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Inaoanisha..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Inaunganisha…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Vifaa vya ziada"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Kidhibiti cha Mbali"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Mipangilio ya kidhibiti cha mbali"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Weka mipangilio ya vitufe vya kidhibiti cha mbali"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Dhibiti sauti, kuzima/kuwasha na vyanzo kwenye TV, spika na vipokea sauti na video"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Unganisha"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Unganisha kwenye %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Tenganisha"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Haipatikani"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Programu za msimamizi wa kifaa"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Hakuna programu zinazotumika"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other">Programu <xliff:g id="COUNT_1">%d</xliff:g> zinatumika</item>
- <item quantity="one">Programu <xliff:g id="COUNT_0">%d</xliff:g> inatumika</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Imezimwa na msimamizi, sera ya usimbaji fiche, au hifadhi ya hati"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Maelezo kuhusu kifaa kinachosimamiwa"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Mabadiliko na mipangilio inayosimamiwa na shirika lako"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Hakuna"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Programu zilizosakinishwa"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Idadi ya programu imekadiriwa. Huenda haijumuishi programu ulizosakinisha nje ya Duka la Google Play."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Angalau programu <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">Angalau programu <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Angalau programu #}other{Angalau programu #}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Ruhusa za mahali"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Ruhusa za maikrofoni"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Ruhusa za kamera"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Programu chaguomsingi"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other">Programu <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">Programu <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{Programu #}other{Programu #}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Kibodi chaguomsingi"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Weka kuwa <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"VPN iwe imewashwa kila wakati"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Stakabadhi zinazoaminika"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Kitambulisho cha kuaminika katika wasifu wako wa binafsi"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Kitambulisho cha kuaminika katika wasifu wako wa kazini"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Angalau vyeti <xliff:g id="COUNT_1">%d</xliff:g> vya CA</item>
- <item quantity="one">Angalau cheti <xliff:g id="COUNT_0">%d</xliff:g> cha CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{Cheti cha CA #}other{Vyeti vya CA #}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Msimamizi anaweza kufunga kifaa na kubadilisha nenosiri"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Msimamizi anaweza kufuta data yote ya kifaa"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Data yote ya kifaa ijifute baada ya kujaribu kuweka nenosiri lisilo sahihi mara nyingi mno"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Data yote ya wasifu wa kazini ijifute baada ya kujaribu kuweka nenosiri lisilo sahihi mara nyingi mno"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other">Majaribio <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">Jaribio <xliff:g id="COUNT_0">%d</xliff:g></item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{Jaribio #}other{Majaribio #}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Kifaa hiki kinadhibitiwa na shirika lako."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Kifaa hiki kinasimamiwa na <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Pata maelezo zaidi"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Programu za kamera</item>
- <item quantity="one">Programu ya kamera</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Programu ya kamera}other{Programu za kamera}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Programu ya kalenda"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Programu ya anwani"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Programu za barua pepe</item>
- <item quantity="one">Programu ya barua pepe</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Programu ya barua pepe}other{Programu za barua pepe}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Programu ya ramani"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Programu za simu</item>
- <item quantity="one">Programu ya simu</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Programu ya simu}other{Programu za simu}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Programu ya kivinjari"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Toleo la Mfumo wa Uendeshaji wa Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Nambari ya ufuatiliaji"</string>
<string name="about_build" msgid="8467840394761634575">"Muundo wa Mfumo wa Uendeshaji wa Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Umebakiza hatua <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ili uwe msanidi programu</item>
- <item quantity="one">Umebakiza hatua <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> ili uwe msanidi programu</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Sasa umebakisha hatua # ili uwe msanidi programu}other{Sasa umebakisha hatua # ili uwe msanidi programu}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Matangazo"</string>
<string name="ads_description" msgid="8081069475265061074">"Dhibiti mipangilio yako ya matangazo, kama vile kubadilisha kitambulisho cha kifaa kwa ajili ya matangazo"</string>
<string name="ads_content_description" msgid="1006489792324920289">"Matangazo, Dhibiti mipangilio yako ya matangazo, kama vile kubadilisha kitambulisho chako cha kifaa kwa ajili ya matangazo."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Masisho ya ziada ya mfumo"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Huenda mtandao unafuatiliwa"</string>
<string name="done_button" msgid="616159688526431451">"Nimemaliza"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Tumia au uondoe vyeti</item>
- <item quantity="one">Tumia au uondoe cheti</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> amesakinisha vyeti kwenye kifaa chako ambavyo huenda vikamwezesha kufuatilia shughuli za mtandao wa kifaa chako, ikijumuisha barua pepe, programu na tovuti salama.\n\nIli upate maelezo zaidi kuhusu vyeti hivi, wasiliana na msimamizi wako.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> amesakinisha cheti kwenye kifaa chako ambacho huenda kikamwezesha kufuatilia shughuli za mtandao wa kifaa chako, ikijumuisha barua pepe, programu na tovuti salama.\n\nIli upate maelezo zaidi kuhusu cheti hiki, wasiliana na msimamizi wako.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> amesakinisha vyeti kwa wasifu wako wa kazini, ambavyo huenda vikamwezesha kufuatilia shughuli za mtandao wa kazini, ikijumuisha barua pepe, programu na tovuti salama.\n\nIli upate maelezo zaidi kuhusu vyeti hivi, wasiliana na msimamizi wako.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> amesakinisha cheti kwa wasifu wako wa kazini, ambacho huenda kikamwezesha kufuatilia shughuli za mtandao wa kazini, ikijumuisha barua pepe, programu na tovuti salama.\n\nIli upate maelezo zaidi kuhusu cheti hiki, wasiliana na msimamizi wako.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Mtu mwingine ana uwezo wa kufuatilia shughuli ya mtandao wako, ikiwa ni pamoja na barua pepe, programu, na tovuti salama. \n\n Kitambulisho cha kuaminika kilichosakinishwa kwenye kifaa chako kinafanikisha hili."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Angalia vyeti</item>
- <item quantity="one">Angalia cheti</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Tumia au uondoe cheti}other{Tumia au uondoe vyeti}}"</string>
<string name="device_status" msgid="8266002761193692207">"Hali"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Mtandao, nambari za mfululizo na maelezo mengine"</string>
<string name="manual" msgid="5683935624321864999">"Mwongozo"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Unganisha"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Sahau mtandao"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Hii hufuta maelezo yaliyotumika kuunganisha kwenye mtandao huu, pamoja na nenosiri lililohifadhiwa"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Unganisha kwenye mtandao wa Wifi kwa kuchanganua msimbo wa QR katika simu yako kisha ufuate maagizo."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Unganisha kwenye mtandao wa Wifi kwa kuchanganua msimbo wa QR katika simu kisha ufuate maagizo.\n \n Kwenye "<b>"Simu ya Android"</b>" nenda kwenye Mipangilio -> Mtandao na intaneti -> Wi-Fi -> Chagua Wi-Fi -> Mipangilio ya Kina -> Ongeza kifaa kisha uchanganue msimbo QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Bonyeza kitufe cha kurudi nyuma ili ughairi"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Sawa"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Endelea"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Hifadhi ya kifaa"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Hifadhi unayoweza kuondoa"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Weka upya"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Futa faili ili upate nafasi"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Futa data iliyo kwenye akiba"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Ongeza nafasi ya <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Itafuta faili zilizohifadhiwa kwa muda zinazochukua nafasi nyingi. Haitaathiri data uliyohifadhi kama vile mapendeleo ya programu au video za nje ya mtandao, na hutahitaji kuingia tena katika akaunti kwenye programu."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Ungependa kufuta data iliyo kwenye akiba?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Hatua hii itafuta data iliyo kwenye akiba ya programu zote."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Ondoa programu"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> imepachikwa"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Haikuweza kupachika <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Hifadhi ya USB imeunganishwa upya"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Maikrofoni"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Ufikiaji wa maikrofoni"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Idhini ya programu ya kufikia maikrofoni"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Ufikiaji wa maikrofoni umezuiwa"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Ili uondoe kizuizi, sogeza swichi ya faragha ya maikrofoni kwenye kifaa chako ili kuiwasha na uruhusu ufikiaji wa maikrofoni."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Ufikiaji wa kamera"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Idhini ya programu ya kufikia kamera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Ufikiaji wa kamera umezuiwa"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Ili uondoe kizuizi, sogeza swichi ya faragha ya kamera kwenye kifaa chako ili kuiwasha na uruhusu ufikiaji wa kamera."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Ufikiaji wa Maikrofoni: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Ukiwasha, programu na huduma zote zilizoidhinishwa zinaweza kufikia maikrofoni yoyote kwenye kifaa hiki.\n\nVifaa vya sauti vyenye mipangilio maalum havitaathiriwa na kipengele hiki."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Ufikiaji wa Kamera: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Samawati-Kijani"</string>
<string name="color_yellow" msgid="3519470952904560404">"Manjano"</string>
<string name="color_magenta" msgid="2377854703399624607">"Majenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Maelezo ya sauti"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Sikia maelezo ya kinachotendeka katika skrini kwenye filamu na vipindi ambapo hili linawezekana"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Washa"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Usanidi"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g>: iwashwe?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Ufuatiliaji"</string>
<string name="system_apps" msgid="8481888654606868074">"Programu"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Usifunge"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Skrini haitazima"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Inakagua HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Ukuzaji wa HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Ungependa kuzima na uwashe tena?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Zima vifaa vya HDMI kwa kutumia runinga"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Kipengele cha kuwasha runinga otomatiki kimewashwa"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Washa runinga kwa kutumia kifaa cha HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Vifaa Vilivyounganishwa</item>
- <item quantity="one">Kifaa Kilichounganishwa</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Vifaa ambavyo Havina Shughuli</item>
- <item quantity="one">Kifaa ambacho Hakina Shughuli</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Vifaa ambavyo Havijaunganishwa</item>
- <item quantity="one">Kifaa ambacho Hakijaunganishwa</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Kifaa Kilichounganishwa}other{Vifaa Vilivyounganishwa}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Kifaa ambacho Hakina Shughuli}other{Vifaa ambavyo Havina Shughuli}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Kifaa ambacho Hakijaunganishwa}other{Vifaa ambavyo Havijaunganishwa}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Zuia ufikiaji wa programu na maudhui mengineyo katika akaunti yako"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Wasifu Uliozuiwa"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Inadhibitiwa na <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Unda wasifu uliodhibitiwa"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Mipangilio"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Programu zilizoruhusiwa"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">Programu %d zimeruhusiwa</item>
- <item quantity="one">Programu 1 imeruhusiwa</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Imeruhusiwa"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Hairuhusiwi"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Geuza vizuizi viwe utakavyo"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Chanzo Kingine"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Ruhusa"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Programu haipatikani"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Programu zisizotumika"</string>
<string name="settings_ok" msgid="5950888975075541964">"SAWA"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Thibitisha"</string>
<string name="settings_cancel" msgid="576094334743686152">"Ghairi"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Idhini hii huruhusu programu kubadilisha mipangilio ya mfumo"</string>
<string name="write_settings_on" msgid="71675710746513956">"Ndiyo"</string>
<string name="write_settings_off" msgid="6730113471695092167">"La"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Kufikia faili zote"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Ruhusu ufikiaji ili idhibiti faili zote"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Ruhusu programu hii isome, irekebishe na kufuta faili zote kwenye kifaa hiki au nafasi zozote za hifadhi zilizounganishwa. Ukiipa ruhusa, huenda programu ikafikia faili bila ufahamu wako."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picha ndani ya picha"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Ruhusu picha ndani ya picha"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Hujasakinisha programu yoyote inayoweza kutumia kipengele cha Picha ndani ya picha"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Ruhusu programu ifungue kidirisha cha picha ndani ya picha ukiwa umefungua programu au baada ya kuifunga (kwa mfano, ili uendelee kutazama video). Kidirisha hiki kitaonekana juu ya programu nyingine unazotumia."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Ruhusu programu ziweke kengele na ratiba za vitendo vinavyozingatia muda. Hatua hii huruhusu programu kuendeshwa chinichini na huenda hii ikaongeza nishati inayotumika.\n\nUkizima ruhusa hii, kengele na ratiba za vitendo vinavyozingatia muda zilizowekwa na programu hii hazitafanya kazi."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Washa skrini"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Ruhusu kuwasha skrini"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Ruhusu programu iwashe skrini. Ikiwa imepewa idhini, programu inaweza kuwasha skrini wakati wowote bila utaratibu wako dhahiri wa kuratibu."</string>
<string name="special_access" msgid="21806055758289916">"Idhini maalum ya kufikia programu"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Sauti"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Kiokoa Data"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Rekebisha ubora wa video kiotomatiki ili utumie kiasi kidogo cha data ya simu"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Arifa na matumizi ya data"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Unaweza kuunganisha kwenye intaneti ukitumia Wi-Fi, Ethaneti au mtandaopepe kwenye simu yako. Ili upate usaidizi zaidi, tembelea "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Unaweza kuunganisha kwenye intaneti ukitumia Wi-Fi, Ethaneti au mtandao pepe wa simu yako."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Kitendo hakiruhusiwi"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Haiwezi kubadilisha sauti"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Umeme na Nishati"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Mipangilio inayotumika unapowasha"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Weka upya"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Msimbo wa kuoanisha wa ethaneti"</string>
</resources>
diff --git a/Settings/res/values-ta/strings.xml b/Settings/res/values-ta/strings.xml
index 59d8599..1805335 100644
--- a/Settings/res/values-ta/strings.xml
+++ b/Settings/res/values-ta/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"கணக்கைச் சேர்"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"கணக்குகள் & உள்நுழைவு"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"கணக்குகள் இல்லை"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> கணக்குகள்</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> கணக்கு</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# கணக்கு}other{# கணக்குகள்}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"மீடியா சேவைகள், Assistant, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"நெட்வொர்க் & இணையம்"</string>
<string name="sound_category_title" msgid="7899816751041939518">"ஒலி"</string>
<string name="applications_category_title" msgid="7112019490898586223">"ஆப்ஸ்"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"சாதன விருப்பத்தேர்வுகள்"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"ரிமோட்கள் & துணைக்கருவிகள்"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"புளூடூத் சாதனங்கள் எதுவும் இணைக்கப்படவில்லை"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> துணைக்கருவிகள்</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> துணைக்கருவி</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"டிஸ்ப்ளேவும் சத்தமும்"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"உதவி & கருத்து"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"தனியுரிமை"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"தரவின் ஆரம்பநிலை மீட்டமைப்பு"</string>
<string name="device_calibration" msgid="2907914144048739705">"அளவுக்குறியீடு"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"எனர்ஜி சேமிப்பான்"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"சாதனங்கள்"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"வடிவங்களைத் தேர்ந்தெடுக்கவும்"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"சரவுண்ட் சவுண்ட்"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"இயக்கப்பட்ட வடிவமைப்புகள்"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"முடக்கப்பட்ட வடிவமைப்புகள்"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"முடக்க, வடிவமைப்புத் தேர்வைக் கைமுறைக்கு மாற்றவும்."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"தெளிவுத்திறன்"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"தானியங்கு"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"தெளிவுத்திறன் மாற்றப்பட்டது"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"இப்போதிலிருந்து %1$s தெளிவுத்திறனைப் பயன்படுத்த \"சரி\" என்பதைத் தேர்ந்தெடுக்கவும்."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"ரத்துசெய்"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"சரி"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"தற்காலிகச் சேமிப்பு தரவை அழிக்கவா?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"இது, எல்லா ஆப்ஸின் தற்காலிகச் சேமிப்பு தரவை அழிக்கும்."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"துணைக்கருவியைச் சேர்"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"இணைக்கிறது..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"இணைக்கிறது..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"துணைக்கருவிகள்"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"ரிமோட் கன்ட்ரோல்"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"ரிமோட் கன்ட்ரோல் அமைப்புகள்"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"ரிமோட் பட்டன்களை அமைத்தல்"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"டிவிகள், ரிசீவர்கள், சவுண்ட்பார்கள் ஆகியவற்றில் ஒலியளவையும் பவரையும் உள்ளீட்டையும் கட்டுப்படுத்தலாம்"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"இணை"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s உடன் இணைக்கவா?"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"இணைப்பைத் துண்டி"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"கிடைக்கவில்லை"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"சாதனநிர்வாகி ஆப்ஸ்"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"ஆப்ஸ் எதுவும் செயலில் இல்லை"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"நிர்வாகி, என்கிரிப்ஷன் பாலிசி/அனுமதிச் சான்று சேமிப்பகம் காரணமாக முடக்கப்பட்டது"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"நிர்வகிக்கப்படும் சாதனத் தகவல்"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"உங்கள் நிறுவனம் நிர்வகிக்கும் மாற்றங்களும் அமைப்புகளும்"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"எதுவுமில்லை"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"நிறுவிய ஆப்ஸ்"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"ஆப்ஸின் எண்ணிக்கை கணிப்பின் அடிப்படையிலானது. இதில் Play Storeரிலிருந்து நிறுவப்படாத ஆப்ஸ் சேர்க்கப்படாமல் இருக்கலாம்."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{குறைந்தபட்சம் # ஆப்ஸ்}other{குறைந்தபட்சம் # ஆப்ஸ்}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"இருப்பிடத்திற்கான அனுமதிகள்"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"மைக்ரோஃபோனுக்கான அனுமதிகள்"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"கேமராவிற்கான அனுமதிகள்"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"இயல்புநிலை ஆப்ஸ்"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# ஆப்ஸ்}other{# ஆப்ஸ்}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"இயல்பு கீபோர்டு"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g>க்கு அமைத்துள்ளார்"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"\"VPNஐ எப்போதும் இயக்கத்தில் வை\" என்பது இயக்கப்பட்டுள்ளது"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"நம்பகமான அனுமதிச் சான்றுகள்"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"உங்கள் தனிப்பட்ட சுயவிவரத்தில் நம்பகமான அனுமதிச் சான்றுகள்"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"உங்கள் பணிக் கணக்கில் நம்பகமான அனுமதிச் சான்றுகள்"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">குறைந்தது <xliff:g id="COUNT_1">%d</xliff:g> CA சான்றிதழ்கள்</item>
- <item quantity="one">குறைந்தது <xliff:g id="COUNT_0">%d</xliff:g> CA சான்றிதழ்</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA சான்றிதழ்}other{# CA சான்றிதழ்கள்}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"நிர்வாகியானவர் சாதனத்தைப் பூட்டலாம், கடவுச்சொல்லை மீட்டமைக்கலாம்"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"நிர்வாகியானவர் சாதனத் தரவு முழுவதையும் நீக்கலாம்"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"எல்லாச் சாதனத் தரவையும் நீக்குவதற்கு முன் தவறான கடவுச்சொல்லை உள்ளிட்டதன் எண்ணிக்கை"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"பணிக் கணக்குச் தரவை நீக்குவதற்கு முன் தவறான கடவுச்சொல்லை உள்ளிட்டதன் எண்ணிக்கை"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# முயற்சி}other{# முயற்சிகள்}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"இந்தச் சாதனத்தை உங்கள் நிறுவனம் நிர்வகிக்கிறது."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"இந்தச் சாதனத்தை நிர்வகிப்பது: <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"மேலும் அறிக"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">கேமரா ஆப்ஸ்</item>
- <item quantity="one">கேமரா ஆப்ஸ்</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{கேமரா ஆப்ஸ்}other{கேமரா ஆப்ஸ்}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"கேலெண்டர் ஆப்ஸ்"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"தொடர்புகள் ஆப்ஸ்"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">மின்னஞ்சல் கிளையன்ட் ஆப்ஸ்</item>
- <item quantity="one">மின்னஞ்சல் கிளையன்ட் ஆப்ஸ்</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{மின்னஞ்சல் கிளையன்ட் ஆப்ஸ்}other{மின்னஞ்சல் கிளையன்ட் ஆப்ஸ்}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"வரைபட ஆப்ஸ்"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">ஃபோன் ஆப்ஸ்</item>
- <item quantity="one">ஃபோன் ஆப்ஸ்</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{ஃபோன் ஆப்ஸ்}other{ஃபோன் ஆப்ஸ்}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"உலாவி ஆப்ஸ்"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OSஸின் பதிப்பு"</string>
<string name="about_serial" msgid="3432319328808745459">"வரிசை எண்"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OSஸின் பதிப்பு"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{நீங்கள் டெவெலப்பராக இன்னும் # படி உள்ளது}other{நீங்கள் டெவெலப்பராக இன்னும் # படிகள் உள்ளன}}"</string>
<string name="about_ads" msgid="7662896442040086522">"விளம்பரங்கள்"</string>
<string name="ads_description" msgid="8081069475265061074">"உங்கள் விளம்பர ஐடியை மீட்டமைப்பது போன்ற விளம்பர அமைப்புகளை நிர்வகிக்கலாம்."</string>
<string name="ads_content_description" msgid="1006489792324920289">"விளம்பரங்கள், உங்கள் விளம்பரப்படுத்தல் ஐடியை மீட்டமைப்பது போன்ற விளம்பர அமைப்புகளை நிர்வகிக்கலாம்."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"கூடுதல் சிஸ்டம் அப்டேட்ஸ்"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"நெட்வொர்க் கண்காணிக்கப்படலாம்"</string>
<string name="done_button" msgid="616159688526431451">"முடிந்தது"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">சான்றிதழ்களை நம்புதல் அல்லது அகற்றுதல்</item>
- <item quantity="one">சான்றிதழை நம்புதல் அல்லது அகற்றுதல்</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other">உங்கள் சாதனத்தில் சான்றிதழ் அங்கீகாரங்களை <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> நிறுவியுள்ளார். இதன்மூலம் உங்கள் சாதன நெட்வொர்க் செயல்பாடுகளை (மின்னஞ்சல்கள், ஆப்ஸ், பாதுகாப்பான இணையதளங்கள் உட்பட) அவர் கண்காணிக்கலாம்.\n\nஇந்தச் சான்றிதழ்கள் குறித்த கூடுதல் தகவல்களுக்கு உங்கள் நிர்வாகியைத் தொடர்புகொள்ளுங்கள்.</item>
- <item quantity="one">உங்கள் சாதனத்தில் சான்றிதழ் அங்கீகாரத்தை <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> நிறுவியுள்ளார். இதன்மூலம் உங்கள் சாதன நெட்வொர்க் செயல்பாடுகளை (மின்னஞ்சல்கள், ஆப்ஸ், பாதுகாப்பான இணையதளங்கள் உட்பட) அவர் கண்காணிக்கலாம்.\n\nஇந்தச் சான்றிதழ் குறித்த கூடுதல் தகவல்களுக்கு உங்கள் நிர்வாகியைத் தொடர்புகொள்ளுங்கள்.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other">உங்கள் பணிக் கணக்குக்கான சான்றிதழ் அங்கீகாரங்களை <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> நிறுவியுள்ளார். இதன்மூலம் பணி நெட்வொர்க் செயல்பாடுகளை (மின்னஞ்சல்கள், ஆப்ஸ், பாதுகாப்பான இணையதளங்கள் உட்பட) அவர் கண்காணிக்கலாம்.\n\nஇந்தச் சான்றிதழ்கள் குறித்த கூடுதல் தகவல்களுக்கு உங்கள் நிர்வாகியைத் தொடர்புகொள்ளுங்கள்.</item>
- <item quantity="one">உங்கள் பணிக் கணக்குக்கான சான்றிதழ் அங்கீகாரத்தை <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> நிறுவியுள்ளார். இதன்மூலம் பணி நெட்வொர்க் செயல்பாடுகளை (மின்னஞ்சல்கள், ஆப்ஸ், பாதுகாப்பான இணையதளங்கள் உட்பட) அவர் கண்காணிக்கலாம்.\n\nஇந்தச் சான்றிதழ் குறித்த கூடுதல் தகவல்களுக்கு உங்கள் நிர்வாகியைத் தொடர்புகொள்ளுங்கள்.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"மின்னஞ்சல்கள், ஆப்ஸ் மற்றும் பாதுகாப்பான இணையதளங்கள் உள்ளிட்ட உங்களின் நெட்வொர்க் செயல்பாட்டை மூன்றாம் தரப்பினர் கண்காணிக்க முடியும்.\n\nஉங்கள் சாதனத்தில் நிறுவப்பட்ட நம்பிக்கையான சான்று இதைச் சாத்தியமாக்கும்."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">சான்றிதழ்களைச் சரிபார்</item>
- <item quantity="one">சான்றிதழைச் சரிபார்</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{சான்றிதழை நம்புதல் அல்லது அகற்றுதல்}other{சான்றிதழ்களை நம்புதல் அல்லது அகற்றுதல்}}"</string>
<string name="device_status" msgid="8266002761193692207">"நிலை"</string>
<string name="device_status_summary" msgid="3270932829412434985">"நெட்வொர்க், வரிசை எண்கள் மற்றும் பிற தகவல்"</string>
<string name="manual" msgid="5683935624321864999">"கையேடு"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"இணை"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"நெட்வொர்க்கை நீக்கு"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"சேமித்த கடவுச்சொல் உள்ளிட்ட இந்த நெட்வொர்க்குடன் இணைக்கப் பயன்படுத்திய தகவலை இது அழிக்கிறது"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"உங்கள் மொபைலில் QR குறியீட்டை ஸ்கேன் செய்வதன் மூலம் Wi-Fiயில் இணைந்து வழிமுறைகளைப் பின்பற்றவும்."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" மொபைலில் QR குறியீட்டை ஸ்கேன் செய்து வழிமுறைகளைப் பின்பற்றுவதன் மூலம் வைஃபையில் இணையலாம்.\n \n "<b>"Android மொபைலில்"</b>" அமைப்புகள் -> நெட்வொர்க் & இணையம் -> வைஃபை -> என்பதற்குச் சென்று, வைஃபை -> மேம்பட்டவை -> என்பதைத் தேர்ந்தெடுத்து, சாதனத்தைச் சேர்த்து QR குறியீட்டை ஸ்கேன் செய்யுங்கள்."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"ரத்துசெய்ய \'பின்செல்\' பட்டனை அழுத்தவும்"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"சரி"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"தொடர்க"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"சாதனச் சேமிப்பகம்"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"அகற்றப்படக்கூடிய சேமிப்பகம்"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"மீட்டமை"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"சேமிப்பகத்தில் காலியிடத்தை அதிகரி"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"தற்காலிகச் சேமிப்பு தரவை அழி"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> இடத்தைக் காலியாக்கு"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"சேமிப்பிடத்தை அதிகம் பயன்படுத்தும் தற்காலிக ஃபைல்களை அழிக்கும். ஆப்ஸ் விருப்பத்தேர்வுகள், ஆஃப்லைன் வீடியோக்கள் போன்ற சேமிக்கப்பட்ட தரவு பாதிக்கப்படாது. மேலும் நீங்கள் ஆப்ஸில் மீண்டும் உள்நுழைய வேண்டியதில்லை."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"தற்காலிகச் சேமிப்பு தரவை அழிக்கவா?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"எல்லா ஆப்ஸின் தற்காலிகச் சேமிப்பு தரவை இது அழிக்கும்."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"ஆப்ஸை நிறுவல் நீக்கு"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> பொருத்தப்பட்டது"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g>ஐப் பொருத்த முடியவில்லை"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB சேமிப்பகம் இணைக்கப்பட்டது"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"மைக்ரோஃபோன்"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"மைக்ரோஃபோன் அணுகல்"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"மைக்ரோஃபோனுக்கான ஆப்ஸ் அணுகல்"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"மைக்ரோஃபோனுக்கான அணுகல் தடுக்கப்பட்டுள்ளது"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"தடுப்பை நீக்குவதற்கு, உங்கள் சாதனத்தில் தனியுரிமை ஸ்விட்சை மைக்ரோஃபோனின் இயக்கநிலைக்கு நகர்த்தி மைக்ரோஃபோனுக்கான அணுகலை அனுமதிக்கவும்."</string>
<string name="camera" msgid="1226671478936288283">"கேமரா"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"கேமரா அணுகல்"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"கேமராவுக்கான ஆப்ஸ் அணுகல்"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"கேமராவுக்கான அணுகல் தடுக்கப்பட்டுள்ளது"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"தடுப்பை நீக்குவதற்கு, உங்கள் சாதனத்தில் தனியுரிமை ஸ்விட்சைக் கேமராவின் இயக்கநிலைக்கு நகர்த்தி கேமராவுக்கான அணுகலை அனுமதிக்கவும்."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"மைக்ரோஃபோன் அணுகல்: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"இயக்கப்பட்டிருக்கும்போது, இந்தச் சாதனத்திலுள்ள எந்த மைக்ரோஃபோனையும் அனுமதியுள்ள அனைத்து ஆப்ஸும் சேவைகளும் அணுகலாம்.\n\nபிரத்தியேக நெறிமுறையைக் கொண்டுள்ள ஆடியோ சாதனங்கள் இந்த அமைப்பினால் பாதிக்கப்படாது."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"கேமரா அணுகல்: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"சியான்"</string>
<string name="color_yellow" msgid="3519470952904560404">"மஞ்சள்"</string>
<string name="color_magenta" msgid="2377854703399624607">"மெஜந்தா"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"ஆடியோ விளக்கம்"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"ஆதரிக்கப்படும் திரைப்படங்களிலும் ஷோக்களிலும் விளக்கத்தைக் கேட்கலாம்"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"இயக்கு"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"உள்ளமைவு"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> ஐப் பயன்படுத்தவா?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"கண்காணி"</string>
<string name="system_apps" msgid="8481888654606868074">"ஆப்ஸ்"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"செயலில் இரு"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"திரையை இயக்க நிலையிலேயே வைத்திரு"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP சரிபார்ப்பு"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI உகந்ததாக்கம்"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"மீண்டும் தொடங்கவா?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"டிவி மூலம் HDMI சாதனங்களை முடக்குகிறது"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"டிவியைத் தானாக இயக்கு"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI சாதனம் மூலம் டிவியை இயக்குகிறது"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">இணைத்துள்ள இன்புட்கள்</item>
- <item quantity="one">இணைத்துள்ள இன்புட்</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">காத்திருப்பு நிலை இன்புட்கள்</item>
- <item quantity="one">காத்திருப்பு நிலை இன்புட்</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">இணைக்காத இன்புட்கள்</item>
- <item quantity="one">இணைக்காத இன்புட்</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{இணைக்கப்பட்ட உள்ளீடு}other{இணைக்கப்பட்ட உள்ளீடுகள்}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{காத்திருப்பு நிலை உள்ளீடு}other{காத்திருப்பு நிலை உள்ளீடுகள்}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{இணைக்கப்படாத உள்ளீடு}other{இணைக்கப்படாத உள்ளீடுகள்}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"உங்கள் கணக்கில் உள்ள ஆப்ஸ் மற்றும் மற்ற உள்ளடக்கத்தின் அணுகலை வரையறுக்கவும்"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"கட்டுப்படுத்தப்பட்ட சுயவிவரம்"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> ஆல் கட்டுப்படுத்தப்படுகிறது"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"கட்டுப்படுத்தப்பட்ட சுயவிவரத்தை உருவாக்கு"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"அமைப்புகள்"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"அனுமதிக்கப்பட்ட ஆப்ஸ்"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d ஆப்ஸ்கள் அனுமதிக்கப்படும்</item>
- <item quantity="one">1 ஆப்ஸ் அனுமதிக்கப்படும்</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"அனுமதிக்கப்படும்"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"அனுமதிக்கப்படாது"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"கட்டுப்பாடுகளைத் தனிப்பயனாக்கவும்"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"மூன்றாம் தரப்பு சோர்ஸ்"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"அனுமதிகள்"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"ஆப்ஸ் இல்லை"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"பயன்படுத்தாத ஆப்ஸ்"</string>
<string name="settings_ok" msgid="5950888975075541964">"சரி"</string>
<string name="settings_confirm" msgid="4489126458677153411">"உறுதிசெய்க"</string>
<string name="settings_cancel" msgid="576094334743686152">"ரத்துசெய்"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"இந்த அனுமதியின் மூலம் ஆப்ஸால் சிஸ்டம் அமைப்புகளை மாற்ற முடியும்."</string>
<string name="write_settings_on" msgid="71675710746513956">"சரி"</string>
<string name="write_settings_off" msgid="6730113471695092167">"வேண்டாம்"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"ஃபைல்கள் அனைத்திற்குமான அணுகல்"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"ஃபைல்கள் அனைத்தையும் நிர்வகிப்பதற்கு அனுமதி"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"இந்த சாதனத்திலோ இணைக்கப்பட்டுள்ள சேமிப்பகங்களிலோ உள்ள ஃபைல்கள் அனைத்தையும் படிக்கவும் நீக்கவும் அவற்றில் மாற்றங்களைச் செய்யவும் இந்த ஆப்ஸை அனுமதிக்கும். அனுமதி வழங்கப்படும் பட்சத்தில் உங்களுக்குத் தெரியாமலேயே ஃபைல்களை ஆப்ஸ் அணுகக்கூடும்."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"பிக்ச்சர்-இன்-பிக்ச்சர்"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"பிக்ச்சர்-இன்-பிக்ச்சரை அனுமதி"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"நிறுவியுள்ள ஆப்ஸ் எதிலும் பிக்ச்சர்-இன்-பிக்ச்சர் அம்சம் இயங்காது"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"ஆப்ஸ் திறந்திருக்கும்போது அல்லது அதிலிருந்து நீங்கள் வெளியேறும்போது (வீடியோவைத் தொடர்ந்து பார்ப்பதற்காக), பிக்ச்சர்-இன்-பிக்ச்சர் சாளரத்தை உருவாக்குவதற்கு, ஆப்ஸை அனுமதிக்கும். இந்தச் சாளரம் நீங்கள் பயன்படுத்தும் பிற ஆப்ஸின் மேல் காட்டப்படும்."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"அலாரங்களை அமைக்கவும் குறிப்பிட்ட கால இடைவெளியில் செயல்களைத் திட்டமிடவும் ஆப்ஸை அனுமதிக்கும். இது ஆப்ஸ் பின்னணியில் இயங்குவதை அனுமதிக்கும் என்பதால் அதிக பேட்டரியைப் பயன்படுத்தக்கூடும்.\n\nஇந்த அனுமதி முடக்கப்பட்டிருந்தால் ஆப்ஸ் மூலம் ஏற்கெனவே அமைத்துள்ள அலாரங்களும் திட்டமிடப்பட்ட நேர அடிப்படையிலான நிகழ்வுகளும் வேலை செய்யாது."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"திரையை ஆன் செய்தல்"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"திரையை ஆன் செய்வதை அனுமதி"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"திரையை ஆன் செய்ய ஓர் ஆப்ஸை அனுமதிக்கவும். அவ்வாறு செய்தால், உங்கள் தலையீடு இல்லாமலே ஆப்ஸ் எப்போது வேண்டுமானாலும் திரையை ஆன் செய்யக்கூடும்."</string>
<string name="special_access" msgid="21806055758289916">"பயன்பாட்டிற்கான சிறப்பு அணுகல்"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"ஆடியோ"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"டேட்டா சேமிப்பு"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"மொபைல் டேட்டாவைப் பயன்படுத்த வீடியோ தரத்தைத் தானாகவே சரிசெய்யுசெய்யும்"</string>
<string name="title_data_alert" msgid="8262081890052682475">"டேட்டா உபயோகமும் விழிப்பூட்டல்களும்"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"வைஃபை, ஈதர்நெட் அல்லது உங்கள் மொபைலின் ஹாட்ஸ்பாட்டைப் பயன்படுத்தி இணையத்தில் இணையலாம். மேலும் உதவிக்கு "<b>"g.co/network"</b>" எனும் இணைப்பிற்குச் செல்லவும்."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"வைஃபை, ஈதர்நெட், மொபைலின் ஹாட்ஸ்பாட் ஆகியவை மூலம் இணையத்துடன் இணையலாம்."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"செயல் அனுமதிக்கப்படவில்லை"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"ஒலியளவை மாற்ற முடியாது"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"பவர் & எனர்ஜி"</string>
<string name="power_on_behavior" msgid="927607372303160716">"பவர் ஆனில் இருக்கும்போது செயல்பாடு"</string>
<string name="reset_options_title" msgid="7632580482285108955">"மீட்டமைத்தல்"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"ஈதர்நெட் இணைத்தல் குறியீடு"</string>
</resources>
diff --git a/Settings/res/values-te/strings.xml b/Settings/res/values-te/strings.xml
index e550407..9105f70 100644
--- a/Settings/res/values-te/strings.xml
+++ b/Settings/res/values-te/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"ఖాతాను జోడించండి"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"ఖాతాలు & సైన్ ఇన్"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"ఖాతాలు లేవు"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> ఖాతాలు</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> ఖాతా</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# ఖాతా}other{# ఖాతాలు}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"మీడియా సర్వీస్లు, Assistant, పేమెంట్లు"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"నెట్వర్క్ & ఇంటర్నెట్"</string>
<string name="sound_category_title" msgid="7899816751041939518">"ధ్వని"</string>
<string name="applications_category_title" msgid="7112019490898586223">"యాప్లు"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"పరికర ప్రాధాన్యతలు"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"రిమోట్లు & ఉపకరణాలు"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"కనెక్ట్ చేయబడిన బ్లూటూత్ పరికరాలు ఏవీ లేవు"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ఉపకరణాలు</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> ఉపకరణం</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"డిస్ప్లే & సౌండ్"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"సహాయం & ఫీడ్బ్యాక్"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"గోప్యత"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"ఫ్యాక్టరీ డేటా రీసెట్"</string>
<string name="device_calibration" msgid="2907914144048739705">"క్రమాంకనం"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"విద్యుత్తు పొదుపు"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"పరికరాలు"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"ఫార్మాట్లను ఎంచుకోండి"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"సరౌండ్ సౌండ్"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"డాల్బీ డిజిటల్"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ఎనేబుల్ అయిన ఫార్మాట్లు"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"డిజేబుల్ అయిన ఫార్మాట్లు"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"డిజేబుల్ చేయడానికి, ఫార్మాట్ ఎంపికను మాన్యువల్కు మార్చండి."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"రిజల్యూషన్"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"ఆటోమేటిక్"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"రిజల్యూషన్ మార్చబడింది"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"ఇప్పటి నుండి %1$s రిజల్యూషన్ను ఉపయోగించడానికి \'సరే\'ను ఎంచుకోండి."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"రద్దు చేయండి"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"సరే"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"కాష్ చేసిన డేటాను తీసివేయాలా?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"ఇది అన్ని అను. కాష్ చేసిన డేటాను తీసివేస్తుంది."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"ఉపకరణాన్ని జోడించండి"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"జత చేస్తోంది..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"కనెక్ట్ అవుతోంది…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"యాక్సెసరీలు"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"రిమోట్ కంట్రోల్"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"రిమోట్ కంట్రోల్ సెట్టింగ్లు"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"రిమోట్ బటన్లను సెటప్ చేయండి"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"వాల్యూమ్, పవర్, టీవీలలో ఇన్పుట్, రిసీవర్లు అలాగే సౌండ్బార్లను కంట్రోల్ చేయండి"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"కనెక్ట్ చేయి"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$sకు కనెక్ట్ అవ్వండి"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"డిస్కనెక్ట్ చేయి"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"అందుబాటులో లేదు"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"పరికర నిర్వాహకుల యాప్లు"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"యాక్టివ్గా ఉన్న యాప్లు లేవు"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"నిర్వాహకులు, ఎన్క్రిప్షన్ విధానం లేదా ఆధారాల నిల్వ ద్వారా నిలిపివేయబడింది"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"నిర్వహించబడిన పరికర సమాచారం"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"మీ సంస్థ నిర్వహిస్తున్న మార్పులు & సెట్టింగ్లు"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"ఏదీ లేదు"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"యాప్లు ఇన్స్టాల్ చేయబడ్డాయి"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"యాప్ల సంఖ్య అనేది అంచనా సమాచారం మాత్రమే. Play Store ద్వారా కాకుండా ఇతర మార్గాల ద్వారా ఇన్స్టాల్ చేయబడిన యాప్లను ఇందులో పరిగణనలోకి తీసుకుని ఉండకపోవచ్చు."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{కనీసం # యాప్}other{కనీసం # యాప్లు}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"లొకేషన్ అనుమతులు"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"మైక్రోఫోన్ అనుమతులు"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"కెమెరా అనుమతులు"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"ఆటోమేటిక్ యాప్లు"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# యాప్}other{# యాప్లు}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"ఆటోమేటిక్ కీబోర్డ్"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g>కు సెట్ చేయబడింది"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"VPNని ఎల్లప్పుడూ-ఆన్ చేయి ఎంపిక ఆన్ చేయబడింది"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"విశ్వసనీయ ఆధారాలు"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"మీ వ్యక్తిగత ప్రొఫైల్లో విశ్వసనీయ ఆధారాలు"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"మీ కార్యాలయ ప్రొఫైల్లో విశ్వసనీయ ఆధారాలు"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">కనీసం <xliff:g id="COUNT_1">%d</xliff:g> CA సర్టిఫికెట్లు</item>
- <item quantity="one">కనీసం <xliff:g id="COUNT_0">%d</xliff:g> CA సర్టిఫికెట్</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA సర్టిఫికెట్}other{# CA సర్టిఫికెట్లు}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"నిర్వాహకులు పరికరాన్ని లాక్ చేయగలరు మరియు పాస్వర్డ్ని రీసెట్ చేయగలరు"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"పరికరంలో ఉన్న మొత్తం డేటాని నిర్వాహకులు తొలగించగలరు"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"మొత్తం పరికర డేటాని తొలగించడానికి ముందు పాస్వర్డ్ విఫలయత్నాలు"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"కార్యాలయ ప్రొఫైల్ డేటాని తొలగించడానికి ముందు పాస్వర్డ్ విఫలయత్నాలు"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# ప్రయత్నం}other{# ప్రయత్నాలు}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"ఈ పరికరాన్ని మీ సంస్థ నిర్వహిస్తోంది."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"ఈ పరికరం <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ద్వారా నిర్వహించబడుతోంది."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"మరింత తెలుసుకోండి"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">కెమెరా యాప్లు</item>
- <item quantity="one">కెమెరా యాప్</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{కెమెరా యాప్}other{కెమెరా యాప్లు}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"క్యాలెండర్ యాప్"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"కాంటాక్ట్ల యాప్"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">ఈమెయిల్ క్లయింట్ యాప్లు</item>
- <item quantity="one">ఈమెయిల్ క్లయింట్ యాప్</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ఈమెయిల్ క్లయింట్ యాప్}other{ఈమెయిల్ క్లయింట్ యాప్లు}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"మ్యాప్ యాప్"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">ఫోన్ యాప్లు</item>
- <item quantity="one">ఫోన్ యాప్</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{ఫోన్ యాప్}other{ఫోన్ యాప్లు}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"బ్రౌజర్ యాప్"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS వెర్షన్"</string>
<string name="about_serial" msgid="3432319328808745459">"సీరియల్ నంబర్"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS బిల్డ్"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{మీరు ఇప్పుడు డెవలపర్ కావడానికి # అడుగు దూరంలో ఉన్నారు}other{మీరు ఇప్పుడు డెవలపర్ కావడానికి # అడుగుల దూరంలో ఉన్నారు}}"</string>
<string name="about_ads" msgid="7662896442040086522">"ప్రకటనలు"</string>
<string name="ads_description" msgid="8081069475265061074">"మీ అడ్వర్టయిజింగ్ IDని రీసెట్ చేయడం వంటి, మీ యాడ్ల సెట్టింగ్లను మేనేజ్ చేయండి."</string>
<string name="ads_content_description" msgid="1006489792324920289">"యాడ్లు, మీ అడ్వర్టయిజింగ్ IDని రీసెట్ చేయడం వంటి, మీ యాడ్ల సెట్టింగ్లను మేనేజ్ చేయండి."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"అదనపు సిస్టమ్ అప్డేట్లు"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"నెట్వర్క్ పర్యవేక్షించబడవచ్చు"</string>
<string name="done_button" msgid="616159688526431451">"పూర్తయింది"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">సర్టిఫికెట్లను విశ్వసించండి లేదా తీసివేయండి</item>
- <item quantity="one">సర్టిఫికెట్ను విశ్వసించండి లేదా తీసివేయండి</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other">మీ పరికరంలో <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> సర్టిఫికెట్ అధికారాన్ని ఇన్స్టాల్ చేసింది. దీని వల్ల వారు ఈమెయిళ్లు, యాప్లు ఇంకా సురక్షితమైన వెబ్సైట్లతో సహా మీ పరికర నెట్వర్క్ యాక్టివిటీని పర్యవేక్షించడానికి అనుమతించబడవచ్చు.\n\nఈ సర్టిఫికెట్ల గురించి మరింత సమాచారం కోసం, మీ అడ్మిన్ను కాంటాక్ట్ చేయండి.</item>
- <item quantity="one">మీ పరికరంలో <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> సర్టిఫికెట్ అధికారాన్ని ఇన్స్టాల్ చేసింది. దీని వల్ల వారు ఈమెయిళ్లు, యాప్లు ఇంకా సురక్షితమైన వెబ్సైట్లతో సహా మీ పరికర నెట్వర్క్ యాక్టివిటీని పర్యవేక్షించడానికి అనుమతించబడవచ్చు.\n\nఈ సర్టిఫికెట్ గురించి మరింత సమాచారం కోసం, మీ అడ్మిన్ను కాంటాక్ట్ చేయండి.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other">మీ వర్క్ ప్రొఫైల్ కోసం <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> సర్టిఫికెట్ అధికారాలను ఇన్స్టాల్ చేసింది. దీని వల్ల వారు ఈమెయిళ్లు, యాప్లు ఇంకా సురక్షితమైన వెబ్సైట్లతో సహా వర్క్ నెట్వర్క్ యాక్టివిటీని పర్యవేక్షించడానికి అనుమతించబడవచ్చు.\n\nఈ సర్టిఫికెట్ల గురించి మరింత సమాచారం కోసం, మీ అడ్మిన్ను కాంటాక్ట్ చేయండి.</item>
- <item quantity="one">మీ వర్క్ ప్రొఫైల్ కోసం <xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> సర్టిఫికెట్ అధికారాన్ని ఇన్స్టాల్ చేసింది. దీని వల్ల వారు ఈమెయిళ్లు, యాప్లు ఇంకా సురక్షితమైన వెబ్సైట్లతో సహా వర్క్ నెట్వర్క్ యాక్టివిటీని పర్యవేక్షించడానికి అనుమతించబడవచ్చు.\n\nఈ సర్టిఫికెట్ గురించి మరింత సమాచారం కోసం, మీ అడ్మిన్ను కాంటాక్ట్ చేయండి.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"మూడవ పక్షం ఈమెయిళ్లు, యాప్లు మరియు సురక్షిత వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలిగే సామర్థ్యాన్ని కలిగి ఉంటారు.\n\nమీ పరికరంలో ఇన్స్టాల్ చేయబడిన విశ్వసనీయ ఆధారాల వలన ఇది సాధ్యపడుతుంది."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">సర్టిఫికెట్లను చెక్ చేయండి</item>
- <item quantity="one">సర్టిఫికెట్ను చెక్ చేయండి</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{సర్టిఫికెట్ను విశ్వసించండి లేదా తీసివేయండి}other{సర్టిఫికెట్లను విశ్వసించండి లేదా తీసివేయండి}}"</string>
<string name="device_status" msgid="8266002761193692207">"స్టేటస్"</string>
<string name="device_status_summary" msgid="3270932829412434985">"నెట్వర్క్, క్రమ సంఖ్యలు మరియు ఇతర సమాచారం"</string>
<string name="manual" msgid="5683935624321864999">"మాన్యువల్"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"కనెక్ట్ చేయి"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"నెట్వర్క్ను విస్మరించు"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"ఇది సేవ్ చేసిన పాస్వర్డ్తో సహా ఈ నెట్వర్క్కి కనెక్ట్ చేయడా. ఉపయో. సమాచారాన్ని క్లియర్ చేస్తుంది"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"మీ మొబైల్ ఫోన్లో QR కోడ్ను స్కాన్ చేయడం ద్వారా Wifiకి కనెక్ట్ అవండి, సూచనను ఫాలో చేయండి."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" మీ మొబైల్ ఫోన్లో QR కోడ్ను స్కాన్ చేయడం ద్వారా Wi-Fiకి కనెక్ట్ అవండి, సూచనను ఫాలో చేయండి.\n \n Android ఫోన్ "<b>"లో"</b>" సెట్టింగ్లు -> నెట్వర్క్ & ఇంటర్నెట్ -> Wi-Fiకి వెళ్లండి -> Wi-Fi -> అధునాతనంను ఎంచుకోండి -> పరికరాన్ని జోడించి, ఆపై QR కోడ్ను స్కాన్ చేయండి."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"రద్దు చేయడానికి \'వెనుకకు\' బటన్ను నొక్కండి"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"సరే"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"కొనసాగించండి"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"పరికర నిల్వ"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"తీసివేయదగిన నిల్వ"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"రీసెట్ చేయండి"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"స్టోరేజ్ను ఖాళీ చేయండి"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"కాష్ చేసిన డేటాను క్లియర్ చేయండి"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g>ను ఖాళీ చేయండి"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"స్పేస్ను ఆక్రమిస్తున్న తాత్కాలిక ఫైళ్లను క్లియర్ చేస్తుంది. యాప్ ప్రాధాన్యతలు లేదా ఆఫ్లైన్ వీడియోల వంటి సేవ్ చేసిన డేటాను ప్రభావితం చేయదు, మీరు మళ్లీ యాప్లకు సైన్ ఇన్ చేయాల్సిన అవసరం లేదు."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"కాష్ చేసిన డేటాను క్లియర్ చేయాలా?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"ఇది అన్ని యాప్ల కాష్ చేసిన డేటాను తీసివేస్తుంది."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"యాప్స్ను అన్ఇన్స్టాల్ చేయండి"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> మౌంట్ చేయబడింది"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g>ని మౌంట్ చేయలేకపోయింది"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB నిల్వను మళ్లీ కనెక్ట్ చేశారు"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"మైక్రోఫోన్"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"మైక్రోఫోన్ యాక్సెస్"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"మైక్రోఫోన్కు యాప్ యాక్సెస్"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"మైక్రోఫోన్ యాక్సెస్ బ్లాక్ చేయబడింది"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"అన్బ్లాక్ చేయడానికి, మైక్రోఫోన్ యాక్సెస్ను అనుమతించడానికి మీ పరికరంలోని గోప్యతా స్విచ్ను మైక్రోఫోన్ను ఆన్ చేయండి స్థానానికి తరలించండి."</string>
<string name="camera" msgid="1226671478936288283">"కెమెరా"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"కెమెరా యాక్సెస్"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"కెమెరాకు యాప్ యాక్సెస్"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"కెమెరా యాక్సెస్ బ్లాక్ చేయబడింది"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"అన్బ్లాక్ చేయడానికి, కెమెరా యాక్సెస్ను అనుమతించడానికి మీ పరికరంలోని గోప్యతా స్విచ్ను కెమెరాను ఆన్ చేయండి స్థానంలోకి తరలించండి."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"మైక్రోఫోన్ యాక్సెస్: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"ఆన్ చేసినప్పుడు, అన్ని యాప్లు, సర్వీస్లు అనుమతితో ఈ పరికరంలోని ఏదైనా మైక్రోఫోన్ను యాక్సెస్ చేయగలవు.\n\nఅనుకూల ప్రోటోకాల్తో ఆడియో పెరిఫెరల్లు ఈ సెట్టింగ్ ద్వారా ప్రభావితం కావు."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"కెమెరా యాక్సెస్: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"ముదురు నీలి రంగు"</string>
<string name="color_yellow" msgid="3519470952904560404">"పసుపు రంగు"</string>
<string name="color_magenta" msgid="2377854703399624607">"మెజెంటా రంగు"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"ఆడియో వివరణ"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"సపోర్ట్ ఉన్న సినిమాల్లో, షోలలో స్క్రీన్పై ఏమి జరుగుతోంది అన్న వివరణను వినండి"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"ఎనేబుల్ చేయండి"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"కాన్ఫిగరేషన్"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"\'<xliff:g id="SERVICE">%1$s</xliff:g>\'ను ఉపయోగించాలా?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"పర్యవేక్షణ"</string>
<string name="system_apps" msgid="8481888654606868074">"యాప్లు"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"సక్రియంగా ఉంచు"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"స్క్రీన్ ఎప్పటికీ స్లీప్ మోడ్లోకి వెళ్లదు"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP తనిఖీ"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI అనుకూలీకరణ"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"ఇప్పుడే రీస్టార్ట్ చేయాలా?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"టీవీతో ఉన్న HDMI పరికరాల పవర్ను ఆఫ్ చేస్తుంది"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"టీవీ ఆటో పవర్ ఆన్"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI పరికరంతో టీవీ పవర్ను ఆన్ చేస్తుంది"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">కనెక్ట్ చేసిన ఇన్పుట్లు</item>
- <item quantity="one">కనెక్ట్ చేసిన ఇన్పుట్</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">స్టాండ్బై ఇన్పుట్లు</item>
- <item quantity="one">స్టాండ్బై ఇన్పుట్</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">కనెక్ట్ చేయని ఇన్పుట్లు</item>
- <item quantity="one">కనెక్ట్ చేయని ఇన్పుట్</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{కనెక్ట్ చేయబడిన ఇన్పుట్}other{కనెక్ట్ చేయబడిన ఇన్పుట్లు}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{స్టాండ్బై ఇన్పుట్}other{స్టాండ్బై ఇన్పుట్లు}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{కనెక్ట్ చేయబడని ఇన్పుట్}other{కనెక్ట్ చేయబడని ఇన్పుట్లు}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"మీ ఖాతాలోని యాప్లు మరియు ఇతర కంటెంట్కి యాక్సెస్ను నియంత్రించండి"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"నియంత్రిత ప్రొఫైల్"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> ద్వారా నియంత్రించబడింది"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"నియంత్రిత ప్రొఫైల్ను క్రియేట్ చేయండి"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"సెట్టింగ్లు"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"అనుమతించిన యాప్లు"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d యాప్లు అనుమతించబడ్డాయి</item>
- <item quantity="one">1 యాప్ అనుమతించబడింది</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"అనుమతించబడింది"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"అనుమతించబడలేదు"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"పరిమితులను అనుకూలంగా మార్చండి"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"థర్డ్-పార్టీ సోర్స్"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"అనుమతులు"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"యాప్ అందుబాటులో లేదు"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"ఉపయోగించని యాప్లు"</string>
<string name="settings_ok" msgid="5950888975075541964">"సరే"</string>
<string name="settings_confirm" msgid="4489126458677153411">"నిర్ధారించండి"</string>
<string name="settings_cancel" msgid="576094334743686152">"రద్దు చేయి"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"ఈ అనుమతి సిస్టమ్ సెట్టింగ్లను ఎడిట్ చేయడానికి యాప్ని అనుమతిస్తుంది."</string>
<string name="write_settings_on" msgid="71675710746513956">"అవును"</string>
<string name="write_settings_off" msgid="6730113471695092167">"లేదు"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"అన్ని ఫైళ్లకు యాక్సెస్"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"అన్ని ఫైళ్లను మేనేజ్ చేయడానికి అనుమతించండి"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"ఈ పరికరంలో, లేదా కనెక్ట్ చేయబడిన ఏవైనా స్టోరేజ్ వాల్యూమ్లలో, అన్ని ఫైళ్లను చదవడానికి, మార్చడానికి, తొలగించడానికి ఈ యాప్నకు అనుమతిని ఇవ్వండి. అటువంటి అనుమతిని మీరు మంజూరు చేస్తే, మీకు ప్రత్యేకంగా తెలియపరచకుండానే మీ ఫైళ్లను యాప్, యాక్సెస్ చేయవచ్చు."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"చిత్రంలో చిత్రం"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"చిత్రంలో చిత్రాన్ని అనుమతించు"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"చిత్రంలో చిత్రానికి మద్దతిచ్చే యాప్లు ఏమీ ఇన్స్టాల్ చేయబడలేదు"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"యాప్ తెరిచి ఉన్నప్పుడు లేదా మీరు దాని నుండి బయటకు వెళ్లిపోయినప్పుడు \'చిత్రంలో చిత్రం\' విండోను క్రియేట్ చేయడానికి ఈ యాప్ను అనుమతించండి (ఉదాహరణకు, వీడియోను చూడటం కొనసాగించడానికి). మీరు ఉపయోగించే ఇతర యాప్ల ఎగువున ఈ విండో ప్రదర్శితమవుతుంది."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"అలారంలను సెట్ చేయడానికి, సమయ-ప్రధాన చర్యలను షెడ్యూల్ చేయడానికి యాప్లను అనుమతించండి. ఇలా చేయడం వలన ఎక్కువ పవర్ను వినియోగించగల యాప్లకు బ్యాక్గ్రౌండ్లో రన్ అయ్యే అనుమతి లభిస్తుంది.\n\nఈ అనుమతిని ఆఫ్ చేస్తే, ఈ యాప్ ద్వారా ఇప్పటికే షెడ్యూల్ చేసి ఉన్న అలారంలు, సమయ-ఆధారిత ఈవెంట్లు పనిచేయవు."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"స్క్రీన్ను ఆన్ చేయండి"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"స్క్రీన్ను ఆన్ చేయడానికి అనుమతించండి"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"స్క్రీన్ను ఆన్ చేయడానికి యాప్ను అనుమతించండి. మంజూరు చేయబడితే, మీ స్పష్టమైన ఉద్దేశం లేకుండా యాప్ ఎప్పుడైనా స్క్రీన్ను ఆన్ చేయవచ్చు."</string>
<string name="special_access" msgid="21806055758289916">"ప్రత్యేక యాప్ యాక్సెస్"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"ఆడియో"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"డేటా సేవర్"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"తక్కువ మొబైల్ డేటాను ఉపయోగించడానికి వీడియో క్వాలిటీని ఆటోమేటిక్గా సర్దుబాటు చేయండి"</string>
<string name="title_data_alert" msgid="8262081890052682475">"డేటా వినియోగం మరియు హెచ్చరికలు"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"మీరు ఇంటర్నెట్కు Wi-Fi, ఈథర్నెట్ లేదా మీ ఫోన్ హాట్స్పాట్ ద్వారా కనెక్ట్ కావచ్చు. మరింత సహాయం కోసం, "<b>"g.co/network"</b>"ను సందర్శించండి."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"మీరు Wi-Fi, ఈథర్నెట్ లేదా మీ ఫోన్ హాట్స్పాట్ ద్వారా ఇంటర్నెట్కు కనక్ట్ కావచ్చు."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"చర్య అనుమతించబడదు"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"వాల్యూమ్ని మార్చలేరు"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"పవర్ & ఎనర్జీ"</string>
<string name="power_on_behavior" msgid="927607372303160716">"పవర్ ఆన్ అయినప్పుడు పని చేసే విధానం"</string>
<string name="reset_options_title" msgid="7632580482285108955">"రీసెట్ చేయండి"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"ఈథర్నెట్ పెయిరింగ్ కోడ్"</string>
</resources>
diff --git a/Settings/res/values-th/strings.xml b/Settings/res/values-th/strings.xml
index 11bf80e..745e484 100644
--- a/Settings/res/values-th/strings.xml
+++ b/Settings/res/values-th/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"เพิ่มบัญชี"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"บัญชีและการลงชื่อเข้าใช้"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"ไม่มีบัญชี"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> บัญชี</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> บัญชี</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# บัญชี}other{# บัญชี}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"บริการสื่อ, Assistant, การชำระเงิน"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"เครือข่ายและอินเทอร์เน็ต"</string>
<string name="sound_category_title" msgid="7899816751041939518">"เสียง"</string>
<string name="applications_category_title" msgid="7112019490898586223">"แอป"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"ค่ากำหนดอุปกรณ์"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"รีโมตและอุปกรณ์เสริม"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"ไม่ได้เชื่อมต่ออุปกรณ์บลูทูธ"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other">อุปกรณ์เสริม <xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ชิ้น</item>
- <item quantity="one">อุปกรณ์เสริม <xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> ชิ้น</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"การแสดงผลและเสียง"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"ความช่วยเหลือและความคิดเห็น"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"ความเป็นส่วนตัว"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"รีเซ็ตข้อมูลเป็นค่าเริ่มต้น"</string>
<string name="device_calibration" msgid="2907914144048739705">"การเทียบมาตรฐาน"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"โหมดประหยัดพลังงาน"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"อุปกรณ์"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"เลือกรูปแบบ"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"เสียงเซอร์ราวด์"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"รูปแบบที่เปิดใช้"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"รูปแบบที่ปิดใช้"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"เปลี่ยนการเลือกรูปแบบเป็น \"เลือกด้วยตนเอง\" เพื่อปิดใช้"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"ความละเอียด"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"อัตโนมัติ"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"เปลี่ยนความละเอียดแล้ว"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"เลือก \"ตกลง\" เพื่อเริ่มใช้ %1$s"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"ยกเลิก"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ตกลง"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"ล้างข้อมูลในแคชไหม"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"การทำงานนี้จะล้างข้อมูลในแคชของแอปทั้งหมด"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"เพิ่มอุปกรณ์เสริม"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"กำลังจับคู่…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"กำลังเชื่อมต่อ…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"อุปกรณ์เสริม"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"รีโมตคอนโทรล"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"การตั้งค่ารีโมตคอนโทรล"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"ตั้งค่าปุ่มรีโมต"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"ควบคุมระดับเสียง การเปิด/ปิด อินพุตในทีวี ตัวรับสัญญาณ และซาวด์บาร์"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"เชื่อมต่อ"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"เชื่อมต่อกับ %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"ยกเลิกการเชื่อมต่อ"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"ไม่พร้อมใช้งาน"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"แอปของผู้ดูแลระบบอุปกรณ์"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"ไม่มีแอปที่ใช้งานอยู่"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"ปิดใช้โดยผู้ดูแลระบบ นโยบายการเข้ารหัสลับ หรือที่เก็บข้อมูลที่เชื่อถือได้"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"จัดการข้อมูลอุปกรณ์"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"องค์กรของคุณเป็นผู้จัดการการเปลี่ยนแปลงและการตั้งค่า"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"ไม่มี"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"ติดตั้งแอปแล้ว"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"จำนวนแอปเป็นเพียงค่าประมาณซึ่งอาจไม่รวมแอปที่ติดตั้งจากที่อื่นที่ไม่ใช่ Play Store"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{อย่างน้อย # แอป}other{อย่างน้อย # แอป}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"สิทธิ์เข้าถึงตำแหน่ง"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"สิทธิ์เข้าถึงไมโครโฟน"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"สิทธิ์เข้าถึงกล้องถ่ายรูป"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"แอปเริ่มต้น"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# แอป}other{# แอป}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"แป้นพิมพ์เริ่มต้น"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"ตั้งค่าเป็น <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"การเชื่อมต่อ VPN ตลอดเวลาเปิดอยู่"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"ข้อมูลรับรองที่เชื่อถือได้"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"ข้อมูลรับรองที่เชื่อถือได้ในโปรไฟล์ส่วนตัวของคุณ"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"ข้อมูลรับรองที่เชื่อถือได้ในโปรไฟล์งานของคุณ"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">ใบรับรอง CA อย่างน้อย <xliff:g id="COUNT_1">%d</xliff:g> รายการ</item>
- <item quantity="one">ใบรับรอง CA อย่างน้อย <xliff:g id="COUNT_0">%d</xliff:g> รายการ</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{ใบรับรอง CA # รายการ}other{ใบรับรอง CA # รายการ}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"ผู้ดูแลระบบสามารถล็อกอุปกรณ์และรีเซ็ตรหัสผ่าน"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"ผู้ดูแลระบบสามารถลบข้อมูลทั้งหมดในอุปกรณ์"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"มีการป้อนรหัสผ่านผิดหลายครั้งก่อนที่ระบบจะลบข้อมูลทั้งหมดในอุปกรณ์"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"มีการป้อนรหัสผ่านผิดหลายครั้งก่อนที่ระบบจะลบข้อมูลโปรไฟล์งาน"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{พยายาม # ครั้ง}other{พยายาม # ครั้ง}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"อุปกรณ์นี้จัดการโดยองค์กรของคุณ"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"อุปกรณ์เครื่องนี้จัดการโดย <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"ดูข้อมูลเพิ่มเติม"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">แอปกล้อง</item>
- <item quantity="one">แอปกล้อง</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{แอปกล้อง}other{แอปกล้อง}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"แอปปฏิทิน"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"แอปรายชื่อติดต่อ"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">แอปโปรแกรมรับส่งอีเมล</item>
- <item quantity="one">แอปโปรแกรมรับส่งอีเมล</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{แอปโปรแกรมรับส่งอีเมล}other{แอปโปรแกรมรับส่งอีเมล}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"แอปแผนที่"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">แอปโทรศัพท์</item>
- <item quantity="one">แอปโทรศัพท์</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{แอปโทรศัพท์}other{แอปโทรศัพท์}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"แอปเบราว์เซอร์"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"เวอร์ชันของระบบปฏิบัติการ Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"หมายเลขซีเรียล"</string>
<string name="about_build" msgid="8467840394761634575">"บิลด์ของระบบปฏิบัติการ Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{ตอนนี้คุณเหลืออีกเพียง # ขั้นตอนก็จะได้เป็นนักพัฒนาซอฟต์แวร์แล้ว}other{ตอนนี้คุณเหลืออีกเพียง # ขั้นตอนก็จะได้เป็นนักพัฒนาซอฟต์แวร์แล้ว}}"</string>
<string name="about_ads" msgid="7662896442040086522">"โฆษณา"</string>
<string name="ads_description" msgid="8081069475265061074">"จัดการเครื่องมือตั้งค่าโฆษณาเช่นการรีเซ็ตรหัสโฆษณา"</string>
<string name="ads_content_description" msgid="1006489792324920289">"โฆษณา จัดการเครื่องมือตั้งค่าโฆษณา เช่น การรีเซ็ตรหัสโฆษณา"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"การอัปเดตระบบอื่นๆ"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"เครือข่ายอาจถูกตรวจสอบ"</string>
<string name="done_button" msgid="616159688526431451">"เสร็จสิ้น"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">เชื่อถือหรือนำใบรับรองออก</item>
- <item quantity="one">เชื่อถือหรือนำใบรับรองออก</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ติดตั้งผู้ออกใบรับรองในอุปกรณ์ของคุณ ซึ่งอาจตรวจสอบกิจกรรมในเครือข่ายอุปกรณ์ รวมถึงอีเมล แอป และเว็บไซต์ที่รักษาความปลอดภัยได้\n\nโปรดติดต่อผู้ดูแลระบบเพื่อขอข้อมูลเพิ่มเติมเกี่ยวกับใบรับรองเหล่านี้</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ติดตั้งผู้ออกใบรับรองในอุปกรณ์ของคุณ ซึ่งอาจตรวจสอบกิจกรรมในเครือข่ายอุปกรณ์ รวมถึงอีเมล แอป และเว็บไซต์ที่รักษาความปลอดภัยได้\n\nโปรดติดต่อผู้ดูแลระบบเพื่อขอข้อมูลเพิ่มเติมเกี่ยวกับใบรับรองนี้</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ติดตั้งผู้ออกใบรับรองสำหรับโปรไฟล์งานของคุณ ซึ่งอาจตรวจสอบกิจกรรมในเครือข่ายของที่ทำงาน รวมถึงอีเมล แอป และเว็บไซต์ที่รักษาความปลอดภัยได้\n\nโปรดติดต่อผู้ดูแลระบบเพื่อขอข้อมูลเพิ่มเติมเกี่ยวกับใบรับรองเหล่านี้</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> ติดตั้งผู้ออกใบรับรองสำหรับโปรไฟล์งานของคุณ ซึ่งอาจตรวจสอบกิจกรรมในเครือข่ายของที่ทำงาน รวมถึงอีเมล แอป และเว็บไซต์ที่รักษาความปลอดภัยได้\n\nโปรดติดต่อผู้ดูแลระบบเพื่อขอข้อมูลเพิ่มเติมเกี่ยวกับใบรับรองนี้</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"บุคคลที่สามสามารถตรวจสอบกิจกรรมทางเครือข่ายของคุณได้ รวมทั้งอีเมล แอป และเว็บไซต์ที่ปลอดภัย\n\nข้อมูลรับรองที่เชื่อถือได้ที่ติดตั้งในอุปกรณ์ของคุณทำให้การดำเนินการนี้เป็นไปได้"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">ตรวจสอบใบรับรอง</item>
- <item quantity="one">ตรวจสอบใบรับรอง</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{เชื่อถือหรือนำใบรับรองออก}other{เชื่อถือหรือนำใบรับรองออก}}"</string>
<string name="device_status" msgid="8266002761193692207">"สถานะ"</string>
<string name="device_status_summary" msgid="3270932829412434985">"เครือข่าย หมายเลขซีเรียล และข้อมูลอื่นๆ"</string>
<string name="manual" msgid="5683935624321864999">"ด้วยตนเอง"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"เชื่อมต่อ"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"ไม่จำเครือข่าย"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"การดำเนินการนี้จะล้างข้อมูลที่ใช้เพื่อเชื่อมต่อกับเครือข่ายนี้ ซึ่งรวมถึงรหัสผ่านที่บันทึกไว้ด้วย"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"เข้าร่วม Wi-Fi โดยสแกนคิวอาร์โค้ดจากโทรศัพท์มือถือแล้วทำตามวิธีการ"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" เข้าร่วม Wi-Fi โดยสแกนคิวอาร์โค้ดจากโทรศัพท์มือถือแล้วทำตามวิธีการ\n \n จาก"<b>"โทรศัพท์ Android"</b>" ให้ไปที่การตั้งค่า -> เครือข่ายและอินเทอร์เน็ต -> Wi-Fi -> เลือก Wi-Fi -> ขั้นสูง -> เพิ่มอุปกรณ์แล้วสแกนคิวอาร์โค้ด"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"กดปุ่มย้อนกลับเพื่อยกเลิก"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ตกลง"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"ต่อไป"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"พื้นที่เก็บข้อมูลของอุปกรณ์"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"ที่เก็บข้อมูลแบบถอดได้"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"รีเซ็ต"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"เพิ่มพื้นที่เก็บข้อมูล"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"ล้างข้อมูลในแคช"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"เพิ่มพื้นที่ว่าง <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"ล้างข้อมูลไฟล์ชั่วคราวที่ใช้พื้นเก็บข้อมูล โดยจะไม่ส่งผลถึงข้อมูลที่บันทึกไว้ เช่น การตั้งค่าของแอปหรือวิดีโอแบบออฟไลน์ และคุณไม่จำเป็นต้องลงชื่อเข้าใช้งานแอปอีกครั้ง"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"ล้างข้อมูลในแคชไหม"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"การทำงานนี้จะล้างข้อมูลในแคชของแอปทั้งหมด"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"ถอนการติดตั้งแอป"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"ต่อเชื่อม <xliff:g id="NAME">%1$s</xliff:g> แล้ว"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"ไม่สามารถต่อเชื่อม <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"เชื่อมต่อที่จัดเก็บข้อมูล USB อีกครั้งแล้ว"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"ไมโครโฟน"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"สิทธิ์เข้าถึงไมโครโฟน"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"สิทธิ์เข้าถึงไมโครโฟนของแอป"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"การเข้าถึงไมโครโฟนถูกบล็อก"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"หากต้องการเลิกบล็อก ให้สลับสวิตช์ความเป็นส่วนตัวบนอุปกรณ์ไปที่ตำแหน่งเปิดไมโครโฟน เพื่อให้สิทธิ์การเข้าถึงไมโครโฟน"</string>
<string name="camera" msgid="1226671478936288283">"กล้อง"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"สิทธิ์เข้าถึงกล้อง"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"สิทธิ์เข้าถึงกล้องของแอป"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"การเข้าถึงกล้องถูกบล็อก"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"หากต้องการเลิกบล็อก ให้สลับสวิตช์ความเป็นส่วนตัวบนอุปกรณ์ไปที่ตำแหน่งเปิดกล้อง เพื่อให้สิทธิ์การเข้าถึงกล้อง"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"สิทธิ์เข้าถึงไมโครโฟน: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"เมื่อเปิดไว้ แอปและบริการทั้งหมดที่มีสิทธิ์จะเข้าถึงไมโครโฟนในอุปกรณ์นี้ได้\n\nอุปกรณ์ต่อพ่วงเสียงโดยมีโปรโตคอลที่กำหนดเองจะไม่ได้รับผลกระทบจากการตั้งค่านี้"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"สิทธิ์เข้าถึงกล้อง: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"ฟ้า"</string>
<string name="color_yellow" msgid="3519470952904560404">"เหลือง"</string>
<string name="color_magenta" msgid="2377854703399624607">"ม่วงแดง"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"เสียงบรรยาย"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"ฟังเสียงบรรยายสิ่งที่เกิดขึ้นบนหน้าจอในภาพยนตร์และรายการทีวีที่รองรับ"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"เปิดใช้"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"การกำหนดค่า"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"ใช้ <xliff:g id="SERVICE">%1$s</xliff:g> ไหม"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"การตรวจสอบ"</string>
<string name="system_apps" msgid="8481888654606868074">"แอป"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"เปิดหน้าจอค้างไว้"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"หน้าจอจะไม่เข้าสู่โหมดสลีป"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"การตรวจสอบ HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"การเพิ่มประสิทธิภาพ HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"ต้องการรีสตาร์ทเลยไหม"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"ปิดอุปกรณ์ HDMI ด้วยทีวี"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"เปิดทีวีอัตโนมัติ"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"เปิดทีวีด้วยอุปกรณ์ HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">อินพุตที่เชื่อมต่อ</item>
- <item quantity="one">อินพุตที่เชื่อมต่อ</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">อินพุตสแตนด์บาย</item>
- <item quantity="one">อินพุตสแตนด์บาย</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">อินพุตที่ไม่ได้เชื่อมต่อ</item>
- <item quantity="one">อินพุตที่ไม่ได้เชื่อมต่อ</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{อินพุตที่เชื่อมต่อ}other{อินพุตที่เชื่อมต่อ}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{อินพุตสแตนด์บาย}other{อินพุตสแตนด์บาย}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{อินพุตที่ไม่ได้เชื่อมต่อ}other{อินพุตที่ไม่ได้เชื่อมต่อ}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"จำกัดการเข้าถึงแอปและเนื้อหาอื่นในบัญชีของคุณ"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"โปรไฟล์ที่ถูกจำกัด"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"ควบคุมโดย <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"สร้างโปรไฟล์แบบจำกัด"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"การตั้งค่า"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"แอปที่ได้รับอนุญาต"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">อนุญาต %d แอป</item>
- <item quantity="one">อนุญาต 1 แอป</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"ได้รับอนุญาต"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"ไม่อนุญาต"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"กำหนดค่าข้อจำกัด"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"แหล่งที่มาของบุคคลที่สาม"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"สิทธิ์"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"แอปพลิเคชันไม่สามารถใช้งานได้"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"แอปที่ไม่ได้ใช้"</string>
<string name="settings_ok" msgid="5950888975075541964">"ตกลง"</string>
<string name="settings_confirm" msgid="4489126458677153411">"ยืนยัน"</string>
<string name="settings_cancel" msgid="576094334743686152">"ยกเลิก"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"สิทธิ์นี้อนุญาตให้แอปแก้ไขการตั้งค่าระบบได้"</string>
<string name="write_settings_on" msgid="71675710746513956">"ใช่"</string>
<string name="write_settings_off" msgid="6730113471695092167">"ไม่"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"การเข้าถึงไฟล์ทั้งหมด"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"อนุญาตให้เข้าถึงเพื่อจัดการไฟล์ทั้งหมด"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"อนุญาตให้แอปนี้อ่าน แก้ไข และลบไฟล์ทั้งหมดในอุปกรณ์นี้หรือวอลุ่มของพื้นที่เก็บข้อมูลใดๆ ที่เชื่อมต่อ หากได้รับอนุญาต แอปอาจเข้าถึงไฟล์ได้โดยที่คุณไม่ทราบอย่างชัดแจ้ง"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"การแสดงภาพซ้อนภาพ"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"อนุญาตการแสดงภาพซ้อนภาพ"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"แอปที่ติดตั้งอยู่ไม่รองรับการแสดงภาพซ้อนภาพ"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"อนุญาตให้แอปสร้างหน้าต่างการแสดงภาพซ้อนภาพในขณะที่แอปเปิดอยู่หรือหลังจากที่คุณปล่อยทิ้งไว้ (เช่น เพื่อดูวิดีโอต่อ) หน้าต่างนี้จะแสดงทับแอปอื่นๆ ที่คุณกำลังใช้"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"อนุญาตให้แอปตั้งปลุกและกำหนดเวลาการดำเนินการที่ต้องคำนึงถึงเวลาเป็นสำคัญ สิทธิ์นี้ช่วยให้แอปทำงานในเบื้องหลังได้ จึงอาจใช้พลังงานมากขึ้น\n\nหากปิดใช้สิทธิ์ การปลุกที่มีอยู่และกิจกรรมที่ต้องคำนึงถึงเวลาเป็นสำคัญซึ่งแอปกำหนดเวลาไว้จะไม่ทำงาน"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"เปิดหน้าจอ"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"อนุญาตให้เปิดหน้าจอ"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"อนุญาตให้แอปเปิดหน้าจอ หากอนุญาต แอปอาจเปิดหน้าจอได้ทุกเมื่อแม้คุณไม่ได้ระบุเจตนาที่ชัดแจ้ง"</string>
<string name="special_access" msgid="21806055758289916">"สิทธิ์เข้าถึงพิเศษของแอป"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"เสียง"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"การประหยัดอินเทอร์เน็ต"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"ปรับคุณภาพของวิดีโอให้ใช้อินเทอร์เน็ตมือถือน้อยลงโดยอัตโนมัติ"</string>
<string name="title_data_alert" msgid="8262081890052682475">"ปริมาณการใช้อินเทอร์เน็ตและการแจ้งเตือน"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"คุณเชื่อมต่ออินเทอร์เน็ตได้ด้วย Wi-Fi, อีเทอร์เน็ต หรือฮอตสปอตของโทรศัพท์ หากต้องการความช่วยเหลือเพิ่มเติม ให้ไปที่ "<b>"g.co/network"</b></string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"คุณเชื่อมต่ออินเทอร์เน็ตได้ด้วย Wi-Fi, อีเทอร์เน็ต หรือฮอตสปอตของโทรศัพท์"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"ไม่อนุญาตให้ดำเนินการนี้"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"ปรับระดับเสียงไม่ได้"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"กำลังไฟฟ้าและพลังงาน"</string>
<string name="power_on_behavior" msgid="927607372303160716">"ลักษณะการทำงานเมื่อเปิดเครื่อง"</string>
<string name="reset_options_title" msgid="7632580482285108955">"รีเซ็ต"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"รหัสการจับคู่อีเทอร์เน็ต"</string>
</resources>
diff --git a/Settings/res/values-tl/strings.xml b/Settings/res/values-tl/strings.xml
index fc5e919..ebab72e 100644
--- a/Settings/res/values-tl/strings.xml
+++ b/Settings/res/values-tl/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Magdagdag ng account"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Mga account at pag-sign in"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Walang account"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> account</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> na account</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# account}one{# account}other{# na account}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Mga serbisyo ng media, Assistant, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Network at Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Tunog"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Mga App"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Mga Kagustuhan sa Device"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Mga remote at accessory"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Walang nakakonektang Bluetooth device"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> accessory</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> na accessory</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Display at Tunog"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Tulong at Feedback"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Privacy"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Pag-reset ng factory data"</string>
<string name="device_calibration" msgid="2907914144048739705">"Pag-calibrate"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Pangtipid sa energy"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Mga Device"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Pumili ng mga format"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Surround Sound"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"MGA NAKA-ENABLE NA FORMAT"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"MGA NAKA-DISABLE NA FORMAT"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Para i-disable, gawing Manual ang pagpili ng format."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Resolution"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Awtomatiko"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Binago ang resolution"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Piliin ang OK para gamitin ang %1$s mula ngayon."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Kanselahin"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"I-clear ang naka-cache na data?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"I-clear nito ang naka-cache na data para sa app."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Magdagdag ng accessory"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Ipinapares…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Kumokonekta..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Mga Accessory"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Remote Control"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Mga setting ng remote control"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Mag-set up ng mga button ng remote"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Kontrolin ang volume, power, input sa mga TV, receiver, at soundbar"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Kumonekta"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Kumonekta sa %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Idiskonekta"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Hindi available"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Mga app ng admin ng device"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Walang aktibong app"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> aktibong app</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> na aktibong app</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Na-disable ng admin, patakaran sa pag-encrypt, o storage ng kredensyal"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Impormasyon ng pinamamahalaang device"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Mga pagbabago at setting na pinamamahalaan ng iyong organisasyon"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Wala"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Mga naka-install na app"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Pagtatantya ang bilang ng mga app. Posibleng hindi kasama rito ang mga app na na-install sa labas ng Play Store."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="one">Minimum na <xliff:g id="COUNT_1">%d</xliff:g> app</item>
- <item quantity="other">Minimum na <xliff:g id="COUNT_1">%d</xliff:g> na app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum na # app}one{Minimum na # app}other{Minimum na # na app}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Mga pahintulot ng lokasyon"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mga pahintulot ng mikropono"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Mga pahintulot ng camera"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Mga default na app"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> app</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> na app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# app}one{# app}other{# na app}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Default na keyboard"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Itakda sa <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Naka-on ang palaging naka-on na VPN"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Mga pinagkakatiwalaang kredensyal"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Mga pinagkakatiwalaang kredensyal sa iyong personal na profile"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Mga pinagkakatiwalaang kredensyal sa iyong profile sa trabaho"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Minimum na <xliff:g id="COUNT_1">%d</xliff:g> CA certificate</item>
- <item quantity="other">Minimum na <xliff:g id="COUNT_1">%d</xliff:g> na CA certificate</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA certificate}one{# CA certificate}other{# na CA certificate}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Maaaring i-lock ng admin ang device at i-reset ang password"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Maaaring i-delete ng admin ang lahat ng data ng device"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Mga nabigong pagsubok sa paglalagay ng password bago i-delete ang lahat ng data ng device"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Mga nabigong pagsubok sa paglalagay ng password bago i-delete ang data ng profile sa trabaho"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> pagsubok</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> na pagsubok</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# pagsubok}one{# pagsubok}other{# na pagsubok}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Ang device na ito ay pinamamahalaan ng iyong organisasyon."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Pinamamahalaan ng <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ang device na ito."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Matuto pa"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Mga Camera app</item>
- <item quantity="other">Mga Camera app</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Camera app}one{Mga Camera app}other{Mga Camera app}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"App na Kalendaryo"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"App na Mga Contact"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Mga Email client app</item>
- <item quantity="other">Mga Email client app</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Email client app}one{Mga Email client app}other{Mga Email client app}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"App na Mapa"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Mga app na Telepono</item>
- <item quantity="other">Mga app na Telepono</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{App na Telepono}one{Mga app na Telepono}other{Mga app na Telepono}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Browser app"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Bersyon ng Android TV OS"</string>
<string name="about_serial" msgid="3432319328808745459">"Serial number"</string>
<string name="about_build" msgid="8467840394761634575">"Build ng Android TV OS"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="one"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> hakbang na lang ang layo mo mula sa pagiging isang developer</item>
- <item quantity="other"><xliff:g id="STEP_COUNT_1">%1$d</xliff:g> na hakbang na lang ang layo mo mula sa pagiging isang developer</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Mga ad"</string>
<string name="ads_description" msgid="8081069475265061074">"I-manage ang ads settings, gaya ng pag-reset sa advertising ID."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Mga Ad, Pamahalaan ang iyong mga setting ng ad, tulad ng pag-reset sa iyong advertising ID."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Karagdagang update ng system"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Maaaring sinusubaybayan ang network"</string>
<string name="done_button" msgid="616159688526431451">"Tapos na"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Pagkatiwalaan o alisin ang mga certificate</item>
- <item quantity="other">Pagkatiwalaan o alisin ang mga certificate</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one">Nag-install ang <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ng mga awtoridad sa certificate sa iyong device, na puwedeng magbigay-daan ditong subaybayan ang aktibidad sa network ng device mo, kabilang ang mga email, app, at secure na website.\n\nPara sa higit pang impormasyon tungkol sa mga certificate na ito, makipag-ugnayan sa iyong admin.</item>
- <item quantity="other">Nag-install ang <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ng mga awtoridad sa certificate sa iyong device, na puwedeng magbigay-daan ditong subaybayan ang aktibidad sa network ng device mo, kabilang ang mga email, app, at secure na website.\n\nPara sa higit pang impormasyon tungkol sa mga certificate na ito, makipag-ugnayan sa iyong admin.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one">Nag-install ang <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ng mga awtoridad sa certificate para sa iyong profile sa trabaho, na puwedeng magbigay-daan ditong subaybayan ang aktibidad sa network ng trabaho, kabilang ang mga email, app, at secure na website.\n\nPara sa higit pang impormasyon tungkol sa mga certificate na ito, makipag-ugnayan sa iyong admin.</item>
- <item quantity="other">Nag-install ang <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ng mga awtoridad sa certificate para sa iyong profile sa trabaho, na puwedeng magbigay-daan ditong subaybayan ang aktibidad sa network ng trabaho, kabilang ang mga email, app, at secure na website.\n\nPara sa higit pang impormasyon tungkol sa mga certificate na ito, makipag-ugnayan sa iyong admin.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"May kakayahan ang isang third party na subaybayan ang aktibidad ng iyong network, kabilang ang mga email, apps, at mga secure website.\n\nGinagawa itong posible ng isang pinagkakatiwalaang credential na naka-install sa iyong device."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Suriin ang mga certificate</item>
- <item quantity="other">Suriin ang mga certificate</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Pagkatiwalaan o alisin ang certificate}one{Pagkatiwalaan o alisin ang mga certificate}other{Pagkatiwalaan o alisin ang mga certificate}}"</string>
<string name="device_status" msgid="8266002761193692207">"Status"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Network, mga serial number, at iba pang impormasyon"</string>
<string name="manual" msgid="5683935624321864999">"Manu-mano"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Kumonekta"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Kalimutan ang network"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Kini-clear nito ang impormasyong ginamit upang kumonekta sa network, kasama ang na-save na password"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Sumali sa Wifi sa pamamagitan ng pag-scan ng QR code mula sa iyong mobile phone at sundin ang tagubilin."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Sumali sa Wi-Fi sa pamamagitan ng pag-scan ng QR code mula sa mobile phone at sundin ang mga tagubilin.\n \n Mula sa "<b>"Android Phone"</b>", pumunta sa Mga Setting -> Network at internet -> Wi-Fi -> Pumili ng Wi-Fi -> Advanced -> Magdagdag ng device at pagkatapos ay i-scan ang QR code."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Pindutin ang button na bumalik para kanselahin"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Magpatuloy"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Storage ng device"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Naaalis na storage"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"I-reset"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Magbakante ng storage"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"I-clear ang naka-cache na data"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Magbakante ng <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Kini-clear ang mga pansamantalang file na gumagamit ng space. Hindi nito maaapektuhan ang naka-save na data gaya ng mga kagutuhan sa app o mga offline na video, at hindi mo na kakailanganing mag-sign in ulit sa mga app."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"I-clear ang naka-cache na data?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Iki-clear nito ang naka-cache na data sa mga app."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Mag-uninstall ng mga app"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Na-mount na ang <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Hindi ma-mount ang <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"nakakonektang muli ang USB storage"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikropono"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Access sa mikropono"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Access ng app sa mikropono"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Naka-block ang access sa mikropono"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Para i-unblock, ilipat sa naka-on na posisyon ang switch ng privacy sa iyong device sa mikropono para payagan ang access sa mikropono."</string>
<string name="camera" msgid="1226671478936288283">"Camera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Access sa camera"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Access ng app sa camera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Naka-block ang access sa camera"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Para i-unblock, ilipat sa naka-on na posisyon ang switch ng privacy sa iyong device sa camera para payagan ang access sa camera."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Access sa Mikropono: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Kapag naka-on ito, maa-access ng lahat ng app at serbisyong may pahintulot ang anumang mikropono sa device na ito.\n\nHindi maaapektuhan ng setting na ito ang mga peripheral ng mikropono na may custom na protocol."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Access sa Camera: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Dilaw"</string>
<string name="color_magenta" msgid="2377854703399624607">"Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Paglalarawan ng audio"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Makarinig ng paglalarawan ng eksena"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"I-enable"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Configuration"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Gamitin ang <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Pagsubaybay"</string>
<string name="system_apps" msgid="8481888654606868074">"Apps"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Manatiling gumagana"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Hindi kailanman magsi-sleep ang screen"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Pagsusuri ng HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Pag-optimize ng HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Mag-restart na ngayon?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"I-off ang mga HDMI device na nakakabit sa TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"I-auto power on ang TV"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"I-on ang TV na may HDMI device"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Mga Nakakonektang Input</item>
- <item quantity="other">Mga Nakakonektang Input</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Mga Naka-standby na Input</item>
- <item quantity="other">Mga Naka-standby na Input</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Mga Hindi Nakakonektang Input</item>
- <item quantity="other">Mga Hindi Nakakonektang Input</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Nakakonektang Input}one{Mga Nakakonektang Input}other{Mga Nakakonektang Input}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Naka-standby na Input}one{Mga Naka-standby na Input}other{Mga Naka-standby na Input}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Hindi Nakakonektang Input}one{Mga Hindi Nakakonektang Input}other{Mga Hindi Nakakonektang Input}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Higpitan ang pag-access sa mga app at ibang content sa iyong account"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Pinaghihigpitang Profile"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Kinokontrol ng <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Gumawa ng pinaghihigpitang profile"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Mga Setting"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Mga pinapayagang app"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d app ang pinapayagan</item>
- <item quantity="other">%d na app ang pinapayagan</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Pinapayagan"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Hindi pinapayagan"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"I-customize ang mga paghihigpit"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Third Party na Pinagmulan"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Mga Pahintulot"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Hindi available ang application"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Mga hindi ginagamit na app"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Kumpirmahin"</string>
<string name="settings_cancel" msgid="576094334743686152">"Kanselahin"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Pinapayagan ng pahintulot na ito na baguhin ng isang app ang mga setting ng system."</string>
<string name="write_settings_on" msgid="71675710746513956">"Oo"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Hindi"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Access sa lahat ng file"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Payagan para mapamahalaan ang lahat ng file"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Payagan ang app na ito na basahin, baguhin, at i-delete ang lahat ng file sa device na ito o sa anumang nakakonektang storage volume. Kung pagbibigyan ito, puwedeng mag-access ng mga file ang app nang hindi mo nalalaman."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Payagan ang picture-in-picture"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Walang naka-install na app na sumusuporta sa Picture-in-picture"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Payagan ang mga app na gumawa ng picture-in-picture na window habang nakabukas ang app o pagkatapos mo itong iwan (halimbawa, para magpatuloy sa panonood ng video). Lumalabas ang window na ito sa ibabaw ng iba pang app na ginagamit mo."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Payagan ang mga app na magtakda ng mga alarm at mag-iskedyul ng mga pagkilos na may partikular na oras. Hahayaan nitong tumakbo ang mga app sa background, na posibleng mas malakas sa baterya.\n\nKung naka-off ang pahintulot na ito, hindi gagana ang mga kasalukuyang alarm at event na nakabatay sa oras na naiskedyul ng app."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"I-on ang screen"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Payagan ang pag-on sa screen"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Payagan ang isang app na i-on ang screen. Kung papayagan, puwedeng i-on ng app ang screen anumang oras nang wala ang iyong malinaw na intent."</string>
<string name="special_access" msgid="21806055758289916">"Espesyal na access ng app"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Data Saver"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Awtomatikong isaayos ang kalidad ng video para sa mas kaunting mobile data"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Paggamit ng data at mga alerto"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Puwede kang kumonekta sa internet gamit ang Wi-Fi, Ethernet, o ang hotspot ng iyong telepono. Para sa higit pang tulong, bumisita sa "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Puwede kang kumonekta sa internet gamit ang Wi-Fi, Ethernet, o hotspot ng iyong telepono."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Hindi pinapayagan ang pagkilos"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Hindi mababago ang volume"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Power at Kuryente"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Gawi sa pag-on"</string>
<string name="reset_options_title" msgid="7632580482285108955">"I-reset"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Code ng pagpapares ng Ethernet"</string>
</resources>
diff --git a/Settings/res/values-tr/strings.xml b/Settings/res/values-tr/strings.xml
index b21174d..42921f7 100644
--- a/Settings/res/values-tr/strings.xml
+++ b/Settings/res/values-tr/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Hesap ekleme"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Hesaplar ve oturum açma"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Hesap yok"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> hesap</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> hesap</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# hesap}other{# hesap}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Medya hizmetleri, Asistan, Ödemeler"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Ağ ve İnternet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Ses"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Uygulamalar"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Cihaz Tercihleri"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Uzaktan Kumandalar ve aksesuarlar"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Bağlı Bluetooth cihaz yok"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> aksesuar</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> aksesuar</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Ekran ve Ses"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Yardım ve geri bildirim"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Gizlilik"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Fabrika verilerine sıfırla"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrasyon"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Enerji tasarrufu"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Cihazlar"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Biçimleri seçin"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Surround Ses"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ETKİN BİÇİMLER"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"DEVRE DIŞI BİÇİMLER"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Devre dışı bırakmak için biçim seçimini Manuel olacak şekilde değiştirin."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Çözünürlük"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Otomatik"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Çözünürlük değiştirildi"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Bundan sonra %1$s çözünürlüğü kullanmak için Tamam\'ı seçin."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"İptal"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"Tamam"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Önbelleğe alınan veriler silinsin mi?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Bu, tüm uygulamaların önbellek verilerini siler."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Aksesuar ekle"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Eşleştiriliyor…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Bağlanıyor…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Aksesuarlar"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Uzaktan Kumanda"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Uzaktan kumanda ayarları"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Uzaktan kumanda düğmeleri ayarlayın"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"TV\'lerde, alıcılarda ve ses çubuklarında ses düzeyini, gücü, girişi kontrol edin"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Bağlan"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s cihazına bağlan"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Bağlantıyı kes"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Mevcut değil"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Cihaz yönetimi uygulamaları"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Etkin uygulama yok"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> etkin uygulama</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> etkin uygulama</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Yönetici, şifreleme politikası veya kimlik bilgileri deposu tarafından devre dışı bırakıldı"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Yönetilen cihaz bilgisi"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Kuruluşunuz tarafından yönetilen değişiklikler ve ayarlar"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Yok"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Yüklü uygulamalar"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Uygulama sayısı tahminidir. Play Store dışından yüklenen uygulamaları içermeyebilir."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">En az <xliff:g id="COUNT_1">%d</xliff:g> uygulama</item>
- <item quantity="one">En az <xliff:g id="COUNT_0">%d</xliff:g> uygulama</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Minimum # uygulama}other{Minimum # uygulama}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Konum izinleri"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mikrofon izinleri"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Kamera izinleri"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Varsayılan uygulamalar"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> uygulama</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> uygulama</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# uygulama}other{# uygulama}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Varsayılan klavye"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> olarak ayarlandı"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Her zaman açık VPN açılmış"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Güvenilir kimlik bilgileri"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Kişisel profilinizde güvenilir kimlik bilgileri"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"İş profilinizde güvenilir kimlik bilgileri"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">En az <xliff:g id="COUNT_1">%d</xliff:g> CA sertifikası</item>
- <item quantity="one">En az <xliff:g id="COUNT_0">%d</xliff:g> CA sertifikası</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA sertifikası}other{# CA sertifikaları}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Yönetici cihazı kilitleyebilir ve şifreyi sıfırlayabilir"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Yönetici tüm cihaz verilerini silebilir"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Tüm cihaz verileri silinmeden önceki başarısız şifre girişi deneme sayısı"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"İş profili verileri silinmeden önceki başarısız şifre girişi deneme sayısı"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> deneme</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> deneme</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# deneme}other{# deneme}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Bu cihaz kuruluşunuz tarafından yönetiliyor."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Bu cihaz <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> tarafından yönetiliyor."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Daha fazla bilgi"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Kamera uygulamaları</item>
- <item quantity="one">Kamera uygulaması</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Kamera uygulaması}other{Kamera uygulamaları}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Takvim uygulaması"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Kişiler uygulaması"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">E-posta istemci uygulamaları</item>
- <item quantity="one">E-posta istemci uygulaması</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{E-posta istemci uygulaması}other{E-posta istemci uygulamaları}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Harita uygulaması"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Telefon uygulamaları</item>
- <item quantity="one">Telefon uygulaması</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Telefon uygulaması}other{Telefon uygulamaları}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Tarayıcı uygulaması"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS sürümü"</string>
<string name="about_serial" msgid="3432319328808745459">"Seri numarası"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS derlemesi"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Geliştirici olmanıza yalnızca <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> adım kaldı</item>
- <item quantity="one">Geliştirici olmanıza yalnızca <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> adım kaldı</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Geliştirici olmanıza # adım kaldı}other{Geliştirici olmanıza # adım kaldı}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Reklam"</string>
<string name="ads_description" msgid="8081069475265061074">"Reklam kimliğinizi sıfırlamak gibi reklam ayarlarınızı yönetin."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Reklamlar, Kimliğinizi sıfırlamak gibi reklam ayarlarınızı yönetin."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Ek sistem güncellemeleri"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Ağ etkinliği izlenebilir"</string>
<string name="done_button" msgid="616159688526431451">"Tamam"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Sertifikalara güvenin veya sertifikaları kaldırın</item>
- <item quantity="one">Sertifikaya güvenin veya sertifikayı kaldırın</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>, cihazınıza sertifika yetkilileri yükledi. Yönetici, bu sertifikayla e-postalar, uygulamalar ve güvenli web siteleri de dahil olmak üzere cihazınızın ağ etkinliğini izleyebilir.\n\nBu sertifikalar hakkında daha fazla bilgi edinmek için yöneticinizle iletişime geçin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g>, cihazınıza sertifika yetkilisi yükledi. Yönetici, bu sertifikayla e-postalar, uygulamalar ve güvenli web siteleri de dahil olmak üzere cihazınızın ağ etkinliğini izleyebilir.\n\nBu sertifika hakkında daha fazla bilgi edinmek için yöneticinizle iletişime geçin.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>, iş profilinize sertifika yetkilileri yükledi. Yönetici, bu sertifikalarla e-postalar, uygulamalar ve güvenli web siteleri de dahil olmak üzere iş ağı etkinliğini izleyebilir.\n\nBu sertifikalar hakkında daha fazla bilgi edinmek için yöneticinizle iletişime geçin.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g>, iş profilinize sertifika yetkilisi yükledi. Yönetici, bu sertifikayla e-postalar, uygulamalar ve güvenli web siteleri de dahil olmak üzere iş ağı etkinliğini izleyebilir.\n\nBu sertifika hakkında daha fazla bilgi edinmek için yöneticinizle iletişime geçin.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"E-postalarınız, uygulamalarınız ve güvenli web siteleriniz dahil olmak üzere ağ etkinliğiniz üçüncü bir tarafça izlenebilir.\n\nCihazınızda yüklü durumdaki güvenilen bir kimlik bilgisi bunu mümkün kılmaktadır."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Sertifikaları kontrol et</item>
- <item quantity="one">Sertifikayı kontrol et</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Sertifikaya güvenin veya sertifikayı kaldırın}other{Sertifikalara güvenin veya sertifikaları kaldırın}}"</string>
<string name="device_status" msgid="8266002761193692207">"Durum"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Ağ, seri numaralar ve diğer bilgiler"</string>
<string name="manual" msgid="5683935624321864999">"Manuel"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Bağlan"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Ağı unut"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Bu işlem, bu ağa bağlanmak için kullanılan bilgileri (tüm kayıtlı şifreler dahil) siler."</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Cep telefonunuzla QR kodu tarayarak kablosuz ağa katılıp talimatları uygulayın."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Bir cep telefonuyla QR kodu tarayarak kablosuz ağa katılın ve talimatları uygulayın.\n \n Bir "<b>"Android Telefonda"</b>" Ayarlar -> Ağ ve internet -> Kablosuz -> Kablosuz ağ seç -> Gelişmiş -> Cihaz ekle\'ye gidip QR kodu tarayın."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"İptal etmek için geri düğmesine basın"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"Tamam"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Devam"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Cihaz depolama alanı"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Çıkarılabilir depolama alanı"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Sıfırlama"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Depolama alanında yer açma"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Önbelleğe alınan verileri sil"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> yer aç"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Yer kaplayan geçici dosyaları temizler. Uygulama tercihleri veya çevrimdışı videolar gibi kayıtlı verileri etkilemez. Ayrıca uygulamalarda tekrar oturum açmanız gerekmez."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Önbelleğe alınan veriler silinsin mi?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Bu, tüm uygulamaların önbellek verilerini siler."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Uygulamaları kaldırma"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> eklendi"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> eklenemedi"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB depolama yeniden bağlandı"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Mikrofon erişimi"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Uygulamanın mikrofona erişimi"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Mikrofon erişimi engellendi"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Engeli kaldırıp mikrofon erişimine izin vermek için cihazınızdaki gizlilik anahtarını mikrofon açık konumuna getirin."</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Kamera erişimi"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Uygulamanın kameraya erişimi"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Kamera erişimi engellendi"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Engeli kaldırıp kamera erişimine izin vermek için cihazınızdaki gizlilik anahtarını kamera açık konumuna getirin."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Mikrofon Erişimi: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Bu seçenek açıldığında izni olan tüm uygulamalar ve hizmetler, bu cihazdaki herhangi bir mikrofona erişebilir.\n\nÖzel bir protokole sahip ses çevre birimleri bu ayardan etkilenmez."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Kamera Erişimi: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Camgöbeği"</string>
<string name="color_yellow" msgid="3519470952904560404">"Sarı"</string>
<string name="color_magenta" msgid="2377854703399624607">"Macenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Sesli açıklama"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Desteklenen filmlerde ve programlarda ekranda neler olduğuyla ilgili açıklamaları dinleyin"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Etkinleştir"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Yapılandırma"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> kullanılsın mı?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"İzleme"</string>
<string name="system_apps" msgid="8481888654606868074">"Uygulamalar"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Uyanık kal"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Ekran asla uyku moduna geçmez"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP denetimi"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI optimizasyonu"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Şimdi yeniden başlatılsın mı?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"HDMI cihazları TV ile kapatın"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV\'yi otomatik aç"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"TV\'yi HDMI cihazıyla açın"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Bağlı Girişler</item>
- <item quantity="one">Bağlı Giriş</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Bekleme Modundaki Girişler</item>
- <item quantity="one">Bekleme Modundaki Giriş</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Bağlı Olmayan Girişler</item>
- <item quantity="one">Bağlı Olmayan Giriş</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Bağlı Giriş}other{Bağlı Girişler}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Bekleme Modundaki Giriş}other{Bekleme Modundaki Girişler}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Bağlı Olmayan Giriş}other{Bağlı Olmayan Girişler}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Hesabınızdaki uygulamalara ve diğer içeriğe erişimi kısıtlayın"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Kısıtlanmış Profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> tarafından kontrol ediliyor"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Kısıtlanmış profil oluştur"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Ayarlar"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"İzin verilen uygulamalar"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d uygulamaya izin verildi</item>
- <item quantity="one">1 uygulamaya izin verildi</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"İzin veriliyor"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"İzin verilmiyor"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Kısıtlamaları özelleştir"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Üçüncü Taraf Kaynak"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"İzinler"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Uygulama kullanılamıyor"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Kullanılmayan uygulamalar"</string>
<string name="settings_ok" msgid="5950888975075541964">"Tamam"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Onayla"</string>
<string name="settings_cancel" msgid="576094334743686152">"İptal"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Bu izin, bir uygulamanın sistem ayarlarını değiştirmesine olanak sağlar."</string>
<string name="write_settings_on" msgid="71675710746513956">"Evet"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Hayır"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Tüm dosyalara erişim"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Tüm dosyaları yönetme erişimine izin ver"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Bu uygulamanın, bu cihazdaki veya cihaza bağlı depolama birimlerindeki tüm dosyaları okumasına, değiştirmesine ve silmesine izin verin. İzin verilirse uygulama size açıkça bildirmeden dosyalara erişebilir."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Pencere içinde pencere"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Pencere içinde pencereye izin ver"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Yüklü uygulamalardan hiçbiri pencere içinde pencere özelliğini desteklemiyor"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Uygulamaların, uygulama açıkken veya uygulamadan çıktıktan sonra (örneğin, video izlemeye devam etmek için) pencere içinde pencere oluşturmasına izin verir. Bu pencere, kullandığınız diğer uygulamaların üzerinde gösterilir."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Uygulamaların alarmlar kurup zamana bağlı işlemler programlamasına izin verir. Bu izin, uygulamaların arka planda çalışmasına olanak sağlayarak daha fazla pil harcanmasına neden olabilir.\n\nBu izin verilmezse bu uygulama tarafından programlanmış mevcut alarmlar ve zamana bağlı etkinlikler çalışmaz."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Ekranı aç"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Ekranı açmaya izin ver"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Bir uygulamanın ekranı açmasına izin verin. İzin verildiğinde, uygulama sizin belirgin niyetiniz olmadan istediği zaman ekranı açabilir."</string>
<string name="special_access" msgid="21806055758289916">"Özel uygulama erişimi"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Ses"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Veri Tasarrufu"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Video kalitesini daha az mobil veri kullanacak şekilde otomatik olarak ayarlayın"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Veri kullanımı ve uyarılar"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"İnternete kablosuz, Ethernet veya telefonunuzun hotspot\'u üzerinden bağlanabilirsiniz. Daha fazla yardım için "<b>"g.co/network"</b>" sayfasını ziyaret edin."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"İnternete kablosuz, Ethernet veya telefonunuzun hotspot\'u üzerinden bağlanabilirsiniz."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"İşleme izin verilmedi"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Ses düzeyi değiştirilemez"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Güç ve Enerji"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Açılış davranışı"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Sıfırla"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet eşleme kodu"</string>
</resources>
diff --git a/Settings/res/values-uk/strings.xml b/Settings/res/values-uk/strings.xml
index 6326115..73c8290 100644
--- a/Settings/res/values-uk/strings.xml
+++ b/Settings/res/values-uk/strings.xml
@@ -45,25 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Додати обліковий запис"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Облікові записи та вхід"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Немає облікових записів"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> обліковий запис</item>
- <item quantity="few"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> облікові записи</item>
- <item quantity="many"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> облікових записів</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> облікового запису</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# обліковий запис}one{# обліковий запис}few{# облікові записи}many{# облікових записів}other{# облікового запису}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Медіа-сервіси, Асистент, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Мережа й Інтернет"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Звук"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Додатки"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Параметри пристрою"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Пульти дистанційного керування й аксесуари"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Пристрої Bluetooth не під’єднано"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> аксесуар</item>
- <item quantity="few"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> аксесуари</item>
- <item quantity="many"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> аксесуарів</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> аксесуара</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Зображення та звук"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Довідка й відгуки"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Конфіденційність"</string>
@@ -122,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Відновлення заводських налаштувань"</string>
<string name="device_calibration" msgid="2907914144048739705">"Калібрування"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Режим енергозбереження"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Пристрої"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Вибрати формати"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Об’ємний звук"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -189,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"УВІМКНЕНІ ФОРМАТИ"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ВИМКНЕНІ ФОРМАТИ"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Щоб вимкнути, укажіть для параметра \"Вибір формату\" значення \"Вручну\"."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Роздільна здатність"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Автоматично"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Роздільну здатність змінено"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Натисніть OK, щоб надалі використовувати роздільну здатність %1$s."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Скасувати"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Гц"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Видалити кешовані дані?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Кешовані дані всіх додатків буде видалено."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Додати пристрої"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Створення пари…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"З’єднання…"</string>
@@ -228,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Аксесуари"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Пульт ДК"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Налаштування пульта ДК"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Налаштуйте кнопки дистанційного керування"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Керуйте гучністю, живленням і джерелами вхідного сигналу телевізора, приймача та звукової панелі"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Підключити"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Підключитися до пристрою %1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Відключити"</string>
@@ -266,12 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Недоступно"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Додатки адміністратора пристрою"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Немає активних додатків"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Вимкнено адміністратором, правилом шифрування або сховищем облікових даних"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Інформація про керований пристрій"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Зміни та налаштування, якими керує адміністратор вашої організації"</string>
@@ -289,22 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Немає"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Установлені додатки"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Це приблизна кількість додатків. Вона може не включати додатки, установлені не з Google Play."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Щонайменше # додаток}one{Щонайменше # додаток}few{Щонайменше # додатки}many{Щонайменше # додатків}other{Щонайменше # додатка}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Дозвіл на доступ до геоданих"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Дозвіл на доступ до мікрофона"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Дозвіл на доступ до камери"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Додатки за умовчанням"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# додаток}one{# додаток}few{# додатки}many{# додатків}other{# додатка}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Клавіатура за умовчанням"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Налаштовано: <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Постійну мережу VPN увімкнено"</string>
@@ -314,47 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Надійні облікові дані"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Надійні облікові дані в особистому профілі"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Надійні облікові дані в робочому профілі"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <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="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# сертифікат центру сертифікації (ЦС)}one{# сертифікат центру сертифікації (ЦС)}few{# сертифікати центру сертифікації (ЦС)}many{# сертифікатів центру сертифікації (ЦС)}other{# сертифіката центру сертифікації (ЦС)}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Адміністратор може заблокувати пристрій і скинути пароль"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Адміністратор може видалити всі дані пристрою"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Невдалі спроби введення пароля перед видаленням усіх даних пристрою"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Невдалі спроби введення пароля перед видаленням даних робочого профілю"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# спроба}one{# спроба}few{# спроби}many{# спроб}other{# спроби}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Цим пристроєм керує адміністратор вашої організації."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Цим пристроєм керує <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Докладніше"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Додатки для камери</item>
- <item quantity="few">Додатки для камери</item>
- <item quantity="many">Додатки для камери</item>
- <item quantity="other">Додатки для камери</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Додаток для камери}one{Додатки для камери}few{Додатки для камери}many{Додатки для камери}other{Додатки для камери}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Додаток для календарів"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Додаток для контактів"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Додатки для електронної пошти</item>
- <item quantity="few">Додатки для електронної пошти</item>
- <item quantity="many">Додатки для електронної пошти</item>
- <item quantity="other">Додатки для електронної пошти</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Додаток для електронної пошти}one{Додатки для електронної пошти}few{Додатки для електронної пошти}many{Додатки для електронної пошти}other{Додатки для електронної пошти}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Додаток для карт"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Додатки для викликів</item>
- <item quantity="few">Додатки для викликів</item>
- <item quantity="many">Додатки для викликів</item>
- <item quantity="other">Додатки для викликів</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Додаток для викликів}one{Додатки для викликів}few{Додатки для викликів}many{Додатки для викликів}other{Додатки для викликів}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Веб-переглядач"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -373,12 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Версія ОС Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Серійний номер"</string>
<string name="about_build" msgid="8467840394761634575">"Складання ОС Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{Залишився лише # крок, щоб стати розробником}one{Залишився лише # крок, щоб стати розробником}few{Залишилося лише # кроки, щоб стати розробником}many{Залишилося лише # кроків, щоб стати розробником}other{Залишилося лише # кроку, щоб стати розробником}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Реклама"</string>
<string name="ads_description" msgid="8081069475265061074">"Керуйте налаштуваннями реклами, зокрема скидайте рекламний ідентифікатор."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Реклама. Керуйте налаштуваннями реклами, зокрема скидайте рекламний ідентифікатор."</string>
@@ -392,31 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Додаткові оновлення системи"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Мережа може відстежуватися"</string>
<string name="done_button" msgid="616159688526431451">"Готово"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Додайте або вилучіть сертифікати</item>
- <item quantity="few">Додайте або вилучіть сертифікати</item>
- <item quantity="many">Додайте або вилучіть сертифікати</item>
- <item quantity="other">Додайте або вилучіть сертифікати</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one">Адміністратор домену <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установив на вашому пристрої центри сертифікації, за допомогою яких зможе відстежувати ваші дії в мережі пристрою, зокрема в електронній пошті, додатках і на безпечних веб-сайтах.\n\nЩоб дізнатися більше про ці сертифікати, зверніться до адміністратора.</item>
- <item quantity="few">Адміністратор домену <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установив на вашому пристрої центри сертифікації, за допомогою яких зможе відстежувати ваші дії в мережі пристрою, зокрема в електронній пошті, додатках і на безпечних веб-сайтах.\n\nЩоб дізнатися більше про ці сертифікати, зверніться до адміністратора.</item>
- <item quantity="many">Адміністратор домену <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установив на вашому пристрої центри сертифікації, за допомогою яких зможе відстежувати ваші дії в мережі пристрою, зокрема в електронній пошті, додатках і на безпечних веб-сайтах.\n\nЩоб дізнатися більше про ці сертифікати, зверніться до адміністратора.</item>
- <item quantity="other">Адміністратор домену <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установив на вашому пристрої центри сертифікації, за допомогою яких зможе відстежувати ваші дії в мережі пристрою, зокрема в електронній пошті, додатках і на безпечних веб-сайтах.\n\nЩоб дізнатися більше про ці сертифікати, зверніться до адміністратора.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one">Адміністратор домену <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установив для вашого робочого профілю центри сертифікації, за допомогою яких зможе відстежувати ваші дії в корпоративній мережі, зокрема в електронній пошті, додатках і на безпечних веб-сайтах.\n\nЩоб дізнатися більше про ці сертифікати, зверніться до адміністратора.</item>
- <item quantity="few">Адміністратор домену <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установив для вашого робочого профілю центри сертифікації, за допомогою яких зможе відстежувати ваші дії в корпоративній мережі, зокрема в електронній пошті, додатках і на безпечних веб-сайтах.\n\nЩоб дізнатися більше про ці сертифікати, зверніться до адміністратора.</item>
- <item quantity="many">Адміністратор домену <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установив для вашого робочого профілю центри сертифікації, за допомогою яких зможе відстежувати ваші дії в корпоративній мережі, зокрема в електронній пошті, додатках і на безпечних веб-сайтах.\n\nЩоб дізнатися більше про ці сертифікати, зверніться до адміністратора.</item>
- <item quantity="other">Адміністратор домену <xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> установив для вашого робочого профілю центри сертифікації, за допомогою яких зможе відстежувати ваші дії в корпоративній мережі, зокрема в електронній пошті, додатках і на безпечних веб-сайтах.\n\nЩоб дізнатися більше про ці сертифікати, зверніться до адміністратора.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Третя сторона може відстежувати ваші дії в мережі, зокрема електронне листування, роботу в програмах і на захищених веб-сайтах.\n\nЦе робиться за допомогою довірених облікових даних, установлених на вашому пристрої."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Перевірити сертифікати</item>
- <item quantity="few">Перевірити сертифікати</item>
- <item quantity="many">Перевірити сертифікати</item>
- <item quantity="other">Перевірити сертифікати</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Додати або вилучити сертифікат}one{Додати або вилучити сертифікати}few{Додати або вилучити сертифікати}many{Додати або вилучити сертифікати}other{Додати або вилучити сертифікати}}"</string>
<string name="device_status" msgid="8266002761193692207">"Статус"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Мережа, серійні номери й інша інформація"</string>
<string name="manual" msgid="5683935624321864999">"Посібник"</string>
@@ -508,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Під’єднатись"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Видалити мережу"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Буде видалено відомості, потрібні для під’єднання до цієї мережі, зокрема збережений пароль"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Щоб підключитися до мережі Wi-Fi, відскануйте QR-код за допомогою мобільного телефона й дотримуйтеся вказівок на екрані."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Щоб підключитися до мережі Wi-Fi, відскануйте QR-код мобільним телефоном і виконайте вказівки.\n \n На "<b>"телефоні Android"</b>" виберіть \"Налаштування\" -> \"Мережа й Інтернет\" -> \"Wi-Fi\" -> виберіть мережу Wi-Fi -> \"Додатково\" -> \"Додати пристрій\", а потім відскануйте QR-код."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Щоб скасувати, натисніть кнопку \"Назад\""</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Продовжити"</string>
@@ -577,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Пам’ять пристрою"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Знімний носій"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Скидання"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Звільніть місце"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Очистьте кешовані дані"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Звільнити <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Буде очищено тимчасові файли, які займають місце. Це не вплине на збережені дані, такі як налаштування додатків чи офлайн-відео, тому вам не доведеться входити в додатки ще раз."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Очистити кешовані дані?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Кешовані дані всіх додатків буде видалено."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Видаліть додатки"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"Носій <xliff:g id="NAME">%1$s</xliff:g> підключено"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Не вдалося підключити носій <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Носій USB підключено"</string>
@@ -654,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Мікрофон"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Доступ до мікрофона"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Доступ додатка до мікрофона"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Доступ до мікрофона заблоковано"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Щоб розблокувати мікрофон і надати доступ до нього, пересуньте перемикач конфіденційності на своєму пристрої в положення \"Мікрофон увімкнено\"."</string>
<string name="camera" msgid="1226671478936288283">"Камера"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Доступ до камери"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Доступ додатка до камери"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Доступ до камери заблоковано"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Щоб розблокувати камеру й надати доступ до неї, пересуньте перемикач конфіденційності на своєму пристрої в положення \"Камеру ввімкнено\"."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Доступ до мікрофона: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Коли цей параметр увімкнено, усі додатки й сервіси з відповідним дозволом можуть отримувати доступ до будь-якого мікрофона на пристрої.\n\nЦе налаштування не впливає на периферійні аудіопристрої зі спеціальним протоколом."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Доступ до камери: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -728,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Блакитний"</string>
<string name="color_yellow" msgid="3519470952904560404">"Жовтий"</string>
<string name="color_magenta" msgid="2377854703399624607">"Пурпурний"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Голосовий супровід"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Озвучування подій, що відбуваються на екрані, у підтримуваних фільмах і серіалах"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Увімкнути"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Конфігурація"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Використовувати <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -748,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Контроль"</string>
<string name="system_apps" msgid="8481888654606868074">"Додатки"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Залишатись активним"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Екран не згасатиме"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Перевірка HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Оптимізація HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Перезавантажити пристрій?"</string>
@@ -868,24 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Вимикати пристрої HDMI за допомогою телевізора"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Автоматичне ввімкн. телевізора"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Вмикати телевізор із пристроєм HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Під’єднані джерела сигналу</item>
- <item quantity="few">Під’єднані джерела сигналу</item>
- <item quantity="many">Під’єднані джерела сигналу</item>
- <item quantity="other">Під’єднані джерела сигналу</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Резервні джерела сигналу</item>
- <item quantity="few">Резервні джерела сигналу</item>
- <item quantity="many">Резервні джерела сигналу</item>
- <item quantity="other">Резервні джерела сигналу</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Непід’єднані джерела сигналу</item>
- <item quantity="few">Непід’єднані джерела сигналу</item>
- <item quantity="many">Непід’єднані джерела сигналу</item>
- <item quantity="other">Непід’єднані джерела сигналу</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Під’єднане джерело сигналу}one{Під’єднані джерела сигналу}few{Під’єднані джерела сигналу}many{Під’єднані джерела сигналу}other{Під’єднані джерела сигналу}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Резервне джерело сигналу}one{Резервні джерела сигналу}few{Резервні джерела сигналу}many{Резервні джерела сигналу}other{Резервні джерела сигналу}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Непід’єднане джерело сигналу}one{Непід’єднані джерела сигналу}few{Непід’єднані джерела сигналу}many{Непід’єднані джерела сигналу}other{Непід’єднані джерела сигналу}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Обмежується доступ до додатків та іншого вмісту в обліковому записі"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Обмежений профіль користувача"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Керує додаток <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -899,12 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Створити обмежений профіль"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Налаштування"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Дозволені додатки"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">Дозволено %d додаток</item>
- <item quantity="few">Дозволено %d додатки</item>
- <item quantity="many">Дозволено %d додатків</item>
- <item quantity="other">Дозволено %d додатка</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Дозволено"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Не дозволено"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Налаштувати обмеження"</string>
@@ -949,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Стороннє джерело"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Дозволи"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Додаток недоступний"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Додатки, що не використовуються"</string>
<string name="settings_ok" msgid="5950888975075541964">"ОК"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Підтвердити"</string>
<string name="settings_cancel" msgid="576094334743686152">"Скасувати"</string>
@@ -1032,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Додаток із цим дозволом може змінювати налаштування системи."</string>
<string name="write_settings_on" msgid="71675710746513956">"Так"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Ні"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Доступ до всіх файлів"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Надати доступ до керування всіма файлами"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Дозволити цьому додатку переглядати, змінювати та видаляти всі файли на цьому пристрої або інших підключених носіях пам\'яті. Після надання дозволу додаток може отримувати доступ до файлів без вашого відома."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Картинка в картинці"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Дозвіл картинки в картинці"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Не встановлено додатків, як підтримують режим картинки в картинці"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Дозвольте додаткам створювати вікно з картинкою в картинці, коли вони відкриті або коли ви вийшли з них (наприклад, щоб дивитися відео). Це вікно з’являтиметься поверх інших додатків."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Дозволити додаткам налаштовувати будильники й створювати події на певний час. Додатки зможуть працювати у фоновому режимі й тому використовувати більше заряду акумулятора.\n\nЯкщо вимкнути цей дозвіл, наявні будильники й події, створені додатком, не працюватимуть."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Увімкнення екрана"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Дозволити ввімкнення екрана"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Дозвольте додатку вмикати екран. Якщо ви надасте цей дозвіл, додаток зможе будь-коли вмикати екран пристрою навіть без вашого явного наміру."</string>
<string name="special_access" msgid="21806055758289916">"Спеціальний доступ додатка"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>."</string>
<string name="audio_category" msgid="6143623109624947993">"Звук"</string>
@@ -1053,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Заощадження трафіку"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Автоматично змінювати якість відео, щоб заощаджувати мобільний трафік"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Використання трафіку та сповіщення"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Ви можете підключитися до Інтернету через Wi-Fi, Ethernet або точку доступу свого телефона. Докладну інформацію можна знайти на сторінці "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Ви можете підключитися до Інтернету через Wi-Fi, Ethernet або точку доступу свого телефона."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Дію не дозволено"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Гучність не можна змінити"</string>
@@ -1103,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Живлення й енергія"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Поведінка під час увімкнення"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Скидання"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Код підключення Ethernet"</string>
</resources>
diff --git a/Settings/res/values-ur/strings.xml b/Settings/res/values-ur/strings.xml
index 53c9a23..27bc3e8 100644
--- a/Settings/res/values-ur/strings.xml
+++ b/Settings/res/values-ur/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"ایک اکاؤنٹ شامل کریں"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"اکاؤنٹس اور سائن ان"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"کوئی اکاؤنٹ نہیں ہے"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> اکاؤنٹس</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> اکاؤنٹ</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# اکاؤنٹ}other{# اکاؤنٹس}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"میڈیا سروسز، اسسٹنٹ، ادائيگیاں"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"نیٹ ورک اور انٹرنیٹ"</string>
<string name="sound_category_title" msgid="7899816751041939518">"آواز"</string>
<string name="applications_category_title" msgid="7112019490898586223">"ایپس"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"آلہ کی ترجیحات"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"ریموٹس اور لوازمات"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"کوئی بلوٹوتھ آلہ منسلک نہیں ہے"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> لوازمات</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> لوازم</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"ڈسپلے اور آواز"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"مدد اور تاثرات"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"رازداری"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"فیکٹری ڈیٹا ری سیٹ"</string>
<string name="device_calibration" msgid="2907914144048739705">"کیلیبریشن"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"انرجی سیور"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"آلات"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"فارمیٹس منتخب کریں"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"محیط آواز"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"فعال فارمیٹس"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"غیر فعال فارمیٹس"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"غیر فعال کرنے کیلئے فارمیٹ سلیکشن کو دستی میں تبدیل کریں۔"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"ریزولیوشن"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"خودکار"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"ریزولیوشن کو تبدیل کر دیا گیا ہے"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"اب سے %1$s کا استعمال کرنے کے لیے \'ٹھیک ہے\' کو منتخب کریں۔"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"منسوخ کریں"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"ٹھیک ہے"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"کیش کیا ہوا ڈیٹا صاف کریں؟"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"یہ سبھی ایپس کیلئے کیش کیے ہوئے ڈیٹا کو صاف کر دے گا۔"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"امدادی سامان شامل کریں"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"جوڑا بنایا جا رہا ہے…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"مربوط کیا جا رہا ہے…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"لوازمات"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"ریموٹ کنٹرول"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"ریموٹ کنٹرول کی ترتیبات"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"ریموٹ بٹنز سیٹ اپ کریں"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"TVs، ریسیورز اور ساؤنڈ بارز پر والیوم، پاور اور ان پٹ کنٹرول کریں"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"منسلک کریں"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s سے منسلک ہوں"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"غیر منسلک کریں"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"دستیاب نہیں ہے"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"آلہ کے نظم و نسق کی ایپس"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"کوئی فعال ایپ نہیں"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"منتظم، مرموز کاری کی پالیسی یا اسناد اسٹوریج کے ذریعے غیر فعال کردہ"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"نظم کردہ آلے کی معلومات"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"آپ کی تنظیم کے ذریعے نظم کردہ ترتیبات اور تبدیلیاں"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"کوئی نہیں"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"ایپس انسٹال ہو گئیں"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"ایپس کی تعداد تخمینی ہے۔ ہو سکتا ہے Play اسٹور سے باہر انسٹال کردہ ایپس اس میں شامل نہ ہوں۔"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{کم از کم # ایپ}other{کم از کم # ایپس}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"مقام کی اجازتیں"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"مائیکروفون کی اجازتیں"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"کیمرے کی اجازتیں"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"ڈیفالٹ ایپس"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# ایپ}other{# ایپس}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"ڈیفالٹ کی بورڈ"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> پر سیٹ"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"ہمیشہ آن VPN آن ہو گیا"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"بھروسہ مند اسناد"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"آپ کے ذاتی پروفائل میں بھروسہ مند اسناد"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"آپ کے دفتری پروفائل میں بھروسہ مند اسناد"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">کم از کم <xliff:g id="COUNT_1">%d</xliff:g> CA سرٹیفکیٹس</item>
- <item quantity="one">کم از کم <xliff:g id="COUNT_0">%d</xliff:g> CA سرٹیفکیٹ</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# CA سرٹیفکیٹ}other{# CA سرٹیفکیٹس}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"منتظم آلے کو مقفل کر کے دوبارہ پاس ورڈ ترتیب دے سکتا ہے"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"ایڈمن آلہ کے تمام ڈیٹا کو حذف کرسکتا ہے"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"آلے کے تمام ڈیٹا کو حذف کرنے سے قبل پاس ورڈ درج کرنے کی ناکام کوششیں"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"دفتری پروفائل کے ڈیٹا کو حذف کرنے سے قبل پاس ورڈ درج کرنے کی ناکام کوششیں"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# کوشش}other{# کوششیں}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"یہ آلہ آپ کی تنظیم کے زیر انتظام ہے۔"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"یہ آلہ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> کے زیر انتظام ہے۔"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"مزید جانیں"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">کیمرا ایپس</item>
- <item quantity="one">کیمرا ایپ</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{کیمرا ایپ}other{کیمرا ایپس}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"کیلنڈر ایپ"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"رابطہ ایپ"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">ای میل کلائنٹ ایپس</item>
- <item quantity="one">ای میل کلائنٹ ایپ</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{ای میل کلائنٹ ایپ}other{ای میل کلائنٹ ایپس}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"نقشہ ایپ"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">فون ایپس</item>
- <item quantity="one">فون ایپ</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{فون ایپ}other{فون ایپس}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"براؤزر ایپ"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>، <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>، <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>، <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS ورژن"</string>
<string name="about_serial" msgid="3432319328808745459">"نمبر شمار"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS بلڈ"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{اب آپ ڈویلپر بننے سے # قدم دور ہیں}other{اب آپ ڈیولپر بننے سے # قدم دور ہیں}}"</string>
<string name="about_ads" msgid="7662896442040086522">"اشتہارات"</string>
<string name="ads_description" msgid="8081069475265061074">"اپنے اشتہارات کی ترتیبات کا نظم کریں، جیسے اپنی تشہیری ID کو دوبارہ شروع کرنا۔"</string>
<string name="ads_content_description" msgid="1006489792324920289">"اشتہارات، اپنے اشتہارات کی ترتیبات کا نظم کریں جیسے اپنی تشہیری ID کو ری سیٹ کرنا۔"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"سسٹم کے اضافی اپ ڈیٹس"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"نیٹ ورک کو مانیٹر کیا جا سکتا ہے"</string>
<string name="done_button" msgid="616159688526431451">"ہو گیا"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">سرٹیفیکیٹس پر اعتماد کریں یا ہٹائیں</item>
- <item quantity="one">سرٹیفکیٹ پر اعتماد کریں یا ہٹائیں</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> نے آپ کے آلے پر سرٹیفیکیٹ اتھارٹیز انسٹال کی ہیں جو انہیں ای میلز، ایپس اور محفوظ ویب سائٹس سمیت آپ کے آلے کے نیٹ ورک کی سرگرمی مانیٹر کرنے کی اجازت دے سکتی ہیں۔\n\nان سرٹیفیکیٹس سے متعلق مزید معلومات کے لیے اپنے منتظم سے رابطہ کریں۔</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> نے آپ کے آلے پر سرٹیفیکیٹ اتھارٹی انسٹال کی ہے جو انہیں ای میلز، ایپس اور محفوظ ویب سائٹس سمیت آپ کے آلے کے نیٹ ورک کی سرگرمی مانیٹر کرنے کی اجازت دے سکتی ہے۔\n\nاس سرٹیفیکیٹ سے متعلق مزید معلومات کے لیے اپنے منتظم سے رابطہ کریں۔</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> نے آپ کی دفتری پروفائل کے لیے سرٹیفیکیٹ اتھارٹیز انسٹال کی ہیں جو انہیں ای میلز، ایپس اور محفوظ ویب سائٹس سمیت دفتری نیٹ ورک کی سرگرمی مانیٹر کرنے کی اجازت دے سکتی ہیں۔\n\nان سرٹیفیکیٹس سے متعلق مزید معلومات کے لیے اپنے منتظم سے رابطہ کریں۔</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> نے آپ کی دفتری پروفائل کے لیے ایک سرٹیفیکیٹ اتھارٹی انسٹال کی ہے جو انہیں ای میلز، ایپس اور محفوظ ویب سائٹس سمیت دفتری نیٹ ورک کی سرگرمی مانیٹر کرنے کی اجازت دے سکتی ہے۔\n\nاس سرٹیفیکیٹ سے متعلق مزید معلومات کے لیے اپنے منتظم سے رابطہ کریں۔</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"ایک تیسرا فریق آپ کے نیٹ ورک کی سرگرمی، بشمول ای میلز، ایپس اور محفوظ ویب سائٹوں پر نگاہ رکھنے پر قادر ہے۔\n\nآپ کے آلے پر انسٹال شدہ ایک بھروسہ مند استناد کی وجہ سے یہ ممکن ہے۔"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">سرٹیفکیٹس چیک کریں</item>
- <item quantity="one">سرٹیفیکیٹ چیک کریں</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{سرٹیفکیٹ پر اعتماد کریں یا ہٹائیں}other{سرٹیفیکیٹس پر اعتماد کریں یا ہٹائیں}}"</string>
<string name="device_status" msgid="8266002761193692207">"اسٹیٹس"</string>
<string name="device_status_summary" msgid="3270932829412434985">"نیٹ ورک، سیریل نمبرز اور دیگر معلومات"</string>
<string name="manual" msgid="5683935624321864999">"مینوئل"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"منسلک کریں"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"نیٹ ورک کو بھول جائیں"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"محفوظ کردہ پاس ورڈ سمیت، یہ اس نیٹ ورک سے منسلک کرنے کیلئے استعمال کردہ معلومات کو صاف کر دیتا ہے۔"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"اپنے موبائل فون سے QR کوڈ اسکین کر کے Wi-Fi میں شامل ہوں اور ہدایت کی پیروی کریں۔"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" موبائل فون سے QR کوڈ اسکین کر کے Wi-Fi میں شامل ہوں اور ہدایت کی پیروی کریں۔\n \n "<b>"Android فون"</b>" سے ترتیبات -> نیٹ ورک اور انٹرنیٹ ->Wi-Fi پر جائیں -> Wi-Fi -> جدید ترین منتخب کریں -> آلہ شامل کریں پھر QR کوڈ اسکین کریں۔"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"منسوخ کرنے کیلئے \"پیچھے جائيں\" بٹن پر دبائیں"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"ٹھیک ہے"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"جاری رکھیں"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"آلہ کا اسٹوریج"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"قابل ہٹاؤ اسٹوریج"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"دوبارہ ترتیب دیں"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"اسٹوریج خالی کریں"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"کیش کردہ ڈیٹا صاف کریں"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> خالی کریں"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"اس سے اسپیس لینے والی عارضی فائلز صاف ہو جاتی ہیں۔ اس سے ایپ کی ترجیحات یا آف لائن ویڈیوز جیسے محفوظ کردہ ڈیٹا متاثر نہیں ہوں گے اور آپ کو ایپس میں دوبارہ سائن ان کرنے کی ضرورت نہیں ہوگی۔"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"کیش کردہ ڈیٹا صاف کریں؟"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"اس سے سبھی ایپس کا کیش کردہ ڈیٹا صاف ہو جائے گا۔"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"ایپس کو اَن انسٹال کریں"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> کو ماؤنٹ کر دیا گیا"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> کو ماؤنٹ نہیں کیا جا سکا"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB اسٹوریج دوبارہ منسلک ہو گئی"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"مائیکروفون"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"مائیکروفون تک رسائی"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"مائیکروفون تک ایپ کی رسائی"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"مائیکروفون تک رسائی مسدود ہے"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"غیر مسدود کرنے کے لیے، کیمرا تک رسائی کی اجازت دینے کے لیے اپنے آلے پر رازداری سوئچ کو \'مائیکروفون آن ہے\' وضع پر لے جائیں۔"</string>
<string name="camera" msgid="1226671478936288283">"کیمرا"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"کیمرے تک رسائی"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"کیمرے تک ایپ کی رسائی"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"کیمرے تک رسائی مسدود ہے"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"غیر مسدود کرنے کی خاطر، کیمرا تک رسائی کی اجازت دینے کے لیے اپنے آلے پر موجود رازداری سوئچ کو \'کیمرا آن ہے\' وضع پر لے جائیں۔"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"مائیکروفون تک رسائی: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"آن ہونے پر، اجازت والی تمام ایپس اور سروسز اس آلے پر کسی بھی مائیکروفون تک رسائی حاصل کر سکتی ہیں۔\n\nحسب ضرورت پروٹوکول والے آڈیو پیریفیرلز اس ترتیب سے متاثر نہیں ہوں گے۔"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"کیمرے تک رسائی: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"سبزی مائل نیلا"</string>
<string name="color_yellow" msgid="3519470952904560404">"زرد"</string>
<string name="color_magenta" msgid="2377854703399624607">"قرمزی"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"آڈیو تفصیل"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"تعاون یافتہ موویز اور شوز میں اسکرین پر کیا ہو رہا ہے اس کی تفصیل سنیں"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"فعال کریں"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"کنفیگریشن"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g> کا استعمال کریں؟"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"مانیٹر کرنا"</string>
<string name="system_apps" msgid="8481888654606868074">"ایپس"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"بیدار رکھیں"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"اسکرین کبھی سلیپ وضع میں نہیں جائے گی"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP چیکنگ"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI آپٹمائزیشن"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"ابھی دوبارہ سٹارٹ کریں؟"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"TV کے ساتھ HDMI آلات کو آف کریں"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV کا آٹو پاور آن ہے"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI آلہ کے ساتھ TV کا پاور آن کریں"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">منسلک ان پٹس</item>
- <item quantity="one">منسلک ان پٹ</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">اسٹینڈ بائی ان پٹس</item>
- <item quantity="one">اسٹینڈ بائی ان پٹ</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">غیر منسلک ان پٹس</item>
- <item quantity="one">غیر منسلک ان پٹ</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{منسلک کردہ TV ان پٹ}other{منسلک کردہ TV ان پٹس}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{اسٹینڈ بائی ان پٹ}other{اسٹینڈ بائی ان پٹس}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{غیر منسلک کردہ TV ان پٹ}other{غیر منسلک کردہ TV ان پٹس}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"اپنے اکاؤنٹ میں رسائی کو ایپس اور دیگر مواد تک محدود کریں"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"محدود پروفائل"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"کنٹرول کردہ بذریعہ <xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"محدود پروفائل بنائیں"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"ترتیبات"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"مجاز ایپس"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d ایپس کو اجازت دی گئی</item>
- <item quantity="one">1 ایپ کو اجازت دی گئی</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"اجازت یافتہ"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"اجازت نہیں ہے"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"پابندیوں کو حسب ضرورت بنائیں"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"فریق ثالث کا ماخذ"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"اجازتیں"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"درخواست دستیاب نہیں"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"غیر مستعمل ایپس"</string>
<string name="settings_ok" msgid="5950888975075541964">"ٹھیک ہے"</string>
<string name="settings_confirm" msgid="4489126458677153411">"تصدیق کریں"</string>
<string name="settings_cancel" msgid="576094334743686152">"منسوخ کریں"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"یہ اجازت ایپ کو سسٹم کی ترتیبات میں ترمیم کرنے دیتی ہے۔"</string>
<string name="write_settings_on" msgid="71675710746513956">"ہاں"</string>
<string name="write_settings_off" msgid="6730113471695092167">"نہیں"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"سبھی فائلز کی رسائی"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"سبھی فائلز کا نظم کرنے کیلئے رسائی کی اجازت دیں"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"اس ایپ کو اس آلہ یا کسی منسلک اسٹوریج والیوم کی تمام فائلز کو پڑھنے، اس میں ترمیم کرنے اور حذف کرنے کی اجازت دیں۔ اگر اجازت دی گئی تو ایپ آپ کو بتائے بغیر فائلز تک رسائی حاصل کر سکتی ہے۔"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"تصویر میں تصویر"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"تصویر میں تصویر کی اجازت دیں"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"کوئی بھی انسٹال کردہ ایپ تصویر میں تصویر کو سپورٹ نہیں کرتی ہے"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"ایپ کے کھلے رہنے پر یا آپ کے اسے چھوڑنے کے بعد ایپس کو تصویر میں تصویر ونڈو بنانے کی اجازت دیں (مثال کے طور پر، ویڈیو دیکھنا جاری رکھنے کیلئے)۔ یہ ونڈو آپ کے ذریعے استعمال کی جانے والی دیگر ایپس کے اوپری حصے پر ڈسپلے ہوتی ہے۔"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"ایپس کو الارمز سیٹ کرنے اور متعین وقت کے لحاظ سے حساس کارروائیوں کو شیڈول کرنے کی اجازت دیں۔ یہ ایپس کو پس منظر میں چلنے دیتا ہے، جس میں زیادہ بیٹری استعمال ہو سکتی ہے۔\n\n اگر یہ اجازت آف ہے تو موجودہ الارمز اور ایپ کے ذریعے شیڈول کردہ وقت پر مبنی ایونٹس کام نہیں کریں گے۔"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"اسکرین آن کریں"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"اسکرین کو آن کرنے کی اجازت دیں"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"ایپ کو اسکرین آن کرنے کی اجازت دیں۔ اگر اجازت دی گئی تو ایپ آپ کے واضح مقصد کے بغیر کسی بھی وقت اسکرین کو آن کر سکتی ہے۔"</string>
<string name="special_access" msgid="21806055758289916">"ایپ کی خاص رسائی"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>، <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"آڈیو"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"ڈیٹا سیور"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"کم موبائل ڈیٹا استعمال کرنے کے ليے ویڈیو کے معیار کو خودکار طور پر ایڈجسٹ کریں"</string>
<string name="title_data_alert" msgid="8262081890052682475">"ڈیٹا کا استعمال اور الرٹس"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"آپ انٹرنیٹ سے Wi-Fi، ایتھرنیٹ یا اپنے فون کے ہاٹ اسپاٹ کے ساتھ منسلک کر سکتے ہیں۔ مزید مدد کے ليے، "<b>"g.co/network"</b>" ملاحظہ کریں۔"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"آپ انٹرنیٹ سے Wi-Fi، ایتھرنیٹ یا اپنے فون کے ہاٹ اسپاٹ کے ساتھ منسلک کر سکتے ہیں۔"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"کارروائی کی اجازت نہیں ہے"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"والیوم تبدیل نہیں کر سکتے"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"پاور اور توانائی"</string>
<string name="power_on_behavior" msgid="927607372303160716">"برتاؤ پر پاور"</string>
<string name="reset_options_title" msgid="7632580482285108955">"ری سیٹ کریں"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"ایتھرنیٹ سے جوڑا بنانے کا کوڈ"</string>
</resources>
diff --git a/Settings/res/values-uz/strings.xml b/Settings/res/values-uz/strings.xml
index 84a27d3..33029a2 100644
--- a/Settings/res/values-uz/strings.xml
+++ b/Settings/res/values-uz/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Hisobingizga kiring"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Hisoblar va tizimga kirish"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Hech qanday hisob yo‘q"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> ta hisob</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> ta hisob</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# ta hisob}other{# ta hisob}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Media xizmatlar, Assistent, toʻlovlar"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Tarmoq va Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Tovush"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Ilovalar"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Qurilma parametrlari"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Pultlar va aksessuarlar"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Hech qanday ulangan Bluetooth qurilma yo‘q"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> ta aksessuar</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> ta aksessuar</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Displey va tovush"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Yordam/fikr-mulohaza"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Maxfiylik"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Zavod sozlamalarini tiklash"</string>
<string name="device_calibration" msgid="2907914144048739705">"Kalibrlash"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Quvvat tejalishi"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Qurilmalar"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Formatlarni tanlang"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Qamrovli ovoz"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"YONIQ FORMATLAR"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"YOQILMAGAN FORMATLAR"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Faolsizlantirish uchun mustaqil rejimga oʻzgartiring."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Tasvir aniqligi"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Avtomatik"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Piksellar sigʻimi oʻzgartirildi"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Hozirdan %1$s ishlatish uchun OK tugmasini bosing."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Bekor qilish"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Kesh tozalansinmi?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Barcha ilovalarning keshi o‘chirib tashlanadi."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Aksessuarni qo‘shish"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Ulanmoqda…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Ulanmoqda…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Aksessuarlar"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Masofaviy boshqaruv"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Masofaviy boshqaruv pulti sozlamalari"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Pult tugmalarini sozlash"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Televizor, resiver va saundbarlardagi tovush balandligi, quvvat va manbalarni boshqarish"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Ulash"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"%1$s bilan ulash"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Uzish"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Mavjud emas"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Qurilma administratori ilovalari"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Hech qanday administrator ilovasi faol emas"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ta faol ilova</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ta faol ilova</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Administrator, shifrlash siyosati, yoki hisob ma’lumotlari ombori tomonidan o‘chirib qo‘yilgan"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Boshqariluvchi qurilma ma’lumotlari"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"O‘zgartirishlar va sozlamalar tashkilotingiz tomonidan boshqariladi"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Hech qanday"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Oʻrnatilgan ilovalar"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Ilovalar soni hisoblanmoqda. Play Market orqali oʻrnatilmagan ilovalar hisoblanmasligi mumkin."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Kamida <xliff:g id="COUNT_1">%d</xliff:g> ta ilova</item>
- <item quantity="one">Kamida <xliff:g id="COUNT_0">%d</xliff:g> ta ilova</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Kamida # ta ilova}other{Kamida # ta ilova}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Joylashuv axborotiga ruxsat"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Mikrofon ruxsatnomasi"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Kamera ruxsatnomasi"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Birlamchi ilovalar"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ta ilova</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ta ilova</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# ta ilova}other{# ta ilova}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Asosiy klaviatura"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"<xliff:g id="APP_LABEL">%s</xliff:g> yorlig‘iga sozlangan"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Doimiy VPN yoqildi"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Ishonchli sertifikatlar"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Shaxsiy profilingizdagi ishonchli sertifikatlar"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Ishchi profilingizdagi ishonchli sertifikatlar"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Kamida <xliff:g id="COUNT_1">%d</xliff:g> ta CA sertifikati</item>
- <item quantity="one">Kamida <xliff:g id="COUNT_0">%d</xliff:g> ta CA sertifikati</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# ta CA sertifikati}other{# ta CA sertifikati}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Administrator qurilmani qulflashi va parolni o‘zgartirishi mumkin"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Administrator barcha qurilma ma’lumotlarini o‘chirib tashlashi mumkin"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Qurilmadagi barcha ma’lumotlar o‘chirib tashlanishi uchun necha marta parol xato kiritilishi kerak"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Ish profili ma’lumotlari o‘chirib tashlanishi uchun necha marta parol xato kiritilishi kerak"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ta urinish</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ta urinish</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# ta urinish}other{# ta urinish}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Bu – tashkilotingiz tomonidan boshqariladigan qurilma."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Bu – <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> tomonidan boshqariladigan qurilma."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Batafsil"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Kamera uchun ilovalar</item>
- <item quantity="one">Kamera uchun ilova</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Kamera uchun ilova}other{Kamera uchun ilovalar}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Taqvim ilovasi"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Kontaktlar ilovasi"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Email uchun ilovalar</item>
- <item quantity="one">Email uchun ilova</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Email uchun ilova}other{Email uchun ilovalar}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Xarita ilovasi"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Telefon uchun ilovalar</item>
- <item quantity="one">Telefon uchun ilova</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Telefon uchun ilova}other{Telefon uchun ilovalar}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Brauzer ilovasi"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OT versiyasi"</string>
<string name="about_serial" msgid="3432319328808745459">"Seriya raqami"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OT nashri"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Dasturchi sifatida ro‘yxatdan o‘tishni yakunlashga <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> qadam qoldi</item>
- <item quantity="one">Dasturchi sifatida ro‘yxatdan o‘tishni yakunlashga <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> qadam qoldi</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{count,plural, =1{Dasturchi boʻlishingizga atigi # qadam qoldi.}other{Dasturchi boʻlishingizga atigi # qadam qoldi.}}"</string>
<string name="about_ads" msgid="7662896442040086522">"Reklamalar"</string>
<string name="ads_description" msgid="8081069475265061074">"Reklama ID tiklanishi kabi sozlamalarni boshqarish"</string>
<string name="ads_content_description" msgid="1006489792324920289">"Reklama, reklama ID tiklanishi kabi sozlamalarni boshqarish"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Qo‘shimcha yangilovlar"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Tarmoq kuzatilishi mumkin"</string>
<string name="done_button" msgid="616159688526431451">"Tayyor"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Sertifikatlarni ishonchli deb belgilash yoki olib tashlash</item>
- <item quantity="one">Sertifikatni ishonchli deb belgilash yoki olib tashlash</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> domeni administratori qurilmangiz uchun sertifikatlar oʻrnatdi. Buning yordamida qurilmaning tarmoq faoliyatini, jumladan, emaillar, ilovalar va xavfsiz saytlarni nazorat qilishi mumkin.\n\nBu sertifikatlar haqida batafsil axborot olish uchun administratorga murojaat qiling.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> domeni administratori qurilmangiz uchun sertifikat oʻrnatdi. Buning yordamida qurilmaning tarmoq faoliyatini, jumladan, emaillar, ilovalar va xavfsiz saytlarni nazorat qilishi mumkin.\n\nBu sertifikat haqida batafsil axborot olish uchun administratorga murojaat qiling.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> domeni administratori ishchi profilingiz uchun sertifikatlar oʻrnatdi. Buning yordamida korporativ tarmoq faoliyatini, jumladan, emaillar, ilovalar va xavfsiz saytlarni nazorat qilishi mumkin.\n\nBu sertifikatlar haqida batafsil axborot olish uchun administratorga murojaat qiling.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> domeni administratori ishchi profilingiz uchun sertifikat oʻrnatdi. Buning yordamida korporativ tarmoq faoliyatini, jumladan, emaillar, ilovalar va xavfsiz saytlarni nazorat qilishi mumkin.\n\nBu sertifikat haqida batafsil axborot olish uchun administratorga murojaat qiling.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Uchinchi shaxslar tarmoqdagi faoliyatlaringiz, shu jumladan, e-pochtangiz, ilovalaringiz va xavfsiz veb-saytlarni kuzatish imkoniyatiga egalar.\n\nQurilmangizga o‘rnatilgan ishonchli hisob ma‘lumotlari bunga imkon yaratib bermoqda."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Sertifikatlarni tekshirish</item>
- <item quantity="one">Sertifikatni tekshirish</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Sertifikatni ishonchli deb belgilash yoki olib tashlash}other{Sertifikatlarni ishonchli deb belgilash yoki olib tashlash}}"</string>
<string name="device_status" msgid="8266002761193692207">"Holati"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Tarmoq, seriya raqami va boshqa ma’lumotlar"</string>
<string name="manual" msgid="5683935624321864999">"Qo‘llanma"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Ulanish"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Tarmoqni unutish"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Bu ushbu tarmoqqa ulanish uchun foydalanilgan ma\'lumotlarni, jumladan saqlangan parolni o\'chiradi"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Mobil telefonda Wifi tarmoqqa ulanish uchun QR kodni skanerlang va koʻrsatmalarni bajaring."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Mobil telefonda Wi-Fi tarmoqqa ulanish uchun QR kodni skanerlang va koʻrsatmalarni bajaring.\n \n "<b>"Android telefoni"</b>" orqali Sozlamalar -> Tarmoq va internet -> Wi-Fi -> Wi-Fi tarmoqni tanlash -> Kengaytirilgan -> Qurilma kiritish sozlamasini oching va QR kodni skanerlang."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Bekor qilish uchun Orqaga tugmasini bosing"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Davom etish"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Qurilma xotirasi"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Tashqi xotira"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Asliga qaytarish"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Xotiradan joy ochish"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Keshni tozalash"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"<xliff:g id="SPACE">%1$s</xliff:g> joy ochish"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Xotiradan joy olayotgan vaqtinchalik fayllarni tozalaydi. Bu ilova parametrlari yoki oflayn videolar kabi saqlangan maʼlumotlarga taʼsir qilmaydi hamda ilovalardagi hisobingizga qayta kirishingiz kerak boʻlmaydi."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Kesh tozalansinmi?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Barcha ilovalarning keshi tozalab tashlanadi"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Ilovalarni oʻchirib tashlash"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> ulandi"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"<xliff:g id="NAME">%1$s</xliff:g> ulanmadi"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"USB xotira qayta ulandi"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Mikrofon"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Mikrofonga ruxsat"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Mikrofonga ruxsati bor ilovalar"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Mikrofonga kirish taqiqlangan"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Mikrofonga kirish uchun qurilmangizdagi maxfiylik tugmachasini suring va mikrofonni yoqing"</string>
<string name="camera" msgid="1226671478936288283">"Kamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Kameraga ruxsat"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Kameraga ruxsati bor ilovalar"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Kameraga kirish taqiqlangan"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Kameraga kirish uchun qurilmangizdagi maxfiylik tugmachasini suring va kamerani yoqing"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Mikrofonga ruxsat: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Yoqilsa, barcha ilova va xizmatlar bu qurilmadagi mikrofondan foydalana oladi.\n\nAudio jihozlar maxsus protokoldan foydalanadi va bu sozlama tomonidan bezovta qilinmaydi."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Kameraga ruxsat: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Zangori"</string>
<string name="color_yellow" msgid="3519470952904560404">"Sariq"</string>
<string name="color_magenta" msgid="2377854703399624607">"Pushtirang"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Audio tavsif"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Sozlamaga mos film va seriallarda ekrandagi hodisalar tavsifini eshitish"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Yoqish"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Konfiguratsiya"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"<xliff:g id="SERVICE">%1$s</xliff:g>dan foydalanilsinmi?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Kuzatish"</string>
<string name="system_apps" msgid="8481888654606868074">"Ilovalar"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Uyg‘oq qolish"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Ekran hech qachon uxlamaydi"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP tekshiruvi"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI-ni optimallashtirish"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Hozir qaytadan yoqilsinmi?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"TV bilan HDMI qurilmalarini o\'chiring"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"TV ni avtomatik yoqish"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"HDMI qurilma bilan TV ni yoqish"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Ulangan portlar</item>
- <item quantity="one">Ulangan port</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Kutish rejimidagi portlar</item>
- <item quantity="one">Kutish rejimidagi port</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Ulanmagan portlar</item>
- <item quantity="one">Ulanmagan port</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{ULANGAN PORT}other{Ulangan portlar}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Kutish rejimidagi port}other{Kutish rejimidagi portlar}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Ulanmagan port}other{Ulanmagan portlar}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Hisobingizdagi ilovalar va boshqa kontentga kirishni cheklang"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Cheklangan profil"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"<xliff:g id="APP">%1$s</xliff:g> bilan boshqariladi"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Imkoniyati cheklangan profil yaratish"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Sozlamalar"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Ruxsat berilgan ilovalar"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d ta ilovaga ruxsat berildi</item>
- <item quantity="one">1 ilovaga ruxsat berildi</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Ruxsat berilgan"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Ruxsat berilmagan"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Cheklanishlarni sozlash"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Tashqi manba"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Ruxsatlar"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Ilova mavjud emas"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Ishlatilmagan ilovalar"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Tasdiqlash"</string>
<string name="settings_cancel" msgid="576094334743686152">"Bekor qilish"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Bu ruxsatnoma ilovaga tizim sozlamalarini o‘zgaritish uchun ruxsat beradi."</string>
<string name="write_settings_on" msgid="71675710746513956">"Ha"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Yo‘q"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Barcha fayllarga kirish ruxsati"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Barcha fayllarni boshqarishga ruxsat"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Bu ilovaga mazkur qurilmadagi yoki ulangan xotira qurilmalaridagi barcha fayllarni oʻqish, tahrirlash va oʻchirib tashlash uchun ruxsat beriladi. Ruxsat berilgandan keyin ilova fayllardan sizning xabaringizsiz foydalana oladi."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Tasvir ustida tasvir"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Tasvir ustida tasvir"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Oʻrnatilgan ilovalar Tasvir ustida tasvir rejimi bilan mos emas"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Ilovalar ochiqligida yoki uni qoldirib ketganingizda (masalan, video tomosha qilishni davom ettirish uchun) bu ilova Tasvir ustida tasvir rejimida ishlashiga ruxsat bering. Bu oyna boshqa ishlatilayotgan ilovalar ustida ochiladi."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Ilovalarga signal oʻrnatish va vaqtga asoslangan amallarni rejalashtirishga ruxsat berish. Bunda ilovalarga orqa fonda ishlashiga imkon beriladi, shu sababli batareya ortiqcha sarflanishi mumkin.\n\nAgar bu ruxsat oʻchirilsa, ushbu ilova tomonidan rejalashtirilgan mavjud signallar va vaqtga asoslangan tadbirlar ishlamaydi."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Ekranni yoqish"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Ekranni yoqishga ruxsat"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Ilovaga ekranni yoqishga ruxsat berish. Ruxsat berilsa, ilova istalgan vaqt ruxsatingizsiz ekranni yoqishi mumkin."</string>
<string name="special_access" msgid="21806055758289916">"Maxsus ruxsatlar"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Audio"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Trafik tejash"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Video sifatini mobil internet trafik tejalishiga moslash"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Trafik sarfi va bildirishnomalar"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Internetga Wi-Fi, Ethernet yoki telefon hotspoti yordamida ulanishingiz mumkin. Yordam olish uchun "<b>"g.co/network"</b>" sahifasiga tashrif buyuring."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Internetga Wi-Fi, Ethernet yoki telefon hotspoti yordamida ulanishingiz mumkin."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Bu amalga ruxsat berilmagan"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Tovush balandligini o‘zgartirib bo‘lmaydi"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Quvvat va energiya"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Birlamchi ekran"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Tiklash"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ethernet ulanish kodi"</string>
</resources>
diff --git a/Settings/res/values-vi/strings.xml b/Settings/res/values-vi/strings.xml
index 152502d..8684945 100644
--- a/Settings/res/values-vi/strings.xml
+++ b/Settings/res/values-vi/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Thêm tài khoản"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Tài khoản và đăng nhập"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Không có tài khoản nào"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> tài khoản</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> tài khoản</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# tài khoản}other{# tài khoản}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Dịch vụ nghe nhìn, Trợ lý, Payments"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Mạng và Internet"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Âm thanh"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Ứng dụng"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Lựa chọn ưu tiên về thiết bị"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Điều khiển từ xa và phụ kiện"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Chưa kết nối với thiết bị Bluetooth nào"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> phụ kiện</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> phụ kiện</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Hiển thị và âm thanh"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Trợ giúp và Phản hồi"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Quyền riêng tư"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Đặt lại dữ liệu về trạng thái ban đầu"</string>
<string name="device_calibration" msgid="2907914144048739705">"Hiệu chỉnh"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Trình tiết kiệm pin"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Thiết bị"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Chọn các định dạng"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Âm thanh vòm"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"ĐỊNH DẠNG ĐÃ BẬT"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"ĐỊNH DẠNG BỊ TẮT"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Để tắt định dạng, hãy thay đổi chế độ lựa chọn định dạng thành Thủ công."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Độ phân giải"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Tự động"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Đã thay đổi độ phân giải"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Chọn OK để dùng %1$s từ giờ trở đi."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Hủy"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"OK"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Xóa dữ liệu đã lưu trong bộ nhớ đệm?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Xóa dữ liệu lưu trong cache cho tất cả ứng dụng."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Thêm phụ kiên"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Đang ghép nối…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Đang kết nối…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Phụ kiện"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Điều khiển từ xa"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Cài đặt điều khiển từ xa"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Thiết lập các nút trên điều khiển từ xa"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Điều chỉnh âm lượng, nguồn, nguồn đầu vào của TV, bộ thu và loa thanh"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Kết nối"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Kết nối với %1$s?"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Ngắt kết nối"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Không có"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Ứng dụng quản trị thiết bị"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Không có ứng dụng nào đang hoạt động"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ứng dụng hoạt động</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ứng dụng hoạt động</item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Do quản trị viên tắt, c.sách mã hóa hay vùng l.trữ t.tin xác thực"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Thông tin thiết bị được quản lý"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Thay đổi và cài đặt do tổ chức của bạn quản lý"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Không có"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Ứng dụng đã cài đặt"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Số lượng ứng dụng là con số ước tính, có thể không bao gồm các ứng dụng được cài đặt bên ngoài Cửa hàng Play."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="other">Tối thiểu <xliff:g id="COUNT_1">%d</xliff:g> ứng dụng</item>
- <item quantity="one">Tối thiểu <xliff:g id="COUNT_0">%d</xliff:g> ứng dụng</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Tối thiểu # ứng dụng}other{Tối thiểu # ứng dụng}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Quyền truy cập vị trí"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Quyền truy cập micrô"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Quyền truy cập máy ảnh"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Ứng dụng mặc định"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ứng dụng</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ứng dụng</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# ứng dụng}other{# ứng dụng}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Bàn phím mặc định"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Đặt thành <xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"Đã bật tùy chọn luôn bật VPN"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Thông tin xác thực tin cậy"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Thông tin xác thực đáng tin cậy trong hồ sơ cá nhân của bạn"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Thông tin xác thực đáng tin cậy trong hồ sơ công việc của bạn"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">Tối thiểu <xliff:g id="COUNT_1">%d</xliff:g> chứng chỉ CA</item>
- <item quantity="one">Tối thiểu <xliff:g id="COUNT_0">%d</xliff:g> chứng chỉ CA</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# chứng chỉ CA}other{# chứng chỉ CA}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Quản trị viên có thể khóa thiết bị và đặt lại mật khẩu"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Quản trị viên có thể xóa tất cả dữ liệu thiết bị"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Những lần nhập mật khẩu không thành công trước khi xóa tất cả dữ liệu thiết bị"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Những lần nhập mật khẩu không thành công trước khi xóa dữ liệu hồ sơ công việc"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> lần thử</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> lần thử</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# lần thử}other{# lần thử}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Thiết bị này do tổ chức của bạn quản lý."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Thiết bị này được <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> quản lý."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Tìm hiểu thêm"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">Các ứng dụng máy ảnh</item>
- <item quantity="one">Ứng dụng máy ảnh</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{Ứng dụng máy ảnh}other{Ứng dụng máy ảnh}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Ứng dụng Lịch"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Ứng dụng Danh bạ"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">Các ứng dụng email</item>
- <item quantity="one">Ứng dụng email</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{Ứng dụng email khách}other{Ứng dụng email khách}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Ứng dụng Bản đồ"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">Các ứng dụng điện thoại</item>
- <item quantity="one">Ứng dụng điện thoại</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{Ứng dụng điện thoại}other{Ứng dụng điện thoại}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"Ứng dụng trình duyệt"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Phiên bản hệ điều hành Android TV"</string>
<string name="about_serial" msgid="3432319328808745459">"Số sê-ri"</string>
<string name="about_build" msgid="8467840394761634575">"Bản dựng hệ điều hành Android TV"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="other">Bây giờ, bạn giờ chỉ cần thực hiện <xliff:g id="STEP_COUNT_1">%1$d</xliff:g> bước nữa là trở thành nhà phát triển</item>
- <item quantity="one">Bây giờ, bạn giờ chỉ cần thực hiện <xliff:g id="STEP_COUNT_0">%1$d</xliff:g> bước nữa là trở thành nhà phát triển</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Quảng cáo"</string>
<string name="ads_description" msgid="8081069475265061074">"Quản lý chế độ cài đặt quảng cáo, ví dụ: đặt lại mã nhận dạng cho quảng cáo."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Quảng cáo, Quản lý chế độ cài đặt quảng cáo, ví dụ: đặt lại mã nhận dạng cho quảng cáo."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Cập nhật hệ thống bổ sung"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Mạng có thể được giám sát"</string>
<string name="done_button" msgid="616159688526431451">"Xong"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">Tin tưởng hoặc xóa các chứng chỉ</item>
- <item quantity="one">Tin tưởng hoặc xóa chứng chỉ</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> đã cài đặt các chứng chỉ CA trên thiết bị của bạn. Nhờ vậy, tổ chức này có thể giám sát hoạt động trên mạng của thiết bị, bao gồm email, ứng dụng và trang web bảo mật.\n\nĐể biết thêm thông tin về các chứng chỉ này, hãy liên hệ với quản trị viên của bạn.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> đã cài đặt một chứng chỉ CA trên thiết bị của bạn. Nhờ vậy, tổ chức này có thể giám sát hoạt động trên mạng của thiết bị, bao gồm email, ứng dụng và trang web bảo mật.\n\nĐể biết thêm thông tin về chứng chỉ này, hãy liên hệ với quản trị viên của bạn.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> đã cài đặt các chứng chỉ CA cho hồ sơ công việc của bạn. Nhờ vậy, tổ chức này có thể cho phép các tổ chức này giám sát hoạt động trên mạng công việc, bao gồm email, ứng dụng và trang web bảo mật.\n\nĐể biết thêm thông tin về các chứng chỉ này, hãy liên hệ với quản trị viên của bạn.</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> đã cài đặt một chứng chỉ CA cho hồ sơ công việc của bạn. Nhờ vậy, tổ chức này có thể giám sát hoạt động trên mạng công việc, bao gồm email, ứng dụng và trang web bảo mật.\n\nĐể biết thêm thông tin về chứng chỉ này, hãy liên hệ với quản trị viên của bạn.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Một bên thứ ba có thể đang theo dõi hoạt động mạng của bạn, bao gồm email, ứng dụng và các trang web bảo mật.\n\nĐiều này có thể xảy ra do một chứng chỉ xác thực đáng tin cậy được cài đặt trên thiết bị của bạn."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">Kiểm tra các chứng chỉ</item>
- <item quantity="one">Kiểm tra chứng chỉ</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Tin tưởng hoặc xoá chứng chỉ}other{Tin tưởng hoặc xoá các chứng chỉ}}"</string>
<string name="device_status" msgid="8266002761193692207">"Trạng thái"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Mạng, số sê-ri và thông tin khác"</string>
<string name="manual" msgid="5683935624321864999">"Thủ công"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Kết nối"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Xóa mạng"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Thao tác này sẽ xóa thông tin được sử dụng để kết nối với mạng này, bao gồm mật khẩu đã lưu"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Kết nối với một mạng Wi-Fi bằng cách quét mã QR trên điện thoại di động của bạn rồi làm theo hướng dẫn."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Kết nối với một mạng Wi-Fi bằng cách quét mã QR trên điện thoại di động rồi làm theo hướng dẫn.\n \n Trên "<b>"điện thoại Android"</b>", hãy chuyển đến phần Cài đặt -> Mạng và Internet -> Wi-Fi -> Chọn Wi-Fi -> Nâng cao -> Thêm thiết bị rồi quét mã QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Nhấn vào nút quay lại để hủy"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"OK"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Tiếp tục"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Bộ nhớ của thiết bị"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Bộ nhớ di động"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Đặt lại"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Giải phóng bộ nhớ"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Xóa dữ liệu đã lưu trong bộ nhớ đệm"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Giải phóng <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Xóa các tệp tạm thời chiếm dung lượng. Điều này sẽ không ảnh hưởng đến dữ liệu đã lưu như lựa chọn ưu tiên của ứng dụng hoặc video ngoại tuyến. Ngoài ra, bạn sẽ không cần đăng nhập lại vào các ứng dụng."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Bạn muốn xóa dữ liệu đã lưu trong bộ nhớ đệm?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Xóa dữ liệu đã lưu trong bộ nhớ đệm cho tất cả ứng dụng."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Gỡ cài đặt ứng dụng"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"<xliff:g id="NAME">%1$s</xliff:g> đã được gắn"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Không thể gắn <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Đã kết nối lại bộ lưu trữ USB"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Micrô"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Quyền truy cập vào micrô"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Quyền truy cập của ứng dụng vào micrô"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Đã chặn quyền truy cập micrô"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Để bỏ chặn, hãy chuyển nút quyền riêng tư trên thiết bị sang vị trí bật micrô để cho phép truy cập micrô."</string>
<string name="camera" msgid="1226671478936288283">"Máy ảnh"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Quyền truy cập vào máy ảnh"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Quyền truy cập của ứng dụng vào máy ảnh"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Đã chặn quyền truy cập máy ảnh"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Để bỏ chặn, hãy chuyển nút quyền riêng tư trên thiết bị sang vị trí bật máy ảnh để cho phép truy cập máy ảnh."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Quyền truy cập vào micrô: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Khi bạn bật chế độ này, tất cả các ứng dụng và dịch vụ có quyền đều có thể truy cập vào micrô trên thiết bị này.\n\nCác thiết bị âm thanh ngoại vi có giao thức tùy chỉnh sẽ không chịu ảnh hưởng của chế độ cài đặt này."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Quyền truy cập vào máy ảnh: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"Lục lam"</string>
<string name="color_yellow" msgid="3519470952904560404">"Vàng"</string>
<string name="color_magenta" msgid="2377854703399624607">"Đỏ tươi"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Mô tả bằng âm thanh"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Nghe mô tả về những gì đang diễn ra trên màn hình trong các bộ phim và chương trình được hỗ trợ"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Bật"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Cấu hình"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Sử dụng <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Kiểm tra"</string>
<string name="system_apps" msgid="8481888654606868074">"Ứng dụng"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Không khóa màn hình"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Màn hình sẽ không bao giờ chuyển sang chế độ ngủ"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Kiểm tra HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Tối ưu hóa HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Khởi động lại bây giờ?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Tắt nguồn thiết bị HDMI với TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Tự động bật nguồn TV"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Bật nguồn TV với thiết bị HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">Đầu vào đã kết nối</item>
- <item quantity="one">Đầu vào đã kết nối</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">Đầu vào dự phòng</item>
- <item quantity="one">Đầu vào dự phòng</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">Đầu vào chưa kết nối</item>
- <item quantity="one">Đầu vào chưa kết nối</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Đầu vào đã kết nối}other{Đầu vào đã kết nối}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Đầu vào dự phòng}other{Đầu vào dự phòng}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Đầu vào chưa kết nối}other{Đầu vào chưa kết nối}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Hạn chế quyền truy cập vào ứng dụng và nội dung khác trong tài khoản của bạn"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Hồ sơ bị hạn chế"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Do <xliff:g id="APP">%1$s</xliff:g> kiểm soát"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Tạo hồ sơ bị hạn chế"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Cài đặt"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Ứng dụng được phép"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">%d ứng dụng được phép</item>
- <item quantity="one">1 ứng dụng được phép</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Được phép"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Không được phép"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Tùy chỉnh các hạn chế"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Nguồn của bên thứ ba"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Quyền"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Ứng dụng không khả dụng"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Ứng dụng không dùng đến"</string>
<string name="settings_ok" msgid="5950888975075541964">"OK"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Xác nhận"</string>
<string name="settings_cancel" msgid="576094334743686152">"Hủy"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Quyền này cho phép ứng dụng sửa đổi các chế độ cài đặt hệ thống."</string>
<string name="write_settings_on" msgid="71675710746513956">"Có"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Không"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Quyền truy cập vào mọi tệp"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Cho phép truy cập để quản lý tất cả các tệp"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Cho phép ứng dụng này đọc, sửa đổi và xóa tất cả các tệp trên thiết bị này hoặc bất kỳ thiết bị lưu trữ nào đã kết nối. Nếu bạn cho phép, ứng dụng có thể truy cập vào các tệp mà không cần thông báo rõ ràng cho bạn."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Hình trong hình"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Cho phép hình trong hình"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Không có ứng dụng đã cài đặt nào hỗ trợ chế độ Hình trong hình"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Cho phép ứng dụng tạo cửa sổ hình trong hình khi ứng dụng đang mở hoặc sau khi bạn rời khỏi ứng dụng đó (chẳng hạn như để tiếp tục xem video). Cửa sổ này sẽ hiển thị trên các ứng dụng khác mà bạn đang sử dụng."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Cho phép các ứng dụng đặt chuông báo và lên lịch cho các thao tác cần chính xác về thời gian. Chế độ này cho phép ứng dụng chạy ở chế độ nền và có thể tiêu tốn nhiều điện hơn.\n\nNếu bạn không cấp quyền này, các chuông báo và sự kiện mà ứng dụng đã đặt lịch sẽ không hoạt động."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Bật màn hình"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Cho phép bật màn hình"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Cho phép ứng dụng bật màn hình. Nếu được phép, ứng dụng có thể bật màn hình bất kỳ lúc nào kể cả khi bạn không có ý định như vậy."</string>
<string name="special_access" msgid="21806055758289916">"Quyền truy cập đặc biệt"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Âm thanh"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Trình tiết kiệm dữ liệu"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Tự động điều chỉnh chất lượng video để tiết kiệm dữ liệu di động"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Mức sử dụng dữ liệu và thông báo"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Bạn có thể kết nối Internet qua Wi-Fi, Ethernet hoặc điểm phát sóng của điện thoại. Để được trợ giúp thêm, hãy truy cập vào "<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Bạn có thể kết nối Internet qua Wi-Fi, cáp Ethernet hoặc điểm phát sóng của điện thoại."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Thao tác này không được phép"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Không thể thay đổi âm lượng"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Điện và năng lượng"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Chế độ khi bật TV"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Đặt lại"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Mã ghép nối Ethernet"</string>
</resources>
diff --git a/Settings/res/values-zh-rCN/strings.xml b/Settings/res/values-zh-rCN/strings.xml
index 4fa2269..b3613a2 100644
--- a/Settings/res/values-zh-rCN/strings.xml
+++ b/Settings/res/values-zh-rCN/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"添加帐号"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"帐号和登录"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"未登录任何帐号"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> 个帐号</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> 个帐号</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# 个帐号}other{# 个帐号}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"媒体服务、Google 助理、付款功能"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"网络和互联网"</string>
<string name="sound_category_title" msgid="7899816751041939518">"声音"</string>
<string name="applications_category_title" msgid="7112019490898586223">"应用"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"设备偏好设置"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"遥控器和配件"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"未连接任何蓝牙设备"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> 个配件</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> 个配件</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"画质和音效"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"帮助和反馈"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"隐私设置"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"恢复出厂设置"</string>
<string name="device_calibration" msgid="2907914144048739705">"校准"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"节能模式"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"设备"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"选择格式"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"环绕声"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"已启用的格式"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"已停用的格式"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"如要停用,请将格式选择设置更改为“手动”。"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"分辨率"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"自动"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"分辨率已更改"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"选择“确定”,即可立即开始使用%1$s。"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"取消"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"确定"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"要清除缓存的数据吗?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"此操作会清除所有应用的缓存数据。"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"添加配件"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"正在配对…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"正在连接…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"配件"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"遥控器"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"遥控器设置"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"设置遥控器按钮"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"控制电视、接收器及条形音箱的音量、电源和输入源"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"连接"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"连接到%1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"断开连接"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"不适用"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"设备管理应用"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"没有运行中的应用"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"由于管理员、加密策略或凭据存储的要求,您无法使用此选项"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"受管理设备的信息"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"由贵单位管理的更改和设置"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"无"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"已安装的应用"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"应用数量是估算值,其中可能不包括从 Play 商店以外的来源安装的应用。"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{至少 # 个应用}other{至少 # 个应用}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"位置权限"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"麦克风使用权限"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"相机使用权"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"默认应用"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# 个应用}other{# 个应用}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"默认键盘"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"已设为<xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"已开启“始终开启的 VPN”"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"可信凭据"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"您个人资料中的可信凭据"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"您工作资料中的可信凭据"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">至少 <xliff:g id="COUNT_1">%d</xliff:g> 个 CA 证书</item>
- <item quantity="one">至少 <xliff:g id="COUNT_0">%d</xliff:g> 个 CA 证书</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# 个 CA 证书}other{# 个 CA 证书}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"管理员可以锁定设备及重置密码"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"管理员可以删除所有设备数据"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"输入错误密码的尝试次数上限(超过此上限将删除所有设备数据)"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"输入错误密码的尝试次数上限(超过此上限将删除工作资料数据)"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{已尝试 # 次}other{已尝试 # 次}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"此设备由贵单位管理。"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"此设备由“<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>”管理。"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"了解详情"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">相机应用</item>
- <item quantity="one">相机应用</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{相机应用}other{相机应用}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"日历应用"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"通讯录应用"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">电子邮件客户端应用</item>
- <item quantity="one">电子邮件客户端应用</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{电子邮件客户端应用}other{电子邮件客户端应用}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"地图应用"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">电话应用</item>
- <item quantity="one">电话应用</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{“电话”应用}other{“电话”应用}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"浏览器应用"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>、<xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>、<xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>、<xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV 操作系统版本"</string>
<string name="about_serial" msgid="3432319328808745459">"序列号"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV 操作系统版本"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{现在只需再执行 # 步操作,即可进入开发者模式}other{现在只需再执行 # 步操作,即可进入开发者模式}}"</string>
<string name="about_ads" msgid="7662896442040086522">"广告"</string>
<string name="ads_description" msgid="8081069475265061074">"管理广告设置,例如重置广告 ID。"</string>
<string name="ads_content_description" msgid="1006489792324920289">"广告,管理广告设置,例如重置广告 ID。"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"其他系统更新"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"网络可能会受到监控"</string>
<string name="done_button" msgid="616159688526431451">"完成"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">设为信任的证书或移除证书</item>
- <item quantity="one">设为信任的证书或移除证书</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>已在您的设备上安装证书授权机构颁发的证书,借此监控设备网络活动,包括电子邮件、应用和安全网站。\n\n如需详细了解这些证书,请与您的管理员联系。</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g>已在您的设备上安装证书授权机构颁发的证书,借此监控设备网络活动,包括电子邮件、应用和安全网站。\n\n如需详细了解此证书,请与您的管理员联系。</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>已为您的工作资料安装证书授权机构颁发的证书,借此监控工作网络活动,包括电子邮件、应用和安全网站。\n\n如需详细了解这些证书,请与您的管理员联系。</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g>已为您的工作资料安装证书授权机构颁发的证书,借此监控工作网络活动,包括电子邮件、应用和安全网站。\n\n如需详细了解此证书,请与您的管理员联系。</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"第三方可以监控您的网络活动,包括收发电子邮件、使用应用和浏览安全网站。\n\n出现这种情况的原因是您在设备上安装了信任的凭据。"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">检查证书</item>
- <item quantity="one">检查证书</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{设为信任的证书或移除证书}other{设为信任的证书或移除证书}}"</string>
<string name="device_status" msgid="8266002761193692207">"状态"</string>
<string name="device_status_summary" msgid="3270932829412434985">"网络、序列号和其他信息"</string>
<string name="manual" msgid="5683935624321864999">"手册"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"连接"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"取消保存网络"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"这将清除用于连接至此网络的信息(包括已保存的密码)"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"如要加入 WLAN,请使用手机扫描二维码,然后按照说明操作。"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" 如要加入 WLAN,请使用手机扫描二维码,然后按照说明操作。\n \n在 "<b>"Android 手机"</b>"中,依次转到“设置”->“网络和互联网”->“WLAN”-> 选择所需 WLAN ->“高级”->“添加设备”,然后扫描二维码。"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"按返回按钮即可取消"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"确定"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"继续"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"设备存储空间"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"移动存储设备"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"重置"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"释放存储空间"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"清除缓存的数据"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"释放 <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"此操作会清除占用空间的临时文件,但不会影响应用偏好设置或离线视频等已保存的数据,您也不需要重新登录应用。"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"是否清除缓存数据?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"此操作会清除所有应用的缓存数据。"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"卸载应用"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"已装载<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"无法装载<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"已重新连接 USB 存储设备"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"麦克风"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"麦克风使用权限"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"应用的麦克风使用权限"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"已禁用麦克风使用权限"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"若要取消禁用,请将设备上的隐私保护开关移到“麦克风已启用”位置,以允许使用麦克风。"</string>
<string name="camera" msgid="1226671478936288283">"摄像头"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"摄像头使用权限"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"应用的摄像头使用权限"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"已禁用摄像头使用权限"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"若要取消禁用,请将设备上的隐私保护开关移到“摄像头已启用”位置,以允许使用摄像头。"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"麦克风使用权限:<xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"开启后,具有权限的所有应用和服务均可使用此设备上的任何麦克风。\n\n此设置将不会影响采用自定义协议的音频外围设备。"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"摄像头使用权限:<xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"青色"</string>
<string name="color_yellow" msgid="3519470952904560404">"黄色"</string>
<string name="color_magenta" msgid="2377854703399624607">"紫红色"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"语音描述"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"听取有关当前屏幕画面内容的语音说明(仅限支持该设置的电影或电视节目)"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"启用"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"配置"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"要使用<xliff:g id="SERVICE">%1$s</xliff:g>吗?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"监控"</string>
<string name="system_apps" msgid="8481888654606868074">"应用"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"保持唤醒状态"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"屏幕绝不会进入休眠状态"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP检查"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI优化"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"要立即重启吗?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"关闭电视时让HDMI设备自动关机"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"电视自动开机"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"打开HDMI设备时让电视自动开机"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">已连接的输入设备</item>
- <item quantity="one">已连接的输入设备</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">待机的输入设备</item>
- <item quantity="one">待机的输入设备</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">未连接的输入设备</item>
- <item quantity="one">未连接的输入设备</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{已连接的输入设备}other{已连接的输入设备}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{待机的输入设备}other{待机的输入设备}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{已断开连接的输入设备}other{已断开连接的输入设备}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"限制其他人使用您帐号中的应用和内容"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"受限个人资料"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"由<xliff:g id="APP">%1$s</xliff:g>控制"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"创建受限个人资料"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"设置"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"允许的应用"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">允许使用 %d 个应用</item>
- <item quantity="one">允许使用 1 个应用</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"允许"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"不允许"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"自定义限制"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"第三方源代码"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"权限"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"无法使用应用"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"未使用的应用"</string>
<string name="settings_ok" msgid="5950888975075541964">"确定"</string>
<string name="settings_confirm" msgid="4489126458677153411">"确认"</string>
<string name="settings_cancel" msgid="576094334743686152">"取消"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"此权限可让应用修改系统设置。"</string>
<string name="write_settings_on" msgid="71675710746513956">"是"</string>
<string name="write_settings_off" msgid="6730113471695092167">"否"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"所有文件访问权限"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"授予管理所有文件的权限"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"允许此应用读取、修改和删除此设备或任何已连接存储卷上的所有文件。如果您授予该权限,应用无需明确通知您即可访问文件。"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"画中画"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"允许进入画中画模式"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"已安装的应用均不支持画中画功能"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"允许应用在您打开应用时或您离开应用后(例如继续观看视频)创建画中画窗口。这类窗口会显示在您当前使用的其他应用的上层。"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"允许应用设置闹钟以及安排在特定时间执行某些操作。开启这项权限后,应用将在后台运行,可能会消耗更多电量。\n\n如果您关闭此权限,该应用设置的现有闹钟将不会响起,而且该应用安排在特定时间执行的现有活动也不会执行。"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"开启屏幕"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"允许开启屏幕"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"允许应用开启屏幕。如获授权,该应用便可在您未明确表达意愿的情况下随时开启屏幕。"</string>
<string name="special_access" msgid="21806055758289916">"特殊应用权限"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>,<xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"音频"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"流量节省程序"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"自动调整视频画质以减少移动数据流量消耗"</string>
<string name="title_data_alert" msgid="8262081890052682475">"流量消耗和提醒"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"您可以通过 WLAN、以太网或手机的热点连接到互联网。如需更多帮助,请访问 "<b>"g.co/network"</b>"。"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"您可以通过 WLAN、以太网或手机的热点连接到互联网。"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"不允许执行此操作"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"无法调节音量"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"开关和电源"</string>
<string name="power_on_behavior" msgid="927607372303160716">"开机行为"</string>
<string name="reset_options_title" msgid="7632580482285108955">"重置"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"以太网配对码"</string>
</resources>
diff --git a/Settings/res/values-zh-rHK/strings.xml b/Settings/res/values-zh-rHK/strings.xml
index 385b840..c9c8ba7 100644
--- a/Settings/res/values-zh-rHK/strings.xml
+++ b/Settings/res/values-zh-rHK/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"新增帳戶"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"帳戶和登入"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"沒有任何帳戶"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> 個帳戶</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> 個帳戶</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# 個帳戶}other{# 個帳戶}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"媒體服務、Google 助理、付款"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"網絡和互聯網"</string>
<string name="sound_category_title" msgid="7899816751041939518">"音效"</string>
<string name="applications_category_title" msgid="7112019490898586223">"應用程式"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"裝置偏好設定"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"遙控器和配件"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"沒有連接的藍牙裝置"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> 個配件</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> 個配件</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"顯示和音效"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"說明與意見反映"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"私隱"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"回復原廠設定"</string>
<string name="device_calibration" msgid="2907914144048739705">"校正"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"省電模式"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"裝置"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"選取格式"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"環迴音效"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"已啟用格式"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"已停用格式"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"如要停用,請將格式選項轉為「手動」。"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"解像度"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"自動"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"解像度已變更"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"選擇 [確定] 即可從現在開始使用 %1$s。"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"取消"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"確定"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"清除快取資料?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"這會清除所有應用程式的快取資料。"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"新增配件"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"正在配對…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"正在連線…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"配件"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"遙控器"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"遙控器設定"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"設定遙控器按鈕"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"控制電視、接收器和 Soundbar 揚聲器的音量、電源開關和訊號源"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"連接"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"連接至「%1$s」"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"解除連接"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"不適用"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"裝置管理應用程式"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"沒有使用中的應用程式"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"已由管理員、加密政策或認證儲存空間停用"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"受管理的裝置資料"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"由您的機構管理的變更和設定"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"無"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"已安裝的應用程式"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"應用程式數量為估計值,並可能不包括未經「Play 商店」安裝的應用程式。"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{最少 # 個應用程式}other{最少 # 個應用程式}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"位置資訊權限"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"麥克風權限"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"相機權限"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"預設應用程式"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# 個應用程式}other{# 個應用程式}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"預設鍵盤"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"已設定為「<xliff:g id="APP_LABEL">%s</xliff:g>」"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"已開啟「永久連線的 VPN」"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"信任的憑證"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"您個人設定檔中信任的憑證"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"您工作設定檔中信任的憑證"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">最少 <xliff:g id="COUNT_1">%d</xliff:g> 個 CA 憑證</item>
- <item quantity="one">最少 <xliff:g id="COUNT_0">%d</xliff:g> 個 CA 憑證</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# 個 CA 憑證}other{# 個 CA 憑證}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"管理員可以將裝置上鎖和重設密碼"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"管理員可以刪除所有裝置資料"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"輸入錯誤密碼的次數上限;如果超出此上限,系統將刪除所有裝置資料"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"輸入錯誤密碼的次數上限;如果超出此上限,系統將刪除工作設定檔資料"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{# 次嘗試}other{# 次嘗試}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"此裝置由您的機構管理。"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"此裝置由 <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> 管理。"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"瞭解詳情"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">相機應用程式</item>
- <item quantity="one">相機應用程式</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{相機應用程式}other{相機應用程式}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"日曆應用程式"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"通訊錄應用程式"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">電子郵件用戶端應用程式</item>
- <item quantity="one">電子郵件用戶端應用程式</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{電子郵件用戶端應用程式}other{電子郵件用戶端應用程式}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"地圖應用程式"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">電話應用程式</item>
- <item quantity="one">電話應用程式</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{電話應用程式}other{電話應用程式}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"瀏覽器應用程式"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>、<xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>、<xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>、<xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV OS 版本"</string>
<string name="about_serial" msgid="3432319328808745459">"序號"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV OS 版本"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{您只需完成剩餘的 # 個步驟,便可成為開發人員}other{您只需完成剩餘的 # 個步驟,便可成為開發人員}}"</string>
<string name="about_ads" msgid="7662896442040086522">"廣告"</string>
<string name="ads_description" msgid="8081069475265061074">"管理您的廣告設定,例如重設廣告 ID。"</string>
<string name="ads_content_description" msgid="1006489792324920289">"廣告,管理你嘅廣告設定,例如重設廣告 ID。"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"其他系統更新"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"網絡可能會受到監管"</string>
<string name="done_button" msgid="616159688526431451">"完成"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">信任或移除憑證</item>
- <item quantity="one">信任或移除憑證</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>已為您的裝置安裝憑證機構,可讓他們監察電郵、應用程式和安全網站等工作網絡活動。\n\n如要進一步瞭解此憑證,請聯絡您的管理員。</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g>已為您的裝置安裝憑證機構,可讓他們監察電郵、應用程式和安全網站等工作網絡活動。\n\n如要進一步瞭解此憑證,請聯絡您的管理員。</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g>已為您的工作設定檔安裝憑證機構,可讓他們監察電郵、應用程式和安全網站等工作網絡活動。\n\n如要進一步瞭解此憑證,請聯絡您的管理員。</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g>已為您的工作設定檔安裝憑證機構,可讓他們監察電郵、應用程式和安全網站等工作網絡活動。\n\n如要進一步瞭解此憑證,請聯絡您的管理員。</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"第三方可以監察您的網絡活動,包括收發電郵、使用應用程式及瀏覽安全網站。\n\n裝置安裝了信任的憑證後,便可能會出現這種情況。"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">檢查憑證</item>
- <item quantity="one">檢查憑證</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{信任或移除憑證}other{信任或移除憑證}}"</string>
<string name="device_status" msgid="8266002761193692207">"狀態"</string>
<string name="device_status_summary" msgid="3270932829412434985">"網絡、序列號和其他資料"</string>
<string name="manual" msgid="5683935624321864999">"手動"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"連線"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"刪除網絡"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"用於連接此網絡的資料將被清除,包括已儲存的密碼"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"使用手機掃瞄 QR 碼以加入 Wi-Fi 網絡,然後按照指示操作。"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" 使用手機掃瞄 QR 碼以加入 Wi-Fi 網絡,然後按照指示操作。\n \n 在 "<b>"Android 手機"</b>"中前往「設定」->「網絡和互聯網」->「Wi-Fi」-> 選擇 Wi-Fi 網絡 ->「進階」->「新增裝置」,然後掃瞄 QR 碼。"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"按一下返回按鈕以取消"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"確定"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"繼續"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"儲存裝置"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"可攜式儲存裝置"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"重設"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"騰出儲存空間"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"清除快取資料"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"騰出 <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"清除佔用空間的臨時檔案。這不會影響應用程式偏好設定或離線影片等已儲存的資料,而您亦無需再次登入應用程式。"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"要清除快取資料嗎?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"這會清除所有應用程式的快取資料。"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"解除安裝應用程式"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"已連接 <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"無法連接 <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"已重新連接 USB 儲存空間"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"麥克風"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"麥克風存取權"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"應用程式的麥克風存取權"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"已封鎖麥克風存取權"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"如要解除封鎖,請將裝置上的私隱開關移至麥克風開啟位置以允許麥克風存取權。"</string>
<string name="camera" msgid="1226671478936288283">"相機"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"相機存取權"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"應用程式的相機存取權"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"已封鎖相機存取權"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"如要解除封鎖,請將裝置上的私隱開關移至相機開啟位置以允許相機存取權。"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"麥克風存取權:<xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"啟用後,所有獲授權的應用程式和服務均可存取此裝置的任何麥克風。\n\n設有自訂通訊協定的周邊音訊裝置將不受此設定影響。"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"相機存取權:<xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"藍綠色"</string>
<string name="color_yellow" msgid="3519470952904560404">"黃色"</string>
<string name="color_magenta" msgid="2377854703399624607">"洋紅色"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"語音描述"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"收聽支援的電影和節目的畫面描述"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"啟用"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"設定"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"使用「<xliff:g id="SERVICE">%1$s</xliff:g>」?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"監控"</string>
<string name="system_apps" msgid="8481888654606868074">"應用程式"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"保持啟用"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"螢幕永不休眠"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP 檢查"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI 優化"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"要立即重新啟動嗎?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"透過電視關閉 HDMI 裝置電源"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"自動開啟電視電源"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"透過 HDMI 裝置開啟電視電源"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">已連接的輸入裝置</item>
- <item quantity="one">已連接的輸入裝置</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">待機輸入裝置</item>
- <item quantity="one">待機輸入裝置</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">未連接的輸入裝置</item>
- <item quantity="one">未連接的輸入裝置</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{已連接的訊號源}other{已連接的訊號源}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{待機訊號源}other{待機訊號源}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{未連接的訊號源}other{未連接的訊號源}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"限制透過您的帳戶存取應用程式和其他內容"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"限制存取的個人檔案"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"由 <xliff:g id="APP">%1$s</xliff:g> 控制"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"建立受限制的個人檔案"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"設定"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"允許的應用程式"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">允許 %d 個應用程式</item>
- <item quantity="one">允許 1 個應用程式</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"允許"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"不允許"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"自訂限制"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"第三方原始碼"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"權限"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"無法啟動應用程式"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"不使用的應用程式"</string>
<string name="settings_ok" msgid="5950888975075541964">"確定"</string>
<string name="settings_confirm" msgid="4489126458677153411">"確認"</string>
<string name="settings_cancel" msgid="576094334743686152">"取消"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"此權限可讓應用程式修改系統設定。"</string>
<string name="write_settings_on" msgid="71675710746513956">"是"</string>
<string name="write_settings_off" msgid="6730113471695092167">"否"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"所有檔案存取權"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"允許存取以管理所有檔案"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"允許此應用程式讀取、修改和刪除此裝置或任何已連接的儲存空間卷宗上的所有檔案。如獲得權限,應用程式可能會在您不知情的情況下存取檔案。"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"畫中畫"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"允許畫中畫"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"沒有已安裝的應用程式支援畫中畫"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"當您離開正運作中的應用程式時,允許該應用程式建立畫中畫視窗 (例如方便您繼續觀看影片)。該視窗會顯示在您目前使用的其他應用程式上層。"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"允許應用程式設定鬧鐘及安排有時效的操作。這樣,應用程式就可以在背景中執行,可能會較耗電。\n\n如果關閉此權限,應用程式所設定的鬧鐘和預定在特定時間進行的事件便無法執行。"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"開啟螢幕"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"允許開啟螢幕"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"允許應用程式開啟螢幕。應用程式獲授權後,可在您未有明確表明意圖的情況下隨時開啟螢幕。"</string>
<string name="special_access" msgid="21806055758289916">"特別應用程式權限"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>,<xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"音訊"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"數據節省模式"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"自動調整影片畫質以使用節省流動數據"</string>
<string name="title_data_alert" msgid="8262081890052682475">"數據用量和通知"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"您可以經 Wi-Fi、以太網或手機的熱點連接互聯網。如需詳細說明,請瀏覽 "<b>"g.co/network"</b>"。"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"您可以經 Wi-Fi、以太網絡或手機的熱點連接互聯網。"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"不允許執行此操作"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"無法變更音量"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"電源和能源"</string>
<string name="power_on_behavior" msgid="927607372303160716">"開機行為"</string>
<string name="reset_options_title" msgid="7632580482285108955">"重設"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"以太網絡配對碼"</string>
</resources>
diff --git a/Settings/res/values-zh-rTW/strings.xml b/Settings/res/values-zh-rTW/strings.xml
index b9660ff..e91d83d 100644
--- a/Settings/res/values-zh-rTW/strings.xml
+++ b/Settings/res/values-zh-rTW/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"新增帳戶"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"帳戶與登入"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"沒有任何帳戶"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> 個帳戶</item>
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_0">%1$d</xliff:g> 個帳戶</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{# 個帳戶}other{# 個帳戶}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"媒體服務、Google 助理、付款功能"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"網路與網際網路"</string>
<string name="sound_category_title" msgid="7899816751041939518">"音效"</string>
<string name="applications_category_title" msgid="7112019490898586223">"應用程式"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"裝置偏好設定"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"遙控器與配件"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"沒有已連線的藍牙裝置"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> 個配件</item>
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_0">%1$d</xliff:g> 個配件</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"螢幕和音效偏好設定"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"說明和意見回饋"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"隱私權"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"恢復原廠設定"</string>
<string name="device_calibration" msgid="2907914144048739705">"校正"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"節約耗電量"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"裝置"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"選取格式"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"環繞音效"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Dolby Digital"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"已啟用的格式"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"已停用的格式"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"如要停用,請將格式選取設定變更為 [手動]。"</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"解析度"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"自動"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"解析度已變更"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"選取 [確定] 就能立即使用 %1$s。"</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"取消"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"確定"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"清除快取資料?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"這項操作會清除所有應用程式的快取資料。"</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"新增配件"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"配對中…"</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"連線中…"</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"配件"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"遙控器"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"遙控器設定"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"設定遙控器按鈕"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"控制電視、接收器和單件式環繞劇院的音量、電源和輸入來源"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"連線"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"連線至「%1$s」"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"中斷連線"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"不適用"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"裝置管理員應用程式"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"沒有使用中的應用程式"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item 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="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"已由管理員、加密政策或認證儲存空間停用"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"受管理的裝置資訊"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"由貴機構所管理的變更內容和設定"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"無"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"已安裝的應用程式"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"應用程式數量是估計值。這個數字可能不包括從 Play 商店以外來源安裝的應用程式。"</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item 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="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{至少有 # 個應用程式}other{至少有 # 個應用程式}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"位置資訊權限"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"麥克風權限"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"相機權限"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"預設應用程式"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item 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="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{# 個應用程式}other{# 個應用程式}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"預設鍵盤"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"已設為「<xliff:g id="APP_LABEL">%s</xliff:g>」"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"已開啟「永久連線的 VPN」"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"信任的憑證"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"你的個人設定檔中安裝的信任的憑證"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"你的工作資料夾中安裝的信任的憑證"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="other">至少有 <xliff:g id="COUNT_1">%d</xliff:g> 個 CA 憑證</item>
- <item quantity="one">至少有 <xliff:g id="COUNT_0">%d</xliff:g> 個 CA 憑證</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{# 個 CA 憑證}other{# 個 CA 憑證}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"管理員可以鎖定裝置及重設密碼"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"管理員可以刪除所有裝置資料"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"輸入錯誤密碼的次數上限,超過後系統將自動刪除所有裝置資料"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"輸入錯誤密碼的次數上限,超過後系統將自動刪除工作資料夾資料"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item 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="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{還有 # 次機會}other{還有 # 次機會}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"這個裝置是由貴機構所管理。"</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"這個裝置是由 <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> 所管理。"</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"瞭解詳情"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="other">相機應用程式</item>
- <item quantity="one">相機應用程式</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{相機應用程式}other{相機應用程式}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"日曆應用程式"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"聯絡人應用程式"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="other">電子郵件用戶端應用程式</item>
- <item quantity="one">電子郵件用戶端應用程式</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{電子郵件用戶端應用程式}other{電子郵件用戶端應用程式}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"地圖應用程式"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="other">電話應用程式</item>
- <item quantity="one">電話應用程式</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{電話應用程式}other{電話應用程式}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"瀏覽器應用程式"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>、<xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>、<xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>、<xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Android TV 作業系統版本"</string>
<string name="about_serial" msgid="3432319328808745459">"序號"</string>
<string name="about_build" msgid="8467840394761634575">"Android TV 作業系統版本"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <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="4064986225625409361">"{count,plural, =1{再 # 個步驟即可啟用開發人員設定}other{再 # 個步驟即可啟用開發人員設定}}"</string>
<string name="about_ads" msgid="7662896442040086522">"廣告"</string>
<string name="ads_description" msgid="8081069475265061074">"管理廣告設定,例如重設廣告 ID。"</string>
<string name="ads_content_description" msgid="1006489792324920289">"廣告,可管理廣告設定,例如重設廣告 ID。"</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"其他系統更新"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"網路可能會受到監控"</string>
<string name="done_button" msgid="616159688526431451">"完成"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="other">設為信任的憑證或移除憑證</item>
- <item quantity="one">設為信任的憑證或移除憑證</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> 已在你的裝置上安裝憑證授權單位憑證,藉此監控裝置的網路活動,包括電子郵件、應用程式和安全的網站。\n\n如要進一步瞭解這些憑證,請與你的管理員聯絡。</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> 已在你的裝置上安裝憑證授權單位憑證,藉此監控裝置的網路活動,包括電子郵件、應用程式和安全的網站。\n\n如要進一步瞭解這個憑證,請與你的管理員聯絡。</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="other"><xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> 已在你的工作資料夾中安裝憑證授權單位憑證,藉此監控工作網路活動,包括電子郵件、應用程式和安全的網站。\n\n如要進一步瞭解這些憑證,請與你的管理員聯絡。</item>
- <item quantity="one"><xliff:g id="MANAGING_DOMAIN_0">%s</xliff:g> 已在你的工作資料夾中安裝憑證授權單位憑證,藉此監控工作網路活動,包括電子郵件、應用程式和安全的網站。\n\n如要進一步瞭解這個憑證,請與你的管理員聯絡。</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"第三方可以監控你的網路活動,包括你使用電子郵件、應用程式和加密網站的情況。\n\n這是因為你的裝置上安裝了信任的憑證。"</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="other">查看憑證</item>
- <item quantity="one">查看憑證</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{信任或移除憑證}other{信任或移除憑證}}"</string>
<string name="device_status" msgid="8266002761193692207">"狀態"</string>
<string name="device_status_summary" msgid="3270932829412434985">"網路、序號和其他資訊"</string>
<string name="manual" msgid="5683935624321864999">"使用者手冊"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"連線"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"清除網路"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"用於連線至這個網路的資訊 (包括已儲存的密碼) 將會遭到清除"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"如要加入 Wi-Fi 網路,請使用手機掃描 QR 圖碼,並按照畫面上的指示操作。"</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" 如要加入 Wi-Fi 網路,請使用手機掃描 QR 圖碼,並按照畫面上的指示操作。\n \n 請依序前往 "<b>"Android 手機"</b>"上的 [設定] -> [網路和網際網路] -> [Wi-Fi] -> 選取所需 Wi-Fi 網路 -> [進階] -> 新增裝置,然後掃描 QR 圖碼。"</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"按下返回按鈕即可取消"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"確定"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"繼續"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"裝置儲存空間"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"外接儲存裝置"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"重設"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"釋出儲存空間"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"清除快取資料"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"釋出 <xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"這項操作將清除占用空間的暫存檔案,但不會影響已儲存的資料,例如應用程式偏好設定或離線影片。請放心,你不必重新登入應用程式。"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"要清除快取資料嗎?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"這項操作會清除所有應用程式的快取資料。"</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"解除安裝應用程式"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"已掛載「<xliff:g id="NAME">%1$s</xliff:g>」"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"無法掛載「<xliff:g id="NAME">%1$s</xliff:g>」"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"已重新連接 USB 儲存空間"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"麥克風"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"麥克風存取權"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"應用程式的麥克風存取權"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"無法存取麥克風"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"如要允許存取麥克風,請將裝置的隱私權切換鈕切換到「開啟麥克風」的位置。"</string>
<string name="camera" msgid="1226671478936288283">"攝影機"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"攝影機存取權"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"應用程式的攝影機存取權"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"無法存取相機"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"如要允許存取相機,請將裝置的隱私權切換鈕切換到「開啟相機」的位置。"</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"麥克風存取權:<xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"開啟後,具有權限的所有應用程式和服務都可以存取這部裝置上的任何麥克風。\n\n這項設定不會影響具有自訂通訊協定的音訊周邊裝置。"</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"攝影機存取權:<xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"青色"</string>
<string name="color_yellow" msgid="3519470952904560404">"黃色"</string>
<string name="color_magenta" msgid="2377854703399624607">"洋紅色"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"口述影像"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"以口述的方式說明目前畫面上的影像內容 (僅限支援這項功能的電影和節目)"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"啟用"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"設定"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"要使用<xliff:g id="SERVICE">%1$s</xliff:g>嗎?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"監控"</string>
<string name="system_apps" msgid="8481888654606868074">"應用程式"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"保持啟用"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"螢幕將不會關閉"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"HDCP 檢查"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"HDMI 最佳化"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"立即重新啟動?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"透過電視關閉 HDMI 裝置電源"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"電視電源自動開啟"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"透過 HDMI 裝置開啟電視電源"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="other">已連接的輸入裝置</item>
- <item quantity="one">已連接的輸入裝置</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="other">待命中的輸入裝置</item>
- <item quantity="one">待命中的輸入裝置</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="other">未連接的輸入裝置</item>
- <item quantity="one">未連接的輸入裝置</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{已連結的輸入裝置}other{已連結的輸入裝置}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{待命的輸入裝置}other{待命的輸入裝置}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{未連結的輸入裝置}other{未連結的輸入裝置}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"限制他人存取您帳戶中的應用程式和其他內容"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"設有限制的個人資料"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"受到 <xliff:g id="APP">%1$s</xliff:g> 控制"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"建立設有限制的個人資料"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"設定"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"允許的應用程式"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="other">允許了 %d 個應用程式</item>
- <item quantity="one">允許了 1 個應用程式</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"允許"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"不允許"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"自訂限制"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"第三方來源"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"權限"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"無法使用應用程式"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"未使用的應用程式"</string>
<string name="settings_ok" msgid="5950888975075541964">"確定"</string>
<string name="settings_confirm" msgid="4489126458677153411">"確認"</string>
<string name="settings_cancel" msgid="576094334743686152">"取消"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"這項權限可讓應用程式修改系統設定。"</string>
<string name="write_settings_on" msgid="71675710746513956">"是"</string>
<string name="write_settings_off" msgid="6730113471695092167">"否"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"所有檔案的存取權"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"授予管理所有檔案的權限"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"允許這個應用程式讀取、修改及刪除這部裝置或任何已連結儲存空間上的所有檔案。如果應用程式獲得授權,可能會在你不知情的情況下存取檔案。"</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"子母畫面"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"允許子母畫面"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"尚未安裝支援子母畫面的應用程式"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"允許應用程式在開啟時或你離開後 (例如離開應用程式以繼續觀看影片) 建立子母畫面視窗。這類視窗會在你目前使用的其他應用程式上層顯示。"</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"允許應用程式設定鬧鐘及安排有時效性的動作。這麼做會讓應用程式在背景執行,可能比較耗電。\n\n如果關閉這項權限,這個應用程式設定的現有鬧鐘將不會響起,而且應用程式也無法在預定的時間發出活動提醒。"</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"開啟螢幕"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"允許開啟螢幕"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"允許應用程式開啟螢幕。如果授予這項權限,即使你未明確指示,應用程式也隨時可能會開啟螢幕。"</string>
<string name="special_access" msgid="21806055758289916">"特殊應用程式存取權"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>,<xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"音訊"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"數據節省模式"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"自動調整影片畫質,藉此降低行動數據用量"</string>
<string name="title_data_alert" msgid="8262081890052682475">"數據用量和快訊"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"你可以透過 Wi-Fi、乙太網路或手機的無線基地台連上網際網路。如需詳細說明,請前往 "<b>"g.co/network"</b>"。"</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"你可以透過 Wi-Fi、乙太網路或手機的無線基地台連上網際網路。"</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"不允許此操作"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"無法變更音量"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"開關和電源"</string>
<string name="power_on_behavior" msgid="927607372303160716">"開機行為"</string>
<string name="reset_options_title" msgid="7632580482285108955">"重設"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"乙太網路配對碼"</string>
</resources>
diff --git a/Settings/res/values-zu/strings.xml b/Settings/res/values-zu/strings.xml
index ce3655c..779286b 100644
--- a/Settings/res/values-zu/strings.xml
+++ b/Settings/res/values-zu/strings.xml
@@ -45,21 +45,13 @@
<string name="add_an_account" msgid="2601275122685226096">"Yengeza i-akhawunti"</string>
<string name="accounts_category_title" msgid="7286858931427579845">"Ama-akhawunti nokungena ngemvume"</string>
<string name="accounts_category_summary_no_account" msgid="3053606166993074648">"Awekho ama-akhawunti"</string>
- <plurals name="accounts_category_summary" formatted="false" msgid="1711483230329281167">
- <item quantity="one"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> ama-akhawunti</item>
- <item quantity="other"><xliff:g id="ACCOUNTS_NUMBER_1">%1$d</xliff:g> ama-akhawunti</item>
- </plurals>
+ <string name="accounts_category_summary" msgid="7617932110389860822">"{count,plural, =1{i-akhawunti engu-#}one{ama-akhawunti angu-#}other{ama-akhawunti angu-#}}"</string>
<string name="accounts_slice_summary" msgid="1571012157154521119">"Amasevisi emediya, Umsizi, Izinkokhelo"</string>
<string name="connectivity_network_category_title" msgid="8226264889892008114">"Inethiwekhi ne-inthanethi"</string>
<string name="sound_category_title" msgid="7899816751041939518">"Umsindo"</string>
<string name="applications_category_title" msgid="7112019490898586223">"Izinhlelo zokusebenza"</string>
<string name="device_pref_category_title" msgid="8292572846154873762">"Izintandokazi zedivayisi"</string>
<string name="remotes_and_accessories_category_title" msgid="4795119810430255047">"Izilawuli kude nezinsiza"</string>
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device" msgid="3604712105359656700">"Awekho amadivayisi axhunyiwe e-bluetooth"</string>
- <plurals name="remotes_and_accessories_category_summary" formatted="false" msgid="5219926550837712529">
- <item quantity="one"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> izinsiza</item>
- <item quantity="other"><xliff:g id="ACCESSORIES_NUMBER_1">%1$d</xliff:g> izinsiza</item>
- </plurals>
<string name="display_and_sound_category_title" msgid="9203309625380755860">"Isibonisi Nomsindo"</string>
<string name="help_and_feedback_category_title" msgid="7036505833991003031">"Usizo nempendulo"</string>
<string name="privacy_category_title" msgid="8552430590908463601">"Ubumfihlo"</string>
@@ -118,6 +110,8 @@
<string name="device_factory_reset" msgid="1110189450013225971">"Ukuhlela kabusha idatha yasembonini"</string>
<string name="device_calibration" msgid="2907914144048739705">"Ukusika"</string>
<string name="device_energy_saver" msgid="1105023232841036991">"Isilondolozi samandla"</string>
+ <string name="overlay_internal_slice_title" msgid="6427352417573831625"></string>
+ <string name="device_fastpair" msgid="1235240814051277047">"Amadivayisi"</string>
<string name="surround_sound_select_formats" msgid="6070283650131226239">"Khetha amafomethi"</string>
<string name="surround_sound_category_title" msgid="5688539514178173911">"Umsindo ozungelezile"</string>
<string name="surround_sound_format_ac3" msgid="4759143098751306492">"Idijithali ye-Dolby"</string>
@@ -185,8 +179,16 @@
<string name="hdr_enabled_formats" msgid="8527870623949982774">"AMAFOMETHI ANIKWE AMANDLA"</string>
<string name="hdr_disabled_formats" msgid="4758522849421497896">"AMAFOMETHI AKHUTSHAZIWE"</string>
<string name="hdr_enabled_format_info_clicked" msgid="1466675962665861040">"Ukuze ukhubaze, shintsha ukukhethwa kwefomethi kube Ngokwamathupha."</string>
+ <string name="resolution_selection_title" msgid="2873993320284587853">"Ukulungiswa"</string>
+ <string name="resolution_selection_auto_title" msgid="4738671207331027385">"Okuzenzakalelayo"</string>
+ <string name="resolution_selection_dialog_title" msgid="4029798035133645272">"Ukulungiswa kushintshiwe"</string>
+ <string name="resolution_selection_dialog_desc" msgid="3667357611495669701">"Khetha okuthi KULUNGILE ukuze usebenzise i-%1$s kusukela manje."</string>
+ <string name="resolution_selection_dialog_cancel" msgid="3683616572317946129">"Khansela"</string>
+ <string name="resolution_selection_dialog_ok" msgid="3123351228545013492">"KULUNGILE"</string>
+ <string name="resolution_selection_hz" msgid="4425902505388495637">"I-Hz"</string>
<string name="device_storage_clear_cache_title" msgid="14370154552302965">"Sula idatha efakwe kunqolobane?"</string>
<string name="device_storage_clear_cache_message" msgid="4352802738505831032">"Lokhu kuzosula idatha efakwe kunqolobane yazo zonke izinhlelo zokusebenza."</string>
+ <string name="default_audio_output_settings_title" msgid="5441937324539531999"></string>
<string name="accessories_add" msgid="413764175035531452">"Engeza into"</string>
<string name="accessory_state_pairing" msgid="15908899628218319">"Iyamatanisa..."</string>
<string name="accessory_state_connecting" msgid="6560241025917621212">"Iyaxhuma..."</string>
@@ -224,6 +226,8 @@
<string name="bluetooth_known_devices_category" msgid="6895470515631452961">"Izinsiza"</string>
<string name="bluetooth_official_remote_category" msgid="5817814488268307170">"Isilawuli-kude"</string>
<string name="bluetooth_official_remote_entry_title" msgid="6699700335229570038">"Amasethingi Wesilawuli-kude"</string>
+ <string name="bluetooth_ir_entry_title" msgid="6927284710576530479">"Setha izinkinobho zesilawuli-kude"</string>
+ <string name="bluetooth_ir_entry_subtitle" msgid="4606207128353416151">"Lawula ivolumu, amandla, okokufaka kuma-TV, izamukeli namabha womsindo"</string>
<string name="bluetooth_connect_action_title" msgid="7715342395313781643">"Xhuma"</string>
<string name="bluetooth_connect_confirm" msgid="4769958536295137386">"Xhuma ku-%1$s"</string>
<string name="bluetooth_disconnect_action_title" msgid="1135513009197728480">"Nqamula"</string>
@@ -262,10 +266,6 @@
<string name="disabled_by_administrator_summary" msgid="3420979957115426764">"Ayitholakali"</string>
<string name="manage_device_admin" msgid="5714217234035017983">"Izinhlelo zokusebenza zomlawuli wedivayisi"</string>
<string name="number_of_device_admins_none" msgid="2734299122299837459">"Azikho izinhlelo zokusebenza ezisebenzayo"</string>
- <plurals name="number_of_device_admins" formatted="false" msgid="5825543996501454373">
- <item quantity="one">ama-app asebenzayo <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">ama-app asebenzayo <xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
<string name="unlock_set_unlock_disabled_summary" msgid="108190334043671416">"Kukhutshazwe umlawuli, inqubomgomo yokubethela, noma isitoreji sezitifiketi"</string>
<string name="enterprise_privacy_settings" msgid="8226765895133003202">"Ulwazi lwedivayisi oluphethwe"</string>
<string name="enterprise_privacy_settings_summary_generic" msgid="5719549523275019419">"Ushintsho nezilungiselelo eziphethwe inhlangano yakho"</string>
@@ -283,18 +283,12 @@
<string name="enterprise_privacy_none" msgid="6660670916934417519">"Lutho"</string>
<string name="enterprise_privacy_enterprise_installed_packages" msgid="7244796629052581085">"Izinhlelo zokusebenza ezifakiwe"</string>
<string name="enterprise_privacy_apps_count_estimation_info" msgid="3875568975752197381">"Inombolo yezinhlelo zokusebenza iyalinganiselwa. Ingahle ingabandakanyi izinhlelo zokusebenza ezingaphandle kwe-Google Play Isitolo."</string>
- <plurals name="enterprise_privacy_number_packages_lower_bound" formatted="false" msgid="3891649682522079620">
- <item quantity="one">Ubuncane obungu-<xliff:g id="COUNT_1">%d</xliff:g> bama-app</item>
- <item quantity="other">Ubuncane obungu-<xliff:g id="COUNT_1">%d</xliff:g> bama-app</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound" msgid="4518330667109848939">"{count,plural, =1{Ubuncane obungu-# be-app}one{Ubuncane obungu-# bama-app}other{Ubuncane obungu-# bama-app}}"</string>
<string name="enterprise_privacy_location_access" msgid="8978502415647245748">"Izimvume zendawo"</string>
<string name="enterprise_privacy_microphone_access" msgid="3746238027890585248">"Izimvume zemakrofoni"</string>
<string name="enterprise_privacy_camera_access" msgid="6258493631976121930">"Izimvume zekhamera"</string>
<string name="enterprise_privacy_enterprise_set_default_apps" msgid="5538330175901952288">"Izinhlelo zokusebenza ezizenzakalelayo"</string>
- <plurals name="enterprise_privacy_number_packages" formatted="false" msgid="1652060324792116347">
- <item quantity="one">ama-app <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">ama-app <xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
+ <string name="enterprise_privacy_number_packages" msgid="6256222390430349008">"{count,plural, =1{i-app engu-#}one{ama-app angu-#}other{ama-app angu-#}}"</string>
<string name="enterprise_privacy_input_method" msgid="5814752394251833058">"Ikhibhodi ezenzakalelayo"</string>
<string name="enterprise_privacy_input_method_name" msgid="1088874503312671318">"Sethela ku-<xliff:g id="APP_LABEL">%s</xliff:g>"</string>
<string name="enterprise_privacy_always_on_vpn_device" msgid="8845550514448914237">"I-VPN ehlala ivuliwe ivuliwe"</string>
@@ -304,37 +298,22 @@
<string name="enterprise_privacy_ca_certs_device" msgid="975646846291012452">"Izifakazeli ezithenjwayo"</string>
<string name="enterprise_privacy_ca_certs_personal" msgid="7641368559306519707">"Ukuqinisekisa okwethembekile kuphrofayela yomuntu siqu"</string>
<string name="enterprise_privacy_ca_certs_work" msgid="2905939250974399645">"Ukuqinisekisa okwethembekile kuphrofayela yakho yomsebenzi"</string>
- <plurals name="enterprise_privacy_number_ca_certs" formatted="false" msgid="4861211387981268796">
- <item quantity="one">Ubuncane bezitifiketi ze-CA ezingu-<xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">Ubuncane bezitifiketi ze-CA ezingu-<xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs" msgid="5918439861975410142">"{count,plural, =1{Isitifiketi se-CA esingu-#}one{Izitifiketi ze-CA ezingu-#}other{Izitifiketi ze-CA ezingu-#}}"</string>
<string name="enterprise_privacy_lock_device" msgid="3140624232334033641">"Umlawuli angakhiya idivayisi aphinde asethe kabusha iphasiwedi"</string>
<string name="enterprise_privacy_wipe_device" msgid="1714271125636510031">"Umlawuli angasusa yonke idatha yedivayisi"</string>
<string name="enterprise_privacy_failed_password_wipe_device" msgid="8272298134556250600">"Imizamo yephasiwedi ehlulekile ngaphambi kokususa yonke idatha yedivayisi"</string>
<string name="enterprise_privacy_failed_password_wipe_work" msgid="1184137458404844014">"Imizamo ehlulekile yephasiwedi ngaphambi kokususa idatha yephrofayela yomsebenzi"</string>
- <plurals name="enterprise_privacy_number_failed_password_wipe" formatted="false" msgid="8317320334895448341">
- <item quantity="one">imizamo <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">imizamo <xliff:g id="COUNT_1">%d</xliff:g></item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe" msgid="277415009661470768">"{count,plural, =1{umzamo ongu-#}one{imizamo engu-#}other{imizamo engu-#}}"</string>
<string name="do_disclosure_generic" msgid="8390478119591845948">"Le divayisi iphethwe inhlangano yakho."</string>
<string name="do_disclosure_with_name" msgid="4755509039938948975">"Le divayisi iphethwe yi-<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string>
<string name="do_disclosure_learn_more_separator" msgid="4226390963162716446">" "</string>
<string name="learn_more" msgid="820336467414665686">"Funda kabanzi"</string>
- <plurals name="default_camera_app_title" formatted="false" msgid="3870902175441923391">
- <item quantity="one">Izinhlelo zokusebenza zekhamera</item>
- <item quantity="other">Izinhlelo zokusebenza zekhamera</item>
- </plurals>
+ <string name="default_camera_app_title" msgid="4573905807226306484">"{count,plural, =1{I-app yekhamera}one{Ama-app wekhamera}other{Ama-app wekhamera}}"</string>
<string name="default_calendar_app_title" msgid="1533912443930743532">"Uhlelo lokusebenza lekhalenda"</string>
<string name="default_contacts_app_title" msgid="7792041146751261191">"Uhlelo lokusebenza loxhumana nabo"</string>
- <plurals name="default_email_app_title" formatted="false" msgid="5601238555065668402">
- <item quantity="one">Izinhlelo zokusebenza zeklayenti le-imeyili</item>
- <item quantity="other">Izinhlelo zokusebenza zeklayenti le-imeyili</item>
- </plurals>
+ <string name="default_email_app_title" msgid="3712283056326496555">"{count,plural, =1{I-app yeklayenti ye-imeyili}one{Ama-app weklayenti ye-imeyili}other{Ama-app weklayenti ye-imeyili}}"</string>
<string name="default_map_app_title" msgid="9051013257374474801">"Uhlelo lokusebenza lemephu"</string>
- <plurals name="default_phone_app_title" formatted="false" msgid="1573981201056870719">
- <item quantity="one">Izinhlelo zokusebenza zefoni</item>
- <item quantity="other">Izinhlelo zokusebenza zefoni</item>
- </plurals>
+ <string name="default_phone_app_title" msgid="4833449131501871644">"{count,plural, =1{I-app yefoni}one{Ama-app wefoni}other{Ama-app wefoni}}"</string>
<string name="default_browser_title" msgid="3612813200586492159">"I-browser app"</string>
<string name="app_names_concatenation_template_2" msgid="5297284354915830297">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>"</string>
<string name="app_names_concatenation_template_3" msgid="4932774380339466733">"<xliff:g id="FIRST_APP_NAME">%1$s</xliff:g>, <xliff:g id="SECOND_APP_NAME">%2$s</xliff:g>, <xliff:g id="THIRD_APP_NAME">%3$s</xliff:g>"</string>
@@ -353,10 +332,7 @@
<string name="about_version" msgid="6223547403835399861">"Inguqulo ye-Android TV OS"</string>
<string name="about_serial" msgid="3432319328808745459">"Inombolo yomkhiqizo"</string>
<string name="about_build" msgid="8467840394761634575">"Umakhiwo we-Android TV OS"</string>
- <plurals name="show_dev_countdown" formatted="false" msgid="523455736684670250">
- <item quantity="one">Manje sewusele ngezinyathelo ezingu-<xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ekubeni ngunjiniyela</item>
- <item quantity="other">Manje sewusele ngezinyathelo ezingu-<xliff:g id="STEP_COUNT_1">%1$d</xliff:g> ekubeni ngunjiniyela</item>
- </plurals>
+ <string name="show_dev_countdown" msgid="4064986225625409361">"{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="about_ads" msgid="7662896442040086522">"Izikhangiso"</string>
<string name="ads_description" msgid="8081069475265061074">"Phatha amasethingi wezikhangiso zakho, njengokusetha kabusha i-ID yakho yokukhangisa."</string>
<string name="ads_content_description" msgid="1006489792324920289">"Izikhangiso, phatha amasethingi wezikhangiso zakho, njengokusetha kabusha i-ID yakho yokukhangisa."</string>
@@ -370,23 +346,7 @@
<string name="additional_system_update_settings_list_item_title" msgid="1839534735929143986">"Ukubuyekeza kwesistimu okwengeziwe"</string>
<string name="ssl_ca_cert_warning" msgid="7836390021162211069">"Inethiwekhi kungenzeka iqashiwe"</string>
<string name="done_button" msgid="616159688526431451">"Kwenziwe"</string>
- <plurals name="ssl_ca_cert_dialog_title" formatted="false" msgid="8222753634330561111">
- <item quantity="one">Themba noma susa izitifiketi</item>
- <item quantity="other">Themba noma susa izitifiketi</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message_device_owner" formatted="false" msgid="6128536570911468907">
- <item quantity="one">U-<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ufake amagunya wesitifiketi kudivayisi yakho, okungamvumela ukuthi aqaphe umsebenzi wenethiwekhi yedivayisi yakho, kufaka phakathi ama-imeyili, ama-app, nokuvikela amawebhusayithi.\n\nNgolwazi olungeziwe ngalezi zitifiketi, xhumana nomlawuli wakho.</item>
- <item quantity="other">U-<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ufake amagunya wesitifiketi kudivayisi yakho, okungamvumela ukuthi aqaphe umsebenzi wenethiwekhi yedivayisi yakho, kufaka phakathi ama-imeyili, ama-app, nokuvikela amawebhusayithi.\n\nNgolwazi olungeziwe ngalezi zitifiketi, xhumana nomlawuli wakho.</item>
- </plurals>
- <plurals name="ssl_ca_cert_info_message" formatted="false" msgid="5828471957724016946">
- <item quantity="one">U-<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ufake amagunya wesitifiketi wephrofayela yakho yomsebenzi, angamvumela ukuthi aqaphe umsebenzi wenethiwekhi yomsebenzi, ofaka ama-imeyili, ama-app, namawebhusayithi avikelekile.\n\nngolwazi olubanzi ngalezi zitifiketi, xhumana nomlawuli wakho.</item>
- <item quantity="other">U-<xliff:g id="MANAGING_DOMAIN_1">%s</xliff:g> ufake amagunya wesitifiketi wephrofayela yakho yomsebenzi, angamvumela ukuthi aqaphe umsebenzi wenethiwekhi yomsebenzi, ofaka ama-imeyili, ama-app, namawebhusayithi avikelekile.\n\nngolwazi olubanzi ngalezi zitifiketi, xhumana nomlawuli wakho.</item>
- </plurals>
- <string name="ssl_ca_cert_warning_message" msgid="4837017382712096218">"Inkampani yangaphandle iyakwazi ukugada umsebenzi wakho wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi aphephile.\n\nUkuqinisekisa okuthenjiwe okufakwe kudivayisi yakho kwenza lokhu kukhoneke."</string>
- <plurals name="ssl_ca_cert_settings_button" formatted="false" msgid="196409967946912560">
- <item quantity="one">Hlola izitifiketi</item>
- <item quantity="other">Hlola izitifiketi</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title" msgid="5104377991202801698">"{count,plural, =1{Themba noma susa isitifiketi}one{Themba noma susa izitifiketi}other{Themba noma susa izitifiketi}}"</string>
<string name="device_status" msgid="8266002761193692207">"Isimo"</string>
<string name="device_status_summary" msgid="3270932829412434985">"Inethiwekhi, izinombolo ze-serial nolunye ulwazi"</string>
<string name="manual" msgid="5683935624321864999">"Ngokulawulwa"</string>
@@ -478,7 +438,7 @@
<string name="wifi_connect" msgid="2206086690065242121">"Xhuma"</string>
<string name="wifi_forget_network" msgid="4634016112624305571">"Khohlwa inethiwekhi"</string>
<string name="wifi_forget_network_description" msgid="4146715475962713899">"Lokhu kusula ulwazi olusetshenziselwe ukuxhuma kule nethiwekhi, kufaka phakathi iphasiwedi eilondoloziwe"</string>
- <string name="wifi_scan_qr_code_description" msgid="2375814285190385839">"Joyina i-Wi-Fi ngokuskena ikhodi ye-QR kusuka kufoni yakho yeselula bese ulandela umyalo."</string>
+ <string name="wifi_scan_qr_code_description" msgid="6620444691131671132">" Joyina i-Wi-Fi ngokuskena ikhodi ye-QR kusuka efonini yeselula bese ulandela iziqondiso.\n \n Kusuka "<b>"Kufoni ye-Android"</b>" iya kokuthi Amasethingi > Inethiwekhi ne-inthanethi > I-Wi-Fi > Khetha i-Wi-Fi > Okuthuthukile > Engeza idivayisi bese uskena ikhodi ye-QR."</string>
<string name="wifi_scan_qr_code_back_description" msgid="8830716278283379280">"Cindezela inkinobho yasemuva ukuze ukhansele"</string>
<string name="wifi_action_ok" msgid="6257483288047397880">"KULUNGILE"</string>
<string name="wifi_setup_action_dont_change_network" msgid="2999582059217623090">"Qhubeka"</string>
@@ -547,6 +507,13 @@
<string name="storage_device_storage_section" msgid="22958375769694027">"Isitoreji sedivayisi"</string>
<string name="storage_removable_storage_section" msgid="280332107650735088">"Isitoreji esikhiphekayo"</string>
<string name="storage_reset_section" msgid="3896575204828589494">"Setha kabusha"</string>
+ <string name="storage_free_up" msgid="5719667150891467122">"Khulula isitoreji"</string>
+ <string name="storage_free_up_clear_cached_data" msgid="858596875459698634">"Sula idatha efakwe kunqolobane"</string>
+ <string name="storage_free_up_clear_cached_data_summary" msgid="3111860361699185304">"Khulula okungu-<xliff:g id="SPACE">%1$s</xliff:g>"</string>
+ <string name="storage_free_up_clear_cached_data_info" msgid="719348815620748812">"Isula amafayela wesikhashana athatha isikhala. Ngeke kuthinte idatha elondoloziwe njengokuncamelayo kwe-app noma amavidiyo angaxhunyiwe, futhi ngeke udinge ukungena kuma-app futhi."</string>
+ <string name="storage_free_up_clear_cached_data_confirm_title" msgid="5047418718048910850">"Sula idatha yenqolobane?"</string>
+ <string name="storage_free_up_clear_cached_data_confirm_description" msgid="4840728913914074729">"Lokhu kuzosula idatha yenqolobane kuwo wonke ama-app."</string>
+ <string name="storage_free_up_uninstall_apps" msgid="7755671754934975908">"Khipha ama-app"</string>
<string name="storage_mount_success" msgid="4459298609971461753">"I-<xliff:g id="NAME">%1$s</xliff:g> ikhweziwe"</string>
<string name="storage_mount_failure" msgid="8521666906216755903">"Ayikwazanga ukukhweza i-<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="storage_mount_adopted" msgid="8880688040694403520">"Isitoreji se-USB siphinde saxhunywa"</string>
@@ -624,9 +591,13 @@
<string name="microphone" msgid="7893752847683941214">"Imakrofoni"</string>
<string name="mic_toggle_title" msgid="7193417007060235665">"Ukufinyelela kwemakrofoni"</string>
<string name="open_mic_permissions" msgid="8121871594807641073">"Ukufinyelela kwemakrofoni kukhamera"</string>
+ <string name="microphone_physical_privacy_enabled_title" msgid="6135130916399886772">"Ukufinyelela kwemakrofoni kuvinjiwe"</string>
+ <string name="microphone_physical_privacy_enabled_text" msgid="401238365312924088">"Ukuze uvulele, hambisa iswishi yobumfihlo kudivayisi yakho uye kumakrofoni esendaweni ukuze uvumele ukufinyelela kwemakrofoni."</string>
<string name="camera" msgid="1226671478936288283">"Ikhamera"</string>
<string name="camera_toggle_title" msgid="5566469574224956142">"Ukufinyelela kwekhamera"</string>
<string name="open_camera_permissions" msgid="301360297337141591">"Ukufinyelela kwe-app kukhamera"</string>
+ <string name="camera_physical_privacy_enabled_title" msgid="1944155695921165511">"Ukufinyelela kwekhamera kuvinjiwe"</string>
+ <string name="camera_physical_privacy_enabled_text" msgid="6692088634676282779">"Ukuze uvulele, hambisa iswishi yobumfihlo kudivayisi yakho uye kukhamera esendaweni ukuze uvumele ukufinyelela kwekhamera."</string>
<string name="mic_toggle_info_title" msgid="1086545614315873599">"Ukufinyelela kwemakrofoni: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
<string name="mic_toggle_info_content" msgid="4699624900513326055">"Lapho evuliwe, wonke ama-app namasevisi anemvume angakwazi ukufinyelela kunoma iyiphi imakrofoni kule divayisi.\n\nAma-peripheral womsindo anephrothokholi engokwezifiso ngeke athintwe yile sethingi."</string>
<string name="camera_toggle_info_title" msgid="3871317082313736088">"Ukufinyelela kwekhamera: <xliff:g id="SENSOR_STATE">%s</xliff:g>"</string>
@@ -698,6 +669,8 @@
<string name="color_cyan" msgid="3172130225116530998">"I-Cyan"</string>
<string name="color_yellow" msgid="3519470952904560404">"Okuphuzi"</string>
<string name="color_magenta" msgid="2377854703399624607">"I-Magenta"</string>
+ <string name="accessibility_toggle_audio_description_preference_title" msgid="933923296129403548">"Incazelo yokulalelwayo"</string>
+ <string name="accessibility_audio_description_summary" msgid="2027813223650517036">"Izwa incazelo yalokho okwenzeka esikrinini kumamuvi nezinhlelo ezisekelwayo"</string>
<string name="system_accessibility_status" msgid="8504842254080682515">"Nika amandla"</string>
<string name="system_accessibility_config" msgid="4820879735377962851">"Ukucushwa"</string>
<string name="system_accessibility_service_on_confirm_title" msgid="4547924421106540376">"Sebenzisa i-<xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
@@ -718,6 +691,7 @@
<string name="system_monitoring" msgid="7997260748312620855">"Ukwengamela"</string>
<string name="system_apps" msgid="8481888654606868074">"Izinhlelo zokusebenza"</string>
<string name="system_stay_awake" msgid="5935117574414511413">"Hlala uphapheme"</string>
+ <string name="keep_screen_on_summary" msgid="4680661166009970792">"Isikrini asisoze salala"</string>
<string name="system_hdcp_checking" msgid="3757586362130048838">"Ihlola i-HDCP"</string>
<string name="system_hdmi_optimization" msgid="4122753440620724144">"Ukulungiselelwa kwe-HDMI"</string>
<string name="system_reboot_confirm" msgid="7035370306447878560">"Qalisa kabusha manje?"</string>
@@ -838,18 +812,9 @@
<string name="inputs_device_auto_off_desc" msgid="1164897242719608201">"Ukuvala amadivayisi we-HDMI nge-TV"</string>
<string name="inputs_tv_auto_on" msgid="544848340484583318">"Ukuvuleka ngokuzenzakalelayo kwe-TV"</string>
<string name="inputs_tv_auto_on_desc" msgid="3640723210479925817">"Ukuvula i-TV ngamadivayisi we-HDMI"</string>
- <plurals name="inputs_header_connected_input" formatted="false" msgid="1179814566738084315">
- <item quantity="one">Okokufaka okuxhunyiwe</item>
- <item quantity="other">Okokufaka okuxhunyiwe</item>
- </plurals>
- <plurals name="inputs_header_standby_input" formatted="false" msgid="1205685426052294376">
- <item quantity="one">Okokufaka okulindile</item>
- <item quantity="other">Okokufaka okulindile</item>
- </plurals>
- <plurals name="inputs_header_disconnected_input" formatted="false" msgid="8405783081133938537">
- <item quantity="one">Okokufaka okungaxhunyiwe</item>
- <item quantity="other">Okokufaka okungaxhunyiwe</item>
- </plurals>
+ <string name="inputs_header_connected_input" msgid="4323324944548164849">"{count,plural, =1{Okokufaka Okuxhunyiwe}one{Okokufaka Okuxhunyiwe}other{Okokufaka Okuxhunyiwe}}"</string>
+ <string name="inputs_header_standby_input" msgid="600117963181008144">"{count,plural, =1{Okokufaka Okulindile}one{Okokufaka Okulindile}other{Okokufaka Okulindile}}"</string>
+ <string name="inputs_header_disconnected_input" msgid="3852361100151289264">"{count,plural, =1{Okokufaka Okungaxhunyiwe}one{Okokufaka Okungaxhunyiwe}other{Okokufaka Okungaxhunyiwe}}"</string>
<string name="user_add_profile_item_summary" msgid="3211866291940617804">"Khawulela ukufinyelela kuzinhlelo zokusebenza nokunye okuqukethwe ku-akhawunti yakho"</string>
<string name="user_new_profile_name" msgid="6637593067318708353">"Iphrofayela ekhawulelwe"</string>
<string name="user_restrictions_controlled_by" msgid="8124926446168030445">"Ilawulwa yi-<xliff:g id="APP">%1$s</xliff:g>"</string>
@@ -863,10 +828,6 @@
<string name="restricted_profile_create_title" msgid="700322590579894058">"Dala iphrofayela ekhawulelwe"</string>
<string name="restricted_profile_configure_title" msgid="3327502517511010296">"Izilungiselelo"</string>
<string name="restricted_profile_configure_apps_title" msgid="2244201859522056827">"Izinhlelo zokusebenza ezivunyelwe"</string>
- <plurals name="restricted_profile_configure_apps_description" formatted="false" msgid="7923692208224457728">
- <item quantity="one">%d izinhlelo zokusebenza ezivunyelwe</item>
- <item quantity="other">%d izinhlelo zokusebenza ezivunyelwe</item>
- </plurals>
<string name="restricted_profile_allowed" msgid="970921490464867884">"Kuvumelekile"</string>
<string name="restricted_profile_not_allowed" msgid="8184983064118036268">"Akuvunyelwe"</string>
<string name="restricted_profile_customize_restrictions" msgid="4723577877385636704">"Yenza ngokwezifiso imikhawulo"</string>
@@ -911,6 +872,7 @@
<string name="device_apps_app_management_licenses" msgid="4809737266551899869">"Umthombo Wenkampani Engahlangene Ngqo"</string>
<string name="device_apps_app_management_permissions" msgid="4951820230491375037">"Izimvume"</string>
<string name="device_apps_app_management_not_available" msgid="4198634078194500518">"Uhlelo lokusebenza alutholakali"</string>
+ <string name="unused_apps" msgid="5539166745483454543">"Ama-unused app"</string>
<string name="settings_ok" msgid="5950888975075541964">"KULUNGILE"</string>
<string name="settings_confirm" msgid="4489126458677153411">"Qinisekisa"</string>
<string name="settings_cancel" msgid="576094334743686152">"Khansela"</string>
@@ -994,11 +956,17 @@
<string name="write_settings_description" msgid="7382397926674265937">"Le mvume ivumela uhlelo lokusebenza ukushintsha izilungiselelo zesistimu."</string>
<string name="write_settings_on" msgid="71675710746513956">"Yebo"</string>
<string name="write_settings_off" msgid="6730113471695092167">"Cha"</string>
+ <string name="manage_external_storage_title" msgid="8139593207533811077">"Ukufinyelela kuwo wonke amafayela"</string>
+ <string name="permit_manage_external_storage" msgid="1776899171934627417">"Vumela ukufinyelela ukuze kuphathwe wonke amafayela"</string>
+ <string name="allow_manage_external_storage_description" msgid="4288250228151617611">"Vumela lolu hlelo lokusebenza ukuthi lufunde, lulungise luphinde lususe wonke amafayela kule divayisi noma kwamanye amavolumu axhunyiwe esitoreji. Uma linikeziwe, uhlelo lokusebenza lungafinyelela kumafayela ngaphandle kokwazi kwakho okusobala."</string>
<string name="picture_in_picture_title" msgid="2636935591386702348">"Isithombe-phakathi-kwesithombe"</string>
<string name="picture_in_picture_app_detail_switch" msgid="3688997906817583854">"Vumela isithombe phakathi kwesithombe"</string>
<string name="picture_in_picture_empty_text" msgid="4370198922852736600">"Azikho izinhlelo zokusebenza ezifakiwe ezisekela isithombe phakathi kwesithombe"</string>
<string name="picture_in_picture_app_detail_summary" msgid="3296649114939705896">"Vumela izinhlelo zokusebenza ukuthi zidale iwindi lesithombe-phakathi-kwesithombe ngenkathi uhlelo lokusebenza luvuliwe noma ngemuva kokuthi ulishiye (isibonelo, ukuze uqhubeke ubukele ividiyo). Leli windi liboniswa ngaphezulu kwezinye izinhlelo zokusebenza ozisebenzisayo."</string>
<string name="alarms_and_reminders_description" msgid="4063972350154624500">"Vumela ama-app ukusetha ama-alamu nokushejula izenzo ezizwelayo esikhathini. Lokhu kuvumela ama-app ukuthi aqhubeke ngemuva, okungasebenzisa amandla amaningi.\n\nUma le mvume ivaliwe, ama-alamu asele nemicimbi esekelwe esikhathini ehlelwe yile app ngeke kusebenze."</string>
+ <string name="turn_screen_on_title" msgid="5293798529284629011">"Vula isikrini"</string>
+ <string name="allow_turn_screen_on" msgid="4903401106871656521">"Vumela ukuvula isikrini"</string>
+ <string name="allow_turn_screen_on_description" msgid="7521761625343889415">"Vumela i-app ivule isikrini. Uma inikwe imvume, i-app ingavula isikrini noma nini ngaphandle kwenhloso yakho esobala."</string>
<string name="special_access" msgid="21806055758289916">"Ukufinyelela kwi-app okukhethekile"</string>
<string name="string_concat" msgid="5213870180216051497">"<xliff:g id="PART1">%1$s</xliff:g>, <xliff:g id="PART2">%2$s</xliff:g>"</string>
<string name="audio_category" msgid="6143623109624947993">"Umsindo"</string>
@@ -1015,7 +983,7 @@
<string name="title_data_saver" msgid="7500278996154002792">"Iseva yedatha"</string>
<string name="summary_data_saver" msgid="6793558728898207405">"Lungisa ngokuzenzakalela ikhwalithi yevidiyo ukuze usebenzise idatha encane yeselula"</string>
<string name="title_data_alert" msgid="8262081890052682475">"Ukusetshenziswa kwedatha nezexwayiso"</string>
- <string name="data_saver_header_info" msgid="239820871940156510">"Ungaxhuma ku-inthanethi nge-Wi-Fi, Ethernet, noma i-hotspot yefoni yakho. Ukuthola usizo olwengeziwe, vakashela ku-"<b>"g.co/network"</b>"."</string>
+ <string name="data_saver_header_info" msgid="2706725187498535785">"Ungaxhuma ku-inthanethi nge-Wi-Fi, i-Ethernet, noma i-hotspot yefoni yakho."</string>
<string name="help_center_title" msgid="6109822142761302433"></string>
<string name="disabled_by_policy_title" msgid="2220484346213756472">"Isenzo asivunyelwe"</string>
<string name="disabled_by_policy_title_adjust_volume" msgid="4229779946666263271">"Ayikwazi ukushintsha ivolumu"</string>
@@ -1065,4 +1033,5 @@
<string name="power_and_energy" msgid="4638182439670702556">"Amandla Namandla"</string>
<string name="power_on_behavior" msgid="927607372303160716">"Ukuziphatha kokuvulwa"</string>
<string name="reset_options_title" msgid="7632580482285108955">"Setha kabusha"</string>
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label" msgid="7551782499828944838">"Ikhodi yokubhangqa ye-Ethernet"</string>
</resources>
diff --git a/Settings/res/values/arrays.xml b/Settings/res/values/arrays.xml
index 007e5e6..69da42f 100644
--- a/Settings/res/values/arrays.xml
+++ b/Settings/res/values/arrays.xml
@@ -176,7 +176,6 @@
<item>@color/captioning_color_555555</item>
<item>@color/captioning_color_5555AA</item>
<item>@color/captioning_color_5555FF</item>
- <item>@color/captioning_color_5555FF</item>
<item>@color/captioning_color_55AA00</item>
<item>@color/captioning_color_55AA55</item>
<item>@color/captioning_color_55AAAA</item>
@@ -243,13 +242,8 @@
<string-array name="font_scale_entry_values" translatable="false">
<item>0.85</item>
<item>1.0</item>
- <item>1.1</item>
<item>1.15</item>
- <item>1.2</item>
- <item>1.25</item>
<item>1.30</item>
- <item>1.5</item>
- <item>2</item>
</string-array>
<!-- Blacklist packages which should be seen as system apps in "All apps" page -->
diff --git a/Settings/res/values/colors.xml b/Settings/res/values/colors.xml
index d452632..ba2ad55 100644
--- a/Settings/res/values/colors.xml
+++ b/Settings/res/values/colors.xml
@@ -164,4 +164,9 @@
<color name="dialog_background">@*android:color/background_device_default_light</color>
<color name="guided_step_text_input_item_background_focused">#FFFFFF</color>
+
+ <!-- Background color of physical privacy enabled info box -->
+ <color name="sensor_physical_privacy_enabled_info_background">#2BD93025</color>
+ <!-- Background color of physical privacy enabled info box when focused -->
+ <color name="sensor_physical_privacy_enabled_info_background_focused">#4FFF5C5C</color>
</resources>
diff --git a/Settings/res/values/config.xml b/Settings/res/values/config.xml
index d57d264..e939d28 100644
--- a/Settings/res/values/config.xml
+++ b/Settings/res/values/config.xml
@@ -32,20 +32,28 @@
<bool name="config_show_standby_timeout">false</bool>
<!-- Determines whether the entire "Quick Settings" section is available or not. -->
- <bool name="config_quick_settings_enabled" translatable="false">true</bool>
+ <bool name="config_quick_settings_enabled">true</bool>
<!-- Determines whether the "Take bug report" option is shown in quick settings. -->
- <bool name="config_quick_settings_show_take_bugreport" translatable="false">true</bool>
+ <bool name="config_quick_settings_show_take_bugreport">true</bool>
<!-- Flavor of TvSettings. -->
<string name="config_tvSettingsFlavor" translatable="false">Classic</string>
+ <!-- Determines whether "Quick connect" menu item is visible (if supported by hardware) -->
+ <bool name="config_easyconnect_enabled">true</bool>
+
<!-- Allow overlay to specify known/official device names using the return value of
BluetoothDevice # getName() so that it is hidden from the generic bluetooth accessories
section and is only visible in OEM-implemented Slice. -->
<string-array name="known_bluetooth_device_labels" translatable="false">
</string-array>
+ <!-- known_bluetooth_device_labels used to be named as known_remote_labels, for backward
+ compatibility, we will keep supporting this option. -->
+ <string-array name="known_remote_labels" translatable="false">
+ </string-array>
+
<!-- Whether to show the bluetooth toggle. Please be very careful with this config as setting it
to true would surface a toggle in Remotes & Accessories settings that allows the user to
turn off Bluetooth. Without an IR remote or some other form of connection, the user may not
@@ -74,4 +82,6 @@
android.view.Display.HdrCapabilities.HDR_TYPE_HDR10_PLUS -->
<integer name="hdr10plus">4</integer>
+ <!-- Determines whether the device should optimise wifi scanning. -->
+ <bool name="wifi_scan_optimisation_enabled">false</bool>
</resources>
diff --git a/Settings/res/values/dimens.xml b/Settings/res/values/dimens.xml
index 3677fc5..68ae214 100644
--- a/Settings/res/values/dimens.xml
+++ b/Settings/res/values/dimens.xml
@@ -15,6 +15,7 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<dimen name="icon_padding">12dp</dimen>
+ <dimen name="preference_icon_offset">0dp</dimen>
<dimen name="browse_item_height">168dp</dimen>
<dimen name="browse_item_width">168dp</dimen>
@@ -227,6 +228,9 @@
<item name="description_with_inline_icon_line_spacing_multiplier" format="float" type="dimen">1.1</item>
+ <dimen name="sensor_physical_privacy_enabled_info_radius">0dp</dimen>
+ <dimen name="sensor_physical_privacy_enabled_info_margin_bottom">0dp</dimen>
+
<!-- Common-->
<dimen name="guidance_group_margin_start_two_panel">129.5dp</dimen>
<dimen name="guidance_group_margin_end_two_panel">92dp</dimen>
diff --git a/Settings/res/values/strings.xml b/Settings/res/values/strings.xml
index c7ac9c9..c8c60aa 100644
--- a/Settings/res/values/strings.xml
+++ b/Settings/res/values/strings.xml
@@ -92,10 +92,11 @@
<!-- Summary for main screen preference for accounts on device indicates no account is signed in[CHAR LIMIT=50] -->
<string name="accounts_category_summary_no_account">No accounts</string>
<!-- Summary for main screen preference for accounts on device indicates several accounts are signed in[CHAR LIMIT=50] -->
- <plurals name="accounts_category_summary">
- <item quantity="one"><xliff:g id="accounts_number">%1$d</xliff:g> account</item>
- <item quantity="other"><xliff:g id="accounts_number">%1$d</xliff:g> accounts</item>
- </plurals>
+ <string name="accounts_category_summary"> {count, plural,
+ =1 {# account}
+ other {# accounts}
+ }
+ </string>
<!-- Summary for main screen preference for accounts on device slice [CHAR LIMIT=75] -->
<string name="accounts_slice_summary">Media services, Assistant, Payments</string>
<!-- Title for main screen preference for network and Internet [CHAR LIMIT=50] -->
@@ -108,13 +109,6 @@
<string name="device_pref_category_title">Device Preferences</string>
<!-- Title for main screen preference for remote and accessories [CHAR_LIMIT_50] -->
<string name="remotes_and_accessories_category_title">Remotes & accessories</string>
- <!-- Summary for main screen preference for remote and accessories indicates no bluetooth device is connected [CHAR LIMIT=50] -->
- <string name="remotes_and_accessories_category_summary_no_bluetooth_device">No connected Bluetooth devices</string>
- <!-- Summary for main screen preference for remote and accessories indicates more than one devices connected[CHAR LIMIT=50] -->
- <plurals name="remotes_and_accessories_category_summary">
- <item quantity="one"><xliff:g id="accessories_number">%1$d</xliff:g> accessory</item>
- <item quantity="other"><xliff:g id="accessories_number">%1$d</xliff:g> accessories</item>
- </plurals>
<!-- Title for main screen preference for display & sound [CHAR LIMIT=50] -->
<string name="display_and_sound_category_title">Display & Sound</string>
<!-- Title for main screen preference for help and feedback [CHAR LIMIT=50] -->
@@ -233,7 +227,6 @@
<string name="device_surround_sound">Surround sound</string>
<!-- Preference and title which changes system sounds settings. [CHAR LIMIT=50] -->
<string name="device_sound_effects">System sounds</string>
- <string name="surround_sound_toggle_slice_uri" translatable="false" />
<!-- Preference which manages apps. [CHAR LIMIT=50] -->
<string name="device_apps">Applications</string>
<!-- Preference which shows storage status. [CHAR LIMIT=50] -->
@@ -248,6 +241,12 @@
<string name="device_calibration">Calibration</string>
<!-- Preference which changes energy saver settings. [CHAR LIMIT=50] -->
<string name="device_energy_saver">Energy saver</string>
+ <!-- Preference which shows internal settings. [CHAR LIMIT=50] -->
+ <string name="overlay_internal_slice_title"/>
+ <string name="overlay_internal_slice_uri" translatable="false"/>
+ <!-- Preference which shows fastpair settings. [CHAR LIMIT=50] -->
+ <string name="device_fastpair">Devices</string>
+ <string name="fastpair_slice_uri" translatable="false" />
<!-- Display and sound screen -->
<skip />
@@ -349,7 +348,6 @@
<string name="advanced_display_settings_title">Advanced display settings</string>
<!-- Title for HDMI-CEC settings entry. [CHAR LIMIT=20] -->
<string name="hdmi_cec_settings_title">HDMI-CEC</string>
- <string name="advanced_sound_settings_slice_uri" translatable="false" />
<!-- Title for preference which when clicked lets the user configure advanced sound settings. [CHAR LIMIT=50] -->
<string name="advanced_sound_settings_title">Advanced sound settings</string>
<!-- Title for preference to allow game mode for display. [CHAR LIMIT=50] -->
@@ -454,11 +452,33 @@
<string name="hdr_enabled_format_info_clicked">To disable, change the
format selection to Manual.</string>
+ <!-- Title for preference for Resolution selection. [CHAR LIMIT=50] -->
+ <string name="resolution_selection_title">Resolution</string>
+ <!-- Title for Automatic preference for Resolution selection. [CHAR LIMIT=50] -->
+ <string name="resolution_selection_auto_title">Automatic</string>
+ <!-- Title for dialog that is shown when user changes the resolution. [CHAR LIMIT=150]-->
+ <string name="resolution_selection_dialog_title">Resolution has been changed</string>
+ <!-- Description for dialog that is shown when user changes the resolution.
+ [CHAR LIMIT=300]-->
+ <string name="resolution_selection_dialog_desc">Select OK to use %1$s from now on.</string>
+ <!-- Cancel button title for dialog that is shown when user changes the resolution.
+ [CHAR LIMIT=30]-->
+ <string name="resolution_selection_dialog_cancel">Cancel</string>
+ <!-- Ok button title for dialog that is shown when user changes the resolution.
+ [CHAR LIMIT=50]-->
+ <string name="resolution_selection_dialog_ok">OK</string>
+ <!-- Unit of refresh rate Hz. [CHAR LIMIT=15]-->
+ <string name="resolution_selection_hz">Hz</string>
+
<!-- Title of dialog asking user to confirm before clearing all caches. [CHAR LIMIT=48] -->
<string name="device_storage_clear_cache_title">Clear cached data?</string>
<!-- Message of dialog asking user to confirm before clearing all caches. [CHAR LIMIT=48] -->
<string name="device_storage_clear_cache_message">This will clear cached data for all apps.</string>
+ <!-- Title of settings entry for default audio output settings. -->
+ <string name="default_audio_output_settings_title" translatable="true"/>
+ <string name="default_audio_output_settings_slice_uri" translatable="false"/>
+
<!-- Remote and Accessories -->
<skip />
<!-- Preference which manages pairing new accessories. [CHAR LIMIT=50] -->
@@ -554,6 +574,12 @@
<!-- Title for official remote control settings. Can be overlaid by OEM to something like as
"Foobar Remote Settings". -->
<string name="bluetooth_official_remote_entry_title">Remote control settings</string>
+ <!-- Uri to be overlaid by partner to show remote control infrared settings. -->
+ <string name="bluetooth_ir_entry_slice_uri" translatable="false" />
+ <!-- Title for remote control infrared settings. -->
+ <string name="bluetooth_ir_entry_title">Set up remote buttons</string>
+ <!-- Subtitle for remote control infrared settings. -->
+ <string name="bluetooth_ir_entry_subtitle">Control volume, power, input on TVs, receivers and soundbars</string>
<!-- Text on button that allows users to connect their Bluetooth devices. [CHAR LIMIT=30] -->
<string name="bluetooth_connect_action_title">Connect</string>
<!-- Text asking users to confirm connecting their Bluetooth devices. [CHAR LIMIT=40] -->
@@ -628,6 +654,9 @@
<string name="system_diagnostic">Usage & diagnostics</string>
<string name="cast_settings_title" translatable="false" />
<string name="cast_settings_slice_uri" translatable="false" />
+ <string name="assistant_broadcast_title" translatable="false" />
+ <string name="assistant_broadcast_slice_uri" translatable="false" />
+ <string name="top_level_assistant_slice_uri" translatable="false" />
<!-- Message when there are no available device admin apps to display -->
<string name="no_device_admins">No device admin apps available</string>
@@ -644,11 +673,6 @@
<!-- 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 active apps</string>
- <!-- Summary of preference to manage device admin apps, informing the user how many device admin apps are installed and active -->
- <plurals name="number_of_device_admins">
- <item quantity="one"><xliff:g id="count">%d</xliff:g> active app</item>
- <item quantity="other"><xliff:g id="count">%d</xliff:g> active apps</item>
- </plurals>
<!-- Summary for preference that has been disabled by because of the DevicePolicyAdmin, or because device encryption is enabled, or because there are credentials in the credential storage [CHAR LIMIT=50] -->
<string name="unlock_set_unlock_disabled_summary">Disabled by admin, encryption policy, or
@@ -689,10 +713,11 @@
<!-- Label explaining that the number of apps is an estimation. [CHAR LIMIT=NONE] -->
<string name="enterprise_privacy_apps_count_estimation_info">Number of apps is estimated. It may not include apps installed outside of the Play Store.</string>
<!-- Summary indicating the number of apps that a label (e.g. installed apps or apps granted a particular permission) refers to. The number shown is a minimum as there may be additional apps we do not know about. [CHAR LIMIT=NONE] -->
- <plurals name="enterprise_privacy_number_packages_lower_bound">
- <item quantity="one">Minimum <xliff:g id="count">%d</xliff:g> app</item>
- <item quantity="other">Minimum <xliff:g id="count">%d</xliff:g> apps</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages_lower_bound"> {count, plural,
+ =1 {Minimum # app}
+ other {Minimum # apps}
+ }
+ </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">Location permissions</string>
<!-- Label indicating that the admin granted one or more apps access to the microphone. [CHAR LIMIT=NONE] -->
@@ -702,10 +727,11 @@
<!-- 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">Default apps</string>
<!-- Summary indicating the number of apps that a label (e.g. installed apps or apps granted a particular permission) refers to. [CHAR LIMIT=NONE] -->
- <plurals name="enterprise_privacy_number_packages">
- <item quantity="one"><xliff:g id="count">%d</xliff:g> app</item>
- <item quantity="other"><xliff:g id="count">%d</xliff:g> apps</item>
- </plurals>
+ <string name="enterprise_privacy_number_packages"> {count, plural,
+ =1 {# app}
+ other {# apps}
+ }
+ </string>
<!-- Label explaining that the current input method was set by the admin. [CHAR LIMIT=NONE] -->
<string name="enterprise_privacy_input_method">Default keyboard</string>
<!-- Summary indicating the input method set by the admin. [CHAR LIMIT=NONE] -->
@@ -725,10 +751,11 @@
<!-- Label explaining that the admin installed trusted CA certificates in work profile. [CHAR LIMIT=NONE] -->
<string name="enterprise_privacy_ca_certs_work">Trusted credentials in your work profile</string>
<!-- Summary indicating the number of trusted CA certificates installed by the admin. The number shown is a minimum as there may be additional CA certificates we do not know about. [CHAR LIMIT=NONE] -->
- <plurals name="enterprise_privacy_number_ca_certs">
- <item quantity="one">Minimum <xliff:g id="count">%d</xliff:g> CA certificate</item>
- <item quantity="other">Minimum <xliff:g id="count">%d</xliff:g> CA certificates</item>
- </plurals>
+ <string name="enterprise_privacy_number_ca_certs"> {count, plural,
+ =1 {# CA certificate}
+ other {# CA certificates}
+ }
+ </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">Admin can lock the device and reset password</string>
<!-- Label explaining that the admin can wipe the device remotely. [CHAR LIMIT=NONE] -->
@@ -738,10 +765,11 @@
<!-- Label explaining that the admin configured the work profile to wipe itself when the password is mistyped too many times. [CHAR LIMIT=NONE] -->
<string name="enterprise_privacy_failed_password_wipe_work">Failed password attempts before deleting work profile data</string>
<!-- Summary indicating the number of mistyped passwords after which the device or work profile wipes itself. [CHAR LIMIT=NONE] -->
- <plurals name="enterprise_privacy_number_failed_password_wipe">
- <item quantity="one"><xliff:g id="count">%d</xliff:g> attempt</item>
- <item quantity="other"><xliff:g id="count">%d</xliff:g> attempts</item>
- </plurals>
+ <string name="enterprise_privacy_number_failed_password_wipe"> {count, plural,
+ =1 {# attempt}
+ other {# attempts}
+ }
+ </string>
<!-- Message indicating that the device is enterprise-managed by a Device Owner [CHAR LIMIT=NONE] -->
<string name="do_disclosure_generic">This device is managed by your organization.</string>
<!-- Message indicating that the device is enterprise-managed by a Device Owner [CHAR LIMIT=NONE] -->
@@ -753,26 +781,29 @@
<!-- Strings for displaying which applications were set as default for specific actions. -->
<!-- Title for the apps that have been set as default handlers of camera-related intents. [CHAR LIMIT=30] -->
- <plurals name="default_camera_app_title">
- <item quantity="one">Camera app</item>
- <item quantity="other">Camera apps</item>
- </plurals>
+ <string name="default_camera_app_title"> {count, plural,
+ =1 {Camera app}
+ other {Camera apps}
+ }
+ </string>
<!-- Title for the app that has been set as default handler of calendar-related intents. [CHAR LIMIT=30] -->
<string name="default_calendar_app_title">Calendar app</string>
<!-- Title for the app that has been set as default handler of contacts-related intents. [CHAR LIMIT=30] -->
<string name="default_contacts_app_title">Contacts app</string>
<!-- Title for the apps that have been set as default handlers of new email intents. [CHAR LIMIT=30] -->
- <plurals name="default_email_app_title">
- <item quantity="one">Email client app</item>
- <item quantity="other">Email client apps</item>
- </plurals>
+ <string name="default_email_app_title"> {count, plural,
+ =1 {Email client app}
+ other {Email client apps}
+ }
+ </string>
<!-- Title for the app that has been set as default handler of geo-related intents. [CHAR LIMIT=30] -->
<string name="default_map_app_title">Map app</string>
<!-- Title for the apps that have been set as default handlers of call-related intents. [CHAR LIMIT=30] -->
- <plurals name="default_phone_app_title">
- <item quantity="one">Phone app</item>
- <item quantity="other">Phone apps</item>
- </plurals>
+ <string name="default_phone_app_title"> {count, plural,
+ =1 {Phone app}
+ other {Phone apps}
+ }
+ </string>
<!-- Title for Default Browser settings [CHAR LIMIT=30] -->
<string name="default_browser_title">Browser app</string>
<!-- Template for concatenating two app names -->
@@ -819,10 +850,11 @@
<!-- Preference which shows build version. [CHAR LIMIT=50] -->
<string name="about_build">Android TV OS build</string>
<!-- 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>
+ <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>
<!-- Preference which shows ads settings. [CHAR LIMIT=50] -->
<string name="about_ads">Ads</string>
<!-- Ads info description outlining the Ads settings options [CHAR LIMIT=NONE] -->
@@ -858,27 +890,11 @@
<!-- Button to close the SSL CA cert warning dialog box, meaning the user is done reading. [CHAR LIMIT=NONE] -->
<string name="done_button">Done</string>
<!-- Title of Dialog warning users of SSL monitoring. [CHAR LIMIT=NONE] -->
- <plurals name="ssl_ca_cert_dialog_title">
- <item quantity="one">Trust or remove certificate</item>
- <item quantity="other">Trust or remove certificates</item>
- </plurals>
- <!-- Text of message to show to device owner user whose administrator has installed a SSL CA Cert. [CHAR LIMIT=NONE] -->
- <plurals name="ssl_ca_cert_info_message_device_owner">
- <item quantity="one"><xliff:g id="managing_domain">%s</xliff:g> has installed a certificate authority on your device, which may allow them to monitor your device network activity, including emails, apps, and secure websites.\n\nFor more information about this certificate, contact your admin.</item>
- <item quantity="other"><xliff:g id="managing_domain">%s</xliff:g> has installed certificate authorities on your device, which may allow them to monitor your device network activity, including emails, apps, and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
- </plurals>
- <!-- Text of message to show to work profile users whose administrator has installed a SSL CA Cert. [CHAR LIMIT=NONE] -->
- <plurals name="ssl_ca_cert_info_message">
- <item quantity="one"><xliff:g id="managing_domain">%s</xliff:g> has installed a certificate authority for your work profile, which may allow them to monitor work network activity, including emails, apps, and secure websites.\n\nFor more information about this certificate, contact your admin.</item>
- <item quantity="other"><xliff:g id="managing_domain">%s</xliff:g> has installed certificate authorities for your work profile, which may allow them to monitor work network activity, including emails, apps, and secure websites.\n\nFor more information about these certificates, contact your admin.</item>
- </plurals>
- <!-- Text of warning to show to users that have a SSL CA Cert installed. [CHAR LIMIT=NONE] -->
- <string name="ssl_ca_cert_warning_message">A third party is capable of monitoring your network activity, including emails, apps, and secure websites.\n\nA trusted credential installed on your device is making this possible.</string>
- <!-- Label on button that will take the user to the Trusted Credentials settings page. [CHAR LIMIT=NONE]-->
- <plurals name="ssl_ca_cert_settings_button">
- <item quantity="one">Check certificate</item>
- <item quantity="other">Check certificates</item>
- </plurals>
+ <string name="sl_ca_cert_dialog_title"> {count, plural,
+ =1 {Trust or remove certificate}
+ other {Trust or remove certificates}
+ }
+ </string>
<!-- About screen, title of the item to go into the device status screen -->
<string name="device_status">Status</string>
@@ -1086,9 +1102,11 @@
<string name="wifi_forget_network">Forget network</string>
<!-- Description for action to forget the wifi network configuration [CHAR LIMIT=100] -->
<string name="wifi_forget_network_description">This clears information used to connect to this network, including a saved password</string>
- <!-- Description for action to scan a QR code [CHAR LIMIT=300] -->
+ <!-- Description for action to scan a QR code with your phone [CHAR LIMIT=300] -->
<string name="wifi_scan_qr_code_description">
- Join a Wifi by scanning the QR code from your mobile phone and follow the instruction.
+ Join a Wi-Fi by scanning the QR code from a mobile phone and follow the instructions.\n
+ \n
+ From an <b>Android Phone</b> go to Settings -> Network & internet -> Wi-Fi -> Select a Wi-Fi -> Advanced -> Add device and then scan the QR code.
</string>
<!-- Description for action to scan a QR code [CHAR LIMIT=300] -->
<string name="wifi_scan_qr_code_back_description">Press the back button to cancel</string>
@@ -1235,6 +1253,21 @@
<!-- Header title for device reset [CHAR_LIMIT=50] -->
<string name="storage_reset_section">Reset</string>
+ <!-- Header title for free up storage[CHAR_LIMIT=50] -->
+ <string name="storage_free_up">Free up storage</string>
+ <!-- Header title for free up storage[CHAR_LIMIT=50] -->
+ <string name="storage_free_up_clear_cached_data">Clear cached data</string>
+ <!-- Header title for free up storage[CHAR_LIMIT=50] -->
+ <string name="storage_free_up_clear_cached_data_summary">Free up <xliff:g id="space" example="100MB">%1$s</xliff:g></string>
+ <!-- Header title for free up storage[CHAR_LIMIT=500] -->
+ <string name="storage_free_up_clear_cached_data_info">Clears temporary files that take up space. Will not impact saved data like app preferences or offline videos, and you won\'t need to sign in to apps again.</string>
+ <!-- Header title for free up storage[CHAR_LIMIT=50] -->
+ <string name="storage_free_up_clear_cached_data_confirm_title">Clear cached data?</string>
+ <!-- Header title for free up storage[CHAR_LIMIT=50] -->
+ <string name="storage_free_up_clear_cached_data_confirm_description">This will clear cached data for all apps.</string>
+ <!-- Header title for free up storage[CHAR_LIMIT=50] -->
+ <string name="storage_free_up_uninstall_apps">Uninstall apps</string>
+
<!-- Toast informing that storage mount operation was successful. [CHAR LIMIT=64]-->
<string name="storage_mount_success"><xliff:g id="name" example="SD card">%1$s</xliff:g> is mounted</string>
<!-- Toast informing that storage unmount operation failed. [CHAR LIMIT=64]-->
@@ -1416,6 +1449,13 @@
<string name="mic_toggle_title">Microphone access</string>
<!-- Title for setting that opens the microphone permissions overview for all apps [CHAR LIMIT=50]-->
<string name="open_mic_permissions">App access to microphone</string>
+ <!-- Title for info box warning that microphone hardware switch is turned off [CHAR LIMIT=50]-->
+ <string name="microphone_physical_privacy_enabled_title">Microphone access blocked</string>
+ <!-- Content for info box warning that microphone hardware switch is turned off [CHAR LIMIT=250]-->
+ <string name="microphone_physical_privacy_enabled_text">To unblock, move the privacy switch on
+ your device to the microphone on position to allow microphone access.</string>
+ <!-- Content text for info panel shown when the microphone hardware switch is turned off. [CHAR LIMIT=500]-->
+ <string name="microphone_physical_privacy_enabled_panel_text" translatable="false">@string/microphone_physical_privacy_enabled_text</string>
<!-- Title for Camera settings [CHAR LIMIT=30] -->
<string name="camera">Camera</string>
@@ -1424,6 +1464,14 @@
<!-- Title for setting that opens the camera permissions overview for all apps [CHAR LIMIT=50]-->
<string name="open_camera_permissions">App access to camera</string>
+ <!-- Title for info box warning that camera hardware switch is turned off [CHAR LIMIT=50]-->
+ <string name="camera_physical_privacy_enabled_title">Camera access blocked</string>
+ <!-- Content for info box warning that camera hardware switch is turned off [CHAR LIMIT=250]-->
+ <string name="camera_physical_privacy_enabled_text">To unblock, move the privacy switch on your
+ device to the camera on position to allow camera access.</string>
+ <!-- Content text for info panel shown when the camera hardware switch is turned off. [CHAR LIMIT=500]-->
+ <string name="camera_physical_privacy_enabled_panel_text" translatable="false">@string/camera_physical_privacy_enabled_text</string>
+
<!-- Title of the info panel that is shown on the side when the microphone toggle is selected.
The sensor_state is one of the following strings: sensor_toggle_info_on or sensor_toggle_info_off [CHAR LIMIT=30]-->
<string name="mic_toggle_info_title">Microphone Access:
@@ -1585,6 +1633,11 @@
<!-- Label for the color magenta. [CHAR LIMIT=35] -->
<string name="color_magenta">Magenta</string>
+ <!-- Title for the accessibility preference to audio description. [CHAR LIMIT=35] -->
+ <string name="accessibility_toggle_audio_description_preference_title">Audio description</string>
+ <!-- Summary for the accessibility preference to audio description. [CHAR LIMIT=150] -->
+ <string name="accessibility_audio_description_summary">Hear a description of what\u2019s happening on screen in supported movies and shows</string>
+
<!-- Title for accessibility service status [CHAR LIMIT=50] -->
<string name="system_accessibility_status">Enable</string>
<!-- Title for accessibility service configuration [CHAR LIMIT=50] -->
@@ -1625,6 +1678,8 @@
<string name="system_apps">Apps</string>
<!-- Title for Set Stay awake in System Settings Developer options [CHAR LIMIT=50] -->
<string name="system_stay_awake">Stay awake</string>
+ <!-- setting Checkbox summary whether to keep the screen on when plugged in -->
+ <string name="keep_screen_on_summary">Screen will never sleep</string>
<!-- Title for Set HDCP checking in System Settings Developer options [CHAR LIMIT=50] -->
<string name="system_hdcp_checking">HDCP checking</string>
<!-- Title for HDMI optimization in System Settings Developer options [CHAR LIMIT=50] -->
@@ -1915,20 +1970,23 @@
<!-- Description of TV auto power on [CHAR LIMIT=50] -->
<string name="inputs_tv_auto_on_desc">Power on the TV with HDMI device</string>
<!-- Header for connected TV input(s) [CHAR LIMIT=30] -->
- <plurals name="inputs_header_connected_input">
- <item quantity="one">Connected Input</item>
- <item quantity="other">Connected Inputs</item>
- </plurals>
+ <string name="inputs_header_connected_input"> {count, plural,
+ =1 {Connected Input}
+ other {Connected Inputs}
+ }
+ </string>
<!-- Header for standby TV input(s) [CHAR LIMIT=30] -->
- <plurals name="inputs_header_standby_input">
- <item quantity="one">Standby Input</item>
- <item quantity="other">Standby Inputs</item>
- </plurals>
+ <string name="inputs_header_standby_input"> {count, plural,
+ =1 {Standby Input}
+ other {Standby Inputs}
+ }
+ </string>
<!-- Header for disconnected TV input(s) [CHAR LIMIT=30] -->
- <plurals name="inputs_header_disconnected_input">
- <item quantity="one">Not Connected Input</item>
- <item quantity="other">Not Connected Inputs</item>
- </plurals>
+ <string name="inputs_header_disconnected_input"> {count, plural,
+ =1 {Not Connected Input}
+ other {Not Connected Inputs}
+ }
+ </string>
<!-- Summary for add restricted profile entry in the choice dialog [CHAR LIMIT=none] -->
<string name="user_add_profile_item_summary">Restrict access to apps and other content in your account</string>
@@ -1956,11 +2014,6 @@
<string name="restricted_profile_configure_title" >Settings</string>
<!-- Title for action to configure apps for a restricted profile [CHAR LIMIT=100] -->
<string name="restricted_profile_configure_apps_title" >Allowed apps</string>
- <!-- Description for action to configure apps for a restricted profile indicating number of allow apps will be ready in a moment [CHAR LIMIT=100] -->
- <plurals name="restricted_profile_configure_apps_description">
- <item quantity="one">1 app allowed</item>
- <item quantity="other">%d apps allowed</item>
- </plurals>
<!-- An action label indicating the package will be or is allowed [CHAR LIMIT=100] -->
<string name="restricted_profile_allowed" >Allowed</string>
<!-- An action label indicating the package will be or is not allowed [CHAR LIMIT=100] -->
@@ -2060,6 +2113,8 @@
<string name="device_apps_app_management_permissions">Permissions</string>
<!-- Application management toast message when an app cannot be launched [CHAR LIMIT=100]-->
<string name="device_apps_app_management_not_available">Application unavailable</string>
+ <!-- Label for showing apps that have not been used for months. [CHAR LIMIT=40]-->
+ <string name="unused_apps">Unused apps</string>
<!-- General settings choice for agreeing to the displayed action [CHAR LIMIT=40] -->
<string name="settings_ok">OK</string>
<!-- General settings choice for confirming the displayed action [CHAR LIMIT=40] -->
@@ -2260,6 +2315,14 @@
<!-- Summary of app not allowed to write system settings [CHAR LIMIT=45] -->
<string name="write_settings_off">No</string>
+ <!-- Manage External Storage settings title [CHAR LIMIT=40] -->
+ <string name="manage_external_storage_title">All files access</string>
+ <!-- Label for a setting which controls whether an app can manage external storage [CHAR LIMIT=45] -->
+ <string name="permit_manage_external_storage">Allow access to manage all files</string>
+ <!-- Description for a setting which controls whether an app can manage external storage
+ [CHAR LIMIT=NONE] -->
+ <string name="allow_manage_external_storage_description">Allow this app to read, modify and delete all files on this device or any connected storage volumes. If granted, app may access files without your explicit knowledge.</string>
+
<!-- Special access > Title for managing Picture-in-picture settings. [CHAR LIMIT=50] -->
<string name="picture_in_picture_title">Picture-in-picture</string>
<!-- Apps > App Details > Picture-in-picture > Switch title. [CHAR LIMIT=NONE] -->
@@ -2276,6 +2339,14 @@
is off, existing alarms and time-based events scheduled by the app won\u2019t work.
</string>
+ <!-- Special access > Title for managing turn screen on settings. [CHAR LIMIT=50] -->
+ <string name="turn_screen_on_title">Turn screen on</string>
+ <!-- Label for a setting which controls whether an app can turn the screen on [CHAR LIMIT=45] -->
+ <string name="allow_turn_screen_on">Allow turning the screen on</string>
+ <!-- Description for a setting which controls whether an app can turn the screen on
+ [CHAR LIMIT=NONE] -->
+ <string name="allow_turn_screen_on_description">Allow an app to turn the screen on. If granted, the app may turn on the screen at any time without your explicit intent.</string>
+
<!-- [CHAR_LIMIT=60] Label for special access screen -->
<string name="special_access">Special app access</string>
@@ -2323,7 +2394,10 @@
<string name="title_data_alert">Data usage and alerts</string>
<!-- Header info to educate users that they can connect to the internet via Wi-Fi, Ethernet, and phone's hotspot. [CHAR LIMIT=NONE] -->
- <string name="data_saver_header_info">You can connect to the internet with Wi-Fi, Ethernet, or your phone\'s hotspot. For more help, visit <b>g.co/network</b>."</string>
+ <string name="data_saver_header_info">You can connect to the internet with Wi-Fi, Ethernet, or your phone\'s hotspot."</string>
+
+ <!-- Package name of slice rendering app -->
+ <string name="slice_rendering_app" translatable="false"/>
<!-- Slice uri for "Accounts & Sign in" -->
<string name="account_slice_uri" translatable="false"/>
@@ -2343,6 +2417,9 @@
<string name="ambient_slice_uri" translatable="false" />
<string name="ambient_settings_title" translatable="false" />
+ <!-- Slice uri for "Channels & Inputs" -->
+ <string name="channels_and_inputs_slice_uri" translatable="false"/>
+
<!-- Slice uri for "Connected devices" -->
<string name="connected_devices_slice_uri" translatable="false"/>
<string name="cec_settings_slice_uri" translatable="false"/>
@@ -2508,4 +2585,7 @@
<string name="font_sans_serif_light" translatable="false">sans-serif-light</string>
<string name="font_sans_serif_thin" translatable="false">sans-serif-thin</string>
<string name="font_sans_serif_condensed" translatable="false">sans-serif-condensed</string>
+
+ <!-- Adb wireless pairing device dialog ethernet pairing code label [CHAR LIMIT=60] -->
+ <string name="adb_pairing_device_dialog_ethernet_pairing_code_label">Ethernet pairing code</string>
</resources>
diff --git a/Settings/res/values/styles.xml b/Settings/res/values/styles.xml
index c32f9b1..1d34c66 100644
--- a/Settings/res/values/styles.xml
+++ b/Settings/res/values/styles.xml
@@ -58,6 +58,16 @@
<item name="guidedStepTheme">@style/GuidedStepFragmentThemeTwoPanel</item>
</style>
+ <!-- Settings theme for device name -->
+ <style name="Theme.SettingsDeviceName" parent="@style/Theme.Settings">
+ <item name="guidedStepTheme">@style/GuidedStepFragmentThemeTwoPanel</item>
+ </style>
+
+ <!-- Settings theme for ResetActivity -->
+ <style name="Theme.Reset" parent="@style/GuidedStepFragmentThemeTwoPanel">
+ <item name="android:windowBackground">@color/settings_background</item>
+ </style>
+
<style name="Theme.Setup" parent="@style/Theme.Settings">
<item name="wifi_signal_color">@color/setup_list_item</item>
<item name="wps_color">@color/setup_list_item</item>
diff --git a/Settings/res/xml/about_legal_compat.xml b/Settings/res/xml/about_legal_compat.xml
new file mode 100644
index 0000000..676e9b5
--- /dev/null
+++ b/Settings/res/xml/about_legal_compat.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/legal_information">
+
+ <!-- Note: The titles given here probably won't be used. Instead, we programmatically
+ fill the title with the label of the activity with the corresponding action.
+ If there is not an activity for an action, the item will be removed from the
+ list. -->
+
+ <!-- Copyright information -->
+ <com.android.tv.settings.compat.TsPreference
+ android:key="copyright"
+ android:title="@string/copyright_title">
+ <intent android:action="android.settings.COPYRIGHT" />
+ </com.android.tv.settings.compat.TsPreference>
+
+ <!-- License information -->
+ <com.android.tv.settings.compat.TsPreference
+ android:key="license"
+ android:title="@string/license_title">
+ <intent android:action="android.settings.LICENSE" />
+ </com.android.tv.settings.compat.TsPreference>
+
+ <!-- Terms and conditions -->
+ <com.android.tv.settings.compat.TsPreference
+ android:key="terms"
+ android:title="@string/terms_title">
+ <intent android:action="android.settings.TERMS" />
+ </com.android.tv.settings.compat.TsPreference>
+
+ <!-- System WebView License information -->
+ <com.android.tv.settings.compat.TsPreference
+ android:key="webview_license"
+ android:title="@string/webview_license_title">
+ <intent android:action="android.settings.WEBVIEW_LICENSE" />
+ </com.android.tv.settings.compat.TsPreference>
+
+ <com.android.tv.settings.about.ConsumerInformationDialogPreferenceCompat
+ android:key="consumer_information"
+ android:title="@string/consumer_information_title"/>
+
+ <!-- TODO: remove this once Google Settings is implemented for TV -->
+ <com.android.tv.settings.compat.TsPreference
+ android:key="ads"
+ android:title="@string/about_ads">
+ <intent android:action="com.google.android.gms.settings.ADS_PRIVACY" />
+ </com.android.tv.settings.compat.TsPreference>
+
+</PreferenceScreen>
diff --git a/Settings/res/xml/accessibility.xml b/Settings/res/xml/accessibility.xml
index c56dc53..72e6926 100644
--- a/Settings/res/xml/accessibility.xml
+++ b/Settings/res/xml/accessibility.xml
@@ -43,6 +43,13 @@
android:title="@string/accessibility_shortcut"
android:fragment="com.android.tv.settings.accessibility.AccessibilityShortcutFragment"/>
+ <com.android.tv.settings.widget.SwitchWithSoundPreference
+ android:key="toggle_audio_description"
+ android:persistent="true"
+ android:title="@string/accessibility_toggle_audio_description_preference_title"
+ android:summary="@string/accessibility_audio_description_summary"/>
+
+
<PreferenceCategory
android:key="system_accessibility_services"
android:title="@string/system_services"/>
diff --git a/Settings/res/xml/accessibility_compat.xml b/Settings/res/xml/accessibility_compat.xml
new file mode 100644
index 0000000..4e0c6a3
--- /dev/null
+++ b/Settings/res/xml/accessibility_compat.xml
@@ -0,0 +1,56 @@
+<?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"
+ android:title="@string/system_accessibility">
+
+ <com.android.tv.settings.compat.TsPreference
+ android:key="captions"
+ android:title="@string/accessibility_captions">
+ <intent
+ android:action="android.intent.action.MAIN"
+ android:targetClass="com.android.tv.settings.system.CaptionSetupActivity"
+ android:targetPackage="com.android.tv.settings"/>
+ </com.android.tv.settings.compat.TsPreference>
+
+ <com.android.tv.settings.compat.TsSwitchWithSoundPreference
+ android:key="toggle_high_text_contrast"
+ android:persistent="true"
+ android:title="@string/accessibility_toggle_high_text_contrast_preference_title"
+ android:summary="@string/experimental_preference"/>
+
+ <com.android.tv.settings.compat.TsPreference
+ android:key="text_to_speech"
+ android:title="@string/system_accessibility_tts_output"
+ android:fragment="com.android.tv.settings.system.TextToSpeechFragment"/>
+
+ <com.android.tv.settings.compat.TsPreference
+ android:key="accessibility_shortcut"
+ android:title="@string/accessibility_shortcut"
+ android:fragment="com.android.tv.settings.accessibility.AccessibilityShortcutFragmentCompat"/>
+
+ <com.android.tv.settings.compat.TsSwitchWithSoundPreference
+ android:key="toggle_audio_description"
+ android:persistent="true"
+ android:title="@string/accessibility_toggle_audio_description_preference_title"
+ android:summary="@string/accessibility_audio_description_summary"/>
+
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="system_accessibility_services"
+ android:title="@string/system_services"/>
+
+</PreferenceScreen>
diff --git a/Settings/res/xml/accessibility_service_compat.xml b/Settings/res/xml/accessibility_service_compat.xml
new file mode 100644
index 0000000..0b4adf6
--- /dev/null
+++ b/Settings/res/xml/accessibility_service_compat.xml
@@ -0,0 +1,20 @@
+<?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" >
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="screen"/>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/Settings/res/xml/accessibility_shortcut_compat.xml b/Settings/res/xml/accessibility_shortcut_compat.xml
new file mode 100644
index 0000000..ed2b221
--- /dev/null
+++ b/Settings/res/xml/accessibility_shortcut_compat.xml
@@ -0,0 +1,34 @@
+<?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"
+ android:title="@string/accessibility_shortcut">
+ <com.android.tv.settings.compat.TsSwitchWithSoundPreference
+ android:key="enable"
+ android:persistent="true"
+ android:title="@string/accessibility_shortcut_enable" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="service"
+ android:persistent="true"
+ android:title="@string/accessibility_shortcut_service"
+ android:fragment="com.android.tv.settings.accessibility.AccessibilityShortcutServiceFragmentCompat"/>
+ <com.android.tv.settings.compat.TsPreference
+ android:enabled="false"
+ android:selectable="false"
+ android:title="@string/accessibility_shortcut_description"
+ android:singleLineTitle="false" />
+</PreferenceScreen>
diff --git a/Settings/res/xml/accessibility_shortcut_service_compat.xml b/Settings/res/xml/accessibility_shortcut_service_compat.xml
new file mode 100644
index 0000000..12c81f1
--- /dev/null
+++ b/Settings/res/xml/accessibility_shortcut_service_compat.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.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/accessibility_shortcut_service" >
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="screen"/>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/Settings/res/xml/adb_wireless_settings.xml b/Settings/res/xml/adb_wireless_settings.xml
new file mode 100644
index 0000000..728628e
--- /dev/null
+++ b/Settings/res/xml/adb_wireless_settings.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:title="@string/enable_adb_wireless">
+
+ <!-- ADB wireless disable/enable option -->
+ <PreferenceCategory
+ android:key="adb_wireless_selection_option">
+ <com.android.tv.settings.RadioPreference
+ android:key="adb_wireless_selection_disable"
+ android:title="@string/disabled"
+ app:radioGroup="adb_wireless_selection_option" />
+ <com.android.tv.settings.RadioPreference
+ android:key="adb_wireless_selection_enable"
+ android:title="@string/enabled"
+ app:radioGroup="adb_wireless_selection_option" />
+ </PreferenceCategory>
+
+ <!-- Pairing code -->
+ <Preference
+ android:key="adb_pair_method_code_pref"
+ android:title="@string/adb_pair_method_code_title"
+ android:fragment="com.android.tv.settings.system.development.WirelessDebuggingFragment$PairingCodeFragment" />
+
+ <!-- ADB device name -->
+ <Preference
+ android:key="adb_device_name_pref"
+ android:title="@string/device_name"
+ android:selectable="false" />
+
+ <!-- IP address & port -->
+ <Preference
+ android:key="adb_ip_addr_pref"
+ android:title="@string/adb_wireless_ip_addr_preference_title"
+ android:selectable="false" />
+
+ <!-- Paired devices list -->
+ <PreferenceCategory
+ android:key="adb_paired_devices_category"
+ android:title="@string/adb_paired_devices_title" />
+</PreferenceScreen>
diff --git a/Settings/res/xml/advanced_display_compat.xml b/Settings/res/xml/advanced_display_compat.xml
new file mode 100644
index 0000000..113168f
--- /dev/null
+++ b/Settings/res/xml/advanced_display_compat.xml
@@ -0,0 +1,35 @@
+<?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:custom="http://schemas.android.com/apk/res-auto"
+ android:title="@string/advanced_display_settings_title">
+ <com.android.tv.settings.compat.TsSwitchPreference
+ android:key="game_mode"
+ android:persistent="true"
+ android:title="@string/game_mode_title"/>
+ <com.android.tv.settings.compat.TsPreference
+ android:fragment="com.android.tv.settings.device.displaysound.HdrFormatSelectionFragmentCompat"
+ android:key="hdr_format_selection"
+ android:persistent="true"
+ android:title="@string/hdr_format_selection_title"/>
+ <com.android.tv.settings.compat.TsPreference
+ android:fragment="com.android.tv.settings.device.displaysound.ResolutionSelectionFragmentCompat"
+ android:key="resolution_selection"
+ android:persistent="true"
+ android:title="@string/resolution_selection_title"/>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/Settings/res/xml/advanced_volume_compat.xml b/Settings/res/xml/advanced_volume_compat.xml
new file mode 100644
index 0000000..9bb65c8
--- /dev/null
+++ b/Settings/res/xml/advanced_volume_compat.xml
@@ -0,0 +1,30 @@
+<?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:app="http://schemas.android.com/apk/res-auto"
+ android:title="@string/surround_sound_select_formats">
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="advanced_sound_settings_option">
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="surround_sound_format_info">
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="surround_sound_format_info_on_manual">
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+</PreferenceScreen>
diff --git a/Settings/res/xml/alarms_and_reminders_compat.xml b/Settings/res/xml/alarms_and_reminders_compat.xml
new file mode 100644
index 0000000..eb5b573
--- /dev/null
+++ b/Settings/res/xml/alarms_and_reminders_compat.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.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/alarms_and_reminders_title">
+ <com.android.tv.settings.compat.TsPreference
+ android:key="header"
+ android:title="@string/alarms_and_reminders_description"
+ android:singleLineTitle="false"
+ android:selectable="false" />
+
+</PreferenceScreen>
diff --git a/Settings/res/xml/all_apps_compat.xml b/Settings/res/xml/all_apps_compat.xml
new file mode 100644
index 0000000..eb7cbc5
--- /dev/null
+++ b/Settings/res/xml/all_apps_compat.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.
+ -->
+
+<android:PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/all_apps_title">
+
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="InstalledPreferenceGroup"
+ android:title="@string/all_apps_installed" />
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="DisabledPreferenceGroup"
+ android:title="@string/all_apps_disabled"
+ android:visible="false" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="ShowOtherApps"
+ android:title="@string/all_apps_show_system_apps"/>
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="OtherPreferenceGroup"
+ android:title="@string/all_apps_other"
+ android:visible="false" />
+
+</android:PreferenceScreen>
diff --git a/Settings/res/xml/all_files_access.xml b/Settings/res/xml/all_files_access.xml
new file mode 100644
index 0000000..27d4d17
--- /dev/null
+++ b/Settings/res/xml/all_files_access.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.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/permit_manage_external_storage">
+ <Preference
+ android:key="header"
+ android:title="@string/allow_manage_external_storage_description"
+ android:singleLineTitle="false"
+ android:selectable="false" />
+
+</PreferenceScreen>
diff --git a/Settings/res/xml/app_management_compat.xml b/Settings/res/xml/app_management_compat.xml
new file mode 100644
index 0000000..e16dea3
--- /dev/null
+++ b/Settings/res/xml/app_management_compat.xml
@@ -0,0 +1,45 @@
+<?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"
+ android:title="@string/applications_category_title">
+
+ <com.android.tv.settings.compat.TsPreference
+ android:key="version" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="open" />
+ <com.android.tv.settings.compat.TsRestrictedPreference
+ android:key="forceStop" />
+ <com.android.tv.settings.compat.TsRestrictedPreference
+ android:key="uninstall" />
+ <com.android.tv.settings.compat.TsRestrictedPreference
+ android:key="enableDisable" />
+ <com.android.tv.settings.compat.TsRestrictedPreference
+ android:key="appStorage" />
+ <com.android.tv.settings.compat.TsRestrictedPreference
+ android:key="clearData" />
+ <com.android.tv.settings.compat.TsRestrictedPreference
+ android:key="clearCache" />
+ <com.android.tv.settings.compat.TsRestrictedPreference
+ android:key="clearDefaults" />
+ <com.android.tv.settings.compat.TsSwitchPreference
+ android:key="notifications" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="permissions" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="licenses" />
+</PreferenceScreen>
diff --git a/Settings/res/xml/app_usage_access_compat.xml b/Settings/res/xml/app_usage_access_compat.xml
new file mode 100644
index 0000000..41ba1d6
--- /dev/null
+++ b/Settings/res/xml/app_usage_access_compat.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"
+ android:title="@string/high_power_apps">
+ <com.android.tv.settings.compat.TsPreference
+ android:key="header"
+ android:singleLineTitle="false"
+ android:title="@string/usage_access_description"
+ android:selectable="false" />
+</PreferenceScreen>
diff --git a/Settings/res/xml/apps.xml b/Settings/res/xml/apps.xml
index 988d8c3..950913d 100644
--- a/Settings/res/xml/apps.xml
+++ b/Settings/res/xml/apps.xml
@@ -30,6 +30,12 @@
android:title="@string/apps_see_all_apps"
android:fragment="com.android.tv.settings.device.apps.AllAppsFragment" />
+ <Preference
+ android:key="see_unused_apps"
+ android:title="@string/unused_apps">
+ <intent android:action="android.intent.action.MANAGE_UNUSED_APPS"/>
+ </Preference>
+
<PreferenceCategory
android:key="permissions"
android:title="@string/apps_permissions_category_title">
diff --git a/Settings/res/xml/apps_compat.xml b/Settings/res/xml/apps_compat.xml
new file mode 100644
index 0000000..7823589
--- /dev/null
+++ b/Settings/res/xml/apps_compat.xml
@@ -0,0 +1,54 @@
+<?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"
+ android:title="@string/applications_category_title">
+
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="recently_used_apps_category"
+ android:title="@string/apps_recently_used_category_title">
+ <!-- Placeholder for a list of recent apps -->
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+
+ <!-- See all apps button -->
+ <com.android.tv.settings.compat.TsPreference
+ android:key="see_all_apps"
+ android:title="@string/apps_see_all_apps"
+ android:fragment="com.android.tv.settings.device.apps.AllAppsFragmentCompat"/>
+
+ <TsPreference
+ android:key="see_unused_apps"
+ android:title="@string/unused_apps">
+ <intent android:action="android.intent.action.MANAGE_UNUSED_APPS"/>
+ </TsPreference>
+
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="permissions"
+ android:title="@string/apps_permissions_category_title">
+
+ <com.android.tv.settings.compat.TsPreference
+ android:key="Permissions"
+ android:title="@string/device_apps_permissions">
+ <intent android:action="android.intent.action.MANAGE_PERMISSIONS"/>
+ </com.android.tv.settings.compat.TsPreference>
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+
+ <com.android.tv.settings.compat.TsPreference
+ android:key="special_access"
+ android:title="@string/special_access"
+ android:fragment="com.android.tv.settings.device.apps.specialaccess.SpecialAppAccessCompat"/>
+</PreferenceScreen>
diff --git a/Settings/res/xml/apps_x.xml b/Settings/res/xml/apps_x.xml
index 06e4689..65b54f1 100644
--- a/Settings/res/xml/apps_x.xml
+++ b/Settings/res/xml/apps_x.xml
@@ -31,6 +31,12 @@
android:title="@string/apps_see_all_apps"
android:fragment="com.android.tv.settings.device.apps.AllAppsFragment" />
+ <Preference
+ android:key="see_unused_apps"
+ android:title="@string/unused_apps">
+ <intent android:action="android.intent.action.MANAGE_UNUSED_APPS"/>
+ </Preference>
+
<PreferenceCategory
android:key="permissions"
android:title="@string/apps_permissions_category_title">
diff --git a/Settings/res/xml/available_virtual_keyboard_compat.xml b/Settings/res/xml/available_virtual_keyboard_compat.xml
new file mode 100644
index 0000000..5da7630
--- /dev/null
+++ b/Settings/res/xml/available_virtual_keyboard_compat.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.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/available_virtual_keyboard_category">
+
+</PreferenceScreen>
diff --git a/Settings/res/xml/date_time_compat.xml b/Settings/res/xml/date_time_compat.xml
new file mode 100644
index 0000000..690e966
--- /dev/null
+++ b/Settings/res/xml/date_time_compat.xml
@@ -0,0 +1,50 @@
+<?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:app="http://schemas.android.com/apk/res-auto"
+ android:title="@string/system_date_time">
+ <com.android.tv.settings.compat.TsListPreference android:key="auto_date_time"
+ android:persistent="true"
+ android:title="@string/system_auto_date_time"
+ android:summary="%s"
+ android:entries="@array/auto_date_time_entries"
+ android:entryValues="@array/auto_date_time_entry_values" />
+
+ <com.android.tv.settings.compat.TsLeanbackPickerDialogPreference
+ android:key="set_date"
+ android:persistent="true"
+ android:title="@string/system_set_date"
+ app:pickerType="date" />
+
+ <com.android.tv.settings.compat.TsLeanbackPickerDialogPreference
+ android:key="set_time"
+ android:persistent="true"
+ android:title="@string/system_set_time"
+ app:pickerType="time" />
+
+ <com.android.tv.settings.compat.TsPreference android:key="set_time_zone"
+ android:persistent="true"
+ android:title="@string/system_set_time_zone"
+ android:fragment="com.android.tv.settings.system.TimeZoneFragment" />
+
+ <com.android.tv.settings.compat.TsSwitchWithSoundPreference
+ android:key="use_24_hour"
+ android:persistent="true"
+ android:title="@string/system_set_time_format" />
+
+</PreferenceScreen>
diff --git a/Settings/res/xml/daydream_compat.xml b/Settings/res/xml/daydream_compat.xml
new file mode 100644
index 0000000..f5e5a3e
--- /dev/null
+++ b/Settings/res/xml/daydream_compat.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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"
+ android:title="@string/device_daydream">
+
+ <!-- TODO: use a custom fragment here to add icon and other chrome -->
+ <com.android.tv.settings.compat.TsListPreference
+ android:key="activeDream"
+ android:persistent="true"
+ android:title="@string/device_daydreams_select"
+ android:summary="%s"
+ android:dialogTitle="@string/device_daydreams_select" />
+
+ <com.android.tv.settings.compat.TsListPreference
+ android:key="dreamTime"
+ android:persistent="true"
+ android:title="@string/device_daydreams_sleep"
+ android:summary="@string/device_daydreams_sleep_summary"
+ android:entries="@array/sleep_timeout_entries"
+ android:entryValues="@array/sleep_timeout_values" />
+
+ <com.android.tv.settings.compat.TsPreference
+ android:key="dreamNow"
+ android:persistent="true"
+ android:title="@string/device_daydreams_test" />
+
+</PreferenceScreen>
diff --git a/Settings/res/xml/development_prefs.xml b/Settings/res/xml/development_prefs.xml
index 3a26938..b720b9d 100644
--- a/Settings/res/xml/development_prefs.xml
+++ b/Settings/res/xml/development_prefs.xml
@@ -72,13 +72,6 @@
<!-- TODO: implement this -->
<!--android:fragment="com.android.settings.applications.RunningServices" />-->
- <PreferenceScreen
- android:key="convert_to_file_encryption"
- android:title="@string/convert_to_file_encryption"
- android:summary="@string/convert_to_file_encryption_enabled" />
- <!-- TODO: implement this-->
- <!--android:fragment="com.android.settings.applications.ConvertToFbe" />-->
-
<com.android.tv.settings.system.development.ColorModePreference
android:key="color_mode"
android:title="@string/picture_color_mode"
@@ -98,6 +91,11 @@
android:title="@string/clear_adb_keys"
android:fragment="com.android.tv.settings.system.development.AdbKeysDialog" />
+ <Preference
+ android:key="toggle_adb_wireless"
+ android:title="@string/enable_adb_wireless"
+ android:fragment="com.android.tv.settings.system.development.WirelessDebuggingFragment" />
+
<com.android.tv.settings.widget.SwitchWithSoundPreference
android:key="enable_terminal"
android:title="@string/enable_terminal_title"
diff --git a/Settings/res/xml/device.xml b/Settings/res/xml/device.xml
index f13c431..f719658 100644
--- a/Settings/res/xml/device.xml
+++ b/Settings/res/xml/device.xml
@@ -16,6 +16,7 @@
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:custom="http://schemas.android.com/apk/res-auto"
android:title="@string/device_pref_category_title">
<Preference
android:fragment="com.android.tv.settings.about.AboutFragment"
@@ -65,6 +66,13 @@
android:title="@string/system_cast" >
<intent android:action="com.google.android.settings.CAST_RECEIVER_SETTINGS" />
</Preference>
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:icon="@drawable/ic_devices_other"
+ android:key="fastpair_slice"
+ android:title="@string/device_fastpair"
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ custom:isPreferenceVisible="false"
+ custom:uri="@string/fastpair_slice_uri"/>
<Preference
android:fragment="com.android.tv.settings.device.display.daydream.DaydreamFragment"
android:icon="@drawable/ic_settings_system_daydream"
@@ -92,7 +100,7 @@
android:fragment="com.android.tv.settings.privacy.SensorFragment" />
<Preference
android:key="camera"
- android:icon="@drawable/ic_camera"
+ android:icon="@drawable/ic_camera_on"
android:title="@string/camera"
android:fragment="com.android.tv.settings.privacy.SensorFragment" />
<Preference
@@ -102,6 +110,13 @@
<intent
android:action="com.google.android.settings.USAGE_AND_DIAGNOSTICS_SETTING"/>
</Preference>
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:icon="@drawable/ic_internal_settings"
+ android:key="overlay_internal"
+ android:title="@string/overlay_internal_slice_title"
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ custom:isPreferenceVisible="false"
+ custom:uri="@string/overlay_internal_slice_uri"/>
<Preference
android:fragment="com.android.tv.settings.accessibility.AccessibilityFragment"
android:icon="@drawable/ic_accessibility_new"
@@ -112,4 +127,4 @@
android:key="reboot"
android:title="@string/restart_button_label"
android:fragment="com.android.tv.settings.about.RebootConfirmFragment" />
-</PreferenceScreen>
\ No newline at end of file
+</PreferenceScreen>
diff --git a/Settings/res/xml/device_info_settings_x.xml b/Settings/res/xml/device_info_settings_x.xml
index c95a136..c7ec4b7 100644
--- a/Settings/res/xml/device_info_settings_x.xml
+++ b/Settings/res/xml/device_info_settings_x.xml
@@ -27,7 +27,7 @@
</Preference>
<!-- System update settings - launches activity -->
- <com.android.tv.twopanelsettings.slices.CustomContentDescriptionPreference
+ <com.android.tv.twopanelsettings.slices.CustomContentDescriptionRestrictedPreference
android:key="system_update_settings"
android:title="@string/about_system_update"
android:fragment="com.android.tv.settings.about.SystemUpdateInfoFragment" />
@@ -44,7 +44,7 @@
<intent android:action="android.settings.DEVICE_NAME" />
</Preference>
- <com.android.tv.twopanelsettings.slices.CustomContentDescriptionPreference
+ <com.android.tv.twopanelsettings.slices.CustomContentDescriptionRestrictedPreference
android:key="reset"
android:title="@string/device_reset"
android:fragment="com.android.tv.settings.about.FactoryResetInfoFragment"
diff --git a/Settings/res/xml/device_two_panel.xml b/Settings/res/xml/device_two_panel.xml
index 49b9bae..e7ed21f 100644
--- a/Settings/res/xml/device_two_panel.xml
+++ b/Settings/res/xml/device_two_panel.xml
@@ -16,6 +16,7 @@
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:custom="http://schemas.android.com/apk/res-auto"
android:title="@string/device_pref_category_title">
<Preference
android:fragment="com.android.tv.settings.about.AboutFragment"
@@ -68,6 +69,20 @@
android:icon="@drawable/ic_accessibility_new"
android:key="accessibility"
android:title="@string/system_accessibility"/>
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:icon="@drawable/ic_internal_settings"
+ android:key="overlay_internal"
+ android:title="@string/overlay_internal_slice_title"
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ custom:isPreferenceVisible="false"
+ custom:uri="@string/overlay_internal_slice_uri"/>
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:icon="@drawable/ic_devices_other"
+ android:key="fastpair_slice"
+ android:title="@string/device_fastpair"
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ custom:isPreferenceVisible="false"
+ custom:uri="@string/fastpair_slice_uri"/>
<com.android.tv.settings.LongClickPreference
android:icon="@drawable/ic_restart_alt"
android:key="reboot"
diff --git a/Settings/res/xml/device_vendor.xml b/Settings/res/xml/device_vendor.xml
index 3f8f610..704ddad 100644
--- a/Settings/res/xml/device_vendor.xml
+++ b/Settings/res/xml/device_vendor.xml
@@ -76,6 +76,27 @@
android:key="cast_settings"
android:title="@string/cast_settings_title"
custom:uri="@string/cast_settings_slice_uri"/>
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ android:icon="@drawable/ic_assistant_broadcast"
+ android:key="assistant_broadcast"
+ custom:isPreferenceVisible="false"
+ android:title="@string/assistant_broadcast_title"
+ custom:uri="@string/assistant_broadcast_slice_uri"/>
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:icon="@drawable/ic_internal_settings"
+ android:key="overlay_internal"
+ android:title="@string/overlay_internal_slice_title"
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ custom:isPreferenceVisible="false"
+ custom:uri="@string/overlay_internal_slice_uri"/>
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:icon="@drawable/ic_devices_other"
+ android:key="fastpair_slice"
+ android:title="@string/device_fastpair"
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ custom:isPreferenceVisible="false"
+ custom:uri="@string/fastpair_slice_uri"/>
<com.android.tv.settings.widget.SwitchWithSoundPreference
android:key="sound_effects_switch"
android:icon="@drawable/ic_system_sound"
diff --git a/Settings/res/xml/device_x.xml b/Settings/res/xml/device_x.xml
index bf680f8..0456cca 100644
--- a/Settings/res/xml/device_x.xml
+++ b/Settings/res/xml/device_x.xml
@@ -75,6 +75,27 @@
android:key="cast_settings"
android:title="@string/cast_settings_title"
custom:uri="@string/cast_settings_slice_uri"/>
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ android:icon="@drawable/ic_assistant_broadcast"
+ android:key="assistant_broadcast"
+ android:title="@string/assistant_broadcast_title"
+ custom:isPreferenceVisible="false"
+ custom:uri="@string/assistant_broadcast_slice_uri"/>
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:icon="@drawable/ic_internal_settings"
+ android:key="overlay_internal"
+ android:title="@string/overlay_internal_slice_title"
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ custom:isPreferenceVisible="false"
+ custom:uri="@string/overlay_internal_slice_uri"/>
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:icon="@drawable/ic_devices_other"
+ android:key="fastpair_slice"
+ android:title="@string/device_fastpair"
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ custom:isPreferenceVisible="false"
+ custom:uri="@string/fastpair_slice_uri"/>
<com.android.tv.settings.LongClickPreference
android:fragment="com.android.tv.settings.about.RebootConfirmFragment"
android:icon="@drawable/ic_restart_alt"
diff --git a/Settings/res/xml/display_sound.xml b/Settings/res/xml/display_sound.xml
index ba7ef50..7daf222 100644
--- a/Settings/res/xml/display_sound.xml
+++ b/Settings/res/xml/display_sound.xml
@@ -37,6 +37,11 @@
android:key="match_content_frame_rate"
android:title="@string/match_content_frame_rate_title"/>
<Preference
+ android:fragment="com.android.tv.settings.device.displaysound.ResolutionSelectionFragment"
+ android:key="resolution_selection"
+ android:persistent="true"
+ android:title="@string/resolution_selection_title"/>
+ <Preference
android:key="advanced_display_settings"
android:title="@string/advanced_display_settings_title"
android:fragment="com.android.tv.settings.device.displaysound.AdvancedDisplayFragment" />
@@ -47,6 +52,12 @@
android:key="sound_effects"
android:persistent="true"
android:title="@string/device_sound_effects"/>
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:key="default_audio_output_settings"
+ android:title="@string/default_audio_output_settings_title"
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ custom:uri="@string/default_audio_output_settings_slice_uri"
+ custom:isPreferenceVisible="false" />
<Preference
android:key="advanced_sound_settings"
android:title="@string/advanced_sound_settings_title"
diff --git a/Settings/res/xml/display_sound_compat.xml b/Settings/res/xml/display_sound_compat.xml
new file mode 100644
index 0000000..7892d60
--- /dev/null
+++ b/Settings/res/xml/display_sound_compat.xml
@@ -0,0 +1,54 @@
+<?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:custom="http://schemas.android.com/apk/res-auto"
+ android:title="@string/device_display_sound">
+
+ <com.android.tv.settings.compat.TsSlicePreference
+ android:key="cec"
+ android:title="@string/hdmi_cec_settings_title"
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ custom:uri="@string/cec_settings_slice_uri"
+ custom:isPreferenceVisible="false" />
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="display_category"
+ android:title="@string/display_category_title" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="font_scale"
+ android:title="@string/font_scale_settings_title"
+ android:fragment="com.android.tv.settings.device.displaysound.FontScalePreferenceFragmentCompat" />
+ <com.android.tv.settings.compat.TsPreference
+ android:fragment="com.android.tv.settings.device.displaysound.MatchContentRateFragmentCompat"
+ android:key="match_content_frame_rate"
+ android:title="@string/match_content_frame_rate_title"/>
+ <com.android.tv.settings.compat.TsPreference
+ android:key="advanced_display_settings"
+ android:title="@string/advanced_display_settings_title"
+ android:fragment="com.android.tv.settings.device.displaysound.AdvancedDisplayFragmentCompat" />
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="sound_category"
+ android:title="@string/device_sound" />
+ <com.android.tv.settings.compat.TsSwitchPreference
+ android:key="sound_effects"
+ android:persistent="true"
+ android:title="@string/device_sound_effects"/>
+ <com.android.tv.settings.compat.TsPreference
+ android:key="advanced_sound_settings"
+ android:title="@string/advanced_sound_settings_title"
+ android:fragment="com.android.tv.settings.device.displaysound.AdvancedVolumeFragmentCompat" />
+</PreferenceScreen>
diff --git a/Settings/res/xml/display_sound_x.xml b/Settings/res/xml/display_sound_x.xml
index 2294ed2..0b5711e 100644
--- a/Settings/res/xml/display_sound_x.xml
+++ b/Settings/res/xml/display_sound_x.xml
@@ -47,6 +47,11 @@
android:key="match_content_frame_rate"
android:title="@string/match_content_frame_rate_title"/>
<Preference
+ android:fragment="com.android.tv.settings.device.displaysound.ResolutionSelectionFragment"
+ android:key="resolution_selection"
+ android:persistent="true"
+ android:title="@string/resolution_selection_title"/>
+ <Preference
android:key="advanced_display_settings"
android:title="@string/advanced_display_settings_title"
android:fragment="com.android.tv.settings.device.displaysound.AdvancedDisplayFragment" />
@@ -57,6 +62,12 @@
android:key="sound_effects"
android:persistent="true"
android:title="@string/device_sound_effects"/>
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:key="default_audio_output_settings"
+ android:title="@string/default_audio_output_settings_title"
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ custom:uri="@string/default_audio_output_settings_slice_uri"
+ custom:isPreferenceVisible="false" />
<Preference
android:key="advanced_sound_settings"
android:title="@string/advanced_sound_settings_title"
diff --git a/Settings/res/xml/energy_saver_compat.xml b/Settings/res/xml/energy_saver_compat.xml
new file mode 100644
index 0000000..2356f81
--- /dev/null
+++ b/Settings/res/xml/energy_saver_compat.xml
@@ -0,0 +1,34 @@
+<?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/device_energy_saver">
+
+ <com.android.tv.settings.compat.TsListPreference
+ android:key="sleepTime"
+ android:persistent="true"
+ android:title="@string/device_energy_saver_screen_off"/>
+
+ <com.android.tv.settings.compat.TsRestrictedSwitchPreference
+ android:key="allowTurnScreenOff"
+ android:persistent="true"
+ android:title="@string/device_energy_saver_allow_turning_screen_off"
+ android:summary="@string/device_energy_saver_allow_turning_screen_off_description"
+ settings:userRestriction="no_config_screen_timeout" />
+
+</PreferenceScreen>
diff --git a/Settings/res/xml/font_scale_compat.xml b/Settings/res/xml/font_scale_compat.xml
new file mode 100644
index 0000000..3b33991
--- /dev/null
+++ b/Settings/res/xml/font_scale_compat.xml
@@ -0,0 +1,20 @@
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT 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:app="http://schemas.android.com/apk/res-auto"
+ android:title="@string/font_scale_settings_title">
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/Settings/res/xml/free_up_storage.xml b/Settings/res/xml/free_up_storage.xml
new file mode 100644
index 0000000..6b51aac
--- /dev/null
+++ b/Settings/res/xml/free_up_storage.xml
@@ -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.
+ -->
+
+<android:PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/storage_free_up">
+ <com.android.tv.settings.device.storage.ClearCachedDataPreference
+ android:key="ClearCachedData"
+ android:title="@string/storage_free_up_clear_cached_data" />
+ <Preference
+ android:key="StorageUninstallApps"
+ android:title="@string/storage_free_up_uninstall_apps"
+ android:fragment="com.android.tv.settings.device.storage.StorageUninstallAppsFragment" />
+</android:PreferenceScreen>
diff --git a/Settings/res/xml/hdr_format_selection_compat.xml b/Settings/res/xml/hdr_format_selection_compat.xml
new file mode 100644
index 0000000..a15e118
--- /dev/null
+++ b/Settings/res/xml/hdr_format_selection_compat.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.
+ -->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:title="@string/hdr_format_selection_title"
+ android:key="hdr_format_selection_screen" >
+
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="hdr_format_selection_option">
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="hdr_format_info">
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="hdr_format_info_on_manual">
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+</PreferenceScreen>
diff --git a/Settings/res/xml/keyboard.xml b/Settings/res/xml/keyboard.xml
index 712e89f..db0793b 100644
--- a/Settings/res/xml/keyboard.xml
+++ b/Settings/res/xml/keyboard.xml
@@ -53,4 +53,7 @@
</PreferenceCategory>
+ <!-- Physical keyboard setting is inserted here with order=5 if any physical keyboards are
+ present -->
+
</PreferenceScreen>
diff --git a/Settings/res/xml/keyboard_compat.xml b/Settings/res/xml/keyboard_compat.xml
new file mode 100644
index 0000000..ff38043
--- /dev/null
+++ b/Settings/res/xml/keyboard_compat.xml
@@ -0,0 +1,54 @@
+<?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"
+ android:title="@string/system_keyboard_autofill">
+
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="keyboardCategory"
+ android:order="0"
+ android:title="@string/system_keyboard">
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+
+ <com.android.tv.settings.compat.TsListPreference
+ android:key="currentKeyboard"
+ android:order="1"
+ android:dialogTitle="@string/title_current_keyboard"
+ android:title="@string/title_current_keyboard"
+ android:summary="%s" />
+
+ <!-- List of input methods are inserted here with order=2 -->
+
+ <com.android.tv.settings.compat.TsPreference
+ android:key="manageKeyboards"
+ android:fragment="com.android.tv.settings.inputmethod.AvailableVirtualKeyboardFragmentCompat"
+ android:order="3"
+ android:title="@string/manage_keyboards"/>
+
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:order="4"
+ android:key="autofillCategory"
+ android:title="@string/system_autofill">
+
+ <com.android.tv.settings.compat.TsPreference
+ android:key="currentAutofill"
+ android:title="@string/title_current_autofill_service"
+ android:summary="%s" />
+
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+
+</PreferenceScreen>
diff --git a/Settings/res/xml/language_compat.xml b/Settings/res/xml/language_compat.xml
new file mode 100644
index 0000000..8b4094d
--- /dev/null
+++ b/Settings/res/xml/language_compat.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.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/system_language">
+
+</PreferenceScreen>
diff --git a/Settings/res/xml/location_compat.xml b/Settings/res/xml/location_compat.xml
new file mode 100644
index 0000000..d668e82
--- /dev/null
+++ b/Settings/res/xml/location_compat.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.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/system_location">
+
+ <com.android.tv.settings.compat.TsListPreference
+ android:key="locationMode"/>
+ <com.android.tv.settings.compat.TsSwitchPreference
+ android:key="wifi_always_scan" />
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="recent_location_requests">
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+</PreferenceScreen>
diff --git a/Settings/res/xml/main_prefs_vendor.xml b/Settings/res/xml/main_prefs_vendor.xml
index e246ac9..e6fe984 100644
--- a/Settings/res/xml/main_prefs_vendor.xml
+++ b/Settings/res/xml/main_prefs_vendor.xml
@@ -47,6 +47,15 @@
android:fragment="com.android.tv.settings.vendor.ChannelsAndInputFragment">
<!-- This is an example. Change to your intent for display and preview-->
</Preference>
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:icon="@drawable/ic_photo_size_select_actual"
+ android:key="channels_and_inputs_slice"
+ android:title="@string/channels_and_inputs_title"
+ android:summary="@string/channels_and_inputs_summary"
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ custom:isPreferenceVisible="false"
+ custom:uri="@string/channels_and_inputs_slice_uri">
+ </com.android.tv.twopanelsettings.slices.SlicePreference>
<Preference
android:icon="@drawable/ic_photo_size_select_actual"
diff --git a/Settings/res/xml/main_prefs_x.xml b/Settings/res/xml/main_prefs_x.xml
index f6d66ae..5472395 100644
--- a/Settings/res/xml/main_prefs_x.xml
+++ b/Settings/res/xml/main_prefs_x.xml
@@ -39,6 +39,23 @@
android:key="general_settings"
android:title="@string/header_category_general_settings"
android:order="2">
+
+ <com.android.tv.twopanelsettings.slices.SlicePreference
+ android:icon="@drawable/ic_photo_size_select_actual"
+ android:key="channels_and_inputs_slice"
+ android:title="@string/channels_and_inputs_title"
+ android:summary="@string/channels_and_inputs_summary"
+ android:fragment="com.android.tv.twopanelsettings.slices.SliceFragment"
+ custom:isPreferenceVisible="false"
+ custom:uri="@string/channels_and_inputs_slice_uri">
+ </com.android.tv.twopanelsettings.slices.SlicePreference>
+
+ <Preference
+ android:icon="@drawable/ic_photo_size_select_actual"
+ android:key="display_and_sound"
+ android:title="@string/device_display_sound"
+ android:fragment="com.android.tv.settings.device.displaysound.DisplaySoundFragment"
+ custom:isPreferenceVisible="false" />
<Preference
android:icon="@drawable/ic_network"
android:key="network"
@@ -75,12 +92,6 @@
android:fragment="com.android.tv.settings.privacy.PrivacyFragment"
custom:isPreferenceVisible="false" />
<Preference
- android:icon="@drawable/ic_photo_size_select_actual"
- android:key="display_and_sound"
- android:title="@string/device_display_sound"
- android:fragment="com.android.tv.settings.device.displaysound.DisplaySoundFragment"
- custom:isPreferenceVisible="false" />
- <Preference
android:icon="@drawable/ic_applications"
android:key="applications"
android:title="@string/applications_category_title"
diff --git a/Settings/res/xml/manage_high_power_compat.xml b/Settings/res/xml/manage_high_power_compat.xml
new file mode 100644
index 0000000..f34ffcc
--- /dev/null
+++ b/Settings/res/xml/manage_high_power_compat.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"
+ android:title="@string/high_power_apps">
+ <com.android.tv.settings.compat.TsPreference
+ android:key="header"
+ android:title="@string/high_power_apps_description"
+ android:singleLineTitle="false"
+ android:selectable="false" />
+</PreferenceScreen>
diff --git a/Settings/res/xml/match_content_frame_rate.xml b/Settings/res/xml/match_content_frame_rate.xml
index a2502a5..8705458 100644
--- a/Settings/res/xml/match_content_frame_rate.xml
+++ b/Settings/res/xml/match_content_frame_rate.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright 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
@@ -38,4 +37,4 @@
app:radioGroup="match_content_frame_rate_option"
android:title="@string/match_content_frame_rate_never"/>
</PreferenceCategory>
-</PreferenceScreen>
\ No newline at end of file
+</PreferenceScreen>
diff --git a/Settings/res/xml/match_content_rate_compat.xml b/Settings/res/xml/match_content_rate_compat.xml
new file mode 100644
index 0000000..cb55c55
--- /dev/null
+++ b/Settings/res/xml/match_content_rate_compat.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.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:title="@string/match_content_frame_rate_title">
+</PreferenceScreen>
diff --git a/Settings/res/xml/missing_storage_compat.xml b/Settings/res/xml/missing_storage_compat.xml
new file mode 100644
index 0000000..ad02578
--- /dev/null
+++ b/Settings/res/xml/missing_storage_compat.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.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+ <Preference
+ android:key="wall_of_text"
+ android:layout="@layout/pref_wall_of_text"
+ android:selectable="false"
+ android:title="@string/storage_forget_wall_of_text" />
+ <Preference
+ android:key="forget"
+ android:title="@string/storage_forget" />
+</PreferenceScreen>
diff --git a/Settings/res/xml/network_compat.xml b/Settings/res/xml/network_compat.xml
new file mode 100644
index 0000000..e4b60a9
--- /dev/null
+++ b/Settings/res/xml/network_compat.xml
@@ -0,0 +1,79 @@
+<?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:custom="http://schemas.android.com/apk/res-auto"
+ android:title="@string/connectivity_network_category_title">
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="data_saver_info"
+ android:title="@string/data_saver_header_info"/>
+ <com.android.tv.settings.compat.TsSwitchPreference
+ android:key="wifi_enable"
+ android:persistent="true"
+ android:title="@string/wifi_setting_enable_wifi" />
+
+ <com.android.tv.settings.compat.TsCollapsibleCategory
+ android:key="wifi_list"
+ android:title="@string/wifi_setting_available_networks"/>
+ <com.android.tv.settings.compat.TsPreference
+ android:key="wifi_collapse"
+ android:title="@string/wifi_setting_see_all" />
+
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="wifi_other"
+ android:title="@string/wifi_setting_header_other_options">
+ <com.android.tv.settings.compat.TsRestrictedPreference
+ android:key="wifi_add_easyconnect"
+ android:title="@string/wifi_setting_other_options_add_network_via_easyconnect"
+ android:fragment="com.android.tv.settings.connectivity.WiFiEasyConnectInfoFragment"
+ android:icon="@drawable/ic_qr_code">
+ </com.android.tv.settings.compat.TsRestrictedPreference>
+ <com.android.tv.settings.compat.TsRestrictedPreference
+ android:key="wifi_add"
+ android:title="@string/wifi_setting_other_options_add_network" >
+ <intent
+ android:targetClass="com.android.tv.settings.connectivity.AddWifiNetworkActivity"
+ android:targetPackage="com.android.tv.settings" />
+ </com.android.tv.settings.compat.TsRestrictedPreference>
+
+ <com.android.tv.settings.compat.TsSwitchPreference
+ android:key="wifi_always_scan"
+ android:persistent="true"
+ android:title="@string/wifi_setting_always_scan"
+ android:fragment="com.android.tv.settings.connectivity.WiFiAlwaysScanInfoFragment"/>
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="ethernet"
+ android:title="@string/connectivity_ethernet">
+ <com.android.tv.settings.compat.TsPreference
+ android:key="ethernet_status"
+ android:title="@string/not_connected" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="ethernet_proxy"
+ android:title="@string/title_wifi_proxy_settings" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="ethernet_dhcp"
+ android:title="@string/title_wifi_ip_settings" />
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+
+ <com.android.tv.settings.compat.TsPreference
+ android:key="network_diagnostics"
+ android:icon="@drawable/ic_network_check"
+ android:title="@string/connectivity_network_diagnostics" />
+
+</PreferenceScreen>
diff --git a/Settings/res/xml/notification_access_compat.xml b/Settings/res/xml/notification_access_compat.xml
new file mode 100644
index 0000000..1bd5088
--- /dev/null
+++ b/Settings/res/xml/notification_access_compat.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"
+ android:title="@string/manage_notification_access_title">
+ <com.android.tv.settings.compat.TsPreference
+ android:key="header"
+ android:title="@string/notification_listener_security_warning_summary"
+ android:singleLineTitle="false"
+ android:selectable="false" />
+</PreferenceScreen>
diff --git a/Settings/res/xml/picture_in_picture_compat.xml b/Settings/res/xml/picture_in_picture_compat.xml
new file mode 100644
index 0000000..87d3bf1
--- /dev/null
+++ b/Settings/res/xml/picture_in_picture_compat.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.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/picture_in_picture_app_detail_switch">
+ <com.android.tv.settings.compat.TsPreference
+ android:key="header"
+ android:title="@string/picture_in_picture_app_detail_summary"
+ android:singleLineTitle="false"
+ android:selectable="false" />
+
+</PreferenceScreen>
diff --git a/Settings/res/xml/preview_display_vendor.xml b/Settings/res/xml/preview_display_vendor.xml
index f424910..c80344a 100644
--- a/Settings/res/xml/preview_display_vendor.xml
+++ b/Settings/res/xml/preview_display_vendor.xml
@@ -21,10 +21,19 @@
android:key="display_category"
android:title="@string/display_category_title" />
<Preference
+ android:key="font_scale"
+ android:title="@string/font_scale_settings_title"
+ android:fragment="com.android.tv.settings.device.displaysound.FontScalePreferenceFragment" />
+ <Preference
android:fragment="com.android.tv.settings.device.displaysound.MatchContentFrameRateFragment"
android:key="match_content_frame_rate"
android:title="@string/match_content_frame_rate_title"/>
<Preference
+ android:fragment="com.android.tv.settings.device.displaysound.ResolutionSelectionFragment"
+ android:key="resolution_selection"
+ android:persistent="true"
+ android:title="@string/resolution_selection_title"/>
+ <Preference
android:key="advanced_display_settings"
android:title="@string/advanced_display_settings_title"
android:fragment="com.android.tv.settings.device.displaysound.AdvancedDisplayFragment" />
diff --git a/Settings/res/xml/privacy_compat.xml b/Settings/res/xml/privacy_compat.xml
new file mode 100644
index 0000000..15cfa63
--- /dev/null
+++ b/Settings/res/xml/privacy_compat.xml
@@ -0,0 +1,36 @@
+<?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"
+ android:title="@string/privacy_category_title"
+ xmlns:custom="http://schemas.android.com/apk/res-auto">
+
+ <PreferenceCategory android:title="@string/privacy_device_settings_category" />
+
+ <com.android.tv.settings.compat.TsPreference
+ android:key="location"
+ android:title="@string/system_location"
+ android:fragment="com.android.tv.settings.system.LocationFragmentCompat" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="microphone"
+ android:title="@string/microphone"
+ android:fragment="com.android.tv.settings.privacy.SensorFragmentCompat" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="camera"
+ android:title="@string/camera"
+ android:fragment="com.android.tv.settings.privacy.SensorFragmentCompat" />
+</PreferenceScreen>
diff --git a/Settings/res/xml/resolution_selection.xml b/Settings/res/xml/resolution_selection.xml
new file mode 100644
index 0000000..eab67e6
--- /dev/null
+++ b/Settings/res/xml/resolution_selection.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.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:title="@string/resolution_selection_title"
+ android:key="resolution_selection_screen" >
+
+ <PreferenceCategory
+ android:key="resolution_selection_option">
+ </PreferenceCategory>
+</PreferenceScreen>
diff --git a/Settings/res/xml/resolution_selection_compat.xml b/Settings/res/xml/resolution_selection_compat.xml
new file mode 100644
index 0000000..560058a
--- /dev/null
+++ b/Settings/res/xml/resolution_selection_compat.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.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:title="@string/resolution_selection_title"
+ android:key="resolution_selection_screen" >
+
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="resolution_selection_option">
+ </com.android.tv.settings.compat.TsPreferenceCategory>
+</PreferenceScreen>
\ No newline at end of file
diff --git a/Settings/res/xml/sensor_compat.xml b/Settings/res/xml/sensor_compat.xml
new file mode 100644
index 0000000..b5e3fd0
--- /dev/null
+++ b/Settings/res/xml/sensor_compat.xml
@@ -0,0 +1,33 @@
+<?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"
+ android:title="@string/privacy_category_title"
+ xmlns:custom="http://schemas.android.com/apk/res-auto">
+
+ <PreferenceCategory android:title="@string/privacy_device_settings_category" />
+
+ <com.android.tv.settings.compat.TsSwitchPreference
+ android:key="sensor_toggle" />
+ <com.android.tv.settings.compat.TsCollapsibleCategory
+ android:key="recent_requests" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="collapse"
+ android:title="@string/recently_accessed_show_all" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="open_permission_controller" />
+</PreferenceScreen>
diff --git a/Settings/res/xml/special_app_access.xml b/Settings/res/xml/special_app_access.xml
index 537e19a..cb45cb8 100644
--- a/Settings/res/xml/special_app_access.xml
+++ b/Settings/res/xml/special_app_access.xml
@@ -30,6 +30,10 @@
android:title="@string/manage_notification_access_title"
android:fragment="com.android.tv.settings.device.apps.specialaccess.NotificationAccess" />
<Preference
+ android:key="all_files_access"
+ android:title="@string/manage_external_storage_title"
+ android:fragment="com.android.tv.settings.device.apps.specialaccess.AllFilesAccess" />
+ <Preference
android:key="system_alert_window"
android:title="@string/system_alert_window_settings"
android:fragment="com.android.tv.settings.device.apps.specialaccess.SystemAlertWindow" />
@@ -45,4 +49,8 @@
android:key="alarms_and_reminders"
android:title="@string/alarms_and_reminders_title"
android:fragment="com.android.tv.settings.device.apps.specialaccess.AlarmsAndReminders" />
+ <Preference
+ android:key="turn_screen_on"
+ android:title="@string/turn_screen_on_title"
+ android:fragment="com.android.tv.settings.device.apps.specialaccess.TurnScreenOn" />
</PreferenceScreen>
diff --git a/Settings/res/xml/special_app_access_compat.xml b/Settings/res/xml/special_app_access_compat.xml
new file mode 100644
index 0000000..3cff659
--- /dev/null
+++ b/Settings/res/xml/special_app_access_compat.xml
@@ -0,0 +1,48 @@
+<?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"
+ android:title="@string/special_access" >
+ <com.android.tv.settings.compat.TsPreference
+ android:key="high_power_apps"
+ android:title="@string/high_power_apps"
+ android:fragment="com.android.tv.settings.device.apps.specialaccess.HighPowerCompat" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="AppUsage"
+ android:title="@string/usage_access"
+ android:fragment="com.android.tv.settings.device.apps.specialaccess.AppUsageAccessCompat" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="notification_access"
+ android:title="@string/manage_notification_access_title"
+ android:fragment="com.android.tv.settings.device.apps.specialaccess.NotificationAccessCompat" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="system_alert_window"
+ android:title="@string/system_alert_window_settings"
+ android:fragment="com.android.tv.settings.device.apps.specialaccess.SystemAlertWindowCompat" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="write_settings"
+ android:title="@string/write_system_settings"
+ android:fragment="com.android.tv.settings.device.apps.specialaccess.WriteSettingsCompat" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="picture_in_picture"
+ android:title="@string/picture_in_picture_title"
+ android:fragment="com.android.tv.settings.device.apps.specialaccess.PictureInPictureCompat" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="alarms_and_reminders"
+ android:title="@string/alarms_and_reminders_title"
+ android:fragment="com.android.tv.settings.device.apps.specialaccess.AlarmsAndRemindersCompat" />
+</PreferenceScreen>
diff --git a/Settings/res/xml/storage_compat.xml b/Settings/res/xml/storage_compat.xml
new file mode 100644
index 0000000..d523bfe
--- /dev/null
+++ b/Settings/res/xml/storage_compat.xml
@@ -0,0 +1,57 @@
+<?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">
+ <com.android.tv.settings.compat.TsPreference
+ android:key="migrate"
+ android:title="@string/storage_migrate" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="eject"
+ android:title="@string/storage_eject" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="erase"
+ android:title="@string/storage_format" />
+
+ <com.android.tv.settings.compat.TsPreference
+ android:key="apps_usage"
+ android:title="@string/storage_apps_usage"
+ android:icon="@drawable/storage_indicator_apps" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="dcim_usage"
+ android:title="@string/storage_dcim_usage"
+ android:icon="@drawable/storage_indicator_dcim" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="music_usage"
+ android:title="@string/storage_music_usage"
+ android:icon="@drawable/storage_indicator_music" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="downloads_usage"
+ android:title="@string/storage_downloads_usage"
+ android:icon="@drawable/storage_indicator_downloads" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="cache_usage"
+ android:title="@string/storage_media_cache_usage"
+ android:icon="@drawable/storage_indicator_cache" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="misc_usage"
+ android:title="@string/storage_media_misc_usage"
+ android:icon="@drawable/storage_indicator_misc" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="available"
+ android:title="@string/storage_available"
+ android:icon="@drawable/storage_indicator_available" />
+</PreferenceScreen>
\ No newline at end of file
diff --git a/Settings/res/xml/storage_summary.xml b/Settings/res/xml/storage_summary.xml
index 2b731f7..4f54ec7 100644
--- a/Settings/res/xml/storage_summary.xml
+++ b/Settings/res/xml/storage_summary.xml
@@ -19,9 +19,12 @@
android:title="@string/device_storage">
<PreferenceCategory
android:key="device_storage"
- android:title="@string/storage_device_storage_section"/>
-
+ android:title="@string/storage_device_storage_section" />
<PreferenceCategory
android:key="removable_storage"
android:title="@string/storage_removable_storage_section"/>
+ <Preference
+ android:key="free_up_storage"
+ android:title="@string/storage_free_up"
+ android:fragment="com.android.tv.settings.device.storage.FreeUpStorageFragment" />
</PreferenceScreen>
diff --git a/Settings/res/xml/storage_summary_compat.xml b/Settings/res/xml/storage_summary_compat.xml
new file mode 100644
index 0000000..08de8e1
--- /dev/null
+++ b/Settings/res/xml/storage_summary_compat.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.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/device_storage">
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="device_storage"
+ android:title="@string/storage_device_storage_section"/>
+
+ <com.android.tv.settings.compat.TsPreferenceCategory
+ android:key="removable_storage"
+ android:title="@string/storage_removable_storage_section"/>
+</PreferenceScreen>
diff --git a/Settings/res/xml/storage_summary_x.xml b/Settings/res/xml/storage_summary_x.xml
index 31aba43..32ff7d1 100644
--- a/Settings/res/xml/storage_summary_x.xml
+++ b/Settings/res/xml/storage_summary_x.xml
@@ -33,4 +33,8 @@
<PreferenceCategory
android:key="removable_storage"
android:title="@string/storage_removable_storage_section"/>
+ <Preference
+ android:key="free_up_storage"
+ android:title="@string/storage_free_up"
+ android:fragment="com.android.tv.settings.device.storage.FreeUpStorageFragment" />
</PreferenceScreen>
diff --git a/Settings/res/xml/storage_uninstall_apps.xml b/Settings/res/xml/storage_uninstall_apps.xml
new file mode 100644
index 0000000..3159ea6
--- /dev/null
+++ b/Settings/res/xml/storage_uninstall_apps.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.
+ -->
+
+<android:PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/all_apps_title">
+
+ <PreferenceCategory
+ android:key="AllAppsPreferenceGroup"
+ android:title="@string/all_apps_installed" />
+
+</android:PreferenceScreen>
diff --git a/Settings/res/xml/system_alert_window_compat.xml b/Settings/res/xml/system_alert_window_compat.xml
new file mode 100644
index 0000000..a6d1291
--- /dev/null
+++ b/Settings/res/xml/system_alert_window_compat.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"
+ android:title="@string/permit_draw_overlay">
+ <com.android.tv.settings.compat.TsPreference
+ android:key="header"
+ android:title="@string/allow_overlay_description"
+ android:singleLineTitle="false"
+ android:selectable="false" />
+</PreferenceScreen>
diff --git a/Settings/res/xml/turn_screen_on.xml b/Settings/res/xml/turn_screen_on.xml
new file mode 100644
index 0000000..297c614
--- /dev/null
+++ b/Settings/res/xml/turn_screen_on.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2022 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/allow_turn_screen_on">
+ <Preference
+ android:key="header"
+ android:title="@string/allow_turn_screen_on_description"
+ android:singleLineTitle="false"
+ android:selectable="false" />
+
+</PreferenceScreen>
diff --git a/Settings/res/xml/wifi_details_compat.xml b/Settings/res/xml/wifi_details_compat.xml
new file mode 100644
index 0000000..b7ba5dd
--- /dev/null
+++ b/Settings/res/xml/wifi_details_compat.xml
@@ -0,0 +1,49 @@
+<?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">
+ <com.android.tv.settings.compat.TsPreference
+ android:key="connection_status"
+ android:title="@string/title_internet_connection"
+ android:summary="@string/connected" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="ip_address"
+ android:title="@string/title_ip_address" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="mac_address"
+ android:title="@string/title_mac_address" />
+ <com.android.tv.settings.compat.TsPreference
+ android:key="signal_strength"
+ android:title="@string/title_signal_strength" />
+ <!-- The android:persistent is set to false for random MAC as it is on per-network basis -->
+ <ListPreference
+ android:key="random_mac"
+ android:title="@string/title_random_mac_settings"
+ android:summary="%s"
+ android:persistent="false"
+ android:entries="@array/random_mac_settings_entries"
+ android:entryValues="@array/random_mac_settings_entry_values" />
+ <com.android.tv.settings.compat.TsRestrictedPreference
+ android:key="proxy_settings"
+ android:title="@string/title_wifi_proxy_settings" />
+ <com.android.tv.settings.compat.TsRestrictedPreference
+ android:key="ip_settings"
+ android:title="@string/title_wifi_ip_settings" />
+ <com.android.tv.settings.compat.TsRestrictedPreference
+ android:key="forget_network"
+ android:title="@string/wifi_forget_network" />
+</PreferenceScreen>
diff --git a/Settings/res/xml/write_settings_compat.xml b/Settings/res/xml/write_settings_compat.xml
new file mode 100644
index 0000000..85d649a
--- /dev/null
+++ b/Settings/res/xml/write_settings_compat.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.
+ -->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ android:title="@string/write_settings_title">
+ <com.android.tv.settings.compat.TsPreference
+ android:key="header"
+ android:title="@string/write_settings_description"
+ android:singleLineTitle="false"
+ android:selectable="false" />
+
+</PreferenceScreen>
diff --git a/Settings/src/com/android/tv/settings/ActionDisabledByAdminDialogHelper.java b/Settings/src/com/android/tv/settings/ActionDisabledByAdminDialogHelper.java
index 46fe067..0f592ab 100644
--- a/Settings/src/com/android/tv/settings/ActionDisabledByAdminDialogHelper.java
+++ b/Settings/src/com/android/tv/settings/ActionDisabledByAdminDialogHelper.java
@@ -87,7 +87,9 @@
// same profile group. Otherwise the admin package and its policies are not accessible to
// the current user.
final UserManager um = UserManager.get(mActivity.getApplicationContext());
- if (um.isSameProfileGroup(getEnforcementAdminUserId(mEnforcedAdmin), um.getUserHandle())) {
+ if (um.isSameProfileGroup(
+ getEnforcementAdminUserId(mEnforcedAdmin),
+ um.getProcessUserId())) {
builder.setNeutralButton(R.string.learn_more, (dialog, which) -> {
showAdminPolicies(mEnforcedAdmin, mActivity);
mActivity.finish();
diff --git a/Settings/src/com/android/tv/settings/DeviceSettingBroadcastReceiver.java b/Settings/src/com/android/tv/settings/DeviceSettingBroadcastReceiver.java
index c4debb1..7f3c8a6 100644
--- a/Settings/src/com/android/tv/settings/DeviceSettingBroadcastReceiver.java
+++ b/Settings/src/com/android/tv/settings/DeviceSettingBroadcastReceiver.java
@@ -16,7 +16,7 @@
package com.android.tv.settings;
-import static com.android.tv.settings.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
+import static com.android.tv.settings.library.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -27,7 +27,7 @@
import android.os.PowerManager;
import android.util.Log;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import java.util.List;
diff --git a/Settings/src/com/android/tv/settings/GlobalKeyReceiver.java b/Settings/src/com/android/tv/settings/GlobalKeyReceiver.java
new file mode 100644
index 0000000..5a7a360
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/GlobalKeyReceiver.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings;
+
+import static com.android.tv.settings.accessories.AddAccessoryActivity.ACTION_CONNECT_INPUT;
+import static com.android.tv.settings.accessories.AddAccessoryActivity.INTENT_EXTRA_NO_INPUT_MODE;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+import android.view.KeyEvent;
+
+/**
+ * Handles global keys.
+ */
+public class GlobalKeyReceiver extends BroadcastReceiver {
+ private static final String TAG = "TvGlobalKeyReceiver";
+ private static final boolean DEBUG = false;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Intent.ACTION_GLOBAL_BUTTON.equals(intent.getAction())) {
+ KeyEvent event = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT, KeyEvent.class);
+ if (DEBUG) {
+ Log.d(TAG, "Received key event " + event.toString());
+ }
+ switch (event.getKeyCode()) {
+ case KeyEvent.KEYCODE_PAIRING:
+ sendPairingIntent(context, event);
+ return;
+ default:
+ if (DEBUG) {
+ Log.d(TAG, "Unhandled key " + event.getKeyCode());
+ }
+ break;
+ }
+ }
+ }
+
+ private static void sendPairingIntent(Context context, KeyEvent event) {
+ Intent intent =
+ new Intent(ACTION_CONNECT_INPUT).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).setPackage(
+ context.getPackageName());
+ if (event != null) {
+ intent.putExtra(INTENT_EXTRA_NO_INPUT_MODE, true)
+ .putExtra(Intent.EXTRA_KEY_EVENT, event);
+ }
+ context.startActivity(intent);
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/service/data/Module.java b/Settings/src/com/android/tv/settings/HasSettingsManager.java
similarity index 71%
copy from Settings/src/com/android/tv/settings/service/data/Module.java
copy to Settings/src/com/android/tv/settings/HasSettingsManager.java
index efcb368..c01d05c 100644
--- a/Settings/src/com/android/tv/settings/service/data/Module.java
+++ b/Settings/src/com/android/tv/settings/HasSettingsManager.java
@@ -14,15 +14,11 @@
* limitations under the License.
*/
-package com.android.tv.settings.service.data;
+package com.android.tv.settings;
-/** Implement this to provide back-end data for multiple states. */
-public interface Module {
- void addState(State state);
+import com.android.tv.settings.library.SettingsManager;
- void removeState(State state);
-
- void create();
-
- void destroy();
+/** Implement this to adapt to new design of using SettingsAPI. */
+public interface HasSettingsManager {
+ SettingsManager getSettingsManager();
}
diff --git a/Settings/src/com/android/tv/settings/MainFragment.java b/Settings/src/com/android/tv/settings/MainFragment.java
index 73571d8..393da6a 100644
--- a/Settings/src/com/android/tv/settings/MainFragment.java
+++ b/Settings/src/com/android/tv/settings/MainFragment.java
@@ -21,10 +21,10 @@
import static com.android.tv.settings.accounts.AccountsUtil.ACCOUNTS_FRAGMENT_RESTRICTED;
import static com.android.tv.settings.accounts.AccountsUtil.ACCOUNTS_SLICE_FRAGMENT;
import static com.android.tv.settings.accounts.AccountsUtil.ACCOUNTS_SYSTEM_INTENT;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_VENDOR;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_X;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_CLASSIC;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_VENDOR;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_X;
import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
import static com.android.tv.settings.util.InstrumentationUtils.logPageFocused;
@@ -43,6 +43,7 @@
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
+import android.icu.text.MessageFormat;
import android.net.Uri;
import android.os.Bundle;
import android.service.settings.suggestions.Suggestion;
@@ -63,15 +64,21 @@
import com.android.tv.settings.HotwordSwitchController.HotwordStateListener;
import com.android.tv.settings.accounts.AccountsFragment;
import com.android.tv.settings.accounts.AccountsUtil;
+import com.android.tv.settings.connectivity.ActiveNetworkProvider;
import com.android.tv.settings.connectivity.ConnectivityListener;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.connectivity.ConnectivityListenerLite;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.SliceUtils;
import com.android.tv.settings.suggestions.SuggestionPreference;
import com.android.tv.settings.system.SecurityFragment;
-import com.android.tv.settings.util.SliceUtils;
import com.android.tv.twopanelsettings.TwoPanelSettingsFragment;
import com.android.tv.twopanelsettings.slices.SlicePreference;
+import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Optional;
import java.util.Set;
/**
@@ -109,10 +116,11 @@
@VisibleForTesting
static final String KEY_DISPLAY_AND_SOUND = "display_and_sound";
private static final String KEY_CHANNELS_AND_INPUTS = "channels_and_inputs";
+ private static final String KEY_CHANNELS_AND_INPUTS_SLICE = "channels_and_inputs_slice";
private static final String ACTION_ACCOUNTS = "com.android.tv.settings.ACCOUNTS";
@VisibleForTesting
- ConnectivityListener mConnectivityListener;
+ Optional<ConnectivityListener> mConnectivityListenerOptional;
@VisibleForTesting
BluetoothAdapter mBtAdapter;
@VisibleForTesting
@@ -129,6 +137,8 @@
}
};
+ private ConnectivityListenerLite mConnectivityListenerLite;
+
public static MainFragment newInstance() {
return new MainFragment();
}
@@ -157,8 +167,14 @@
@Override
public void onCreate(Bundle savedInstanceState) {
mSuggestionQuickSettingPrefsContainer.onCreate();
- mConnectivityListener = new ConnectivityListener(getContext(), this::updateConnectivity,
- getSettingsLifecycle());
+ if (isWifiScanOptimisationEnabled()) {
+ mConnectivityListenerLite = new ConnectivityListenerLite(
+ getContext(), this::updateConnectivityType, getLifecycle());
+ mConnectivityListenerOptional = Optional.empty();
+ } else {
+ mConnectivityListenerOptional = Optional.of(new ConnectivityListener(
+ getContext(), this::updateConnectivity, getSettingsLifecycle()));
+ }
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
super.onCreate(savedInstanceState);
// This is to record the initial start of Settings root in two panel settings case, as the
@@ -170,17 +186,51 @@
}
}
+ private boolean isWifiScanOptimisationEnabled() {
+ return getContext().getResources().getBoolean(R.bool.wifi_scan_optimisation_enabled);
+ }
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mSuggestionQuickSettingPrefsContainer.showOrHideQuickSettings();
updateAccountPref();
updateAccessoryPref();
- updateConnectivity();
+ if (isWifiScanOptimisationEnabled()) {
+ mConnectivityListenerLite.handleConnectivityChange();
+ } else {
+ updateConnectivity();
+ }
updateBasicModeSuggestion();
+ updateChannelsAndInputs();
return super.onCreateView(inflater, container, savedInstanceState);
}
+ private void updateConnectivityType(ActiveNetworkProvider activeNetworkProvider) {
+ final Preference networkPref = findPreference(KEY_NETWORK);
+ if (networkPref == null) {
+ return;
+ }
+
+ if (activeNetworkProvider.isTypeCellular()) {
+ networkPref.setIcon(R.drawable.ic_cell_signal_4_white);
+ } else if (activeNetworkProvider.isTypeEthernet()) {
+ networkPref.setIcon(R.drawable.ic_ethernet_white);
+ networkPref.setSummary(R.string.connectivity_summary_ethernet_connected);
+ } else if (activeNetworkProvider.isTypeWifi()) {
+ networkPref.setIcon(R.drawable.ic_wifi_signal_4_white);
+ networkPref.setSummary(activeNetworkProvider.getSsid());
+ } else {
+ if (activeNetworkProvider.isWifiEnabled()) {
+ networkPref.setIcon(R.drawable.ic_wifi_not_connected);
+ networkPref.setSummary(R.string.connectivity_summary_no_network_connected);
+ } else {
+ networkPref.setIcon(R.drawable.ic_wifi_signal_off_white);
+ networkPref.setSummary(R.string.connectivity_summary_wifi_disabled);
+ }
+ }
+ }
+
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(getPreferenceScreenResId(), null);
@@ -216,13 +266,16 @@
@VisibleForTesting
void updateConnectivity() {
+ if (!mConnectivityListenerOptional.isPresent()) {
+ return;
+ }
final Preference networkPref = findPreference(KEY_NETWORK);
if (networkPref == null) {
return;
}
- if (mConnectivityListener.isCellConnected()) {
- final int signal = mConnectivityListener.getCellSignalStrength();
+ if (mConnectivityListenerOptional.get().isCellConnected()) {
+ final int signal = mConnectivityListenerOptional.get().getCellSignalStrength();
switch (signal) {
case CellSignalStrength.SIGNAL_STRENGTH_GREAT:
networkPref.setIcon(R.drawable.ic_cell_signal_4_white);
@@ -241,12 +294,12 @@
networkPref.setIcon(R.drawable.ic_cell_signal_0_white);
break;
}
- } else if (mConnectivityListener.isEthernetConnected()) {
+ } else if (mConnectivityListenerOptional.get().isEthernetConnected()) {
networkPref.setIcon(R.drawable.ic_ethernet_white);
networkPref.setSummary(R.string.connectivity_summary_ethernet_connected);
- } else if (mConnectivityListener.isWifiEnabledOrEnabling()) {
- if (mConnectivityListener.isWifiConnected()) {
- final int signal = mConnectivityListener.getWifiSignalStrength(5);
+ } else if (mConnectivityListenerOptional.get().isWifiEnabledOrEnabling()) {
+ if (mConnectivityListenerOptional.get().isWifiConnected()) {
+ final int signal = mConnectivityListenerOptional.get().getWifiSignalStrength(5);
switch (signal) {
case 4:
networkPref.setIcon(R.drawable.ic_wifi_signal_4_white);
@@ -265,7 +318,7 @@
networkPref.setIcon(R.drawable.ic_wifi_signal_0_white);
break;
}
- networkPref.setSummary(mConnectivityListener.getSsid());
+ networkPref.setSummary(mConnectivityListenerOptional.get().getSsid());
} else {
networkPref.setIcon(R.drawable.ic_wifi_not_connected);
networkPref.setSummary(R.string.connectivity_summary_no_network_connected);
@@ -514,8 +567,13 @@
if (accounts.length == 1) {
accountsPref.setSummary(accounts[0].name);
} else {
- accountsPref.setSummary(getResources().getQuantityString(
- R.plurals.accounts_category_summary, accounts.length, accounts.length));
+ MessageFormat msgFormat = new MessageFormat(
+ getContext().getResources().getString(
+ R.string.accounts_category_summary),
+ Locale.getDefault());
+ Map<String, Object> arguments = new HashMap<>();
+ arguments.put("count", accounts.length);
+ accountsPref.setSummary(msgFormat.format(arguments));
}
}
}
@@ -535,9 +593,26 @@
}
}
+ private void updateChannelsAndInputs() {
+ Preference channelsAndInputsPreference = findPreference(KEY_CHANNELS_AND_INPUTS);
+ SlicePreference channelsAndInputsSlicePreference =
+ (SlicePreference) findPreference(KEY_CHANNELS_AND_INPUTS_SLICE);
+ if (channelsAndInputsSlicePreference != null
+ && FlavorUtils.isTwoPanel(getContext())
+ && SliceUtils.isSliceProviderValid(
+ getContext(), channelsAndInputsSlicePreference.getUri())) {
+ channelsAndInputsSlicePreference.setVisible(true);
+ if (channelsAndInputsPreference != null) {
+ channelsAndInputsPreference.setVisible(false);
+ }
+ }
+ }
+
@Override
public void onStart() {
super.onStart();
+ updateAccountPref();
+ updateAccessoryPref();
IntentFilter btChangeFilter = new IntentFilter();
btChangeFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
btChangeFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
diff --git a/Settings/src/com/android/tv/settings/MainSettings.java b/Settings/src/com/android/tv/settings/MainSettings.java
index 718865f..3ab9dcc 100644
--- a/Settings/src/com/android/tv/settings/MainSettings.java
+++ b/Settings/src/com/android/tv/settings/MainSettings.java
@@ -18,8 +18,6 @@
import androidx.fragment.app.Fragment;
-import com.android.tv.settings.overlay.FlavorUtils;
-
/**
* Main settings which loads up the top level headers.
*/
@@ -27,8 +25,9 @@
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(MainFragment.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(MainFragment.class.getName(), null);
}
@Override
diff --git a/Settings/src/com/android/tv/settings/SettingsPreferenceFragment.java b/Settings/src/com/android/tv/settings/SettingsPreferenceFragment.java
index dc1a92b..7635108 100644
--- a/Settings/src/com/android/tv/settings/SettingsPreferenceFragment.java
+++ b/Settings/src/com/android/tv/settings/SettingsPreferenceFragment.java
@@ -31,9 +31,11 @@
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
+import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
@@ -51,7 +53,7 @@
import androidx.recyclerview.widget.RecyclerView;
import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import com.android.tv.settings.util.SettingsPreferenceUtil;
import com.android.tv.settings.widget.SettingsViewModel;
import com.android.tv.settings.widget.TsPreference;
@@ -104,6 +106,12 @@
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
+ // Set list view listeners after the fragment view is created
+ if (getCallbackFragment() instanceof TwoPanelSettingsFragment) {
+ TwoPanelSettingsFragment parentFragment =
+ (TwoPanelSettingsFragment) getCallbackFragment();
+ parentFragment.addListenerForFragment(this);
+ }
if (view != null) {
TextView titleView = view.findViewById(R.id.decor_title);
// We rely on getResources().getConfiguration().getLayoutDirection() instead of
@@ -111,14 +119,13 @@
// it is RTL.
if (titleView != null
&& getResources().getConfiguration().getLayoutDirection()
- == View.LAYOUT_DIRECTION_RTL) {
+ == View.LAYOUT_DIRECTION_RTL) {
titleView.setGravity(Gravity.RIGHT);
}
if (FlavorUtils.isTwoPanel(getContext())) {
ViewGroup decor = view.findViewById(R.id.decor_title_container);
if (decor != null) {
decor.setOutlineProvider(null);
- decor.setBackgroundResource(R.color.tp_preference_panel_background_color);
}
} else {
// We only want to set the title in this location for one-panel settings.
@@ -168,20 +175,34 @@
@Override
protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {
- if (FlavorUtils.isTwoPanel(getContext())) {
- return new PreferenceGroupAdapter(preferenceScreen) {
- @Override
- @NonNull
- public PreferenceViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
- int viewType) {
- PreferenceViewHolder vh = super.onCreateViewHolder(parent, viewType);
+ return new PreferenceGroupAdapter(preferenceScreen) {
+ @Override
+ @NonNull
+ public PreferenceViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
+ int viewType) {
+ PreferenceViewHolder vh = super.onCreateViewHolder(parent, viewType);
+ if (FlavorUtils.isTwoPanel(getContext())) {
vh.itemView.setStateListAnimator(AnimatorInflater.loadStateListAnimator(
getContext(), R.animator.preference));
- return vh;
}
- };
- }
- return new PreferenceGroupAdapter(preferenceScreen);
+ vh.itemView.setOnTouchListener((v, e) -> {
+ if (e.getActionMasked() == MotionEvent.ACTION_DOWN) {
+ vh.itemView.requestFocus();
+ v.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,
+ KeyEvent.KEYCODE_DPAD_CENTER));
+ return true;
+ } else if (e.getActionMasked() == MotionEvent.ACTION_UP) {
+ v.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,
+ KeyEvent.KEYCODE_DPAD_CENTER));
+ return true;
+ }
+ return false;
+ });
+ vh.itemView.setFocusable(true);
+ vh.itemView.setFocusableInTouchMode(true);
+ return vh;
+ }
+ };
}
@Override
@@ -209,11 +230,6 @@
public void onResume() {
super.onResume();
mLifecycle.handleLifecycleEvent(ON_RESUME);
- if (getCallbackFragment() instanceof TwoPanelSettingsFragment) {
- TwoPanelSettingsFragment parentFragment =
- (TwoPanelSettingsFragment) getCallbackFragment();
- parentFragment.addListenerForFragment(this);
- }
}
// This should only be invoked if the parent Fragment is TwoPanelSettingsFragment.
@@ -228,11 +244,6 @@
public void onPause() {
mLifecycle.handleLifecycleEvent(ON_PAUSE);
super.onPause();
- if (getCallbackFragment() instanceof TwoPanelSettingsFragment) {
- TwoPanelSettingsFragment parentFragment =
- (TwoPanelSettingsFragment) getCallbackFragment();
- parentFragment.removeListenerForFragment(this);
- }
}
@CallSuper
@@ -249,6 +260,16 @@
super.onDestroy();
}
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ if (getCallbackFragment() instanceof TwoPanelSettingsFragment) {
+ TwoPanelSettingsFragment parentFragment =
+ (TwoPanelSettingsFragment) getCallbackFragment();
+ parentFragment.removeListenerForFragment(this);
+ }
+ }
+
@CallSuper
@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
diff --git a/Settings/src/com/android/tv/settings/SuggestionQuickSettingPrefsContainer.java b/Settings/src/com/android/tv/settings/SuggestionQuickSettingPrefsContainer.java
index 7ab72ef..1395543 100644
--- a/Settings/src/com/android/tv/settings/SuggestionQuickSettingPrefsContainer.java
+++ b/Settings/src/com/android/tv/settings/SuggestionQuickSettingPrefsContainer.java
@@ -18,7 +18,7 @@
import com.android.settingslib.utils.IconCache;
import com.android.tv.settings.HotwordSwitchController.HotwordStateListener;
import com.android.tv.settings.R;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import com.android.tv.settings.suggestions.SuggestionPreference;
import com.android.tv.settings.system.SecurityFragment;
diff --git a/Settings/src/com/android/tv/settings/SystemSoundsPlayer.java b/Settings/src/com/android/tv/settings/SystemSoundsPlayer.java
index 3274677..ae0f5ea 100644
--- a/Settings/src/com/android/tv/settings/SystemSoundsPlayer.java
+++ b/Settings/src/com/android/tv/settings/SystemSoundsPlayer.java
@@ -76,7 +76,8 @@
public SystemSoundsPlayer(Context context) {
mContext = context.getApplicationContext();
float attenuationDb = mContext.getResources().getInteger(
- com.android.internal.R.integer.config_soundEffectVolumeDb);
+ mContext.getResources().getIdentifier("config_soundEffectVolumeDb",
+ "integer", "android"));
// This is the same value that is used for framework system sounds as set by
// com.android.server.audio.SoundEffectsHelper#onPlaySoundEffect()
mVolumeAttenuation = (float) Math.pow(10, attenuationDb / 20);
diff --git a/Settings/src/com/android/tv/settings/TakeBugReportController.java b/Settings/src/com/android/tv/settings/TakeBugReportController.java
index f90a12a..d9a5861 100644
--- a/Settings/src/com/android/tv/settings/TakeBugReportController.java
+++ b/Settings/src/com/android/tv/settings/TakeBugReportController.java
@@ -61,7 +61,8 @@
public void updateState(Preference preference) {
super.updateState(preference);
if (KEY_TAKE_BUG_REPORT.equals(preference.getKey())) {
- preference.setTitle(com.android.internal.R.string.bugreport_title);
+ preference.setTitle(mContext.getResources().getIdentifier("bugreport_title",
+ "string", "android"));
preference.setIcon(R.drawable.ic_bug_report);
}
}
diff --git a/Settings/src/com/android/tv/settings/TvSettingsActivity.java b/Settings/src/com/android/tv/settings/TvSettingsActivity.java
index 70b23a8..20c0f8f 100644
--- a/Settings/src/com/android/tv/settings/TvSettingsActivity.java
+++ b/Settings/src/com/android/tv/settings/TvSettingsActivity.java
@@ -16,10 +16,12 @@
package com.android.tv.settings;
-import static com.android.tv.settings.overlay.FlavorUtils.ALL_FLAVORS_MASK;
+import static com.android.tv.settings.library.overlay.FlavorUtils.ALL_FLAVORS_MASK;
import android.content.Intent;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
import android.transition.Scene;
import android.transition.Slide;
import android.transition.Transition;
@@ -32,17 +34,133 @@
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.SettingsManager;
+import com.android.tv.settings.library.State;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.overlay.FlavorUtils;
-public abstract class TvSettingsActivity extends FragmentActivity {
+import java.util.List;
+
+public abstract class TvSettingsActivity extends FragmentActivity implements HasSettingsManager {
private static final String TAG = "TvSettingsActivity";
private static final String SETTINGS_FRAGMENT_TAG =
"com.android.tv.settings.MainSettings.SETTINGS_FRAGMENT";
+ private static final int UI_UPDATE_DELAY_MS = 200;
private static final int REQUEST_CODE_STARTUP_VERIFICATION = 1;
+ public SettingsManager mSettingsManager;
+ private Handler mHandler = new Handler(Looper.getMainLooper());
+
+ private final UIUpdateCallback mUIUpdateCallback =
+ new UIUpdateCallback() {
+ @Override
+ public void notifyUpdate(
+ int state, PreferenceCompat preference) {
+ // Delay the preference updates if there is no visible fragment yet, this
+ // could happen when a configuration change has occurred.
+ if (getVisibleFragment() == null) {
+ mHandler.postDelayed(() -> {
+ notifyUpdate(state, preference);
+ }, UI_UPDATE_DELAY_MS);
+ return;
+ }
+ getVisibleFragment().getChildFragmentManager().getFragments().stream()
+ .filter(
+ fragment ->
+ fragment instanceof PreferenceControllerFragmentCompat
+ &&
+ ((PreferenceControllerFragmentCompat) fragment)
+ .getStateIdentifier() == state)
+
+ .forEach(
+ fragment ->
+ ((PreferenceControllerFragmentCompat) fragment)
+ .updatePref(preference));
+ }
+
+ @Override
+ public void notifyUpdateAll(
+ int state, List<PreferenceCompat> preferences) {
+ // Delay the preference updates if there is no visible fragment yet, this
+ // could happen when a configuration change has occurred.
+ if (getVisibleFragment() == null) {
+ mHandler.postDelayed(() -> {
+ notifyUpdateAll(state, preferences);
+ }, UI_UPDATE_DELAY_MS);
+ return;
+ }
+ getVisibleFragment().getChildFragmentManager().getFragments().stream()
+ .filter(
+ fragment ->
+ fragment instanceof PreferenceControllerFragmentCompat
+ &&
+ ((PreferenceControllerFragmentCompat) fragment)
+ .getStateIdentifier() == state)
+ .forEach(
+ fragment ->
+ ((PreferenceControllerFragmentCompat) fragment)
+ .updateAllPref(preferences));
+ }
+
+ @Override
+ public void notifyUpdateScreenTitle(int state, String title) {
+ // Delay the preference updates if there is no visible fragment yet, this
+ // could happen when a configuration change has occurred.
+ if (getVisibleFragment() == null) {
+ mHandler.postDelayed(() -> {
+ notifyUpdateScreenTitle(state, title);
+ }, UI_UPDATE_DELAY_MS);
+ return;
+ }
+ getVisibleFragment().getChildFragmentManager().getFragments().stream()
+ .filter(
+ fragment ->
+ fragment instanceof PreferenceControllerFragmentCompat
+ &&
+ ((PreferenceControllerFragmentCompat) fragment)
+ .getStateIdentifier() == state)
+ .forEach(
+ fragment ->
+ ((PreferenceControllerFragmentCompat) fragment)
+ .updateScreenTitle(title));
+ }
+
+ @Override
+ public void notifyNavigateBackward(int state) {
+
+ }
+
+ @Override
+ public void notifyNavigateForward(int state) {
+
+ }
+ };
+
+ public Fragment getVisibleFragment() {
+ FragmentManager fragmentManager = getSupportFragmentManager();
+ List<Fragment> fragments = fragmentManager.getFragments();
+ if (fragments != null) {
+ for (Fragment fragment : fragments) {
+ if (fragment != null && fragment.isVisible()) {
+ return fragment;
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public SettingsManager getSettingsManager() {
+ return mSettingsManager;
+ }
+
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -51,7 +169,6 @@
finish();
}
if (savedInstanceState == null) {
-
final Fragment fragment = createSettingsFragment();
if (fragment == null) {
return;
@@ -107,7 +224,8 @@
@Override
public void finish() {
- final Fragment fragment = getSupportFragmentManager().findFragmentByTag(SETTINGS_FRAGMENT_TAG);
+ final Fragment fragment = getSupportFragmentManager().findFragmentByTag(
+ SETTINGS_FRAGMENT_TAG);
if (FlavorUtils.isTwoPanel(this)) {
super.finish();
return;
@@ -174,7 +292,20 @@
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == REQUEST_CODE_STARTUP_VERIFICATION) {
+ if (mSettingsManager != null && ManagerUtil.getStateIdentifier(requestCode) != -1) {
+ int stateIdentifier = ManagerUtil.getStateIdentifier(requestCode);
+ getVisibleFragment().getChildFragmentManager().getFragments().stream().filter(
+ fragment ->
+ fragment instanceof PreferenceControllerFragmentCompat
+ && ((PreferenceControllerFragmentCompat) fragment)
+ .getStateIdentifier() == stateIdentifier)
+ .findAny().ifPresent(fragment -> {
+ State state = ((PreferenceControllerFragmentCompat) fragment).getState();
+ if (state != null) {
+ mSettingsManager.onActivityResult(state, requestCode, resultCode, data);
+ }
+ });
+ } else if (requestCode == REQUEST_CODE_STARTUP_VERIFICATION) {
if (resultCode == RESULT_OK) {
Log.v(TAG, "Startup verification succeeded.");
if (FlavorUtils.getFlavor(this) == FlavorUtils.FLAVOR_X
@@ -199,4 +330,10 @@
}
}
}
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mHandler.removeCallbacksAndMessages(null);
+ }
}
diff --git a/Settings/src/com/android/tv/settings/about/AboutActivity.java b/Settings/src/com/android/tv/settings/about/AboutActivity.java
index 4fea93f..a2d2f63 100644
--- a/Settings/src/com/android/tv/settings/about/AboutActivity.java
+++ b/Settings/src/com/android/tv/settings/about/AboutActivity.java
@@ -19,7 +19,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
/**
* Activity which shows the build / model / legal info / etc.
@@ -28,7 +27,8 @@
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(AboutFragment.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(AboutFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/about/AboutFragment.java b/Settings/src/com/android/tv/settings/about/AboutFragment.java
index 3eb1777..ce37060 100644
--- a/Settings/src/com/android/tv/settings/about/AboutFragment.java
+++ b/Settings/src/com/android/tv/settings/about/AboutFragment.java
@@ -16,10 +16,10 @@
package com.android.tv.settings.about;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_VENDOR;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_X;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_CLASSIC;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_VENDOR;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_X;
import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
import android.app.tvsettings.TvSettingsEnums;
@@ -28,6 +28,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ResolveInfo;
+import android.icu.text.MessageFormat;
import android.os.Build;
import android.os.Bundle;
import android.os.PersistableBundle;
@@ -58,10 +59,13 @@
import com.android.tv.settings.PreferenceUtils;
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import com.android.tv.settings.name.DeviceManager;
-import com.android.tv.settings.overlay.FlavorUtils;
import com.android.tv.twopanelsettings.slices.CustomContentDescriptionPreference;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -252,6 +256,8 @@
// Remove regulatory information if none present.
final Preference regulatoryPref = findPreference(KEY_REGULATORY_INFO);
PreferenceUtils.resolveSystemActivityOrRemove(getActivity(), screen, regulatoryPref, 0);
+
+ updateTutorials();
}
private void removePreference(@Nullable Preference preference) {
@@ -275,7 +281,6 @@
mDevHitCountdown = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(getContext())
? -1 : TAPS_TO_BE_A_DEVELOPER;
mDevHitToast = null;
- updateTutorials();
}
@Override
@@ -358,11 +363,13 @@
if (mDevHitToast != null) {
mDevHitToast.cancel();
}
- mDevHitToast = Toast
- .makeText(getActivity(), getResources().getQuantityString(
- R.plurals.show_dev_countdown, mDevHitCountdown,
- mDevHitCountdown),
- Toast.LENGTH_SHORT);
+ MessageFormat msgFormat = new MessageFormat(
+ getResources().getString(R.string.show_dev_countdown),
+ Locale.getDefault());
+ Map<String, Object> arguments = new HashMap<>();
+ arguments.put("count", mDevHitCountdown);
+ mDevHitToast = Toast.makeText(
+ getActivity(), msgFormat.format(arguments), Toast.LENGTH_SHORT);
mDevHitToast.show();
}
} else if (mDevHitCountdown < 0) {
diff --git a/Settings/src/com/android/tv/settings/about/ConsumerInformationDialogPreferenceCompat.java b/Settings/src/com/android/tv/settings/about/ConsumerInformationDialogPreferenceCompat.java
new file mode 100644
index 0000000..32c81b1
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/about/ConsumerInformationDialogPreferenceCompat.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.about;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.TsDialogPreference;
+
+/**
+ * Implementation of {@link TsDialogPreference} to show the consumer information
+ * {@link androidx.preference.Preference Preference}.
+ */
+public class ConsumerInformationDialogPreferenceCompat extends TsDialogPreference {
+ public ConsumerInformationDialogPreferenceCompat(Context context, AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ public ConsumerInformationDialogPreferenceCompat(Context context, AttributeSet attrs,
+ int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public ConsumerInformationDialogPreferenceCompat(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public ConsumerInformationDialogPreferenceCompat(Context context) {
+ super(context);
+ }
+
+ @Override
+ public CharSequence getDialogMessage() {
+ return getContext().getString(R.string.consumer_information_message);
+ }
+
+ @Override
+ public CharSequence getPositiveButtonText() {
+ return getContext().getString(R.string.consumer_information_button_ok);
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/about/LegalFragment.java b/Settings/src/com/android/tv/settings/about/LegalFragment.java
index 7f3b5fc..d6e555a 100644
--- a/Settings/src/com/android/tv/settings/about/LegalFragment.java
+++ b/Settings/src/com/android/tv/settings/about/LegalFragment.java
@@ -30,7 +30,7 @@
import com.android.tv.settings.PreferenceUtils;
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
@Keep
public class LegalFragment extends SettingsPreferenceFragment {
diff --git a/Settings/src/com/android/tv/settings/about/LegalFragmentCompat.java b/Settings/src/com/android/tv/settings/about/LegalFragmentCompat.java
new file mode 100644
index 0000000..40b08af
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/about/LegalFragmentCompat.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.about;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_LEGAL;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+
+@Keep
+public class LegalFragmentCompat extends PreferenceControllerFragmentCompat {
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ setPreferencesFromResource(R.xml.about_legal_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_LEGAL;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/about/RebootConfirmFragment.java b/Settings/src/com/android/tv/settings/about/RebootConfirmFragment.java
index ce6662f..daf73fe 100644
--- a/Settings/src/com/android/tv/settings/about/RebootConfirmFragment.java
+++ b/Settings/src/com/android/tv/settings/about/RebootConfirmFragment.java
@@ -16,10 +16,10 @@
package com.android.tv.settings.about;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_VENDOR;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_X;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_CLASSIC;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_VENDOR;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_X;
import android.content.Context;
import android.os.AsyncTask;
@@ -34,7 +34,7 @@
import androidx.leanback.widget.GuidedAction;
import com.android.tv.settings.R;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import java.util.List;
diff --git a/Settings/src/com/android/tv/settings/about/StatusActivity.java b/Settings/src/com/android/tv/settings/about/StatusActivity.java
index 15c5275..fbe4a45 100644
--- a/Settings/src/com/android/tv/settings/about/StatusActivity.java
+++ b/Settings/src/com/android/tv/settings/about/StatusActivity.java
@@ -19,13 +19,13 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
public class StatusActivity extends TvSettingsActivity {
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(StatusFragment.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(StatusFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/accessibility/AccessibilityFragment.java b/Settings/src/com/android/tv/settings/accessibility/AccessibilityFragment.java
index a7f6aa7..75b65e4 100644
--- a/Settings/src/com/android/tv/settings/accessibility/AccessibilityFragment.java
+++ b/Settings/src/com/android/tv/settings/accessibility/AccessibilityFragment.java
@@ -53,6 +53,7 @@
@Keep
public class AccessibilityFragment extends SettingsPreferenceFragment {
private static final String TOGGLE_HIGH_TEXT_CONTRAST_KEY = "toggle_high_text_contrast";
+ private static final String TOGGLE_AUDIO_DESCRIPTION_KEY = "toggle_audio_description";
private static final String ACCESSIBILITY_SERVICES_KEY = "system_accessibility_services";
private PreferenceGroup mServicesPref;
@@ -94,6 +95,12 @@
highContrastPreference.setChecked(Settings.Secure.getInt(getContext().getContentResolver(),
Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, 0) == 1);
+ final TwoStatePreference audioDescriptionPreference =
+ (TwoStatePreference) findPreference(TOGGLE_AUDIO_DESCRIPTION_KEY);
+ audioDescriptionPreference.setChecked(Settings.Secure.getInt(
+ getContext().getContentResolver(),
+ Settings.Secure.ENABLED_ACCESSIBILITY_AUDIO_DESCRIPTION_BY_DEFAULT, 0) == 1);
+
mServicesPref = (PreferenceGroup) findPreference(ACCESSIBILITY_SERVICES_KEY);
if (mServicesPref != null) {
refreshServices(mServicesPref);
@@ -115,6 +122,14 @@
Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED,
(((SwitchPreference) preference).isChecked() ? 1 : 0));
return true;
+ } else if (TextUtils.equals(preference.getKey(), TOGGLE_AUDIO_DESCRIPTION_KEY)) {
+ logToggleInteracted(
+ TvSettingsEnums.SYSTEM_A11Y_AUDIO_DESCRIPTION,
+ ((SwitchPreference) preference).isChecked());
+ Settings.Secure.putInt(getActivity().getContentResolver(),
+ Settings.Secure.ENABLED_ACCESSIBILITY_AUDIO_DESCRIPTION_BY_DEFAULT,
+ (((SwitchPreference) preference).isChecked() ? 1 : 0));
+ return true;
} else {
return super.onPreferenceTreeClick(preference);
}
diff --git a/Settings/src/com/android/tv/settings/accessibility/AccessibilityFragmentCompat.java b/Settings/src/com/android/tv/settings/accessibility/AccessibilityFragmentCompat.java
new file mode 100644
index 0000000..d34c772
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/accessibility/AccessibilityFragmentCompat.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.tv.settings.accessibility;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_ACCESSIBILITY;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceManager;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+
+/**
+ * Fragment for Accessibility settings
+ */
+@Keep
+public class AccessibilityFragmentCompat extends PreferenceControllerFragmentCompat {
+ private static final String ACCESSIBILITY_SERVICES_KEY = "system_accessibility_services";
+ private static final String TOGGLE_HIGH_TEXT_CONTRAST_KEY = "toggle_high_text_contrast";
+ private static final String TOGGLE_AUDIO_DESCRIPTION_KEY = "toggle_audio_description";
+
+ private PreferenceGroup mServicesPref;
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_ACCESSIBILITY;
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ getPreferenceManager()
+ .setPreferenceComparisonCallback(
+ new PreferenceManager.SimplePreferenceComparisonCallback());
+ setPreferencesFromResource(R.xml.accessibility_compat, null);
+
+ mServicesPref = (PreferenceGroup) findPreference(ACCESSIBILITY_SERVICES_KEY);
+ findPreference(TOGGLE_HIGH_TEXT_CONTRAST_KEY).setOnPreferenceChangeListener(this);
+ findPreference(TOGGLE_AUDIO_DESCRIPTION_KEY).setOnPreferenceChangeListener(this);
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat prefCompat) {
+ HasKeys preference = super.updatePref(prefCompat);
+ if (preference == null) {
+ return null;
+ }
+ switch (prefCompat.getKey()[0]) {
+ case ACCESSIBILITY_SERVICES_KEY:
+ RenderUtil.updatePreferenceGroup(
+ mServicesPref, prefCompat.getChildPrefCompats());
+ break;
+ default:
+ // no-op
+ }
+ return preference;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/accessibility/AccessibilityServiceFragmentCompat.java b/Settings/src/com/android/tv/settings/accessibility/AccessibilityServiceFragmentCompat.java
new file mode 100644
index 0000000..930b0ee
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/accessibility/AccessibilityServiceFragmentCompat.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.tv.settings.accessibility;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_ACCESSIBILITY_SERVICE;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.PreferenceManager;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.compat.TsPreferenceCategory;
+import com.android.tv.settings.compat.TsRestrictedSwitchPreference;
+import com.android.tv.settings.library.PreferenceCompat;
+
+/**
+ * Fragment for controlling accessibility service
+ */
+@Keep
+public class AccessibilityServiceFragmentCompat extends
+ PreferenceControllerFragmentCompat {
+ private static final String KEY_SCREEN = "screen";
+ private static final String KEY_ENABLE = "enable";
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_ACCESSIBILITY_SERVICE;
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ getPreferenceManager()
+ .setPreferenceComparisonCallback(
+ new PreferenceManager.SimplePreferenceComparisonCallback());
+ setPreferencesFromResource(R.xml.accessibility_service_compat, null);
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat prefCompat) {
+ HasKeys preference = super.updatePref(prefCompat);
+ if (preference == null) {
+ return null;
+ }
+ switch (prefCompat.getKey()[0]) {
+ case KEY_SCREEN:
+ final TsPreferenceCategory screen = findPreference(KEY_SCREEN);
+ RenderUtil.updatePreferenceGroup(screen, prefCompat.getChildPrefCompats());
+ // Set OnPreferenceChangeListener to the ENABLE switch after them created.
+ TsRestrictedSwitchPreference enable = findPreference(KEY_ENABLE);
+ enable.setOnPreferenceChangeListener(this);
+ break;
+ default:
+ // no-op
+ }
+ return preference;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/accessibility/AccessibilityShortcutFragmentCompat.java b/Settings/src/com/android/tv/settings/accessibility/AccessibilityShortcutFragmentCompat.java
new file mode 100644
index 0000000..e7bf304
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/accessibility/AccessibilityShortcutFragmentCompat.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.accessibility;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_ACCESSIBILITY_SHORTCUT;
+import static com.android.tv.settings.util.InstrumentationUtils.logToggleInteracted;
+
+import android.app.tvsettings.TvSettingsEnums;
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.PreferenceManager;
+import androidx.preference.TwoStatePreference;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.library.accessibility.AccessibilityShortcutState;
+
+/**
+ * Fragment for configuring the accessibility shortcut
+ */
+@Keep
+public class AccessibilityShortcutFragmentCompat extends PreferenceControllerFragmentCompat {
+ private static final String KEY_ENABLE = "enable";
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ getPreferenceManager()
+ .setPreferenceComparisonCallback(
+ new PreferenceManager.SimplePreferenceComparisonCallback());
+ setPreferencesFromResource(R.xml.accessibility_shortcut_compat, null);
+
+ final TwoStatePreference enablePref = findPreference(KEY_ENABLE);
+ enablePref.setOnPreferenceChangeListener((preference, newValue) -> {
+ logToggleInteracted(TvSettingsEnums.SYSTEM_A11Y_SHORTCUT_ON_OFF, (Boolean) newValue);
+ AccessibilityShortcutState state = getState(AccessibilityShortcutState.class);
+ state.setAccessibilityShortcutEnabled((Boolean) newValue);
+ return true;
+ });
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_ACCESSIBILITY_SHORTCUT;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/accessibility/AccessibilityShortcutServiceFragmentCompat.java b/Settings/src/com/android/tv/settings/accessibility/AccessibilityShortcutServiceFragmentCompat.java
new file mode 100644
index 0000000..d2f53a8
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/accessibility/AccessibilityShortcutServiceFragmentCompat.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.tv.settings.accessibility;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_ACCESSIBILITY_SHORTCUT_SERVICE;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.PreferenceManager;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.compat.TsPreferenceCategory;
+import com.android.tv.settings.compat.TsRadioPreference;
+import com.android.tv.settings.library.PreferenceCompat;
+
+/**
+ * Fragment imitating a single-selection list for picking the accessibility shortcut service
+ */
+@Keep
+public class AccessibilityShortcutServiceFragmentCompat extends PreferenceControllerFragmentCompat {
+ private static final String TAG = "AccessibilityShortcutServiceFragmentCompat";
+ private static final String KEY_SCREEN = "screen";
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat prefCompat) {
+ HasKeys preference = super.updatePref(prefCompat);
+ if (preference == null) {
+ return null;
+ }
+ switch (prefCompat.getKey()[0]) {
+ case KEY_SCREEN:
+ final TsPreferenceCategory screen = findPreference(KEY_SCREEN);
+ RenderUtil.updatePreferenceGroup(screen, prefCompat.getChildPrefCompats());
+ // Set OnPreferenceChangeListener to the RadioPreference after them created.
+ int prefCount = screen.getPreferenceCount();
+ for (int i = 0; i < prefCount; i++) {
+ TsRadioPreference pref = (TsRadioPreference) screen.getPreference(i);
+ pref.setOnPreferenceChangeListener(this);
+ }
+ break;
+ default:
+ // no-op
+ }
+ return preference;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_ACCESSIBILITY_SHORTCUT_SERVICE;
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ getPreferenceManager()
+ .setPreferenceComparisonCallback(
+ new PreferenceManager.SimplePreferenceComparisonCallback());
+ setPreferencesFromResource(R.xml.accessibility_shortcut_service_compat, null);
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/accessories/A2dpDeviceCriteria.java b/Settings/src/com/android/tv/settings/accessories/A2dpDeviceCriteria.java
index 79e0d7d..8fe2543 100644
--- a/Settings/src/com/android/tv/settings/accessories/A2dpDeviceCriteria.java
+++ b/Settings/src/com/android/tv/settings/accessories/A2dpDeviceCriteria.java
@@ -38,7 +38,8 @@
majorMinorClass == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES ||
majorMinorClass == BluetoothClass.Device.AUDIO_VIDEO_LOUDSPEAKER ||
majorMinorClass == BluetoothClass.Device.AUDIO_VIDEO_PORTABLE_AUDIO ||
- majorMinorClass == BluetoothClass.Device.AUDIO_VIDEO_HIFI_AUDIO
- );
+ majorMinorClass == BluetoothClass.Device.AUDIO_VIDEO_HIFI_AUDIO ||
+ majorMinorClass == BluetoothClass.Device.AUDIO_VIDEO_VIDEO_DISPLAY_AND_LOUDSPEAKER
+ );
}
}
diff --git a/Settings/src/com/android/tv/settings/accessories/AccessoryUtils.java b/Settings/src/com/android/tv/settings/accessories/AccessoryUtils.java
index becd1b8..560e91e 100644
--- a/Settings/src/com/android/tv/settings/accessories/AccessoryUtils.java
+++ b/Settings/src/com/android/tv/settings/accessories/AccessoryUtils.java
@@ -19,12 +19,11 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothProfile;
import android.content.Context;
+import android.text.Html;
import android.util.Log;
-import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -141,6 +140,13 @@
Collections.unmodifiableList(
Arrays.asList(context.getResources().getStringArray(
R.array.known_bluetooth_device_labels)));
+ // For backward compatibility, the customization name used to be known_remote_labels
+ if (sKnownDeviceLabels.isEmpty()) {
+ sKnownDeviceLabels = Collections.unmodifiableList(
+ Arrays.asList(
+ context.getResources().getStringArray(
+ R.array.known_remote_labels)));
+ }
}
}
@@ -153,7 +159,15 @@
return false;
}
+ @Nullable
+ static String getHtmlEscapedDeviceName(@Nullable BluetoothDevice bluetoothDevice) {
+ if (bluetoothDevice == null || bluetoothDevice.getName() == null) {
+ return null;
+ }
+ return Html.escapeHtml(bluetoothDevice.getName());
+ }
+
private AccessoryUtils() {
// do not allow instantiation
}
-}
\ No newline at end of file
+}
diff --git a/Settings/src/com/android/tv/settings/accessories/AddAccessoryActivity.java b/Settings/src/com/android/tv/settings/accessories/AddAccessoryActivity.java
index 65a5c13..e2498f4 100644
--- a/Settings/src/com/android/tv/settings/accessories/AddAccessoryActivity.java
+++ b/Settings/src/com/android/tv/settings/accessories/AddAccessoryActivity.java
@@ -56,11 +56,6 @@
private static final boolean DEBUG = false;
private static final String TAG = "AddAccessoryActivity";
- static final String ACTION_CONNECT_INPUT =
- "com.google.android.intent.action.CONNECT_INPUT";
-
- private static final String INTENT_EXTRA_NO_INPUT_MODE = "no_input_mode";
-
private static final String SAVED_STATE_PREFERENCE_FRAGMENT =
"AddAccessoryActivity.PREFERENCE_FRAGMENT";
private static final String SAVED_STATE_CONTENT_FRAGMENT =
@@ -70,6 +65,11 @@
private static final String ADDRESS_NONE = "NONE";
+ public static final String ACTION_CONNECT_INPUT =
+ "com.google.android.intent.action.CONNECT_INPUT";
+
+ public static final String INTENT_EXTRA_NO_INPUT_MODE = "no_input_mode";
+
private static final int AUTOPAIR_COUNT = 10;
private static final int MSG_UPDATE_VIEW = 1;
@@ -336,7 +336,7 @@
if (ACTION_CONNECT_INPUT.equals(intent.getAction()) &&
(intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) == 0) {
- KeyEvent event = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
+ KeyEvent event = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT, KeyEvent.class);
if (event != null && event.getKeyCode() == KeyEvent.KEYCODE_PAIRING) {
if (event.getAction() == KeyEvent.ACTION_UP) {
onHwKeyEvent(false);
@@ -595,6 +595,9 @@
case BluetoothDevicePairer.STATUS_ERROR:
state = "BluetoothDevicePairer.STATUS_ERROR";
break;
+ case BluetoothDevicePairer.STATUS_SUCCEED_BREDRMOUSE:
+ state = "BluetoothDevicePairer.STATUS_SUCCEED_BREDRMOUSE";
+ break;
}
long time = mBluetoothPairer.getNextStageTime() - SystemClock.elapsedRealtime();
Log.d(TAG, "Update received, number of devices:" + numDevices + " state: " +
@@ -662,6 +665,16 @@
clearDeviceList();
}
break;
+ case BluetoothDevicePairer.STATUS_SUCCEED_BREDRMOUSE:
+ // Pairing complete
+ mCurrentTargetStatus = getString(R.string.accessory_state_paired);
+ mMsgHandler.sendEmptyMessage(MSG_UPDATE_VIEW);
+ mMsgHandler.sendEmptyMessageDelayed(MSG_PAIRING_COMPLETE,
+ DONE_MESSAGE_TIMEOUT);
+ mDone = true;
+ // Done, return here and just wait for the message
+ // to close the activity
+ return;
}
mCurrentTargetAddress = address;
diff --git a/Settings/src/com/android/tv/settings/accessories/AddAccessoryPreferenceFragment.java b/Settings/src/com/android/tv/settings/accessories/AddAccessoryPreferenceFragment.java
index b3dfd4f..6712eb0 100644
--- a/Settings/src/com/android/tv/settings/accessories/AddAccessoryPreferenceFragment.java
+++ b/Settings/src/com/android/tv/settings/accessories/AddAccessoryPreferenceFragment.java
@@ -104,10 +104,15 @@
Drawable drawable = mResizedDrawables.get(resId);
if (drawable == null) {
final Drawable tempDrawable = getActivity().getDrawable(resId);
+ // icons for TwoPanel have a bigger icon offset
+ final int iconOffset =
+ getResources().getDimensionPixelSize(R.dimen.preference_icon_offset);
final int iconWidth =
- getResources().getDimensionPixelSize(R.dimen.lb_dialog_list_item_icon_width);
+ getResources().getDimensionPixelSize(R.dimen.lb_dialog_list_item_icon_width)
+ + iconOffset;
final int iconHeight =
- getResources().getDimensionPixelSize(R.dimen.lb_dialog_list_item_icon_height);
+ getResources().getDimensionPixelSize(R.dimen.lb_dialog_list_item_icon_height)
+ + iconOffset;
tempDrawable.setBounds(0, 0, iconWidth, iconHeight);
final Bitmap bitmap =
Bitmap.createBitmap(iconWidth, iconHeight, Bitmap.Config.ARGB_8888);
diff --git a/Settings/src/com/android/tv/settings/accessories/BluetoothA2dpConnector.java b/Settings/src/com/android/tv/settings/accessories/BluetoothA2dpConnector.java
index a2ee54c..7ece9e9 100644
--- a/Settings/src/com/android/tv/settings/accessories/BluetoothA2dpConnector.java
+++ b/Settings/src/com/android/tv/settings/accessories/BluetoothA2dpConnector.java
@@ -57,11 +57,10 @@
if (mA2dpProfile == null) {
break;
}
- mA2dpProfile.connect(mTarget);
- // must set PRIORITY_AUTO_CONNECT or auto-connection will not
+ // must set CONNECTION_POLICY_ALLOWED or auto-connection will not
// occur, however this setting does not appear to be sticky
// across a reboot
- mA2dpProfile.setPriority(mTarget, BluetoothProfile.PRIORITY_AUTO_CONNECT);
+ mA2dpProfile.setConnectionPolicy(mTarget, BluetoothProfile.CONNECTION_POLICY_ALLOWED);
break;
default:
break;
diff --git a/Settings/src/com/android/tv/settings/accessories/BluetoothAccessoryActivity.java b/Settings/src/com/android/tv/settings/accessories/BluetoothAccessoryActivity.java
index 2d82ee0..176b17f 100644
--- a/Settings/src/com/android/tv/settings/accessories/BluetoothAccessoryActivity.java
+++ b/Settings/src/com/android/tv/settings/accessories/BluetoothAccessoryActivity.java
@@ -26,7 +26,6 @@
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.tv.settings.R;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
public class BluetoothAccessoryActivity extends TvSettingsActivity {
@@ -58,7 +57,8 @@
deviceName = getString(R.string.accessory_options);
deviceImgId = R.drawable.ic_qs_bluetooth_not_connected;
}
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(BluetoothAccessoryFragment.class.getName(),
getArguments(deviceAddress, deviceName, deviceImgId));
}
diff --git a/Settings/src/com/android/tv/settings/accessories/BluetoothAccessoryFragment.java b/Settings/src/com/android/tv/settings/accessories/BluetoothAccessoryFragment.java
index 3bbf476..808350e 100644
--- a/Settings/src/com/android/tv/settings/accessories/BluetoothAccessoryFragment.java
+++ b/Settings/src/com/android/tv/settings/accessories/BluetoothAccessoryFragment.java
@@ -155,6 +155,7 @@
public void onStart() {
super.onStart();
if (mDevice != null &&
+ mDevice.isConnected() &&
(mDevice.getType() == BluetoothDevice.DEVICE_TYPE_LE ||
mDevice.getType() == BluetoothDevice.DEVICE_TYPE_DUAL)) {
// Only LE devices support GATT
diff --git a/Settings/src/com/android/tv/settings/accessories/BluetoothDevicePairer.java b/Settings/src/com/android/tv/settings/accessories/BluetoothDevicePairer.java
index 8ad1a05..3b816a7 100644
--- a/Settings/src/com/android/tv/settings/accessories/BluetoothDevicePairer.java
+++ b/Settings/src/com/android/tv/settings/accessories/BluetoothDevicePairer.java
@@ -19,7 +19,6 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
-import android.bluetooth.IBluetoothA2dp;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -36,6 +35,7 @@
import com.android.tv.settings.util.bluetooth.BluetoothDeviceCriteria;
import com.android.tv.settings.util.bluetooth.BluetoothScanner;
+import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
@@ -98,6 +98,11 @@
* Device has been paired with, we are opening a connection to the device.
*/
public static final int STATUS_CONNECTING = 4;
+ /**
+ * BR/EDR mice need to be handled separately because of the unique
+ * connection establishment sequence.
+ */
+ public static final int STATUS_SUCCEED_BREDRMOUSE = 5;
public interface EventListener {
@@ -183,6 +188,14 @@
isCompatible = true;
}
+ if ((sources & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) {
+ isCompatible = true;
+ }
+
+ if ((sources & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK) {
+ isCompatible = true;
+ }
+
if ((sources & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD) {
boolean isValidKeyboard = true;
String keyboardName = device.getName();
@@ -307,7 +320,7 @@
// Add Bluetooth a2dp on if the service is running and the
// setting profile_supported_a2dp is set to true.
- Intent intent = new Intent(IBluetoothA2dp.class.getName());
+ Intent intent = new Intent("android.bluetooth.IBluetoothA2dp");
ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0);
if (comp != null) {
int enabledState = mContext.getPackageManager().getComponentEnabledSetting(comp);
@@ -358,9 +371,10 @@
if (scanMode != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
Log.d(TAG, "Turning on discoverability, default scan mode: " + scanMode);
mDefaultScanMode = scanMode;
+ // Remove discoverable timeout.
+ bluetoothAdapter.setDiscoverableTimeout(Duration.ZERO);
bluetoothAdapter.setScanMode(
- BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE,
- 0 /* no timeout */);
+ BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
}
// set status to scanning before we start listening since
@@ -595,7 +609,17 @@
}
private void onBonded() {
- openConnection();
+ BluetoothDevice target = getTargetDevice();
+ if (!(target.getBluetoothClass().getDeviceClass()
+ == BluetoothClass.Device.PERIPHERAL_POINTING)
+ || !(target.getType() == BluetoothDevice.DEVICE_TYPE_CLASSIC)) {
+ openConnection();
+ } else if (target.isConnected()) {
+ setStatus(STATUS_SUCCEED_BREDRMOUSE);
+ } else {
+ Log.w(TAG, "There was an error connect by BR/EDR Mouse.");
+ setStatus(STATUS_ERROR);
+ }
}
private void openConnection() {
diff --git a/Settings/src/com/android/tv/settings/accessories/BluetoothDevicesService.java b/Settings/src/com/android/tv/settings/accessories/BluetoothDevicesService.java
index dc1b7de..6f80a60 100644
--- a/Settings/src/com/android/tv/settings/accessories/BluetoothDevicesService.java
+++ b/Settings/src/com/android/tv/settings/accessories/BluetoothDevicesService.java
@@ -22,6 +22,7 @@
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHidHost;
import android.bluetooth.BluetoothProfile;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -132,6 +133,11 @@
}
} else {
switch(action) {
+ case BluetoothHidHost.ACTION_CONNECTION_STATE_CHANGED:
+ if (device.getBondState() == BluetoothDevice.BOND_BONDED) {
+ mHandler.post(() -> onDeviceUpdated(device));
+ }
+ break;
case BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED:
int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
mHandler.post(() -> onA2dpConnectionStateChanged(device.getName(), state));
@@ -169,6 +175,7 @@
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
+ filter.addAction(BluetoothHidHost.ACTION_CONNECTION_STATE_CHANGED);
filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED); // Headset connection
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); // Bluetooth toggle
registerReceiver(mBluetoothReceiver, filter);
diff --git a/Settings/src/com/android/tv/settings/accessories/BluetoothInputDeviceConnector.java b/Settings/src/com/android/tv/settings/accessories/BluetoothInputDeviceConnector.java
index 1e6820f..35ee976 100644
--- a/Settings/src/com/android/tv/settings/accessories/BluetoothInputDeviceConnector.java
+++ b/Settings/src/com/android/tv/settings/accessories/BluetoothInputDeviceConnector.java
@@ -62,12 +62,10 @@
}
// TODO need to start a timer, otherwise if the connection fails we might be
// stuck here forever
- mInputProxy.connect(mTarget);
-
- // must set PRIORITY_AUTO_CONNECT or auto-connection will not
+ // must set CONNECTION_POLICY_ALLOWED or auto-connection will not
// occur, however this setting does not appear to be sticky
// across a reboot
- mInputProxy.setPriority(mTarget, BluetoothProfile.PRIORITY_AUTO_CONNECT);
+ mInputProxy.setConnectionPolicy(mTarget, BluetoothProfile.CONNECTION_POLICY_ALLOWED);
}
}
};
diff --git a/Settings/src/com/android/tv/settings/accessories/BluetoothPairingDialog.java b/Settings/src/com/android/tv/settings/accessories/BluetoothPairingDialog.java
index af6447b..52eaac7 100644
--- a/Settings/src/com/android/tv/settings/accessories/BluetoothPairingDialog.java
+++ b/Settings/src/com/android/tv/settings/accessories/BluetoothPairingDialog.java
@@ -16,6 +16,8 @@
package com.android.tv.settings.accessories;
+import static com.android.tv.settings.accessories.AccessoryUtils.getHtmlEscapedDeviceName;
+
import android.app.Fragment;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
@@ -42,6 +44,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.tv.settings.R;
import com.android.tv.settings.dialog.old.Action;
import com.android.tv.settings.dialog.old.ActionFragment;
@@ -66,6 +69,8 @@
private static final int BLUETOOTH_PIN_MAX_LENGTH = 16;
private static final int BLUETOOTH_PASSKEY_MAX_LENGTH = 6;
+ @SuppressWarnings("unused")
+ private LocalBluetoothManager mLocalBtManager;
private BluetoothDevice mDevice;
private int mType;
private String mPairingKey;
@@ -110,6 +115,9 @@
return;
}
+ // LocalBluetoothManager monitors UUIDs and triggers HID host connection.
+ mLocalBtManager = AccessoryUtils.getLocalBluetoothManager(this);
+
mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
mType = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.ERROR);
@@ -263,7 +271,7 @@
if (DEBUG) {
Log.d(TAG, "cancelPairing");
}
- mDevice.cancelPairing();
+ mDevice.cancelBondProcess();
}
private void createUserEntryDialog() {
@@ -373,7 +381,8 @@
final int maxLength;
switch (mType) {
case BluetoothDevice.PAIRING_VARIANT_PIN:
- instructions = getString(R.string.bluetooth_enter_pin_msg, mDevice.getName());
+ instructions = getString(R.string.bluetooth_enter_pin_msg,
+ getHtmlEscapedDeviceName(mDevice));
final TextView instructionText = (TextView) v.findViewById(R.id.hint_text);
instructionText.setText(getString(R.string.bluetooth_pin_values_hint));
// Maximum of 16 characters in a PIN
@@ -383,7 +392,7 @@
case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
instructions = getString(R.string.bluetooth_enter_passkey_msg,
- mDevice.getName());
+ getHtmlEscapedDeviceName(mDevice));
// Maximum of 6 digits for passkey
maxLength = BLUETOOTH_PASSKEY_MAX_LENGTH;
textInput.setInputType(InputType.TYPE_CLASS_TEXT);
@@ -457,7 +466,7 @@
case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
instructions = getString(R.string.bluetooth_display_passkey_pin_msg,
- mDevice.getName(), mPairingKey);
+ getHtmlEscapedDeviceName(mDevice), mPairingKey);
// Since its only a notification, send an OK to the framework,
// indicating that the dialog has been displayed.
@@ -470,13 +479,13 @@
case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION:
instructions = getString(R.string.bluetooth_confirm_passkey_msg,
- mDevice.getName(), mPairingKey);
+ getHtmlEscapedDeviceName(mDevice), mPairingKey);
break;
case BluetoothDevice.PAIRING_VARIANT_CONSENT:
case BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT:
instructions = getString(R.string.bluetooth_incoming_pairing_msg,
- mDevice.getName());
+ getHtmlEscapedDeviceName(mDevice));
break;
default:
diff --git a/Settings/src/com/android/tv/settings/accessories/BluetoothRequestPermissionActivity.java b/Settings/src/com/android/tv/settings/accessories/BluetoothRequestPermissionActivity.java
index 8378d5f..188b6db 100644
--- a/Settings/src/com/android/tv/settings/accessories/BluetoothRequestPermissionActivity.java
+++ b/Settings/src/com/android/tv/settings/accessories/BluetoothRequestPermissionActivity.java
@@ -25,7 +25,7 @@
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
-import java.util.concurrent.TimeUnit;
+import java.time.Duration;
public class BluetoothRequestPermissionActivity extends FragmentActivity {
@@ -56,8 +56,8 @@
return;
}
- mBluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE,
- TimeUnit.SECONDS.toMillis(mTimeoutSeconds));
+ mBluetoothAdapter.setDiscoverableTimeout(Duration.ofSeconds(mTimeoutSeconds));
+ mBluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
setResult(Activity.RESULT_OK);
finish();
diff --git a/Settings/src/com/android/tv/settings/accessories/ConnectedDevicesSliceProvider.java b/Settings/src/com/android/tv/settings/accessories/ConnectedDevicesSliceProvider.java
index d2d927a..712123c 100644
--- a/Settings/src/com/android/tv/settings/accessories/ConnectedDevicesSliceProvider.java
+++ b/Settings/src/com/android/tv/settings/accessories/ConnectedDevicesSliceProvider.java
@@ -106,6 +106,7 @@
static final String KEY_PAIR_REMOTE = "pair_remote";
static final String KEY_ACCESSORIES = "accessories";
static final String KEY_OFFICIAL_REMOTE = "official_remote";
+ static final String KEY_IR = "ir";
static final String KEY_CONNECT = "connect";
static final String KEY_DISCONNECT = "disconnect";
static final String KEY_RENAME = "rename";
@@ -460,17 +461,25 @@
private void updateOfficialRemoteSettings(PreferenceSliceBuilder psb) {
String officialRemoteSettingsUri =
getString(R.string.bluetooth_official_remote_entry_slice_uri);
- if (TextUtils.isEmpty(officialRemoteSettingsUri)) {
- return;
- }
- if (ConnectedDevicesSliceUtils.isSliceProviderValid(
- getContext(), officialRemoteSettingsUri)) {
+ String irSettingsUri =
+ getString(R.string.bluetooth_ir_entry_slice_uri);
+ boolean isOfficialRemoteSettingsUriValid = isSliceProviderValid(officialRemoteSettingsUri);
+ boolean isIrSettingsUriValid = isSliceProviderValid(irSettingsUri);
+ if (isOfficialRemoteSettingsUriValid || isIrSettingsUriValid) {
psb.addPreferenceCategory(new RowBuilder()
- .setTitle(getContext().getString(R.string.bluetooth_official_remote_category)));
+ .setTitle(getString(R.string.bluetooth_official_remote_category)));
+ }
+ if (isIrSettingsUriValid) {
+ psb.addPreference(new RowBuilder()
+ .setKey(KEY_IR)
+ .setTitle(getString(R.string.bluetooth_ir_entry_title))
+ .setSubtitle(getString(R.string.bluetooth_ir_entry_subtitle))
+ .setTargetSliceUri(irSettingsUri));
+ }
+ if (isOfficialRemoteSettingsUriValid) {
psb.addPreference(new RowBuilder()
.setKey(KEY_OFFICIAL_REMOTE)
- .setTitle(getContext().getString(
- R.string.bluetooth_official_remote_entry_title))
+ .setTitle(getString(R.string.bluetooth_official_remote_entry_title))
.setTargetSliceUri(officialRemoteSettingsUri));
}
}
@@ -555,4 +564,9 @@
private String getString(@IntegerRes int resId) {
return getContext().getString(resId);
}
+
+ private boolean isSliceProviderValid(String uri) {
+ return !TextUtils.isEmpty(uri)
+ && ConnectedDevicesSliceUtils.isSliceProviderValid(getContext(), uri);
+ }
}
diff --git a/Settings/src/com/android/tv/settings/accounts/AccountSliceActivity.java b/Settings/src/com/android/tv/settings/accounts/AccountSliceActivity.java
index c1070d7..a3a50fc 100644
--- a/Settings/src/com/android/tv/settings/accounts/AccountSliceActivity.java
+++ b/Settings/src/com/android/tv/settings/accounts/AccountSliceActivity.java
@@ -16,7 +16,7 @@
package com.android.tv.settings.accounts;
-import static com.android.tv.settings.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
+import static com.android.tv.settings.library.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
import com.android.tv.settings.R;
import com.android.tv.settings.slice.SliceActivity;
diff --git a/Settings/src/com/android/tv/settings/accounts/AccountSyncActivity.java b/Settings/src/com/android/tv/settings/accounts/AccountSyncActivity.java
index 7c85d37..ef29847 100644
--- a/Settings/src/com/android/tv/settings/accounts/AccountSyncActivity.java
+++ b/Settings/src/com/android/tv/settings/accounts/AccountSyncActivity.java
@@ -24,7 +24,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
/**
* Displays the sync settings for a given account.
@@ -47,8 +46,9 @@
}
}
}
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(AccountSyncFragment.class.getName(), getArguments(account));
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(AccountSyncFragment.class.getName(), getArguments(account));
}
private Bundle getArguments(Account account) {
diff --git a/Settings/src/com/android/tv/settings/accounts/AccountsActivity.java b/Settings/src/com/android/tv/settings/accounts/AccountsActivity.java
index 1df5358..2267fe6 100644
--- a/Settings/src/com/android/tv/settings/accounts/AccountsActivity.java
+++ b/Settings/src/com/android/tv/settings/accounts/AccountsActivity.java
@@ -23,7 +23,6 @@
import com.android.tv.settings.TvSettingsActivity;
import com.android.tv.settings.basic.BasicModeAccountsAndSignInInfoFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
/** Activity for showing account settings (without slices). */
public class AccountsActivity extends TvSettingsActivity {
@@ -34,11 +33,13 @@
protected Fragment createSettingsFragment() {
if (getIntent().getIntExtra(EXTRA_FRAGMENT_TYPE, ACCOUNTS_FRAGMENT_DEFAULT)
== ACCOUNTS_BASIC_MODE_FRAGMENT) {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(BasicModeAccountsAndSignInInfoFragment.class.getName(),
null);
} else {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(AccountsFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/accounts/AccountsFragment.java b/Settings/src/com/android/tv/settings/accounts/AccountsFragment.java
index 546cfa0..a7d576a 100644
--- a/Settings/src/com/android/tv/settings/accounts/AccountsFragment.java
+++ b/Settings/src/com/android/tv/settings/accounts/AccountsFragment.java
@@ -42,7 +42,7 @@
import com.android.settingslib.accounts.AuthenticatorHelper;
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import com.android.tv.settings.system.SecurityFragment;
import java.util.ArrayList;
diff --git a/Settings/src/com/android/tv/settings/accounts/AccountsUtil.java b/Settings/src/com/android/tv/settings/accounts/AccountsUtil.java
index 9074872..a5c004b 100644
--- a/Settings/src/com/android/tv/settings/accounts/AccountsUtil.java
+++ b/Settings/src/com/android/tv/settings/accounts/AccountsUtil.java
@@ -27,8 +27,8 @@
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.tv.settings.MainFragment;
import com.android.tv.settings.R;
-import com.android.tv.settings.overlay.FlavorUtils;
-import com.android.tv.settings.util.SliceUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.SliceUtils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
diff --git a/Settings/src/com/android/tv/settings/accounts/AddAccountWithTypeActivity.java b/Settings/src/com/android/tv/settings/accounts/AddAccountWithTypeActivity.java
index 48b0fec..7a8c7fc 100644
--- a/Settings/src/com/android/tv/settings/accounts/AddAccountWithTypeActivity.java
+++ b/Settings/src/com/android/tv/settings/accounts/AddAccountWithTypeActivity.java
@@ -31,7 +31,7 @@
import androidx.fragment.app.FragmentActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import java.io.IOException;
diff --git a/Settings/src/com/android/tv/settings/accounts/ManageUserServicesSliceActivity.java b/Settings/src/com/android/tv/settings/accounts/ManageUserServicesSliceActivity.java
index 11438ad..bf62c75 100644
--- a/Settings/src/com/android/tv/settings/accounts/ManageUserServicesSliceActivity.java
+++ b/Settings/src/com/android/tv/settings/accounts/ManageUserServicesSliceActivity.java
@@ -16,7 +16,7 @@
package com.android.tv.settings.accounts;
-import static com.android.tv.settings.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
+import static com.android.tv.settings.library.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
import android.text.TextUtils;
diff --git a/Settings/src/com/android/tv/settings/autofill/AutofillPickerActivity.java b/Settings/src/com/android/tv/settings/autofill/AutofillPickerActivity.java
index 394bf8d..cfc07b8 100644
--- a/Settings/src/com/android/tv/settings/autofill/AutofillPickerActivity.java
+++ b/Settings/src/com/android/tv/settings/autofill/AutofillPickerActivity.java
@@ -22,7 +22,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
/**
* Activity pick current autofill service
@@ -44,7 +43,8 @@
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(AutofillPickerFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/autofill/AutofillPickerFragment.java b/Settings/src/com/android/tv/settings/autofill/AutofillPickerFragment.java
index b8c84fb..36b2cc0 100644
--- a/Settings/src/com/android/tv/settings/autofill/AutofillPickerFragment.java
+++ b/Settings/src/com/android/tv/settings/autofill/AutofillPickerFragment.java
@@ -32,10 +32,11 @@
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
-import com.android.settingslib.applications.DefaultAppInfo;
import com.android.tv.settings.R;
import com.android.tv.settings.RadioPreference;
import com.android.tv.settings.SettingsPreferenceFragment;
+import com.android.tv.settings.library.settingslib.AutofillHelper;
+import com.android.tv.settings.library.settingslib.DefaultAppInfo;
import java.util.List;
diff --git a/Settings/src/com/android/tv/settings/autofill/AutofillPickerTrampolineActivity.java b/Settings/src/com/android/tv/settings/autofill/AutofillPickerTrampolineActivity.java
index dc5df9a..4a4c95b 100644
--- a/Settings/src/com/android/tv/settings/autofill/AutofillPickerTrampolineActivity.java
+++ b/Settings/src/com/android/tv/settings/autofill/AutofillPickerTrampolineActivity.java
@@ -22,6 +22,8 @@
import androidx.fragment.app.FragmentActivity;
+import com.android.tv.settings.library.settingslib.AutofillHelper;
+
/**
* Standalone activity used to launch a {@link AutofillPickerActivity" from a
* {@link android.provider.Settings#ACTION_REQUEST_SET_AUTOFILL_SERVICE} intent.
diff --git a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl b/Settings/src/com/android/tv/settings/compat/HasKeys.java
similarity index 76%
copy from Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
copy to Settings/src/com/android/tv/settings/compat/HasKeys.java
index c065485..999b7c7 100644
--- a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
+++ b/Settings/src/com/android/tv/settings/compat/HasKeys.java
@@ -14,6 +14,11 @@
* limitations under the License.
*/
-package com.android.tv.settings.service;
+package com.android.tv.settings.compat;
-parcelable PreferenceParcelable;
\ No newline at end of file
+/** Implement this to add multiple key for Preference. */
+public interface HasKeys {
+ void setKeys(String[] keys);
+
+ String[] getKeys();
+}
diff --git a/Settings/src/com/android/tv/settings/compat/PreferenceControllerFragmentCompat.java b/Settings/src/com/android/tv/settings/compat/PreferenceControllerFragmentCompat.java
new file mode 100644
index 0000000..b04e3c2
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/PreferenceControllerFragmentCompat.java
@@ -0,0 +1,315 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.compat;
+
+import android.animation.AnimatorInflater;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.leanback.preference.LeanbackPreferenceFragmentCompat;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceGroupAdapter;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.PreferenceViewHolder;
+import androidx.preference.TwoStatePreference;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.tv.settings.HasSettingsManager;
+import com.android.tv.settings.R;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.SettingsManager;
+import com.android.tv.settings.library.State;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.twopanelsettings.TwoPanelSettingsFragment;
+
+import java.util.List;
+
+/** Provide utility class to render settings preferences. */
+public abstract class PreferenceControllerFragmentCompat extends LeanbackPreferenceFragmentCompat
+ implements Preference.OnPreferenceChangeListener {
+ private SettingsManager mSettingsManager;
+ private String mTitle;
+ private State mState;
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ if (getActivity() instanceof HasSettingsManager) {
+ mSettingsManager = ((HasSettingsManager) getActivity()).getSettingsManager();
+ mState = mSettingsManager.createState(getStateIdentifier());
+ if (mState != null) {
+ mState.onAttach();
+ }
+ }
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (mState != null) {
+ mState.onCreate(getArguments());
+ }
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ if (mState != null) {
+ mState.onStart();
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (getCallbackFragment() instanceof TwoPanelSettingsFragment) {
+ TwoPanelSettingsFragment parentFragment =
+ (TwoPanelSettingsFragment) getCallbackFragment();
+ parentFragment.addListenerForFragment(this);
+ }
+ if (mState != null) {
+ mState.onResume();
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ if (getCallbackFragment() instanceof TwoPanelSettingsFragment) {
+ TwoPanelSettingsFragment parentFragment =
+ (TwoPanelSettingsFragment) getCallbackFragment();
+ parentFragment.removeListenerForFragment(this);
+ }
+ if (mState != null) {
+ mState.onPause();
+ }
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ if (mState != null) {
+ mState.onStop();
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (mState != null) {
+ mState.onDestroy();
+ }
+ }
+
+ @Override
+ public void onDetach() {
+ super.onDetach();
+ if (mState != null) {
+ mState.onDetach();
+ }
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference) {
+ if (getActivity() instanceof HasSettingsManager) {
+ if (mState == null || (!(preference instanceof HasKeys))) {
+ return super.onPreferenceTreeClick(preference);
+ }
+ boolean handled = mSettingsManager.onPreferenceClick(
+ mState,
+ ((HasKeys) preference).getKeys(),
+ preference instanceof TwoStatePreference
+ && ((TwoStatePreference) preference).isChecked());
+ if (handled) {
+ return true;
+ }
+ }
+ return super.onPreferenceTreeClick(preference);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ if (mSettingsManager == null || mState == null || !(preference instanceof HasKeys)) {
+ return false;
+ }
+ return mSettingsManager.onPreferenceChange(
+ mState,
+ ((HasKeys) preference).getKeys(),
+ newValue);
+ }
+
+ protected Preference findTargetPreference(String[] key) {
+ Preference preference = findPreference(key[0]);
+ for (int i = 1; i < key.length; i++) {
+ if (preference instanceof PreferenceGroup) {
+ PreferenceGroup preferenceGroup = (PreferenceGroup) preference;
+ preference = preferenceGroup.findPreference(key[i]);
+ } else {
+ return null;
+ }
+ }
+ return preference;
+ }
+
+ public HasKeys updatePref(PreferenceCompat prefCompat) {
+ if (prefCompat == null) {
+ return null;
+ }
+ String[] key = prefCompat.getKey();
+ Preference preference = findTargetPreference(key);
+ if (preference == null) {
+ return null;
+ }
+
+ RenderUtil.updatePreference(
+ getContext(), (HasKeys) preference, prefCompat, preference.getOrder());
+ if (prefCompat.hasOnPreferenceChangeListener()) {
+ preference.setOnPreferenceChangeListener(this);
+ }
+ if (prefCompat.getChildPrefCompats() != null && prefCompat.getChildPrefCompats().size() > 0
+ && preference instanceof PreferenceGroup) {
+ RenderUtil.updatePreferenceGroup((PreferenceGroup) preference,
+ prefCompat.getChildPrefCompats());
+ }
+ return (HasKeys) preference;
+ }
+
+ public void updateAllPref(List<PreferenceCompat> preferenceCompatList) {
+ if (preferenceCompatList == null) {
+ return;
+ }
+ preferenceCompatList.stream()
+ .forEach(preferenceCompat -> updatePref(preferenceCompat));
+ }
+
+ public void updateScreenTitle(String title) {
+ setTitle(title);
+ mTitle = title;
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ }
+
+ /**
+ * Return the state identifier to be matched with SettingsAPI for the fragment.
+ *
+ * @return state identifier
+ */
+ public abstract int getStateIdentifier();
+
+ public State getState() {
+ return mState;
+ }
+
+ public <T extends State> T getState(Class<T> clazz) {
+ return clazz.cast(mState);
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ if (view != null) {
+ TextView titleView = view.findViewById(R.id.decor_title);
+ // We rely on getResources().getConfiguration().getLayoutDirection() instead of
+ // view.isLayoutRtl() as the latter could return false in some complex scenarios even if
+ // it is RTL.
+ if (titleView != null) {
+ if (mTitle != null) {
+ titleView.setText(mTitle);
+ }
+ if (getResources().getConfiguration().getLayoutDirection()
+ == View.LAYOUT_DIRECTION_RTL) {
+ titleView.setGravity(Gravity.RIGHT);
+ }
+ }
+ if (FlavorUtils.isTwoPanel(getContext())) {
+ ViewGroup decor = view.findViewById(R.id.decor_title_container);
+ if (decor != null) {
+ decor.setOutlineProvider(null);
+ decor.setBackgroundResource(R.color.tp_preference_panel_background_color);
+ }
+ }
+ removeAnimationClipping(view);
+ }
+ }
+
+ protected void removeAnimationClipping(View v) {
+ if (v instanceof ViewGroup) {
+ ((ViewGroup) v).setClipChildren(false);
+ ((ViewGroup) v).setClipToPadding(false);
+ for (int index = 0; index < ((ViewGroup) v).getChildCount(); index++) {
+ View child = ((ViewGroup) v).getChildAt(index);
+ removeAnimationClipping(child);
+ }
+ }
+ }
+
+ @Override
+ protected RecyclerView.Adapter onCreateAdapter(PreferenceScreen preferenceScreen) {
+ return new PreferenceGroupAdapter(preferenceScreen) {
+ @Override
+ @NonNull
+ public PreferenceViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
+ int viewType) {
+ PreferenceViewHolder vh = super.onCreateViewHolder(parent, viewType);
+ if (FlavorUtils.isTwoPanel(getContext())) {
+ vh.itemView.setStateListAnimator(AnimatorInflater.loadStateListAnimator(
+ getContext(), R.animator.preference));
+ }
+ vh.itemView.setOnTouchListener((v, e) -> {
+ if (e.getActionMasked() == MotionEvent.ACTION_DOWN) {
+ vh.itemView.requestFocus();
+ v.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,
+ KeyEvent.KEYCODE_DPAD_CENTER));
+ return true;
+ } else if (e.getActionMasked() == MotionEvent.ACTION_UP) {
+ v.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,
+ KeyEvent.KEYCODE_DPAD_CENTER));
+ return true;
+ }
+ return false;
+ });
+ vh.itemView.setFocusable(true);
+ vh.itemView.setFocusableInTouchMode(true);
+ return vh;
+ }
+ };
+ }
+
+ @Override
+ public void onDisplayPreferenceDialog(Preference preference) {
+ if (getActivity() instanceof HasSettingsManager) {
+ if (mState == null || (!(preference instanceof HasKeys))) {
+ super.onDisplayPreferenceDialog(preference);
+ return;
+ }
+ mSettingsManager.onDisplayPreferenceDialog(mState, ((HasKeys) preference).getKeys());
+ return;
+ }
+ super.onDisplayPreferenceDialog(preference);
+ }
+}
+
diff --git a/Settings/src/com/android/tv/settings/compat/RenderUtil.java b/Settings/src/com/android/tv/settings/compat/RenderUtil.java
new file mode 100644
index 0000000..4777dee
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/RenderUtil.java
@@ -0,0 +1,334 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.compat;
+
+import static com.android.tv.settings.compat.TsCollapsibleCategory.COLLAPSE;
+import static com.android.tv.settings.library.ManagerUtil.INFO_WIFI_SIGNAL_LEVEL;
+import static com.android.tv.settings.library.ManagerUtil.STATE_ACCESSIBILITY_SERVICE;
+import static com.android.tv.settings.library.ManagerUtil.STATE_APPS;
+import static com.android.tv.settings.library.ManagerUtil.STATE_APP_MANAGEMENT;
+import static com.android.tv.settings.library.ManagerUtil.STATE_EMPTY;
+import static com.android.tv.settings.library.ManagerUtil.STATE_MISSING_STORAGE;
+import static com.android.tv.settings.library.ManagerUtil.STATE_STORAGE;
+import static com.android.tv.settings.library.ManagerUtil.STATE_WIFI_DETAILS;
+import static com.android.tv.settings.library.PreferenceCompat.TYPE_DIALOG;
+import static com.android.tv.settings.library.PreferenceCompat.TYPE_LIST;
+import static com.android.tv.settings.library.PreferenceCompat.TYPE_PREFERENCE;
+import static com.android.tv.settings.library.PreferenceCompat.TYPE_PREFERENCE_ACCESS_POINT;
+import static com.android.tv.settings.library.PreferenceCompat.TYPE_PREFERENCE_CATEGORY;
+import static com.android.tv.settings.library.PreferenceCompat.TYPE_PREFERENCE_COLLAPSE_CATEGORY;
+import static com.android.tv.settings.library.PreferenceCompat.TYPE_RADIO;
+import static com.android.tv.settings.library.PreferenceCompat.TYPE_SWITCH;
+
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.TwoStatePreference;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.RadioPreference;
+import com.android.tv.settings.library.PreferenceCompat;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.OptionalInt;
+import java.util.stream.IntStream;
+
+/** Provide utility methods for rendering PreferenceFragment. */
+public final class RenderUtil {
+
+ private RenderUtil() {
+ }
+
+ public static void updatePreferenceGroup(
+ PreferenceGroup preferenceGroup, List<PreferenceCompat> newPrefCompats, int order) {
+ if (preferenceGroup == null || newPrefCompats == null) {
+ return;
+ }
+ Context context = preferenceGroup.getContext();
+ // Remove old preferences that do not exist in the new list
+ int index = 0;
+ while (index < getPreferenceCount(preferenceGroup)) {
+ if (!(preferenceGroup.getPreference(index) instanceof HasKeys)) {
+ return;
+ }
+ HasKeys pref = (HasKeys) preferenceGroup.getPreference(index);
+ // Do not remove the preference if order is provided and current preference is not in
+ // the group with the provided order.
+ if (order != -1 && ((Preference) pref).getOrder() != order) {
+ index++;
+ } else {
+ boolean match =
+ newPrefCompats.stream().anyMatch(
+ prefParcelable -> keyMatch(pref, prefParcelable));
+ if (!match) {
+ preferenceGroup.removePreference((Preference) pref);
+ } else {
+ index++;
+ }
+ }
+ }
+
+ // Add or update preferences following the order in the new list.
+ IntStream.range(0, newPrefCompats.size())
+ .forEach(
+ i -> {
+ PreferenceCompat preferenceCompat = newPrefCompats.get(i);
+ OptionalInt matchedIndex =
+ IntStream.range(0, getPreferenceCount(preferenceGroup))
+ .filter(
+ j -> keyMatch(
+ (HasKeys) preferenceGroup.getPreference(
+ j), preferenceCompat))
+ .findFirst();
+ HasKeys newPref;
+ if (matchedIndex.isPresent()) {
+ newPref = (HasKeys) preferenceGroup.getPreference(
+ matchedIndex.getAsInt());
+ } else {
+ newPref = createPreference(context, preferenceCompat);
+ preferenceGroup.addPreference((Preference) newPref);
+ }
+ updatePreference(context, newPref, preferenceCompat,
+ order != -1 ? order : i);
+ if (newPref instanceof PreferenceGroup) {
+ updatePreferenceGroup((PreferenceGroup) newPref,
+ preferenceCompat.getChildPrefCompats(), -1);
+ }
+ });
+ }
+
+ public static void updatePreferenceGroup(
+ PreferenceGroup preferenceGroup, List<PreferenceCompat> newPrefCompats) {
+ updatePreferenceGroup(preferenceGroup, newPrefCompats, -1);
+ }
+
+ private static int getPreferenceCount(PreferenceGroup preferenceGroup) {
+ return (preferenceGroup instanceof TsCollapsibleCategory)
+ ? ((TsCollapsibleCategory) preferenceGroup).getRealPreferenceCount()
+ : preferenceGroup.getPreferenceCount();
+ }
+
+ static boolean keyMatch(HasKeys preference, PreferenceCompat preferenceCompat) {
+ return Arrays.equals(preference.getKeys(), preferenceCompat.getKey());
+ }
+
+ public static void updatePreference(
+ Context context,
+ HasKeys hasKeysPreference,
+ PreferenceCompat preferenceCompat,
+ int order) {
+ switch (preferenceCompat.getType()) {
+ case TYPE_PREFERENCE_ACCESS_POINT:
+ Integer wifiLevel = getInfoInt(INFO_WIFI_SIGNAL_LEVEL, preferenceCompat);
+ if (wifiLevel != null) {
+ updateAccessPointPreference(
+ (Preference) hasKeysPreference,
+ wifiLevel,
+ context);
+ }
+ break;
+ case TYPE_PREFERENCE_COLLAPSE_CATEGORY:
+ ((TsCollapsibleCategory) hasKeysPreference)
+ .setCollapsed(getInfoBoolean(COLLAPSE, preferenceCompat));
+ break;
+ case TYPE_LIST:
+ if (hasKeysPreference instanceof TsListPreference) {
+ TsListPreference pref = (TsListPreference) hasKeysPreference;
+ pref.setValue(preferenceCompat.getValue());
+ }
+ break;
+ default:
+ // no-op
+ }
+
+ String[] keys = preferenceCompat.getKey();
+ hasKeysPreference.setKeys(keys);
+ Preference preference = (Preference) hasKeysPreference;
+ preference.setKey(keys[keys.length - 1]);
+ if (preferenceCompat.getTitle() != null) {
+ preference.setTitle(preferenceCompat.getTitle());
+ }
+ if (preferenceCompat.getSummary() != null) {
+ preference.setSummary(preferenceCompat.getSummary());
+ }
+ if (preferenceCompat.getIntent() != null) {
+ preference.setIntent(preferenceCompat.getIntent());
+ }
+ if (preferenceCompat.getExtras() != null) {
+ preference.getExtras().putAll(preferenceCompat.getExtras());
+ }
+ Integer nextState = preferenceCompat.getNextState();
+ if (nextState != null) {
+ preference.setFragment(getNextFragment(nextState));
+ }
+ setVisible(preference, preferenceCompat);
+ setSelectable(preference, preferenceCompat);
+ setEnabled(preference, preferenceCompat);
+ setPersistent(preference, preferenceCompat);
+ if (preference instanceof TwoStatePreference) {
+ setChecked((TwoStatePreference) preference, preferenceCompat);
+ }
+ if (preference instanceof TsRadioPreference) {
+ if (preferenceCompat.getRadioGroup() != null) {
+ ((RadioPreference) preference).setRadioGroup(preferenceCompat.getRadioGroup());
+ }
+ }
+ if (preference instanceof TsRestrictedPreference) {
+ ((TsRestrictedPreference) preference).setDisabledByAdmin(
+ preferenceCompat.isDisabledByAdmin());
+ }
+ if (preference instanceof TsRestrictedSwitchPreference) {
+ ((TsRestrictedSwitchPreference) preference).setDisabledByAdmin(
+ preferenceCompat.isDisabledByAdmin());
+ }
+ if (preference instanceof TsListPreference) {
+ ((TsListPreference) preference).setEntries(preferenceCompat.getEntries());
+ ((TsListPreference) preference).setEntryValues(preferenceCompat.getEntryValues());
+ ((TsListPreference) preference).setValueIndex(preferenceCompat.getValueIndex());
+ ((TsListPreference) preference).setValue(preferenceCompat.getValue());
+ }
+ preference.setOrder(order);
+ }
+
+ public static HasKeys createPreference(Context context, PreferenceCompat preferenceCompat) {
+ if (preferenceCompat.isRestricted()) {
+ if (preferenceCompat.getType() == TYPE_SWITCH) {
+ return new TsRestrictedSwitchPreference(preferenceCompat.getKey(), context);
+ }
+ return new TsRestrictedPreference(preferenceCompat.getKey(), context);
+ }
+ if (preferenceCompat.hasSlice()) {
+ return new TsSlicePreference(
+ context, preferenceCompat.getKey(), preferenceCompat.getSliceUri());
+ }
+ switch (preferenceCompat.getType()) {
+ case TYPE_PREFERENCE_ACCESS_POINT:
+ return new TsAccessPointPreference(context, preferenceCompat.getKey());
+ case TYPE_PREFERENCE_CATEGORY:
+ return new TsPreferenceCategory(context, preferenceCompat.getKey());
+ case TYPE_PREFERENCE_COLLAPSE_CATEGORY:
+ return new TsCollapsibleCategory(context, preferenceCompat.getKey());
+ case TYPE_LIST:
+ return new TsListPreference(context, preferenceCompat.getKey());
+ case TYPE_RADIO:
+ return new TsRadioPreference(context, preferenceCompat.getKey());
+ case TYPE_SWITCH:
+ return new TsSwitchPreference(context, preferenceCompat.getKey());
+ case TYPE_DIALOG:
+ return new TsDialogPreference(context, preferenceCompat.getKey());
+ case TYPE_PREFERENCE:
+ default:
+ return new TsPreference(context, preferenceCompat.getKey());
+ }
+ }
+
+ public static Boolean getInfoBoolean(String key, PreferenceCompat preferenceCompat) {
+ Object value = preferenceCompat.getInfo(key);
+ return (value instanceof Boolean) ? (Boolean) value : null;
+ }
+
+ public static Integer getInfoInt(String key, PreferenceCompat preferenceCompat) {
+ Object value = preferenceCompat.getInfo(key);
+ return (value instanceof Integer) ? (Integer) value : null;
+ }
+
+ public static void setChecked(
+ TwoStatePreference preference, PreferenceCompat preferenceCompat) {
+ if (preferenceCompat.getChecked() == PreferenceCompat.STATUS_ON) {
+ preference.setChecked(true);
+ } else if (preferenceCompat.getChecked() == PreferenceCompat.STATUS_OFF) {
+ preference.setChecked(false);
+ }
+ }
+
+ public static void setPersistent(
+ Preference preference, PreferenceCompat preferenceCompat) {
+ if (preferenceCompat.getPersistent() == PreferenceCompat.STATUS_ON) {
+ preference.setPersistent(true);
+ } else if (preferenceCompat.getPersistent() == PreferenceCompat.STATUS_OFF) {
+ preference.setPersistent(false);
+ }
+ }
+
+ public static void setSelectable(Preference preference, PreferenceCompat preferenceParcelable) {
+ if (preferenceParcelable.getSelectable() == PreferenceCompat.STATUS_ON) {
+ preference.setVisible(true);
+ } else if (preferenceParcelable.getVisible() == PreferenceCompat.STATUS_OFF) {
+ preference.setVisible(false);
+ }
+ }
+
+ public static void setVisible(Preference preference, PreferenceCompat preferenceParcelable) {
+ if (preferenceParcelable.getVisible() == PreferenceCompat.STATUS_ON) {
+ preference.setVisible(true);
+ } else if (preferenceParcelable.getVisible() == PreferenceCompat.STATUS_OFF) {
+ preference.setVisible(false);
+ }
+ }
+
+ public static void setEnabled(Preference preference, PreferenceCompat preferenceParcelable) {
+ if (preferenceParcelable.getEnabled() == PreferenceCompat.STATUS_ON) {
+ preference.setEnabled(true);
+ } else if (preferenceParcelable.getEnabled() == PreferenceCompat.STATUS_OFF) {
+ preference.setEnabled(false);
+ }
+ }
+
+ static void updateAccessPointPreference(Preference preference, int level, Context context) {
+ switch (level) {
+ case 4:
+ preference.setIcon(R.drawable.ic_wifi_signal_4_white);
+ return;
+ case 3:
+ preference.setIcon(R.drawable.ic_wifi_signal_3_white);
+ return;
+ case 2:
+ preference.setIcon(R.drawable.ic_wifi_signal_2_white);
+ return;
+ case 1:
+ preference.setIcon(R.drawable.ic_wifi_signal_1_white);
+ return;
+ case 0:
+ // fall through
+ default:
+ preference.setIcon(R.drawable.ic_wifi_signal_0_white);
+ return;
+ }
+ }
+
+ private static String getNextFragment(int nextState) {
+ switch (nextState) {
+ case STATE_WIFI_DETAILS:
+ return "com.android.tv.settings.connectivity.WifiDetailsFragmentCompat";
+ case STATE_APP_MANAGEMENT:
+ return "com.android.tv.settings.device.apps.AppManagementFragmentCompat";
+ case STATE_ACCESSIBILITY_SERVICE:
+ return "com.android.tv.settings.accessibility.AccessibilityServiceFragmentCompat";
+ case STATE_STORAGE:
+ return "com.android.tv.settings.device.storage.StorageFragmentCompat";
+ case STATE_MISSING_STORAGE:
+ return "com.android.tv.settings.device.storage.MissingStorageFragmentCompat";
+ case STATE_APPS:
+ return "com.android.tv.settings.device.apps.AppsFragmentCompat";
+ case STATE_EMPTY:
+ default:
+ return null;
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/compat/TsAccessPointPreference.java b/Settings/src/com/android/tv/settings/compat/TsAccessPointPreference.java
new file mode 100644
index 0000000..6e4f56e
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/TsAccessPointPreference.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.compat;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+/** A compat preference to show Wi-Fi access point information. */
+public class TsAccessPointPreference extends TsPreference {
+ public TsAccessPointPreference(Context context, AttributeSet attributeSet, int i, int i1) {
+ super(context, attributeSet, i, i1);
+ }
+
+ public TsAccessPointPreference(Context context, AttributeSet attributeSet, int i) {
+ super(context, attributeSet, i);
+ }
+
+ public TsAccessPointPreference(Context context, AttributeSet attributeSet) {
+ super(context, attributeSet);
+ }
+
+ public TsAccessPointPreference(Context context) {
+ super(context);
+ }
+
+ public TsAccessPointPreference(Context context, String[] keys) {
+ super(context, keys);
+ setKeys(keys);
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/compat/TsCollapsibleCategory.java b/Settings/src/com/android/tv/settings/compat/TsCollapsibleCategory.java
new file mode 100644
index 0000000..a30f0b6
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/TsCollapsibleCategory.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.tv.settings.compat;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+/** Preference category compat class to display wifi list. */
+public class TsCollapsibleCategory extends TsPreferenceCategory {
+ public static final String COLLAPSE = "collapse";
+ private static final int COLLAPSED_ITEM_COUNT = 3;
+ private boolean mCollapsed = true;
+
+ public TsCollapsibleCategory(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ public TsCollapsibleCategory(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public TsCollapsibleCategory(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public TsCollapsibleCategory(Context context) {
+ super(context);
+ }
+
+ public TsCollapsibleCategory(Context context, String[] keys) {
+ super(context);
+ setKeys(keys);
+ }
+
+ @Override
+ public int getPreferenceCount() {
+ if (mCollapsed && shouldShowCollapsePref()) {
+ return COLLAPSED_ITEM_COUNT;
+ } else {
+ return super.getPreferenceCount();
+ }
+ }
+
+ public int getRealPreferenceCount() {
+ return super.getPreferenceCount();
+ }
+
+ /**
+ * Only show the collapse preference if the list would be longer than the collapsed list plus
+ * the
+ * collapse preference itself.
+ *
+ * @return true if collapse pref should be shown
+ */
+ public boolean shouldShowCollapsePref() {
+ return super.getPreferenceCount() >= COLLAPSED_ITEM_COUNT + 1;
+ }
+
+ public boolean isCollapsed() {
+ return mCollapsed;
+ }
+
+ public void setCollapsed(Boolean collapsed) {
+ if (collapsed != null) {
+ this.mCollapsed = collapsed;
+ notifyHierarchyChanged();
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/compat/TsDialogPreference.java b/Settings/src/com/android/tv/settings/compat/TsDialogPreference.java
new file mode 100644
index 0000000..adf2cfd
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/TsDialogPreference.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.tv.settings.compat;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.preference.DialogPreference;
+
+import java.util.Arrays;
+
+public class TsDialogPreference extends DialogPreference implements HasKeys {
+ private String[] mKeys;
+
+ public TsDialogPreference(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ mKeys = getDefaultPreferenceKeys();
+ }
+
+ public TsDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ mKeys = getDefaultPreferenceKeys();
+ }
+
+ public TsDialogPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mKeys = getDefaultPreferenceKeys();
+ }
+
+ public TsDialogPreference(Context context) {
+ super(context);
+ mKeys = getDefaultPreferenceKeys();
+ }
+
+ public TsDialogPreference(Context context, String[] keys) {
+ super(context);
+ setKeys(keys);
+ }
+
+ @Override
+ public void setKeys(String[] keys) {
+ mKeys = Arrays.copyOf(keys, keys.length);
+ if (keys.length != 0) {
+ setKey(keys[keys.length - 1]);
+ }
+ }
+
+ @Override
+ public String[] getKeys() {
+ return mKeys;
+ }
+
+ private String[] getDefaultPreferenceKeys() {
+ return new String[]{ getKey() };
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/compat/TsLeanbackPickerDialogPreference.java b/Settings/src/com/android/tv/settings/compat/TsLeanbackPickerDialogPreference.java
new file mode 100644
index 0000000..e15d435
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/TsLeanbackPickerDialogPreference.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.tv.settings.compat;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import com.android.tv.settings.system.LeanbackPickerDialogPreference;
+
+import java.util.Arrays;
+
+/** LeanbackPickerDialogPreference for TV to provide extra functionality. */
+public class TsLeanbackPickerDialogPreference extends LeanbackPickerDialogPreference implements
+ HasKeys {
+ private String[] mKeys;
+
+ public TsLeanbackPickerDialogPreference(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsLeanbackPickerDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsLeanbackPickerDialogPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsLeanbackPickerDialogPreference(Context context) {
+ super(context);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsLeanbackPickerDialogPreference(Context context, String[] keys) {
+ super(context);
+ setKeys(keys);
+ }
+
+ @Override
+ public void setKeys(String[] keys) {
+ this.mKeys = Arrays.copyOf(keys, keys.length);
+ }
+
+ @Override
+ public String[] getKeys() {
+ return mKeys;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/compat/TsListPreference.java b/Settings/src/com/android/tv/settings/compat/TsListPreference.java
new file mode 100644
index 0000000..e163f3b
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/TsListPreference.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.compat;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.preference.ListPreference;
+
+import java.util.Arrays;
+
+/** ListPreference for TV to provide extra functionality. */
+public class TsListPreference extends ListPreference implements HasKeys {
+ private String[] mKeys;
+
+ public TsListPreference(Context context, AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsListPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsListPreference(Context context) {
+ super(context);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsListPreference(Context context, String[] keys) {
+ super(context);
+ setKeys(keys);
+ }
+
+ @Override
+ public void setKeys(String[] keys) {
+ this.mKeys = Arrays.copyOf(keys, keys.length);
+ if (keys.length != 0) {
+ setKey(keys[keys.length - 1]);
+ }
+ }
+
+ @Override
+ public String[] getKeys() {
+ return mKeys;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/compat/TsPreference.java b/Settings/src/com/android/tv/settings/compat/TsPreference.java
new file mode 100644
index 0000000..f847a71
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/TsPreference.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.compat;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.preference.Preference;
+
+import java.util.Arrays;
+
+/** Preference for TV to provide extra functionality. */
+public class TsPreference extends Preference implements HasKeys {
+ private String[] mKeys;
+
+ public TsPreference(Context context, AttributeSet attributeSet, int i, int i1) {
+ super(context, attributeSet, i, i1);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsPreference(Context context, AttributeSet attributeSet, int i) {
+ super(context, attributeSet, i);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsPreference(Context context, AttributeSet attributeSet) {
+ super(context, attributeSet);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsPreference(Context context) {
+ super(context);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsPreference(Context context, String[] keys) {
+ super(context);
+ setKeys(keys);
+ }
+
+ @Override
+ public void setKeys(String[] keys) {
+ this.mKeys = Arrays.copyOf(keys, keys.length);
+ if (keys.length != 0) {
+ setKey(keys[keys.length - 1]);
+ }
+ }
+
+ @Override
+ public String[] getKeys() {
+ return mKeys;
+ }
+}
+
diff --git a/Settings/src/com/android/tv/settings/compat/TsPreferenceCategory.java b/Settings/src/com/android/tv/settings/compat/TsPreferenceCategory.java
new file mode 100644
index 0000000..3712cf5
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/TsPreferenceCategory.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.compat;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.preference.PreferenceCategory;
+
+import java.util.Arrays;
+
+/** PreferenceCategory for TV to provide extra functionality. */
+public class TsPreferenceCategory extends PreferenceCategory implements HasKeys {
+ private String[] mKeys;
+
+ public TsPreferenceCategory(Context context, AttributeSet attributeSet, int i, int i1) {
+ super(context, attributeSet, i, i1);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsPreferenceCategory(Context context, AttributeSet attributeSet, int i) {
+ super(context, attributeSet, i);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsPreferenceCategory(Context context, AttributeSet attributeSet) {
+ super(context, attributeSet);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsPreferenceCategory(Context context) {
+ super(context);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsPreferenceCategory(Context context, String[] keys) {
+ super(context);
+ setKeys(keys);
+ }
+
+ @Override
+ public void setKeys(String[] keys) {
+ this.mKeys = Arrays.copyOf(keys, keys.length);
+ if (keys.length != 0) {
+ setKey(keys[keys.length - 1]);
+ }
+ }
+
+ @Override
+ public String[] getKeys() {
+ return mKeys;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/compat/TsRadioPreference.java b/Settings/src/com/android/tv/settings/compat/TsRadioPreference.java
new file mode 100644
index 0000000..4b96e7c
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/TsRadioPreference.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.tv.settings.compat;
+
+import android.content.Context;
+
+import com.android.tv.settings.RadioPreference;
+
+import java.util.Arrays;
+
+/** RadioPreference for TV to provide extra functionality. */
+public class TsRadioPreference extends RadioPreference implements HasKeys {
+ private String[] mKeys;
+ public TsRadioPreference(Context context, String[] keys) {
+ super(context);
+ setKeys(keys);
+ }
+
+ @Override
+ public void setKeys(String[] keys) {
+ if (keys == null) {
+ return;
+ }
+ this.mKeys = Arrays.copyOf(keys, keys.length);
+ if (keys.length != 0) {
+ setKey(keys[keys.length - 1]);
+ }
+ }
+
+ @Override
+ public String[] getKeys() {
+ return mKeys;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/compat/TsRestrictedPreference.java b/Settings/src/com/android/tv/settings/compat/TsRestrictedPreference.java
new file mode 100644
index 0000000..584db12
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/TsRestrictedPreference.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.compat;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.core.content.res.TypedArrayUtils;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.settingslib.R;
+import com.android.settingslib.widget.TwoTargetPreference;
+
+import java.util.Arrays;
+
+/** RestrictedPreference for TV to provide extra functionality. */
+public class TsRestrictedPreference extends TwoTargetPreference implements HasKeys {
+ private boolean mDisabledByAdmin;
+ private String[] mKeys;
+
+ public TsRestrictedPreference(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsRestrictedPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public TsRestrictedPreference(Context context, AttributeSet attrs) {
+ this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle,
+ android.R.attr.preferenceStyle));
+ }
+
+ public TsRestrictedPreference(Context context) {
+ this(context, null);
+ }
+
+ public TsRestrictedPreference(String[] key, Context context) {
+ this(context, null);
+ setKeys(key);
+ }
+
+ @Override
+ protected int getSecondTargetResId() {
+ return R.layout.restricted_icon;
+ }
+
+ @Override
+ protected boolean shouldHideSecondTarget() {
+ return !isDisabledByAdmin();
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+ final View restrictedIcon = holder.findViewById(R.id.restricted_icon);
+ if (restrictedIcon != null) {
+ restrictedIcon.setVisibility(isDisabledByAdmin() ? View.VISIBLE : View.GONE);
+ }
+ }
+
+ public boolean isDisabledByAdmin() {
+ return mDisabledByAdmin;
+ }
+
+ public void setDisabledByAdmin(boolean disabledByAdmin) {
+ mDisabledByAdmin = disabledByAdmin;
+ }
+
+ @Override
+ public void setKeys(String[] keys) {
+ mKeys = Arrays.copyOf(keys, keys.length);
+ }
+
+ @Override
+ public String[] getKeys() {
+ return mKeys;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/compat/TsRestrictedSwitchPreference.java b/Settings/src/com/android/tv/settings/compat/TsRestrictedSwitchPreference.java
new file mode 100644
index 0000000..44806f5
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/TsRestrictedSwitchPreference.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.tv.settings.compat;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.core.content.res.TypedArrayUtils;
+
+import com.android.settingslib.R;
+import com.android.settingslib.RestrictedSwitchPreference;
+
+import java.util.Arrays;
+
+/** RestrictedSwitchPreference for TV to provide extra functionality. */
+public class TsRestrictedSwitchPreference extends RestrictedSwitchPreference implements HasKeys {
+ private boolean mDisabledByAdmin;
+ private String[] mKeys;
+
+ public TsRestrictedSwitchPreference(Context context,
+ AttributeSet attrs,
+ int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsRestrictedSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public TsRestrictedSwitchPreference(Context context, AttributeSet attrs) {
+ this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle,
+ android.R.attr.preferenceStyle));
+ }
+
+ public TsRestrictedSwitchPreference(Context context) {
+ this(context, null);
+ }
+
+ public TsRestrictedSwitchPreference(String[] key, Context context) {
+ this(context, null);
+ setKeys(key);
+ }
+
+ @Override
+ public boolean isDisabledByAdmin() {
+ return mDisabledByAdmin;
+ }
+
+ public void setDisabledByAdmin(boolean disabledByAdmin) {
+ mDisabledByAdmin = disabledByAdmin;
+ }
+
+ @Override
+ public void setKeys(String[] keys) {
+ mKeys = Arrays.copyOf(keys, keys.length);
+ }
+
+ @Override
+ public String[] getKeys() {
+ return mKeys;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/compat/TsSlicePreference.java b/Settings/src/com/android/tv/settings/compat/TsSlicePreference.java
new file mode 100644
index 0000000..956a2bd
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/TsSlicePreference.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.tv.settings.compat;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import com.android.tv.settings.library.util.SliceUtils;
+import com.android.tv.twopanelsettings.slices.SlicePreference;
+
+public class TsSlicePreference extends SlicePreference implements HasKeys {
+ private String[] mKeys;
+ public TsSlicePreference(Context context, String[] keys, String uri) {
+ super(context);
+ mKeys = keys;
+ setFragment(SliceUtils.PATH_SLICE_FRAGMENT);
+ setUri(uri);
+ }
+
+ public TsSlicePreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(attrs);
+ setKeys(new String[]{getKey()});
+ }
+
+ @Override
+ public void setKeys(String[] keys) {
+ mKeys = keys;
+ }
+
+ @Override
+ public String[] getKeys() {
+ return mKeys;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/compat/TsSwitchPreference.java b/Settings/src/com/android/tv/settings/compat/TsSwitchPreference.java
new file mode 100644
index 0000000..9d22e46
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/TsSwitchPreference.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.compat;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.preference.SwitchPreference;
+
+import java.util.Arrays;
+
+/** SwitchPreference for TV to provide extra functionality. */
+public class TsSwitchPreference extends SwitchPreference implements HasKeys {
+ private String[] mKeys;
+
+ public TsSwitchPreference(Context context, AttributeSet attributeSet, int i, int i1) {
+ super(context, attributeSet, i, i1);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsSwitchPreference(Context context, AttributeSet attributeSet, int i) {
+ super(context, attributeSet, i);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsSwitchPreference(Context context, AttributeSet attributeSet) {
+ super(context, attributeSet);
+ mKeys = new String[]{getKey()};
+ }
+
+ public TsSwitchPreference(Context context) {
+ super(context);
+ }
+
+ public TsSwitchPreference(Context context, String[] keys) {
+ super(context);
+ setKeys(keys);
+ }
+
+ @Override
+ public void setKeys(String[] keys) {
+ this.mKeys = Arrays.copyOf(keys, keys.length);
+ if (keys.length != 0) {
+ setKey(keys[keys.length - 1]);
+ }
+ }
+
+ @Override
+ public String[] getKeys() {
+ return mKeys;
+ }
+}
+
diff --git a/Settings/src/com/android/tv/settings/compat/TsSwitchWithSoundPreference.java b/Settings/src/com/android/tv/settings/compat/TsSwitchWithSoundPreference.java
new file mode 100644
index 0000000..72a7afa
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/compat/TsSwitchWithSoundPreference.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.compat;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import com.android.tv.settings.widget.SwitchWithSoundPreference;
+
+import java.util.Arrays;
+
+/** SwitchWithSoundPreference for TV to provide extra functionality. */
+public class TsSwitchWithSoundPreference extends SwitchWithSoundPreference implements HasKeys {
+ private String[] mKeys;
+
+ public TsSwitchWithSoundPreference(Context context, AttributeSet attributeSet) {
+ super(context, attributeSet);
+ mKeys = new String[]{getKey()};
+ }
+
+ @Override
+ public void setKeys(String[] keys) {
+ this.mKeys = Arrays.copyOf(keys, keys.length);
+ }
+
+ @Override
+ public String[] getKeys() {
+ return mKeys;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/connectivity/ActiveNetworkProvider.java b/Settings/src/com/android/tv/settings/connectivity/ActiveNetworkProvider.java
new file mode 100644
index 0000000..1451af0
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/connectivity/ActiveNetworkProvider.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.tv.settings.connectivity;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+
+import androidx.annotation.Nullable;
+
+import java.util.Optional;
+
+/**
+ * Provides information about the currently connected network synchronously.
+ */
+public class ActiveNetworkProvider {
+ private final ConnectivityManager mConnectivityManager;
+ private final Optional<WifiManager> mWifiManagerOptional;
+ @Nullable private NetworkInfo mNetworkInfo;
+
+ ActiveNetworkProvider(Context context) {
+ mConnectivityManager = context.getSystemService(ConnectivityManager.class);
+ mWifiManagerOptional = Optional.ofNullable(context.getSystemService(WifiManager.class));
+ mNetworkInfo = null;
+ }
+
+ void updateActiveNetwork() {
+ mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
+ }
+
+ public boolean isConnected() {
+ return mNetworkInfo != null
+ && (mNetworkInfo.isConnected() || mNetworkInfo.isConnectedOrConnecting());
+ }
+
+ public boolean isTypeCellular() {
+ return isConnected() && mNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
+ }
+
+ public boolean isTypeEthernet() {
+ return isConnected() && mNetworkInfo.getType() == ConnectivityManager.TYPE_ETHERNET;
+ }
+
+ public boolean isTypeWifi() {
+ return isConnected() && mNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI;
+ }
+
+ public boolean isWifiEnabled() {
+ return mWifiManagerOptional.map(WifiManager::isWifiEnabled).orElse(false);
+ }
+
+ @Nullable
+ public String getSsid() {
+ if (!isTypeWifi()) {
+ return null;
+ }
+ return mWifiManagerOptional
+ .map(WifiManager::getConnectionInfo)
+ .map(WifiInfo::getSSID)
+ .map(ActiveNetworkProvider::sanitizeSsid)
+ .orElse(null);
+ }
+
+ private static String sanitizeSsid(@Nullable String string) {
+ return removeDoubleQuotes(string);
+ }
+
+ private static String removeDoubleQuotes(@Nullable String string) {
+ if (string == null) return null;
+ final int length = string.length();
+ if ((length > 1) && (string.charAt(0) == '"') && (string.charAt(length - 1) == '"')) {
+ return string.substring(1, length - 1);
+ }
+ return string;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/connectivity/ConnectivityListener.java b/Settings/src/com/android/tv/settings/connectivity/ConnectivityListener.java
index 7597fc2..0c69ecd 100644
--- a/Settings/src/com/android/tv/settings/connectivity/ConnectivityListener.java
+++ b/Settings/src/com/android/tv/settings/connectivity/ConnectivityListener.java
@@ -21,9 +21,10 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
import android.net.EthernetManager;
+import android.net.EthernetManager.InterfaceStateListener;
+import android.net.IpConfiguration;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.Network;
@@ -31,10 +32,12 @@
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
+import android.os.Handler;
import android.telephony.PhoneStateListener;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.Log;
import androidx.annotation.Nullable;
@@ -44,6 +47,7 @@
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
+import com.android.settingslib.utils.ThreadUtils;
import com.android.settingslib.wifi.AccessPoint;
import com.android.settingslib.wifi.WifiTracker;
@@ -89,6 +93,9 @@
private int mNetworkType;
private String mWifiSsid;
private int mWifiSignalStrength;
+ private final InterfaceStateListener mEthernetListener;
+ private final ArrayMap<String, IpConfiguration> mAvailableInterfaces = new ArrayMap<>();
+ private final Handler mUiHandler = ThreadUtils.getUiThreadHandler();
/**
* @deprecated use the constructor that provides a {@link Lifecycle} instead
@@ -113,6 +120,17 @@
mWifiTracker = new WifiTracker(context, this, true, true);
}
}
+ mEthernetListener = (iface, state, role, configuration) -> {
+ if (state == EthernetManager.STATE_LINK_UP) {
+ mAvailableInterfaces.put(iface, configuration);
+ } else {
+ mAvailableInterfaces.remove(iface);
+ }
+ updateConnectivityStatus();
+ if (mListener != null) {
+ mListener.onConnectivityChange();
+ }
+ };
updateConnectivityStatus();
}
@@ -148,6 +166,10 @@
telephonyManager.listen(mPhoneStateListener,
PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
}
+ if (mEthernetManager != null) {
+ mEthernetManager.addInterfaceStateListener(r -> mUiHandler.post(r),
+ mEthernetListener);
+ }
}
}
@@ -176,6 +198,9 @@
if (telephonyManager != null) {
telephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
}
+ if (mEthernetManager != null) {
+ mEthernetManager.removeInterfaceStateListener(mEthernetListener);
+ }
}
}
@@ -279,12 +304,23 @@
return mNetworkType == ConnectivityManager.TYPE_MOBILE;
}
+ private void ensureRunningOnUiThread() {
+ if (mUiHandler.getLooper().getThread() != Thread.currentThread()) {
+ throw new IllegalStateException("Not running on the UI thread: "
+ + Thread.currentThread().getName());
+ }
+ }
+
+ private boolean isEthernetEnabled() {
+ return mEthernetManager != null;
+ }
+
/**
* Return whether Ethernet port is available.
*/
public boolean isEthernetAvailable() {
- return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_ETHERNET)
- && mEthernetManager.getAvailableInterfaces().length > 0;
+ ensureRunningOnUiThread();
+ return isEthernetEnabled() && (mAvailableInterfaces.size() > 0);
}
private Network getFirstEthernet() {
@@ -331,6 +367,25 @@
return formatIpAddresses(network);
}
+
+ /**
+ * Get the current Ethernet interface name.
+ */
+ public String getEthernetInterfaceName() {
+ ensureRunningOnUiThread();
+ if (mAvailableInterfaces.size() == 0) return null;
+ return mAvailableInterfaces.keyAt(0);
+ }
+
+ /**
+ * Get the current IP configuration of Ethernet interface.
+ */
+ public IpConfiguration getEthernetIpConfiguration() {
+ ensureRunningOnUiThread();
+ if (mAvailableInterfaces.size() == 0) return null;
+ return mAvailableInterfaces.valueAt(0);
+ }
+
public int getWifiSignalStrength(int maxLevel) {
if (mWifiManager != null) {
WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
diff --git a/Settings/src/com/android/tv/settings/connectivity/ConnectivityListenerLite.java b/Settings/src/com/android/tv/settings/connectivity/ConnectivityListenerLite.java
new file mode 100644
index 0000000..b9a0868
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/connectivity/ConnectivityListenerLite.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.connectivity;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
+
+/**
+ * Listens for changes in internet connectivity without using WifiTracker to avoid wifi scans.
+ */
+public class ConnectivityListenerLite implements LifecycleObserver {
+ private static final int CONNECTIVITY_CHANGE = 0;
+ private final ConnectivityManager mConnectivityManager;
+ private final ActiveNetworkProvider mActiveNetworkProvider;
+ private Listener mListener;
+
+ private final Handler mHandler;
+ private final ConnectivityManager.NetworkCallback mNetworkCallback;
+
+ private final Lifecycle mLifecycle;
+
+ public ConnectivityListenerLite(Context context, Listener listener, Lifecycle lifecycle) {
+ mConnectivityManager = context.getSystemService(ConnectivityManager.class);
+ mActiveNetworkProvider = new ActiveNetworkProvider(context);
+ mListener = listener;
+ mHandler = new Handler(Looper.getMainLooper()) {
+ @Override
+ public void handleMessage(@NonNull Message msg) {
+ if (msg.what == CONNECTIVITY_CHANGE) {
+ handleConnectivityChange();
+ }
+ }
+ };
+ mNetworkCallback = new DefaultNetworkCallback(mHandler);
+ mLifecycle = lifecycle;
+ mLifecycle.addObserver(this);
+ }
+
+ public void handleConnectivityChange() {
+ mActiveNetworkProvider.updateActiveNetwork();
+ mListener.onConnectivityChange(mActiveNetworkProvider);
+ }
+
+ @OnLifecycleEvent(Lifecycle.Event.ON_START)
+ private void registerNetworkCallback() {
+ mConnectivityManager.registerDefaultNetworkCallback(mNetworkCallback);
+ }
+
+ @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
+ private void unregisterNetworkCallback() {
+ mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
+ }
+
+ @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+ public void onDestroy() {
+ mHandler.removeCallbacksAndMessages(null);
+ mLifecycle.removeObserver(this);
+ mListener = null;
+ }
+
+ public interface Listener {
+ void onConnectivityChange(ActiveNetworkProvider activeNetworkProvider);
+ }
+
+ private static class DefaultNetworkCallback extends ConnectivityManager.NetworkCallback {
+ private static final int DELAY = 100;
+ private final Handler mHandler;
+
+ private DefaultNetworkCallback(Handler handler) {
+ this.mHandler = handler;
+ }
+
+ @Override
+ public void onAvailable(@NonNull Network network) {
+ super.onAvailable(network);
+ mHandler.removeMessages(CONNECTIVITY_CHANGE);
+ mHandler.sendEmptyMessageDelayed(CONNECTIVITY_CHANGE, DELAY);
+ }
+
+ @Override
+ public void onLost(@NonNull Network network) {
+ super.onLost(network);
+ mHandler.removeMessages(CONNECTIVITY_CHANGE);
+ mHandler.sendEmptyMessageDelayed(CONNECTIVITY_CHANGE, DELAY);
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/connectivity/EditIpSettingsActivity.java b/Settings/src/com/android/tv/settings/connectivity/EditIpSettingsActivity.java
index 16e2f4b..a47f4ae 100644
--- a/Settings/src/com/android/tv/settings/connectivity/EditIpSettingsActivity.java
+++ b/Settings/src/com/android/tv/settings/connectivity/EditIpSettingsActivity.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.content.Intent;
+import android.net.IpConfiguration;
import android.net.wifi.WifiConfiguration;
import android.os.Bundle;
import android.os.UserHandle;
@@ -45,12 +46,28 @@
private static final int NETWORK_ID_ETHERNET = WifiConfiguration.INVALID_NETWORK_ID;
private static final String EXTRA_NETWORK_ID = "network_id";
+ private static final String EXTRA_IFACE = "interface_name";
+ private static final String EXTRA_IP_CONFIG = "ip_config";
- public static Intent createIntent(Context context, int networkId) {
+ /**
+ * Create a new Intent for WiFi network.
+ */
+ public static Intent createWifiIntent(Context context, int networkId) {
return new Intent(context, EditIpSettingsActivity.class)
.putExtra(EXTRA_NETWORK_ID, networkId);
}
+ /**
+ * Create a new Intent for Ethernet network.
+ */
+ public static Intent createEthernetIntent(Context context, String iface,
+ IpConfiguration initialConfig) {
+ return new Intent(context, EditIpSettingsActivity.class)
+ .putExtra(EXTRA_NETWORK_ID, NETWORK_ID_ETHERNET)
+ .putExtra(EXTRA_IFACE, iface)
+ .putExtra(EXTRA_IP_CONFIG, initialConfig);
+ }
+
private State mSaveState;
private State mSaveSuccessState;
private State mSaveFailedState;
@@ -69,11 +86,13 @@
mSaveState = new SaveState(this);
mSaveSuccessState = new SaveSuccessState(this);
mSaveFailedState = new SaveFailedState(this);
- int networkId = getIntent().getIntExtra(EXTRA_NETWORK_ID, NETWORK_ID_ETHERNET);
+ final Intent intent = getIntent();
+ int networkId = intent.getIntExtra(EXTRA_NETWORK_ID, NETWORK_ID_ETHERNET);
NetworkConfiguration netConfig;
if (networkId == NETWORK_ID_ETHERNET) {
- netConfig = new EthernetConfig(this);
- ((EthernetConfig) netConfig).load();
+ final String iface = intent.getStringExtra(EXTRA_IFACE);
+ final IpConfiguration initialConfig = intent.getParcelableExtra(EXTRA_IP_CONFIG);
+ netConfig = new EthernetConfig(this, iface, initialConfig);
} else {
final UserManager userManager = UserManager.get(this);
if (userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_WIFI)) {
diff --git a/Settings/src/com/android/tv/settings/connectivity/EditProxySettingsActivity.java b/Settings/src/com/android/tv/settings/connectivity/EditProxySettingsActivity.java
index eee97da..ee5b29f 100644
--- a/Settings/src/com/android/tv/settings/connectivity/EditProxySettingsActivity.java
+++ b/Settings/src/com/android/tv/settings/connectivity/EditProxySettingsActivity.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.content.Intent;
+import android.net.IpConfiguration;
import android.net.wifi.WifiConfiguration;
import android.os.Bundle;
import android.os.UserHandle;
@@ -46,12 +47,28 @@
private static final int NETWORK_ID_ETHERNET = WifiConfiguration.INVALID_NETWORK_ID;
private static final String EXTRA_NETWORK_ID = "network_id";
+ private static final String EXTRA_IFACE = "interface_name";
+ private static final String EXTRA_IP_CONFIG = "ip_config";
- public static Intent createIntent(Context context, int networkId) {
+ /**
+ * Create a new Intent for WiFi network.
+ */
+ public static Intent createWifiIntent(Context context, int networkId) {
return new Intent(context, EditProxySettingsActivity.class)
.putExtra(EXTRA_NETWORK_ID, networkId);
}
+ /**
+ * Create a new Intent for Ethernet network.
+ */
+ public static Intent createEthernetIntent(Context context, String iface,
+ IpConfiguration initialConfig) {
+ return new Intent(context, EditProxySettingsActivity.class)
+ .putExtra(EXTRA_NETWORK_ID, NETWORK_ID_ETHERNET)
+ .putExtra(EXTRA_IFACE, iface)
+ .putExtra(EXTRA_IP_CONFIG, initialConfig);
+ }
+
private State mSaveState;
private State mSaveSuccessState;
private State mSaveFailedState;
@@ -70,11 +87,13 @@
mSaveState = new SaveState(this);
mSaveSuccessState = new SaveSuccessState(this);
mSaveFailedState = new SaveFailedState(this);
- int networkId = getIntent().getIntExtra(EXTRA_NETWORK_ID, NETWORK_ID_ETHERNET);
+ final Intent intent = getIntent();
+ int networkId = intent.getIntExtra(EXTRA_NETWORK_ID, NETWORK_ID_ETHERNET);
NetworkConfiguration netConfig;
if (networkId == NETWORK_ID_ETHERNET) {
- netConfig = new EthernetConfig(this);
- ((EthernetConfig) netConfig).load();
+ final String iface = intent.getStringExtra(EXTRA_IFACE);
+ final IpConfiguration initialConfig = intent.getParcelableExtra(EXTRA_IP_CONFIG);
+ netConfig = new EthernetConfig(this, iface, initialConfig);
} else {
final UserManager userManager = UserManager.get(this);
if (userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_WIFI)) {
diff --git a/Settings/src/com/android/tv/settings/connectivity/EthernetConfig.java b/Settings/src/com/android/tv/settings/connectivity/EthernetConfig.java
index c79dfd2..6c781f5 100644
--- a/Settings/src/com/android/tv/settings/connectivity/EthernetConfig.java
+++ b/Settings/src/com/android/tv/settings/connectivity/EthernetConfig.java
@@ -18,7 +18,9 @@
import android.content.Context;
import android.net.EthernetManager;
+import android.net.EthernetNetworkUpdateRequest;
import android.net.IpConfiguration;
+import android.net.NetworkCapabilities;
import android.net.wifi.WifiManager;
import com.android.tv.settings.R;
@@ -30,11 +32,12 @@
private final EthernetManager mEthernetManager;
private IpConfiguration mIpConfiguration;
private final String mName;
- private String mInterfaceName;
+ private final String mInterfaceName;
- EthernetConfig(Context context) {
+ EthernetConfig(Context context, String iface, IpConfiguration initialConfig) {
mEthernetManager = (EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE);
- mIpConfiguration = new IpConfiguration();
+ mIpConfiguration = initialConfig;
+ mInterfaceName = iface;
mName = context.getResources().getString(R.string.connectivity_ethernet);
}
@@ -51,7 +54,25 @@
@Override
public void save(WifiManager.ActionListener listener) {
if (mInterfaceName != null) {
- mEthernetManager.setConfiguration(mInterfaceName, mIpConfiguration);
+ // TODO: Remove below NetworkCapabilities list once EthernetNetworkUpdateRequest
+ // supports the default standard NetworkCapabilities built for Ethernet transport.
+ final NetworkCapabilities nc = new NetworkCapabilities.Builder()
+ .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING)
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED)
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED)
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED)
+ .setLinkUpstreamBandwidthKbps(100 * 1000)
+ .setLinkDownstreamBandwidthKbps(100 * 1000)
+ .build();
+ final EthernetNetworkUpdateRequest request =
+ new EthernetNetworkUpdateRequest.Builder()
+ .setIpConfiguration(mIpConfiguration)
+ .setNetworkCapabilities(nc)
+ .build();
+ mEthernetManager.updateConfiguration(mInterfaceName, request, r -> r.run(),
+ null /* network listener */);
}
if (listener != null) {
@@ -59,20 +80,8 @@
}
}
- /**
- * Load IpConfiguration from system.
- */
- public void load() {
- String[] ifaces = mEthernetManager.getAvailableInterfaces();
- if (ifaces.length > 0) {
- mInterfaceName = ifaces[0];
- mIpConfiguration = mEthernetManager.getConfiguration(mInterfaceName);
- }
- }
-
@Override
public String getPrintableName() {
return mName;
}
-
}
diff --git a/Settings/src/com/android/tv/settings/connectivity/NetworkActivity.java b/Settings/src/com/android/tv/settings/connectivity/NetworkActivity.java
index 1dbbd41..7a6aa7d 100644
--- a/Settings/src/com/android/tv/settings/connectivity/NetworkActivity.java
+++ b/Settings/src/com/android/tv/settings/connectivity/NetworkActivity.java
@@ -19,13 +19,13 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
public class NetworkActivity extends TvSettingsActivity {
@Override
- protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ protected Fragment createSettingsFragment() {
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(NetworkFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/connectivity/NetworkFragment.java b/Settings/src/com/android/tv/settings/connectivity/NetworkFragment.java
index 6efcc63..65e294b 100644
--- a/Settings/src/com/android/tv/settings/connectivity/NetworkFragment.java
+++ b/Settings/src/com/android/tv/settings/connectivity/NetworkFragment.java
@@ -16,10 +16,10 @@
package com.android.tv.settings.connectivity;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_VENDOR;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_X;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_CLASSIC;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_VENDOR;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_X;
import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
import static com.android.tv.settings.util.InstrumentationUtils.logToggleInteracted;
@@ -31,7 +31,6 @@
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
-import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
@@ -51,8 +50,8 @@
import com.android.tv.settings.R;
import com.android.tv.settings.RestrictedPreferenceAdapter;
import com.android.tv.settings.SettingsPreferenceFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
-import com.android.tv.settings.util.SliceUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.SliceUtils;
import com.android.tv.settings.widget.CustomContentDescriptionSwitchPreference;
import com.android.tv.settings.widget.TvAccessPointPreference;
import com.android.tv.twopanelsettings.slices.SlicePreference;
@@ -186,11 +185,7 @@
mEthernetCategory = (PreferenceCategory) findPreference(KEY_ETHERNET);
mEthernetStatusPref = findPreference(KEY_ETHERNET_STATUS);
mEthernetProxyPref = findPreference(KEY_ETHERNET_PROXY);
- mEthernetProxyPref.setIntent(EditProxySettingsActivity.createIntent(getContext(),
- WifiConfiguration.INVALID_NETWORK_ID));
mEthernetDhcpPref = findPreference(KEY_ETHERNET_DHCP);
- mEthernetDhcpPref.setIntent(EditIpSettingsActivity.createIntent(getContext(),
- WifiConfiguration.INVALID_NETWORK_ID));
if (!mIsWifiHardwarePresent) {
mEnableWifiPref.setVisible(false);
@@ -303,7 +298,7 @@
mCollapsePref.setVisible(wifiEnabled && mWifiNetworksCategory.shouldShowCollapsePref());
mAddPref.setVisible(wifiEnabled);
if (mAddEasyConnectPref != null) {
- mAddEasyConnectPref.setVisible(wifiEnabled && mWifiManager.isEasyConnectSupported());
+ mAddEasyConnectPref.setVisible(isEasyConnectEnabled());
}
if (!wifiEnabled) {
@@ -329,12 +324,24 @@
mEthernetCategory.setVisible(ethernetAvailable);
mEthernetStatusPref.setVisible(ethernetAvailable);
mEthernetProxyPref.setVisible(ethernetAvailable);
+ if (ethernetAvailable) {
+ mEthernetProxyPref.setIntent(EditProxySettingsActivity.createEthernetIntent(
+ getContext(),
+ mConnectivityListener.getEthernetInterfaceName(),
+ mConnectivityListener.getEthernetIpConfiguration()));
+ }
mEthernetProxyPref.setOnPreferenceClickListener(
preference -> {
logEntrySelected(TvSettingsEnums.NETWORK_ETHERNET_PROXY_SETTINGS);
return false;
});
+
mEthernetDhcpPref.setVisible(ethernetAvailable);
+ if (ethernetAvailable) {
+ mEthernetDhcpPref.setIntent(EditIpSettingsActivity.createEthernetIntent(getContext(),
+ mConnectivityListener.getEthernetInterfaceName(),
+ mConnectivityListener.getEthernetIpConfiguration()));
+ }
mEthernetDhcpPref.setOnPreferenceClickListener(
preference -> {
logEntrySelected(TvSettingsEnums.NETWORK_ETHERNET_IP_SETTINGS);
@@ -477,4 +484,15 @@
protected int getPageId() {
return TvSettingsEnums.NETWORK;
}
+
+ private boolean isEasyConnectEnabled() {
+ final boolean wifiEnabled = mIsWifiHardwarePresent
+ && mConnectivityListener.isWifiEnabledOrEnabling();
+
+ if (!wifiEnabled || !mWifiManager.isEasyConnectSupported()) {
+ return false;
+ }
+
+ return getContext().getResources().getBoolean(R.bool.config_easyconnect_enabled);
+ }
}
diff --git a/Settings/src/com/android/tv/settings/connectivity/NetworkFragmentCompat.java b/Settings/src/com/android/tv/settings/connectivity/NetworkFragmentCompat.java
new file mode 100644
index 0000000..10c595f
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/connectivity/NetworkFragmentCompat.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.connectivity;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_NETWORK;
+
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceManager;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.compat.TsCollapsibleCategory;
+import com.android.tv.settings.library.PreferenceCompat;
+
+@Keep
+public class NetworkFragmentCompat extends PreferenceControllerFragmentCompat {
+ private static final String KEY_WIFI_LIST = "wifi_list";
+ private static final String KEY_WIFI_COLLAPSE = "wifi_collapse";
+ private static final String KEY_ETHERNET_PROXY = "ethernet_proxy";
+ private static final String KEY_ETHERNET_DHCP = "ethernet_dhcp";
+
+ private TsCollapsibleCategory mWifiNetworksCategory;
+ private Preference mEthernetProxyPref;
+ private Preference mEthernetDhcpPref;
+ private Preference mCollapsePref;
+
+ private int getPreferenceScreenResId() {
+ return R.xml.network_compat;
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ getPreferenceManager()
+ .setPreferenceComparisonCallback(
+ new PreferenceManager.SimplePreferenceComparisonCallback());
+ setPreferencesFromResource(getPreferenceScreenResId(), null);
+ mWifiNetworksCategory = findPreference(KEY_WIFI_LIST);
+ mEthernetProxyPref = findPreference(KEY_ETHERNET_PROXY);
+ mCollapsePref = findTargetPreference(new String[]{KEY_WIFI_COLLAPSE});
+ mEthernetProxyPref.setIntent(
+ new Intent()
+ .setAction("com.android.settings.wifi.action.EDIT_PROXY_SETTINGS")
+ .putExtra("network_id", -1));
+ mEthernetDhcpPref = findPreference(KEY_ETHERNET_DHCP);
+ mEthernetDhcpPref.setIntent(
+ new Intent()
+ .setAction("com.android.settings.wifi.action.EDIT_IP_SETTINGS")
+ .putExtra("network_id", "-1"));
+ }
+
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateCollapsePref();
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat prefCompat) {
+ HasKeys preference = super.updatePref(prefCompat);
+ if (preference == null) {
+ return null;
+ }
+ String[] key = preference.getKeys();
+ if (prefCompat.getType() == PreferenceCompat.TYPE_PREFERENCE_COLLAPSE_CATEGORY) {
+ RenderUtil.updatePreferenceGroup(
+ mWifiNetworksCategory, prefCompat.getChildPrefCompats());
+ updateCollapsePref();
+ }
+ return preference;
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference) {
+ if (preference.getKey() != null && preference.getKey().equals(KEY_WIFI_COLLAPSE)) {
+ final boolean collapse = !mWifiNetworksCategory.isCollapsed();
+ mCollapsePref.setTitle(collapse
+ ? R.string.wifi_setting_see_all : R.string.wifi_setting_see_fewer);
+ mWifiNetworksCategory.setCollapsed(collapse);
+ return true;
+ }
+ return super.onPreferenceTreeClick(preference);
+ }
+
+ private void updateCollapsePref() {
+ if (mCollapsePref != null) {
+ mCollapsePref.setVisible(mWifiNetworksCategory != null
+ && mWifiNetworksCategory.isVisible()
+ && mWifiNetworksCategory.shouldShowCollapsePref());
+ }
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_NETWORK;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/connectivity/WifiConfig.java b/Settings/src/com/android/tv/settings/connectivity/WifiConfig.java
index a592f81..bb2730e 100644
--- a/Settings/src/com/android/tv/settings/connectivity/WifiConfig.java
+++ b/Settings/src/com/android/tv/settings/connectivity/WifiConfig.java
@@ -21,6 +21,8 @@
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
+import com.android.tv.settings.library.network.WifiHelper;
+
/**
* Wi-Fi configuration that implements NetworkConfiguration.
*/
@@ -61,6 +63,6 @@
}
public boolean isLockedDown(Context context) {
- return WifiConfigHelper.isNetworkLockedDown(context, mWifiConfiguration);
+ return WifiHelper.isNetworkLockedDown(context, mWifiConfiguration);
}
}
diff --git a/Settings/src/com/android/tv/settings/connectivity/WifiConfigHelper.java b/Settings/src/com/android/tv/settings/connectivity/WifiConfigHelper.java
index 8b656e8..2be232a 100644
--- a/Settings/src/com/android/tv/settings/connectivity/WifiConfigHelper.java
+++ b/Settings/src/com/android/tv/settings/connectivity/WifiConfigHelper.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 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.
@@ -16,19 +16,12 @@
package com.android.tv.settings.connectivity;
-import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
-import android.content.ContentResolver;
import android.content.Context;
-import android.content.pm.PackageManager;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration.AuthAlgorithm;
import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
@@ -60,9 +53,16 @@
"$|^(\\*)?\\.?[" + HC + "]+(\\-[" + HC + "]+)*(\\.[" + HC + "]+(\\-[" + HC + "]+)*)*$";
private static final Pattern EXCLUSION_PATTERN;
+ private static final String BYPASS_PROXY_EXCLUDE_REGEX =
+ "[a-zA-Z0-9*]+(\\-[a-zA-Z0-9*]+)*(\\.[a-zA-Z0-9*]+(\\-[a-zA-Z0-9*]+)*)*";
+ private static final String BYPASS_PROXY_EXCLUDE_LIST_REGEXP = "^$|^"
+ + BYPASS_PROXY_EXCLUDE_REGEX + "(," + BYPASS_PROXY_EXCLUDE_REGEX + ")*$";
+ private static final Pattern BYPASS_PROXY_EXCLUSION_PATTERN;
+
static {
HOSTNAME_PATTERN = Pattern.compile(HOSTNAME_REGEXP);
EXCLUSION_PATTERN = Pattern.compile(EXCLUSION_REGEXP);
+ BYPASS_PROXY_EXCLUSION_PATTERN = Pattern.compile(BYPASS_PROXY_EXCLUDE_LIST_REGEXP);
}
private WifiConfigHelper() {
@@ -107,17 +107,44 @@
/**
* validate syntax of hostname and port entries
*
+ * @param hostname host name to be used
+ * @param port port to be used
+ * @param exclList what should be accepted as input
* @return 0 on success, string resource ID on failure
*/
public static int validate(String hostname, String port, String exclList) {
+ return validate(hostname, port, exclList, false);
+ }
+
+ /**
+ * validate syntax of hostname and port entries
+ *
+ * @param hostname host name to be used
+ * @param port port to be used
+ * @param exclList what should be accepted as input
+ * @param forProxyCheck if extra check for bypass proxy should be done
+ * @return 0 on success, string resource ID on failure
+ */
+ public static int validate(String hostname, String port, String exclList,
+ boolean forProxyCheck) {
+ if (DEBUG) {
+ Log.i(TAG, "validate, hostname: " + hostname + ", for proxy=" + forProxyCheck);
+ }
Matcher match = HOSTNAME_PATTERN.matcher(hostname);
String[] exclListArray = exclList.split(",");
if (!match.matches()) return R.string.proxy_error_invalid_host;
for (String excl : exclListArray) {
- Matcher m = EXCLUSION_PATTERN.matcher(excl);
- if (!m.matches()) return R.string.proxy_error_invalid_exclusion_list;
+ Matcher m;
+ if (forProxyCheck) {
+ m = BYPASS_PROXY_EXCLUSION_PATTERN.matcher(excl);
+ } else {
+ m = EXCLUSION_PATTERN.matcher(excl);
+ }
+ if (!m.matches()) {
+ return R.string.proxy_error_invalid_exclusion_list;
+ }
}
if (hostname.length() > 0 && port.length() == 0) {
@@ -143,7 +170,7 @@
/**
* Get {@link WifiConfiguration} based upon the {@link WifiManager} and networkId.
- * @param wifiManager
+ *
* @param networkId the id of the network.
* @return the {@link WifiConfiguration} of the specified network.
*/
@@ -227,6 +254,7 @@
// If the SSID and the security match, that's our network.
String configuredSsid = WifiInfo.sanitizeSsid(configuredNetwork.SSID);
+
if (TextUtils.equals(configuredSsid, ssid)) {
int configuredSecurity = WifiSecurityUtil.getSecurity(configuredNetwork);
if (configuredSecurity == security) {
@@ -238,75 +266,4 @@
return null;
}
-
- /**
- * @param context Context of caller
- * @param config The WiFi config.
- * @return true if Settings cannot modify the config due to lockDown.
- */
- public static boolean isNetworkLockedDown(Context context, WifiConfiguration config) {
- if (config == null) {
- return false;
- }
-
- final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
- final PackageManager pm = context.getPackageManager();
- final UserManager um = context.getSystemService(UserManager.class);
-
- // Check if device has DPM capability. If it has and dpm is still null, then we
- // treat this case with suspicion and bail out.
- if (pm.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN) && dpm == null) {
- return true;
- }
-
- boolean isConfigEligibleForLockdown = false;
- if (dpm != null) {
- final ComponentName deviceOwner = dpm.getDeviceOwnerComponentOnAnyUser();
- if (deviceOwner != null) {
- final int deviceOwnerUserId = dpm.getDeviceOwnerUserId();
- try {
- final int deviceOwnerUid = pm.getPackageUidAsUser(deviceOwner.getPackageName(),
- deviceOwnerUserId);
- isConfigEligibleForLockdown = deviceOwnerUid == config.creatorUid;
- } catch (PackageManager.NameNotFoundException e) {
- // don't care
- }
- } else if (dpm.isOrganizationOwnedDeviceWithManagedProfile()) {
- int profileOwnerUserId = getManagedProfileId(um, UserHandle.myUserId());
- final ComponentName profileOwner = dpm.getProfileOwnerAsUser(profileOwnerUserId);
- if (profileOwner != null) {
- try {
- final int profileOwnerUid = pm.getPackageUidAsUser(
- profileOwner.getPackageName(), profileOwnerUserId);
- isConfigEligibleForLockdown = profileOwnerUid == config.creatorUid;
- } catch (PackageManager.NameNotFoundException e) {
- // don't care
- }
- }
- }
- }
- if (!isConfigEligibleForLockdown) {
- return false;
- }
-
- final ContentResolver resolver = context.getContentResolver();
- final boolean isLockdownFeatureEnabled = Settings.Global.getInt(resolver,
- Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN, 0) != 0;
- return isLockdownFeatureEnabled;
- }
-
- /**
- * Retrieves the id for the given user's profile.
- *
- * @return the profile id or UserHandle.USER_NULL if there is none.
- */
- private static int getManagedProfileId(UserManager um, int parentUserId) {
- final int[] profileIds = um.getProfileIdsWithDisabled(parentUserId);
- for (int profileId : profileIds) {
- if (profileId != parentUserId && um.isManagedProfile(profileId)) {
- return profileId;
- }
- }
- return UserHandle.USER_NULL;
- }
}
diff --git a/Settings/src/com/android/tv/settings/connectivity/WifiConnectionActivity.java b/Settings/src/com/android/tv/settings/connectivity/WifiConnectionActivity.java
index 662b467..dc30110 100644
--- a/Settings/src/com/android/tv/settings/connectivity/WifiConnectionActivity.java
+++ b/Settings/src/com/android/tv/settings/connectivity/WifiConnectionActivity.java
@@ -22,6 +22,7 @@
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
+import android.util.Log;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
diff --git a/Settings/src/com/android/tv/settings/connectivity/WifiDetailsFragment.java b/Settings/src/com/android/tv/settings/connectivity/WifiDetailsFragment.java
index 1cc96c7..8805ad7 100644
--- a/Settings/src/com/android/tv/settings/connectivity/WifiDetailsFragment.java
+++ b/Settings/src/com/android/tv/settings/connectivity/WifiDetailsFragment.java
@@ -42,6 +42,7 @@
import com.android.settingslib.wifi.AccessPoint;
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
+import com.android.tv.settings.library.network.WifiHelper;
import java.util.List;
@@ -115,7 +116,7 @@
mIpAddressPref = findPreference(KEY_IP_ADDRESS);
mMacAddressPref = findPreference(KEY_MAC_ADDRESS);
mSignalStrengthPref = findPreference(KEY_SIGNAL_STRENGTH);
- mRandomMacPref = (ListPreference) findPreference(KEY_RANDOM_MAC);
+ mRandomMacPref = findPreference(KEY_RANDOM_MAC);
mProxySettingsPref = findPreference(KEY_PROXY_SETTINGS);
mIpSettingsPref = findPreference(KEY_IP_SETTINGS);
mForgetNetworkPref = findPreference(KEY_FORGET_NETWORK);
@@ -174,13 +175,14 @@
ProxySettings proxySettings = wifiConfiguration.getIpConfiguration().getProxySettings();
mProxySettingsPref.setSummary(proxySettings == ProxySettings.NONE
? R.string.wifi_action_proxy_none : R.string.wifi_action_proxy_manual);
- mProxySettingsPref.setIntent(EditProxySettingsActivity.createIntent(getContext(),
+ mProxySettingsPref.setIntent(EditProxySettingsActivity.createWifiIntent(getContext(),
networkId));
IpAssignment ipAssignment = wifiConfiguration.getIpConfiguration().getIpAssignment();
mIpSettingsPref.setSummary(ipAssignment == IpAssignment.STATIC
- ? R.string.wifi_action_static : R.string.wifi_action_dhcp);
- mIpSettingsPref.setIntent(EditIpSettingsActivity.createIntent(getContext(), networkId));
+ ? R.string.wifi_action_static : R.string.wifi_action_dhcp);
+ mIpSettingsPref.setIntent(EditIpSettingsActivity.createWifiIntent(getContext(),
+ networkId));
mForgetNetworkPref.setFragment(ForgetNetworkConfirmFragment.class.getName());
ForgetNetworkConfirmFragment.prepareArgs(mForgetNetworkPref.getExtras(), mAccessPoint);
@@ -205,7 +207,7 @@
return false;
});
- boolean canModifyNetwork = !WifiConfigHelper.isNetworkLockedDown(
+ boolean canModifyNetwork = !WifiHelper.isNetworkLockedDown(
getContext(), wifiConfiguration);
if (canModifyNetwork) {
mProxySettingsPref.setDisabledByAdmin(null);
diff --git a/Settings/src/com/android/tv/settings/connectivity/WifiDetailsFragmentCompat.java b/Settings/src/com/android/tv/settings/connectivity/WifiDetailsFragmentCompat.java
new file mode 100644
index 0000000..8178c52
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/connectivity/WifiDetailsFragmentCompat.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.tv.settings.connectivity;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_WIFI_DETAILS;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+
+/**
+ * Fragment for displaying the details of a single wifi network
+ */
+@Keep
+public class WifiDetailsFragmentCompat extends PreferenceControllerFragmentCompat {
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.wifi_details_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_WIFI_DETAILS;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/connectivity/security/WifiSecurityHelper.java b/Settings/src/com/android/tv/settings/connectivity/security/WifiSecurityHelper.java
index dbda7a4..c622d9a 100644
--- a/Settings/src/com/android/tv/settings/connectivity/security/WifiSecurityHelper.java
+++ b/Settings/src/com/android/tv/settings/connectivity/security/WifiSecurityHelper.java
@@ -123,7 +123,7 @@
if ((length == 10 || length == 26 || length == 58)
&& password.matches("[0-9A-Fa-f]*")) {
config.wepKeys[0] = password;
- } else {
+ } else if (length != 0) {
config.wepKeys[0] = '"' + password + '"';
}
break;
@@ -141,7 +141,7 @@
case AccessPoint.SECURITY_SAE:
config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE);
- if (password.length() != 0) {
+ if (length != 0) {
config.preSharedKey = '"' + password + '"';
}
break;
diff --git a/Settings/src/com/android/tv/settings/connectivity/setup/AddStartState.java b/Settings/src/com/android/tv/settings/connectivity/setup/AddStartState.java
index 6b855b7..580039f 100644
--- a/Settings/src/com/android/tv/settings/connectivity/setup/AddStartState.java
+++ b/Settings/src/com/android/tv/settings/connectivity/setup/AddStartState.java
@@ -51,6 +51,7 @@
if ((wifiSecurity == AccessPoint.SECURITY_WEP
&& TextUtils.isEmpty(configuration.wepKeys[0]))
|| (!WifiSecurityUtil.isOpen(wifiSecurity)
+ && wifiSecurity != AccessPoint.SECURITY_WEP
&& TextUtils.isEmpty(configuration.preSharedKey))) {
mStateMachine.getListener().onComplete(StateMachine.PASSWORD);
} else {
diff --git a/Settings/src/com/android/tv/settings/connectivity/setup/AdvancedOptionsState.java b/Settings/src/com/android/tv/settings/connectivity/setup/AdvancedOptionsState.java
index 7da9d20..a419276 100644
--- a/Settings/src/com/android/tv/settings/connectivity/setup/AdvancedOptionsState.java
+++ b/Settings/src/com/android/tv/settings/connectivity/setup/AdvancedOptionsState.java
@@ -27,9 +27,9 @@
import androidx.lifecycle.ViewModelProviders;
import com.android.tv.settings.R;
-import com.android.tv.settings.connectivity.WifiConfigHelper;
import com.android.tv.settings.connectivity.util.State;
import com.android.tv.settings.connectivity.util.StateMachine;
+import com.android.tv.settings.library.network.WifiHelper;
import java.util.List;
@@ -75,7 +75,7 @@
.of(mActivity)
.get(UserChoiceInfo.class);
WifiConfiguration wifiConfiguration = userChoiceInfo.getWifiConfiguration();
- return WifiConfigHelper.isNetworkLockedDown(mActivity, wifiConfiguration);
+ return WifiHelper.isNetworkLockedDown(mActivity, wifiConfiguration);
}
@Override
diff --git a/Settings/src/com/android/tv/settings/connectivity/setup/ConnectState.java b/Settings/src/com/android/tv/settings/connectivity/setup/ConnectState.java
index 7ece8fe..3542fff 100644
--- a/Settings/src/com/android/tv/settings/connectivity/setup/ConnectState.java
+++ b/Settings/src/com/android/tv/settings/connectivity/setup/ConnectState.java
@@ -221,12 +221,15 @@
NetworkCapabilities wifiNetworkCapabilities = getActiveWifiNetworkCapabilities();
if (wifiNetworkCapabilities != null) {
if (wifiNetworkCapabilities.hasCapability(
- NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
+ NetworkCapabilities.NET_CAPABILITY_VALIDATED) ||
+ wifiNetworkCapabilities.hasCapability(
+ NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
notifyListener(StateMachine.RESULT_SUCCESS);
} else if (wifiNetworkCapabilities.hasCapability(
NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)) {
notifyListener(StateMachine.RESULT_CAPTIVE_PORTAL);
}
+
}
} else {
switch (configuration.getNetworkSelectionStatus()
diff --git a/Settings/src/com/android/tv/settings/connectivity/setup/IpAddressState.java b/Settings/src/com/android/tv/settings/connectivity/setup/IpAddressState.java
index 91ff7a2..e8714ec 100644
--- a/Settings/src/com/android/tv/settings/connectivity/setup/IpAddressState.java
+++ b/Settings/src/com/android/tv/settings/connectivity/setup/IpAddressState.java
@@ -131,6 +131,12 @@
}
@Override
+ public void onResume() {
+ super.onResume();
+ openInEditMode(mAction);
+ }
+
+ @Override
public long onGuidedActionEditedAndProceed(GuidedAction action) {
if (action.getId() == GuidedAction.ACTION_ID_CONTINUE) {
mAdvancedOptionsFlowInfo.put(AdvancedOptionsFlowInfo.IP_ADDRESS,
diff --git a/Settings/src/com/android/tv/settings/connectivity/setup/IpSettingsState.java b/Settings/src/com/android/tv/settings/connectivity/setup/IpSettingsState.java
index 17917d6..2b3318f 100644
--- a/Settings/src/com/android/tv/settings/connectivity/setup/IpSettingsState.java
+++ b/Settings/src/com/android/tv/settings/connectivity/setup/IpSettingsState.java
@@ -31,10 +31,10 @@
import androidx.lifecycle.ViewModelProviders;
import com.android.tv.settings.R;
-import com.android.tv.settings.connectivity.WifiConfigHelper;
import com.android.tv.settings.connectivity.util.AdvancedOptionsFlowUtil;
import com.android.tv.settings.connectivity.util.State;
import com.android.tv.settings.connectivity.util.StateMachine;
+import com.android.tv.settings.library.network.WifiHelper;
import java.util.List;
@@ -80,7 +80,7 @@
.of(mActivity)
.get(UserChoiceInfo.class);
WifiConfiguration wifiConfiguration = userChoiceInfo.getWifiConfiguration();
- return WifiConfigHelper.isNetworkLockedDown(mActivity, wifiConfiguration);
+ return WifiHelper.isNetworkLockedDown(mActivity, wifiConfiguration);
}
@Override
diff --git a/Settings/src/com/android/tv/settings/connectivity/setup/KnownNetworkState.java b/Settings/src/com/android/tv/settings/connectivity/setup/KnownNetworkState.java
index bca7de6..6078388 100644
--- a/Settings/src/com/android/tv/settings/connectivity/setup/KnownNetworkState.java
+++ b/Settings/src/com/android/tv/settings/connectivity/setup/KnownNetworkState.java
@@ -30,9 +30,9 @@
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.tv.settings.R;
-import com.android.tv.settings.connectivity.WifiConfigHelper;
import com.android.tv.settings.connectivity.util.State;
import com.android.tv.settings.connectivity.util.StateMachine;
+import com.android.tv.settings.library.network.WifiHelper;
import java.util.List;
@@ -139,7 +139,7 @@
}
private boolean canForgetNetwork() {
- return !WifiConfigHelper.isNetworkLockedDown(getContext(),
+ return !WifiHelper.isNetworkLockedDown(getContext(),
mUserChoiceInfo.getWifiConfiguration());
}
}
diff --git a/Settings/src/com/android/tv/settings/connectivity/setup/ProxySettingsState.java b/Settings/src/com/android/tv/settings/connectivity/setup/ProxySettingsState.java
index 21645e9..a60f21c 100644
--- a/Settings/src/com/android/tv/settings/connectivity/setup/ProxySettingsState.java
+++ b/Settings/src/com/android/tv/settings/connectivity/setup/ProxySettingsState.java
@@ -30,10 +30,10 @@
import androidx.lifecycle.ViewModelProviders;
import com.android.tv.settings.R;
-import com.android.tv.settings.connectivity.WifiConfigHelper;
import com.android.tv.settings.connectivity.util.AdvancedOptionsFlowUtil;
import com.android.tv.settings.connectivity.util.State;
import com.android.tv.settings.connectivity.util.StateMachine;
+import com.android.tv.settings.library.network.WifiHelper;
import java.util.List;
@@ -79,7 +79,7 @@
.of(mActivity)
.get(UserChoiceInfo.class);
WifiConfiguration wifiConfiguration = userChoiceInfo.getWifiConfiguration();
- return WifiConfigHelper.isNetworkLockedDown(mActivity, wifiConfiguration);
+ return WifiHelper.isNetworkLockedDown(mActivity, wifiConfiguration);
}
@Override
diff --git a/Settings/src/com/android/tv/settings/connectivity/util/AdvancedOptionsFlowUtil.java b/Settings/src/com/android/tv/settings/connectivity/util/AdvancedOptionsFlowUtil.java
index 4579dc1..649761c 100644
--- a/Settings/src/com/android/tv/settings/connectivity/util/AdvancedOptionsFlowUtil.java
+++ b/Settings/src/com/android/tv/settings/connectivity/util/AdvancedOptionsFlowUtil.java
@@ -68,7 +68,7 @@
int result;
try {
port = Integer.parseInt(portStr);
- result = WifiConfigHelper.validate(host, portStr, exclusionList);
+ result = WifiConfigHelper.validate(host, portStr, exclusionList, true);
} catch (NumberFormatException e) {
result = R.string.proxy_error_invalid_port;
}
diff --git a/Settings/src/com/android/tv/settings/connectivity/util/WifiSecurityUtil.java b/Settings/src/com/android/tv/settings/connectivity/util/WifiSecurityUtil.java
index df6927b..9f90599 100644
--- a/Settings/src/com/android/tv/settings/connectivity/util/WifiSecurityUtil.java
+++ b/Settings/src/com/android/tv/settings/connectivity/util/WifiSecurityUtil.java
@@ -51,9 +51,15 @@
* @return the category of wifi security.
*/
public static int getSecurity(WifiConfiguration config) {
+ if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.SAE)) {
+ return AccessPoint.SECURITY_SAE;
+ }
if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_PSK)) {
return AccessPoint.SECURITY_PSK;
}
+ if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.SAE)) {
+ return AccessPoint.SECURITY_SAE;
+ }
if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP)
|| config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X)) {
return AccessPoint.SECURITY_EAP;
diff --git a/Settings/src/com/android/tv/settings/device/DevicePrefFragment.java b/Settings/src/com/android/tv/settings/device/DevicePrefFragment.java
index 26fe4ca..7b8db10 100644
--- a/Settings/src/com/android/tv/settings/device/DevicePrefFragment.java
+++ b/Settings/src/com/android/tv/settings/device/DevicePrefFragment.java
@@ -16,10 +16,10 @@
package com.android.tv.settings.device;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_VENDOR;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_X;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_CLASSIC;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_VENDOR;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_X;
import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
import static com.android.tv.settings.util.InstrumentationUtils.logToggleInteracted;
@@ -49,20 +49,20 @@
import androidx.preference.Preference;
import androidx.preference.TwoStatePreference;
-import com.android.settingslib.applications.DefaultAppInfo;
import com.android.settingslib.development.DevelopmentSettingsEnabler;
import com.android.tv.settings.LongClickPreference;
import com.android.tv.settings.MainFragment;
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
import com.android.tv.settings.about.RebootConfirmFragment;
-import com.android.tv.settings.autofill.AutofillHelper;
-import com.android.tv.settings.inputmethod.InputMethodHelper;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.settingslib.AutofillHelper;
+import com.android.tv.settings.library.settingslib.DefaultAppInfo;
+import com.android.tv.settings.library.settingslib.InputMethodHelper;
+import com.android.tv.settings.library.util.SliceUtils;
import com.android.tv.settings.privacy.PrivacyToggle;
import com.android.tv.settings.privacy.SensorFragment;
import com.android.tv.settings.system.SecurityFragment;
-import com.android.tv.settings.util.SliceUtils;
import com.android.tv.twopanelsettings.TwoPanelSettingsFragment;
import com.android.tv.twopanelsettings.slices.SlicePreference;
@@ -91,6 +91,10 @@
private static final String KEY_REBOOT = "reboot";
private static final String KEY_MIC = "microphone";
private static final String KEY_CAMERA = "camera";
+ private static final String KEY_FASTPAIR_SETTINGS_SLICE = "fastpair_slice";
+ private static final String KEY_OVERLAY_INTERNAL_SETTINGS_SLICE = "overlay_internal";
+ private static final String KEY_ASSISTANT_BROADCAST = "assistant_broadcast";
+ private static final String RES_TOP_LEVEL_ASSISTANT_SLICE_URI = "top_level_assistant_slice_uri";
private Preference mSoundsPref;
private TwoStatePreference mSoundsSwitchPref;
@@ -138,6 +142,14 @@
findPreference(KEY_MIC), SensorFragment.TOGGLE_EXTRA);
PrivacyToggle.CAMERA_TOGGLE.preparePreferenceWithSensorFragment(getContext(),
findPreference(KEY_CAMERA), SensorFragment.TOGGLE_EXTRA);
+
+ final Preference assistantBroadcastPreference = findPreference(KEY_ASSISTANT_BROADCAST);
+ if (assistantBroadcastPreference != null && SliceUtils.isSettingsSliceEnabled(
+ getContext(),
+ ((SlicePreference) assistantBroadcastPreference).getUri(),
+ RES_TOP_LEVEL_ASSISTANT_SLICE_URI)) {
+ assistantBroadcastPreference.setVisible(true);
+ }
}
@Override
@@ -168,6 +180,8 @@
updateSounds();
updateGoogleSettings();
updateCastSettings();
+ updateInternalSettings();
+ updateFastpairSettings();
updateKeyboardAutofillSettings();
hideIfIntentUnhandled(findPreference(KEY_HOME_SETTINGS));
hideIfIntentUnhandled(findPreference(KEY_CAST_SETTINGS));
@@ -313,6 +327,27 @@
}
}
+ private void updateInternalSettings() {
+ final SlicePreference internalSlicePref = findPreference(
+ KEY_OVERLAY_INTERNAL_SETTINGS_SLICE);
+ if (internalSlicePref != null) {
+ internalSlicePref.setVisible(
+ SliceUtils.isSliceProviderValid(getContext(), internalSlicePref.getUri())
+ && SliceUtils.isSettingsSliceEnabled(getContext(),
+ internalSlicePref.getUri(), null));
+ }
+ }
+
+ @VisibleForTesting
+ void updateFastpairSettings() {
+ final SlicePreference fastpairSlicePref = findPreference(KEY_FASTPAIR_SETTINGS_SLICE);
+ if (fastpairSlicePref != null) {
+ if (SliceUtils.isSliceProviderValid(getContext(), fastpairSlicePref.getUri())) {
+ fastpairSlicePref.setVisible(true);
+ }
+ }
+ }
+
@VisibleForTesting
void updateKeyboardAutofillSettings() {
final Preference keyboardPref = findPreference(KEY_KEYBOARD);
diff --git a/Settings/src/com/android/tv/settings/device/StorageResetActivity.java b/Settings/src/com/android/tv/settings/device/StorageResetActivity.java
index 04274dd..9f530c0 100644
--- a/Settings/src/com/android/tv/settings/device/StorageResetActivity.java
+++ b/Settings/src/com/android/tv/settings/device/StorageResetActivity.java
@@ -22,7 +22,6 @@
import com.android.tv.settings.R;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
/**
* Activity to view storage consumption and factory reset device.
@@ -35,7 +34,8 @@
if (!TextUtils.isEmpty(getString(R.string.storage_summary_fragment_name))) {
fragmentName = getString(R.string.storage_summary_fragment_name);
}
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(fragmentName, null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(fragmentName, null);
}
}
diff --git a/Settings/src/com/android/tv/settings/device/StorageSummaryFragment.java b/Settings/src/com/android/tv/settings/device/StorageSummaryFragment.java
index db06afa..0734671 100644
--- a/Settings/src/com/android/tv/settings/device/StorageSummaryFragment.java
+++ b/Settings/src/com/android/tv/settings/device/StorageSummaryFragment.java
@@ -16,10 +16,10 @@
package com.android.tv.settings.device;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_VENDOR;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_X;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_CLASSIC;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_VENDOR;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_X;
import android.app.tvsettings.TvSettingsEnums;
import android.content.Context;
@@ -42,7 +42,7 @@
import com.android.tv.settings.device.storage.NewStorageActivity;
import com.android.tv.settings.device.storage.StorageFragment;
import com.android.tv.settings.device.storage.StoragePreference;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import java.io.File;
import java.util.ArrayList;
diff --git a/Settings/src/com/android/tv/settings/device/apps/AllAppsActivity.java b/Settings/src/com/android/tv/settings/device/apps/AllAppsActivity.java
index cff0304..3657428 100644
--- a/Settings/src/com/android/tv/settings/device/apps/AllAppsActivity.java
+++ b/Settings/src/com/android/tv/settings/device/apps/AllAppsActivity.java
@@ -21,7 +21,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
/**
* Activity allowing the management of apps settings.
@@ -41,7 +40,8 @@
volumeUuid = args.getString(EXTRA_VOLUME_UUID);
volumeName = args.getString(EXTRA_VOLUME_NAME);
}
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(AllAppsFragment.class.getName(),
getArguments(volumeUuid, volumeName));
}
diff --git a/Settings/src/com/android/tv/settings/device/apps/AllAppsFragmentCompat.java b/Settings/src/com/android/tv/settings/device/apps/AllAppsFragmentCompat.java
new file mode 100644
index 0000000..2e7b0eb
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/AllAppsFragmentCompat.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.tv.settings.device.apps;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_ALL_APPS;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceManager;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+
+/**
+ * Fragment compat to handle all apps screen.
+ */
+@Keep
+public class AllAppsFragmentCompat extends PreferenceControllerFragmentCompat {
+ private PreferenceGroup mInstalledPreferenceGroup;
+ private PreferenceGroup mDisabledPreferenceGroup;
+ private PreferenceGroup mOtherPreferenceGroup;
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ getPreferenceManager()
+ .setPreferenceComparisonCallback(
+ new PreferenceManager.SimplePreferenceComparisonCallback());
+ setPreferencesFromResource(R.xml.all_apps_compat, null);
+ mInstalledPreferenceGroup = (PreferenceGroup) findPreference("InstalledPreferenceGroup");
+ mDisabledPreferenceGroup = (PreferenceGroup) findPreference("DisabledPreferenceGroup");
+ mOtherPreferenceGroup = (PreferenceGroup) findPreference("OtherPreferenceGroup");
+ mOtherPreferenceGroup.setVisible(false);
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat prefParcelable) {
+ HasKeys preference = super.updatePref(prefParcelable);
+ if (preference == null) {
+ return null;
+ }
+ switch (prefParcelable.getKey()[0]) {
+ case "InstalledPreferenceGroup":
+ RenderUtil.updatePreferenceGroup(
+ mInstalledPreferenceGroup, prefParcelable.getChildPrefCompats());
+ break;
+ case "DisabledPreferenceGroup":
+ RenderUtil.updatePreferenceGroup(
+ mDisabledPreferenceGroup, prefParcelable.getChildPrefCompats());
+ break;
+ case "OtherPreferenceGroup":
+ RenderUtil.updatePreferenceGroup(
+ mOtherPreferenceGroup, prefParcelable.getChildPrefCompats());
+ break;
+ default:
+ // no-op
+ }
+ return preference;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_ALL_APPS;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/AppManagementFragmentCompat.java b/Settings/src/com/android/tv/settings/device/apps/AppManagementFragmentCompat.java
new file mode 100644
index 0000000..0d862d3
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/AppManagementFragmentCompat.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.apps;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * Fragment compat to display app management settings.
+ */
+@Keep
+public class AppManagementFragmentCompat extends PreferenceControllerFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.app_management_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_APP_MANAGEMENT;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/AppsActivity.java b/Settings/src/com/android/tv/settings/device/apps/AppsActivity.java
index e91f1b1..e773e67 100644
--- a/Settings/src/com/android/tv/settings/device/apps/AppsActivity.java
+++ b/Settings/src/com/android/tv/settings/device/apps/AppsActivity.java
@@ -21,7 +21,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
/**
* Activity allowing the management of apps settings.
@@ -41,7 +40,8 @@
volumeUuid = args.getString(EXTRA_VOLUME_UUID);
volumeName = args.getString(EXTRA_VOLUME_NAME);
}
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(AppsFragment.class.getName(),
getArguments(volumeUuid, volumeName));
}
diff --git a/Settings/src/com/android/tv/settings/device/apps/AppsFragment.java b/Settings/src/com/android/tv/settings/device/apps/AppsFragment.java
index f3dadc6..32b8aab 100644
--- a/Settings/src/com/android/tv/settings/device/apps/AppsFragment.java
+++ b/Settings/src/com/android/tv/settings/device/apps/AppsFragment.java
@@ -16,6 +16,9 @@
package com.android.tv.settings.device.apps;
+import static android.provider.DeviceConfig.NAMESPACE_APP_HIBERNATION;
+
+import static com.android.tv.settings.library.util.LibUtils.PROPERTY_APP_HIBERNATION_ENABLED;
import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
import android.app.Activity;
@@ -23,6 +26,7 @@
import android.app.tvsettings.TvSettingsEnums;
import android.content.Context;
import android.os.Bundle;
+import android.provider.DeviceConfig;
import android.text.TextUtils;
import androidx.annotation.Keep;
@@ -32,8 +36,8 @@
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.tv.settings.PreferenceControllerFragment;
import com.android.tv.settings.R;
-import com.android.tv.settings.overlay.FlavorUtils;
-import com.android.tv.settings.util.SliceUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.SliceUtils;
import com.android.tv.twopanelsettings.slices.SlicePreference;
import java.util.ArrayList;
@@ -49,6 +53,8 @@
private static final String KEY_SECURITY = "security";
private static final String KEY_OVERLAY_SECURITY = "overlay_security";
private static final String KEY_UPDATE = "update";
+ private static final String TOP_LEVEL_SLICE_URI = "top_level_settings_slice_uri";
+ private static final String KEY_HIBERNATED_APPS = "see_unused_apps";
public static void prepareArgs(Bundle b, String volumeUuid, String volumeName) {
b.putString(AppsActivity.EXTRA_VOLUME_UUID, volumeUuid);
@@ -79,6 +85,7 @@
final Preference securityPreference = findPreference(KEY_SECURITY);
final Preference overlaySecuritySlicePreference = findPreference(KEY_OVERLAY_SECURITY);
final Preference updateSlicePreference = findPreference(KEY_UPDATE);
+ final Preference hibernatedAppsPreference = findPreference(KEY_HIBERNATED_APPS);
if (FlavorUtils.getFeatureFactory(getContext()).getBasicModeFeatureProvider()
.isBasicMode(getContext())) {
showSecurityPreference(securityPreference, overlaySecuritySlicePreference);
@@ -97,13 +104,17 @@
isUpdateSlicePreferenceEnabled(updateSlicePreference));
}
}
+ if (hibernatedAppsPreference != null) {
+ hibernatedAppsPreference.setVisible(isHibernationEnabled());
+ }
}
private boolean isOverlaySecuritySlicePreferenceEnabled(
@Nullable Preference overlaySecuritySlicePreference) {
return overlaySecuritySlicePreference instanceof SlicePreference
- && SliceUtils.isSettingsSliceEnabled(
- getContext(), ((SlicePreference) overlaySecuritySlicePreference).getUri());
+ && SliceUtils.isSettingsSliceEnabled(getContext(),
+ ((SlicePreference) overlaySecuritySlicePreference).getUri(),
+ TOP_LEVEL_SLICE_URI);
}
private void showOverlaySecuritySlicePreference(
@@ -132,7 +143,14 @@
@Nullable Preference updateSlicePreference) {
return updateSlicePreference instanceof SlicePreference
&& SliceUtils.isSettingsSliceEnabled(
- getContext(), ((SlicePreference) updateSlicePreference).getUri());
+ getContext(),
+ ((SlicePreference) updateSlicePreference).getUri(),
+ TOP_LEVEL_SLICE_URI);
+ }
+
+ private static boolean isHibernationEnabled() {
+ return DeviceConfig.getBoolean(
+ NAMESPACE_APP_HIBERNATION, PROPERTY_APP_HIBERNATION_ENABLED, false);
}
@Override
diff --git a/Settings/src/com/android/tv/settings/device/apps/AppsFragmentCompat.java b/Settings/src/com/android/tv/settings/device/apps/AppsFragmentCompat.java
new file mode 100644
index 0000000..2c03784
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/AppsFragmentCompat.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.tv.settings.device.apps;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_APPS;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+
+/**
+ * Fragment compat to handle apps screen.
+ */
+@Keep
+public class AppsFragmentCompat extends PreferenceControllerFragmentCompat {
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.apps_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_APPS;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/ConfirmationActivity.java b/Settings/src/com/android/tv/settings/device/apps/ConfirmationActivity.java
new file mode 100644
index 0000000..6de5287
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/ConfirmationActivity.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.tv.settings.device.apps;
+
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.FragmentActivity;
+import androidx.leanback.app.GuidedStepSupportFragment;
+import androidx.leanback.widget.GuidanceStylist;
+import androidx.leanback.widget.GuidedAction;
+
+import com.android.tv.settings.util.GuidedActionsAlignUtil;
+
+import java.util.List;
+
+/** Confirmation activity to handle apps related actions. */
+public class ConfirmationActivity extends FragmentActivity {
+ private static final String ARG_PACKAGE_NAME = "packageName";
+ private static final String EXTRA_GUIDANCE_TITLE = "guidancetitle";
+ private static final String EXTRA_GUIDANCE_SUBTITLE = "guidanceSubtitle";
+ private static final String EXTRA_GUIDANCE_BREADCRUMB = "guidacneBreadcrumb";
+ private static final String EXTRA_GUIDANCE_ICON = "guidanceIcon";
+
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (savedInstanceState == null) {
+ GuidedStepSupportFragment
+ .addAsRoot(this, ConfirmationFragment.newInstance(
+ getIntent()), android.R.id.content);
+ }
+ }
+
+ public static class ConfirmationFragment extends GuidedStepSupportFragment {
+ private static final int ID_OK = 0;
+ private static final int ID_CANCEL = 1;
+ private final Intent mIntent;
+
+ private ConfirmationFragment(Intent intent) {
+ mIntent = intent;
+ setArguments(intent.getExtras());
+ }
+
+ /** @return an new activity instance. */
+ public static ConfirmationFragment newInstance(Intent intent) {
+ ConfirmationFragment f = new ConfirmationFragment(intent);
+ return f;
+ }
+
+ @Override
+ public void onCreateActions(@NonNull List<GuidedAction> actions,
+ Bundle savedInstanceState) {
+ actions.add(new GuidedAction.Builder()
+ .title(getString(android.R.string.ok))
+ .id(ID_OK)
+ .build());
+ actions.add(new GuidedAction.Builder()
+ .title(getString(android.R.string.cancel))
+ .id(ID_CANCEL)
+ .build());
+ }
+
+ @Override
+ public GuidanceStylist onCreateGuidanceStylist() {
+ return GuidedActionsAlignUtil.createGuidanceStylist();
+ }
+
+ @NonNull
+ @Override
+ public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
+ return new GuidanceStylist.Guidance(
+ getArguments().getString(EXTRA_GUIDANCE_TITLE),
+ getArguments().getString(EXTRA_GUIDANCE_SUBTITLE),
+ getArguments().getString(EXTRA_GUIDANCE_BREADCRUMB),
+ null);
+ }
+
+ @Override
+ public void onGuidedActionClicked(GuidedAction action) {
+ switch ((int) action.getId()) {
+ case ID_OK:
+ getActivity().setResult(RESULT_OK, mIntent);
+ break;
+ case ID_CANCEL:
+ getActivity().setResult(RESULT_CANCELED, mIntent);
+ break;
+ }
+ getActivity().finish();
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/NotificationsPreference.java b/Settings/src/com/android/tv/settings/device/apps/NotificationsPreference.java
index f4e248e..7972df0 100644
--- a/Settings/src/com/android/tv/settings/device/apps/NotificationsPreference.java
+++ b/Settings/src/com/android/tv/settings/device/apps/NotificationsPreference.java
@@ -139,7 +139,8 @@
private boolean isNonBlockablePackage(Resources resources, String packageName) {
final String[] nonBlockablePkgs = resources.getStringArray(
- com.android.internal.R.array.config_nonBlockableNotificationPackages);
+ resources.getIdentifier("config_nonBlockableNotificationPackages",
+ "array", "android"));
for (String pkg : nonBlockablePkgs) {
// The non blockable package list can contain channels in the `package:channelId`
// format. Since TV settings don't support notifications channels, we'll consider
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/AlarmsAndRemindersActivity.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/AlarmsAndRemindersActivity.java
index 4adfb57..5482c22 100644
--- a/Settings/src/com/android/tv/settings/device/apps/specialaccess/AlarmsAndRemindersActivity.java
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/AlarmsAndRemindersActivity.java
@@ -19,7 +19,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
import com.android.tv.settings.system.SecurityFragment;
/**
@@ -33,7 +32,8 @@
finish();
return null;
} else {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(AlarmsAndReminders.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/AlarmsAndRemindersCompat.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/AlarmsAndRemindersCompat.java
new file mode 100644
index 0000000..1727ddc
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/AlarmsAndRemindersCompat.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.tv.settings.device.apps.specialaccess;
+
+import android.os.Bundle;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * Settings fragment compat for managing "Alarms & Reminders" permission
+ */
+public class AlarmsAndRemindersCompat extends SpecialAccessControllerFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.alarms_and_reminders_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_ALARMS_AND_REMINDERS;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/AllFilesAccess.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/AllFilesAccess.java
new file mode 100644
index 0000000..425cee0
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/AllFilesAccess.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.tv.settings.device.apps.specialaccess;
+
+import android.Manifest;
+import android.app.AppOpsManager;
+import android.app.tvsettings.TvSettingsEnums;
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.tv.settings.R;
+
+/**
+ * Settings screen for managing "All files access" permission
+ */
+@Keep
+public class AllFilesAccess extends ManageAppOp {
+
+ @Override
+ public int getAppOpsOpCode() {
+ return AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE;
+ }
+
+ @Override
+ public String getPermission() {
+ return Manifest.permission.MANAGE_EXTERNAL_STORAGE;
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.all_files_access, null);
+ }
+
+ @NonNull
+ @Override
+ public Preference bindPreference(@NonNull Preference preference,
+ ApplicationsState.AppEntry entry) {
+ final TwoStatePreference switchPref = (SwitchPreference) preference;
+ switchPref.setTitle(entry.label);
+ switchPref.setKey(entry.info.packageName);
+ switchPref.setIcon(entry.icon);
+ switchPref.setOnPreferenceChangeListener((pref, grant) -> {
+ pref.getContext().getSystemService(AppOpsManager.class)
+ .setMode(getAppOpsOpCode(), entry.info.uid, entry.info.packageName,
+ (Boolean) grant
+ ? AppOpsManager.MODE_ALLOWED
+ : AppOpsManager.MODE_ERRORED);
+ return true;
+ });
+ switchPref.setSummary(getPreferenceSummary(entry));
+ switchPref.setChecked(((PermissionState) entry.extraInfo).isAllowed());
+
+ return switchPref;
+ }
+
+ @NonNull
+ @Override
+ public Preference createAppPreference() {
+ return new SwitchPreference(getPreferenceManager().getContext());
+ }
+
+ @NonNull
+ @Override
+ public PreferenceGroup getAppPreferenceGroup() {
+ return getPreferenceScreen();
+ }
+
+ private CharSequence getPreferenceSummary(ApplicationsState.AppEntry entry) {
+ if (entry.extraInfo instanceof PermissionState) {
+ return getContext().getText(((PermissionState) entry.extraInfo).isAllowed()
+ ? R.string.app_permission_summary_allowed
+ : R.string.app_permission_summary_not_allowed);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ protected int getPageId() {
+ return TvSettingsEnums.APPS_SPECIAL_APP_ACCESS_ALL_FILES_ACCESS;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/AllFilesAccessActivity.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/AllFilesAccessActivity.java
new file mode 100644
index 0000000..cfff279
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/AllFilesAccessActivity.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.tv.settings.device.apps.specialaccess;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.tv.settings.TvSettingsActivity;
+import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.system.SecurityFragment;
+
+/**
+ * Wrapper activity for {@link AllFilesAccess}
+ */
+public class AllFilesAccessActivity extends TvSettingsActivity {
+
+ @Override
+ protected Fragment createSettingsFragment() {
+ if (SecurityFragment.isRestrictedProfileInEffect(this)) {
+ finish();
+ return null;
+ } else {
+ return FlavorUtils.getFeatureFactory(this)
+ .getSettingsFragmentProvider()
+ .newSettingsFragment(
+ AllFilesAccess.class.getName(),
+ getIntent() != null ? getIntent().getExtras() : null);
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/AppUsageAccessActivity.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/AppUsageAccessActivity.java
index b954dda..42379c3 100644
--- a/Settings/src/com/android/tv/settings/device/apps/specialaccess/AppUsageAccessActivity.java
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/AppUsageAccessActivity.java
@@ -19,7 +19,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
import com.android.tv.settings.system.SecurityFragment;
/**
@@ -33,8 +32,9 @@
finish();
return null;
} else {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(AppUsageAccess.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(AppUsageAccess.class.getName(), null);
}
}
}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/AppUsageAccessCompat.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/AppUsageAccessCompat.java
new file mode 100644
index 0000000..2542c9e
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/AppUsageAccessCompat.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.apps.specialaccess;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * Fragment compat for controlling if apps can monitor app usage
+ */
+@Keep
+public class AppUsageAccessCompat extends SpecialAccessControllerFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.app_usage_access_compat, null);
+ }
+
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_APP_USAGE_ACCESS;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/ExternalSourcesActivity.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/ExternalSourcesActivity.java
index fda1e3d..728ec37 100644
--- a/Settings/src/com/android/tv/settings/device/apps/specialaccess/ExternalSourcesActivity.java
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/ExternalSourcesActivity.java
@@ -19,7 +19,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
import com.android.tv.settings.system.SecurityFragment;
/**
@@ -33,8 +32,9 @@
finish();
return null;
} else {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(ExternalSources.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(ExternalSources.class.getName(), null);
}
}
}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/HighPowerCompat.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/HighPowerCompat.java
new file mode 100644
index 0000000..2f1c84b
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/HighPowerCompat.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.apps.specialaccess;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * Fragment compat for managing power save allowlist
+ */
+@Keep
+public class HighPowerCompat extends SpecialAccessControllerFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.manage_high_power_compat, null);
+ }
+
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_HIGH_POWER;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/NotificationAccess.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/NotificationAccess.java
index 36d471a..2e4c055 100644
--- a/Settings/src/com/android/tv/settings/device/apps/specialaccess/NotificationAccess.java
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/NotificationAccess.java
@@ -98,7 +98,8 @@
setPreferencesFromResource(R.xml.notification_access, null);
String packages = getString(
- com.android.internal.R.string.config_defaultListenerAccessPackages);
+ getResources().getIdentifier("config_defaultListenerAccessPackages",
+ "string", "android"));
mDefaultPackages = new ArraySet<String>(packages.split(DEFAULT_PACKAGES_SEPARATOR));
}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/NotificationAccessCompat.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/NotificationAccessCompat.java
new file mode 100644
index 0000000..c9c0d64
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/NotificationAccessCompat.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.tv.settings.device.apps.specialaccess;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.Preference;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.compat.TsSwitchPreference;
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+
+import java.util.List;
+
+/** Fragment compat for managing notification access. */
+@Keep
+public class NotificationAccessCompat extends PreferenceControllerFragmentCompat {
+ @Override
+ public void updateAllPref(List<PreferenceCompat> preferenceCompatList) {
+ if (preferenceCompatList == null) {
+ return;
+ }
+ preferenceCompatList.stream()
+ .forEach(preferenceCompat -> updatePref(preferenceCompat));
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.notification_access_compat, null);
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat pref) {
+ if (pref == null) {
+ return null;
+ }
+ String[] key = pref.getKey();
+ Preference preference = findTargetPreference(key);
+ if (preference == null) {
+ preference = new TsSwitchPreference(getContext(), key);
+ getPreferenceScreen().addPreference(preference);
+ }
+ RenderUtil.updatePreference(
+ getContext(), (HasKeys) preference, pref, preference.getOrder());
+ return (HasKeys) preference;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_NOTIFICATION_ACCESS;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/PictureInPictureActivity.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/PictureInPictureActivity.java
index 87537c7..1647a28 100644
--- a/Settings/src/com/android/tv/settings/device/apps/specialaccess/PictureInPictureActivity.java
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/PictureInPictureActivity.java
@@ -19,7 +19,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
import com.android.tv.settings.system.SecurityFragment;
/**
@@ -33,8 +32,9 @@
finish();
return null;
} else {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(PictureInPicture.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(PictureInPicture.class.getName(), null);
}
}
}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/PictureInPictureCompat.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/PictureInPictureCompat.java
new file mode 100644
index 0000000..f4ff0ba
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/PictureInPictureCompat.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.apps.specialaccess;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.library.ManagerUtil;
+
+
+/**
+ * Fragment compat for managing which apps are granted PIP access
+ */
+@Keep
+public class PictureInPictureCompat extends SpecialAccessControllerFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.picture_in_picture_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_PICTURE_IN_PICTURE;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/SpecialAccessControllerFragmentCompat.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/SpecialAccessControllerFragmentCompat.java
new file mode 100644
index 0000000..265db43
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/SpecialAccessControllerFragmentCompat.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.tv.settings.device.apps.specialaccess;
+
+import androidx.preference.Preference;
+
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.compat.TsPreference;
+import com.android.tv.settings.compat.TsSwitchPreference;
+import com.android.tv.settings.library.PreferenceCompat;
+
+import java.util.List;
+
+/** Base fragment compat for special app access. */
+public abstract class SpecialAccessControllerFragmentCompat
+ extends PreferenceControllerFragmentCompat {
+ @Override
+ public void updateAllPref(List<PreferenceCompat> preferenceCompatList) {
+ if (preferenceCompatList == null) {
+ return;
+ }
+ preferenceCompatList.stream()
+ .forEach(preferenceCompat -> updatePref(preferenceCompat));
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat pref) {
+ if (pref == null) {
+ return null;
+ }
+ String[] key = pref.getKey();
+ Preference preference = findTargetPreference(key);
+ if (preference == null) {
+ if (pref.getType() == PreferenceCompat.TYPE_SWITCH) {
+ preference = new TsSwitchPreference(getContext(), key);
+ } else {
+ preference = new TsPreference(getContext(), key);
+ }
+ getPreferenceScreen().addPreference(preference);
+ }
+ RenderUtil.updatePreference(
+ getContext(), (HasKeys) preference, pref, preference.getOrder());
+ if (pref.hasOnPreferenceChangeListener()) {
+ preference.setOnPreferenceChangeListener(this);
+ }
+ return (HasKeys) preference;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/SpecialAppAccessCompat.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/SpecialAppAccessCompat.java
new file mode 100644
index 0000000..3936b7b
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/SpecialAppAccessCompat.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.apps.specialaccess;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * Fragment compat for special app access items.
+ */
+@Keep
+public class SpecialAppAccessCompat extends PreferenceControllerFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.special_app_access_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_SPECIAL_ACCESS;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/SystemAlertActivity.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/SystemAlertActivity.java
index de60b6b..39a6397 100644
--- a/Settings/src/com/android/tv/settings/device/apps/specialaccess/SystemAlertActivity.java
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/SystemAlertActivity.java
@@ -19,7 +19,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
import com.android.tv.settings.system.SecurityFragment;
/**
@@ -33,7 +32,8 @@
finish();
return null;
} else {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(SystemAlertWindow.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/SystemAlertWindowCompat.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/SystemAlertWindowCompat.java
new file mode 100644
index 0000000..fffd4d1
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/SystemAlertWindowCompat.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.apps.specialaccess;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * Settings screen for managing "Display over other apps" permission
+ */
+@Keep
+public class SystemAlertWindowCompat extends SpecialAccessControllerFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.system_alert_window_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_SYSTEM_ALERT_WINDOW;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/TurnScreenOn.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/TurnScreenOn.java
new file mode 100644
index 0000000..de6d40f
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/TurnScreenOn.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.apps.specialaccess;
+
+import android.Manifest;
+import android.app.ActivityManager;
+import android.app.AppOpsManager;
+import android.app.tvsettings.TvSettingsEnums;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.util.Log;
+
+import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.SwitchPreference;
+import androidx.preference.TwoStatePreference;
+
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.tv.settings.R;
+import com.android.tv.settings.SettingsPreferenceFragment;
+
+/**
+ * Fragment for managing which apps are allowed to turn the screen on
+ */
+@Keep
+public class TurnScreenOn extends SettingsPreferenceFragment
+ implements ManageApplicationsController.Callback {
+ private static final String TAG = TurnScreenOn.class.getSimpleName();
+ private static final boolean DEBUG = false;
+ private ManageApplicationsController mManageApplicationsController;
+ private AppOpsManager mAppOpsManager;
+
+ private final ApplicationsState.AppFilter mFilter = new ApplicationsState.CompoundFilter(
+ new ApplicationsState.CompoundFilter(
+ ApplicationsState.FILTER_WITHOUT_DISABLED_UNTIL_USED,
+ ApplicationsState.FILTER_ALL_ENABLED),
+ new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(ApplicationsState.AppEntry info) {
+ info.extraInfo = mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_TURN_SCREEN_ON,
+ info.info.uid, info.info.packageName) == AppOpsManager.MODE_ALLOWED;
+ return !ManageAppOp.shouldIgnorePackage(
+ getContext(),
+ info.info.packageName, /* customizedIgnoredPackagesArray= */ 0)
+ && !info.info.isPrivilegedApp()
+ && ActivityManager.getCurrentUser() == UserHandle.getUserId(
+ info.info.uid)
+ && checkPackageHasWakeLockPermission(info.info.packageName);
+ }
+ });
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mAppOpsManager = getContext().getSystemService(AppOpsManager.class);
+ mManageApplicationsController = new ManageApplicationsController(getContext(), this,
+ getLifecycle(), mFilter, ApplicationsState.ALPHA_COMPARATOR);
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.turn_screen_on, null);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mManageApplicationsController.updateAppList();
+ }
+
+ private boolean checkPackageHasWakeLockPermission(String packageName) {
+ return getContext().getPackageManager().checkPermission(Manifest.permission.WAKE_LOCK,
+ packageName) == PackageManager.PERMISSION_GRANTED;
+ }
+
+ @NonNull
+ @Override
+ public Preference bindPreference(@NonNull Preference preference,
+ ApplicationsState.AppEntry entry) {
+ final TwoStatePreference switchPref = (SwitchPreference) preference;
+ switchPref.setTitle(entry.label);
+ switchPref.setKey(entry.info.packageName);
+ switchPref.setIcon(entry.icon);
+ switchPref.setChecked((Boolean) entry.extraInfo);
+ switchPref.setOnPreferenceChangeListener((pref, newValue) -> {
+ int newMode =
+ (Boolean) newValue ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_ERRORED;
+ if (DEBUG) {
+ Log.d(TAG, "setting OP_TURN_SCREEN_ON to " + newMode
+ + ", uid=" + entry.info.uid
+ + ", packageName=" + entry.info.packageName
+ + ", userId=" + UserHandle.getUserId(entry.info.uid)
+ + ", currentUser=" + ActivityManager.getCurrentUser());
+ }
+ mAppOpsManager.setMode(AppOpsManager.OP_TURN_SCREEN_ON,
+ entry.info.uid,
+ entry.info.packageName,
+ newMode);
+ return true;
+ });
+ switchPref.setSummaryOn(R.string.app_permission_summary_allowed);
+ switchPref.setSummaryOff(R.string.app_permission_summary_not_allowed);
+ return switchPref;
+ }
+
+ @NonNull
+ @Override
+ public Preference createAppPreference() {
+ return new SwitchPreference(getPreferenceManager().getContext());
+ }
+
+ @NonNull
+ @Override
+ public Preference getEmptyPreference() {
+ final Preference empty = new Preference(getPreferenceManager().getContext());
+ empty.setKey("empty");
+ empty.setTitle(R.string.noApplications);
+ empty.setEnabled(false);
+ return empty;
+ }
+
+ @NonNull
+ @Override
+ public PreferenceGroup getAppPreferenceGroup() {
+ return getPreferenceScreen();
+ }
+
+ @Override
+ protected int getPageId() {
+ return TvSettingsEnums.APPS_SPECIAL_APP_ACCESS_TURN_SCREEN_ON;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/apps/specialaccess/WriteSettingsCompat.java b/Settings/src/com/android/tv/settings/device/apps/specialaccess/WriteSettingsCompat.java
new file mode 100644
index 0000000..c060500
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/apps/specialaccess/WriteSettingsCompat.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.apps.specialaccess;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * Fragment compat for managing apps which can write system settings
+ */
+@Keep
+public class WriteSettingsCompat extends SpecialAccessControllerFragmentCompat {
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.write_settings_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_WRITE_SETTINGS;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/display/ambient/AmbientSliceActivity.java b/Settings/src/com/android/tv/settings/device/display/ambient/AmbientSliceActivity.java
index 9c78609..e8d0edc 100644
--- a/Settings/src/com/android/tv/settings/device/display/ambient/AmbientSliceActivity.java
+++ b/Settings/src/com/android/tv/settings/device/display/ambient/AmbientSliceActivity.java
@@ -16,7 +16,7 @@
package com.android.tv.settings.device.display.ambient;
-import static com.android.tv.settings.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
+import static com.android.tv.settings.library.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
import com.android.tv.settings.R;
import com.android.tv.settings.slice.SliceActivity;
diff --git a/Settings/src/com/android/tv/settings/device/display/daydream/DaydreamActivity.java b/Settings/src/com/android/tv/settings/device/display/daydream/DaydreamActivity.java
index e163af2..2818d1f 100644
--- a/Settings/src/com/android/tv/settings/device/display/daydream/DaydreamActivity.java
+++ b/Settings/src/com/android/tv/settings/device/display/daydream/DaydreamActivity.java
@@ -16,10 +16,11 @@
package com.android.tv.settings.device.display.daydream;
+import static com.android.tv.settings.library.overlay.FlavorUtils.NON_X_EXPERIENCE_FLAVORS_MASK;
+
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
/**
* Activity that allows the setting of daydreams.
@@ -28,7 +29,13 @@
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(DaydreamFragment.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(DaydreamFragment.class.getName(), null);
+ }
+
+ @Override
+ protected int getAvailableFlavors() {
+ return NON_X_EXPERIENCE_FLAVORS_MASK;
}
}
diff --git a/Settings/src/com/android/tv/settings/device/display/daydream/DaydreamFragment.java b/Settings/src/com/android/tv/settings/device/display/daydream/DaydreamFragment.java
index 885f9bf..45318c8 100644
--- a/Settings/src/com/android/tv/settings/device/display/daydream/DaydreamFragment.java
+++ b/Settings/src/com/android/tv/settings/device/display/daydream/DaydreamFragment.java
@@ -18,10 +18,10 @@
import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_VENDOR;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_X;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_CLASSIC;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_VENDOR;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_X;
import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
import android.app.tvsettings.TvSettingsEnums;
@@ -45,7 +45,7 @@
import com.android.tv.settings.R;
import com.android.tv.settings.RestrictedPreferenceAdapter;
import com.android.tv.settings.SettingsPreferenceFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import java.util.List;
import java.util.Map;
diff --git a/Settings/src/com/android/tv/settings/device/display/daydream/DaydreamFragmentCompat.java b/Settings/src/com/android/tv/settings/device/display/daydream/DaydreamFragmentCompat.java
new file mode 100644
index 0000000..4e3917d
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/display/daydream/DaydreamFragmentCompat.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.tv.settings.device.display.daydream;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * The fragment for screen saver screen in TV settings.
+ */
+@Keep
+public class DaydreamFragmentCompat extends PreferenceControllerFragmentCompat {
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.daydream_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_DAYDREAM;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/display/daydream/EnergySaverFragmentCompat.java b/Settings/src/com/android/tv/settings/device/display/daydream/EnergySaverFragmentCompat.java
new file mode 100644
index 0000000..0ea8563
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/display/daydream/EnergySaverFragmentCompat.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.tv.settings.device.display.daydream;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_ENERGY_SAVER;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.Preference;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+
+/**
+ * The fragment compat for energy saver screen in TV settings.
+ */
+@Keep
+public class EnergySaverFragmentCompat extends PreferenceControllerFragmentCompat {
+ private static final String KEY_ALLOW_TURN_SCREEN_OFF = "allowTurnScreenOff";
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.energy_saver_compat, null);
+ Preference preference = findPreference(KEY_ALLOW_TURN_SCREEN_OFF);
+ preference.setVisible(showStandbyTimeout());
+ }
+
+ private boolean showStandbyTimeout() {
+ return getResources().getBoolean(R.bool.config_show_standby_timeout);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_ENERGY_SAVER;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/AdvancedDisplayFragmentCompat.java b/Settings/src/com/android/tv/settings/device/displaysound/AdvancedDisplayFragmentCompat.java
new file mode 100644
index 0000000..fea843d
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/displaysound/AdvancedDisplayFragmentCompat.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.tv.settings.device.displaysound;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * The fragment compat for advanced display screen in TV settings.
+ */
+@Keep
+public class AdvancedDisplayFragmentCompat extends PreferenceControllerFragmentCompat {
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ setPreferencesFromResource(R.xml.advanced_display_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_ADVANCED_DISPLAY;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/AdvancedVolumeFragment.java b/Settings/src/com/android/tv/settings/device/displaysound/AdvancedVolumeFragment.java
index f1c2663..357bb47 100644
--- a/Settings/src/com/android/tv/settings/device/displaysound/AdvancedVolumeFragment.java
+++ b/Settings/src/com/android/tv/settings/device/displaysound/AdvancedVolumeFragment.java
@@ -16,7 +16,7 @@
package com.android.tv.settings.device.displaysound;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_CLASSIC;
import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
import static com.android.tv.settings.util.InstrumentationUtils.logToggleInteracted;
@@ -40,7 +40,7 @@
import com.android.tv.settings.PreferenceControllerFragment;
import com.android.tv.settings.R;
import com.android.tv.settings.RadioPreference;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import java.util.ArrayList;
import java.util.List;
@@ -86,6 +86,21 @@
mAudioManager = getAudioManager();
mFormats = mAudioManager.getSurroundFormats();
mReportedFormats = mAudioManager.getReportedSurroundFormats();
+
+ // For the first time, when the user has never changed the surround sound setting, enable
+ // all the surround sound formats supported by android and audio device, and disable the
+ // formats supported by Android device, but not by audio device.
+ String formatString = Settings.Global.getString(getContext().getContentResolver(),
+ Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS);
+ if (formatString == null) {
+ for (int format : mFormats.keySet()) {
+ if (mReportedFormats.contains(format)) {
+ mAudioManager.setSurroundFormatEnabled(format, true);
+ } else {
+ mAudioManager.setSurroundFormatEnabled(format, false);
+ }
+ }
+ }
super.onAttach(context);
}
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/AdvancedVolumeFragmentCompat.java b/Settings/src/com/android/tv/settings/device/displaysound/AdvancedVolumeFragmentCompat.java
new file mode 100644
index 0000000..39719d2
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/displaysound/AdvancedVolumeFragmentCompat.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.tv.settings.device.displaysound;
+
+import static com.android.tv.settings.library.PreferenceCompat.STATUS_OFF;
+import static com.android.tv.settings.library.PreferenceCompat.STATUS_ON;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.PreferenceGroup;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+
+/**
+ * The fragment compat for advanced volume screen in TV settings.
+ */
+@Keep
+public class AdvancedVolumeFragmentCompat extends RadioPreferencesFragmentCompat {
+ private static final String KEY_ADVANCED_SOUND_OPTION = "advanced_sound_settings_option";
+ private static final String KEY_FORMAT_INFO = "surround_sound_format_info";
+ private static final String KEY_FORMAT_INFO_ON_MANUAL = "surround_sound_format_info_on_manual";
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ setPreferencesFromResource(R.xml.advanced_volume_compat, null);
+ mPrefGroup = findPreference(KEY_ADVANCED_SOUND_OPTION);
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat preferenceCompat) {
+ if (preferenceCompat != null && preferenceCompat.getKey().length == 1) {
+ String categoryKey = preferenceCompat.getKey()[0];
+ switch (categoryKey) {
+ case KEY_ADVANCED_SOUND_OPTION:
+ return super.updatePref(preferenceCompat);
+ case KEY_FORMAT_INFO:
+ case KEY_FORMAT_INFO_ON_MANUAL:
+ if (preferenceCompat.getVisible() == STATUS_OFF) {
+ findPreference(categoryKey).setVisible(false);
+ } else if (preferenceCompat.getVisible() == STATUS_ON) {
+ findPreference(categoryKey).setVisible(true);
+ }
+ RenderUtil.updatePreferenceGroup(
+ ((PreferenceGroup) findPreference(categoryKey)),
+ preferenceCompat.getChildPrefCompats());
+ return null;
+ default:
+ return null;
+ }
+ }
+ return super.updatePref(preferenceCompat);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_ADVANCED_VOLUME;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/DisplaySoundActivity.java b/Settings/src/com/android/tv/settings/device/displaysound/DisplaySoundActivity.java
index 48d69f9..c06bcd7 100644
--- a/Settings/src/com/android/tv/settings/device/displaysound/DisplaySoundActivity.java
+++ b/Settings/src/com/android/tv/settings/device/displaysound/DisplaySoundActivity.java
@@ -19,7 +19,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
/**
* Activity that allows the enabling and disabling of display and sound effects.
@@ -28,7 +27,8 @@
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(DisplaySoundFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/DisplaySoundFragment.java b/Settings/src/com/android/tv/settings/device/displaysound/DisplaySoundFragment.java
index c1115b4..ef05882 100644
--- a/Settings/src/com/android/tv/settings/device/displaysound/DisplaySoundFragment.java
+++ b/Settings/src/com/android/tv/settings/device/displaysound/DisplaySoundFragment.java
@@ -16,40 +16,55 @@
package com.android.tv.settings.device.displaysound;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_VENDOR;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_X;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_CLASSIC;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_VENDOR;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_X;
import static com.android.tv.settings.util.InstrumentationUtils.logToggleInteracted;
import android.app.tvsettings.TvSettingsEnums;
import android.content.ContentResolver;
import android.content.Context;
+import android.hardware.display.DisplayManager;
+import android.hardware.hdmi.HdmiControlManager;
import android.media.AudioManager;
import android.os.Bundle;
import android.provider.Settings;
import android.text.TextUtils;
+import android.view.Display;
import androidx.annotation.Keep;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.TwoStatePreference;
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
-import com.android.tv.settings.util.SliceUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.SliceUtils;
+import com.android.tv.settings.util.ResolutionSelectionUtils;
import com.android.tv.twopanelsettings.slices.SlicePreference;
+import java.util.Objects;
+
/**
* The "Display & sound" screen in TV Settings.
*/
@Keep
-public class DisplaySoundFragment extends SettingsPreferenceFragment {
+public class DisplaySoundFragment extends SettingsPreferenceFragment implements
+ DisplayManager.DisplayListener {
static final String KEY_SOUND_EFFECTS = "sound_effects";
private static final String KEY_CEC = "cec";
+ private static final String KEY_DEFAULT_AUDIO_OUTPUT_SETTINGS_SLICE =
+ "default_audio_output_settings";
+ private static final String KEY_RESOLUTION_TITLE = "resolution_selection";
private AudioManager mAudioManager;
+ private HdmiControlManager mHdmiControlManager;
+
+ private Display.Mode mCurrentMode = null;
+ private DisplayManager mDisplayManager;
public static DisplaySoundFragment newInstance() {
return new DisplaySoundFragment();
@@ -63,6 +78,7 @@
@Override
public void onAttach(Context context) {
mAudioManager = context.getSystemService(AudioManager.class);
+ mHdmiControlManager = context.getSystemService(HdmiControlManager.class);
super.onAttach(context);
}
@@ -86,6 +102,18 @@
final TwoStatePreference soundPref = findPreference(KEY_SOUND_EFFECTS);
soundPref.setChecked(getSoundEffectsEnabled());
updateCecPreference();
+ updateDefaultAudioOutputSettings();
+
+ mDisplayManager = getDisplayManager();
+ Display display = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
+ if (display.getSystemPreferredDisplayMode() != null) {
+ mDisplayManager.registerDisplayListener(this, null);
+ mCurrentMode = mDisplayManager.getGlobalUserPreferredDisplayMode();
+ updateResolutionTitleDescription(ResolutionSelectionUtils.modeToString(
+ mCurrentMode, getContext()));
+ } else {
+ removeResolutionPreference();
+ }
}
@Override
@@ -125,10 +153,8 @@
&& SliceUtils.isSliceProviderValid(
getContext(), ((SlicePreference) cecPreference).getUri())) {
ContentResolver resolver = getContext().getContentResolver();
- // Note that default CEC is enabled. You'll find similar retrieval of property in
- // HdmiControlService.
- boolean cecEnabled =
- Settings.Global.getInt(resolver, Settings.Global.HDMI_CONTROL_ENABLED, 1) != 0;
+ boolean cecEnabled = mHdmiControlManager.getHdmiCecEnabled()
+ == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED;
cecPreference.setSummary(cecEnabled ? R.string.enabled : R.string.disabled);
cecPreference.setVisible(true);
} else {
@@ -136,8 +162,55 @@
}
}
+ private void updateDefaultAudioOutputSettings() {
+ final SlicePreference defaultAudioOutputSlicePref = findPreference(
+ KEY_DEFAULT_AUDIO_OUTPUT_SETTINGS_SLICE);
+ if (defaultAudioOutputSlicePref != null) {
+ defaultAudioOutputSlicePref.setVisible(
+ SliceUtils.isSliceProviderValid(getContext(),
+ defaultAudioOutputSlicePref.getUri())
+ && SliceUtils.isSettingsSliceEnabled(getContext(),
+ defaultAudioOutputSlicePref.getUri(), null));
+ }
+ }
+
@Override
protected int getPageId() {
return TvSettingsEnums.DISPLAY_SOUND;
}
+
+ @Override
+ public void onDisplayAdded(int displayId) {}
+
+ @Override
+ public void onDisplayRemoved(int displayId) {}
+
+ @Override
+ public void onDisplayChanged(int displayId) {
+ Display.Mode newMode = mDisplayManager.getGlobalUserPreferredDisplayMode();
+ if (!Objects.equals(mCurrentMode, newMode)) {
+ updateResolutionTitleDescription(
+ ResolutionSelectionUtils.modeToString(newMode, getContext()));
+ mCurrentMode = newMode;
+ }
+ }
+
+ @VisibleForTesting
+ DisplayManager getDisplayManager() {
+ return getContext().getSystemService(DisplayManager.class);
+ }
+
+ private void updateResolutionTitleDescription(String summary) {
+ Preference titlePreference = findPreference(KEY_RESOLUTION_TITLE);
+ if (titlePreference != null) {
+ titlePreference.setSummary(summary);
+ }
+ }
+
+ private void removeResolutionPreference() {
+ Preference resolutionPreference = findPreference(KEY_RESOLUTION_TITLE);
+ if (resolutionPreference != null) {
+ getPreferenceScreen().removePreference(resolutionPreference);
+ }
+ }
}
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/DisplaySoundFragmentCompat.java b/Settings/src/com/android/tv/settings/device/displaysound/DisplaySoundFragmentCompat.java
new file mode 100644
index 0000000..77dce38
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/displaysound/DisplaySoundFragmentCompat.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.displaysound;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * The fragment compat for "Display & sound" screen in TV Settings.
+ */
+@Keep
+public class DisplaySoundFragmentCompat extends PreferenceControllerFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ setPreferencesFromResource(R.xml.display_sound_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_DISPLAY_SOUND;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/FontScalePreferenceFragment.java b/Settings/src/com/android/tv/settings/device/displaysound/FontScalePreferenceFragment.java
index b759935..a068d41 100644
--- a/Settings/src/com/android/tv/settings/device/displaysound/FontScalePreferenceFragment.java
+++ b/Settings/src/com/android/tv/settings/device/displaysound/FontScalePreferenceFragment.java
@@ -16,7 +16,9 @@
package com.android.tv.settings.device.displaysound;
-import android.app.settings.SettingsEnums;
+import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
+
+import android.app.tvsettings.TvSettingsEnums;
import android.content.ContentResolver;
import android.content.Context;
import android.os.Bundle;
@@ -29,6 +31,7 @@
import com.android.tv.settings.R;
import com.android.tv.settings.RadioPreference;
import com.android.tv.settings.SettingsPreferenceFragment;
+import com.android.tv.settings.library.overlay.FlavorUtils;
/**
* The "Text scaling" screen in TV Settings.
@@ -49,6 +52,8 @@
final Context themedContext = getPreferenceManager().getContext();
final String[] entryValues = getContext().getResources()
.getStringArray(R.array.font_scale_entry_values);
+ final String[] entries = getContext().getResources()
+ .getStringArray(R.array.font_scale_entries);
initFontScaleValue(getContext());
for (int i = 0; i < entryValues.length; i++) {
@@ -62,35 +67,22 @@
.getString(R.string.font_scale_item_detail, scaleValue);
preference.setSummaryOff(summary);
preference.setSummaryOn(summary);
- preference.setTitle(mapScaleIndexToTitle(i));
- preference.setFragment(FontScalePreviewFragment.class.getName());
+ preference.setTitle(entries[i]);
+ if (FlavorUtils.isTwoPanel(getContext())) {
+ preference.setFragment(FontScalePreviewFragment.class.getName());
+ }
Bundle extras = preference.getExtras();
extras.putString(FontScalePreviewFragment.PREVIEW_FONT_SCALE_VALUE, entryValues[i]);
extras.putFloat(
FontScalePreviewFragment.CURRENT_FONT_SCALE_VALUE, mCurrentFontScaleValue);
- if (entryValues[i].equals(String.valueOf(mCurrentFontScaleValue))) {
+ if (Float.compare(mCurrentFontScaleValue, Float.parseFloat(entryValues[i])) == 0) {
preference.setChecked(true);
}
fontScaleGroup.addPreference(preference);
}
}
- // Temporary method to accommodate additional font scale settings.
- // TODO: remove once font scale values are finalized.
- private String mapScaleIndexToTitle(int scaleValueIndex) {
- final String[] entries = getContext().getResources()
- .getStringArray(R.array.font_scale_entries);
- if (scaleValueIndex < 2) {
- return entries[scaleValueIndex];
- }
- if (scaleValueIndex > 3) {
- return entries[3];
- } else {
- return entries[2];
- }
- }
-
private void initFontScaleValue(Context context) {
final ContentResolver resolver = getContext().getContentResolver();
mCurrentFontScaleValue =
@@ -107,6 +99,7 @@
radioPreference.clearOtherRadioPreferences(fontScaleGroup);
mCurrentFontScaleValue = Float.parseFloat(preference.getKey());
commit();
+ logNewFontScaleSelection(preference.getKey());
return true;
}
@@ -116,8 +109,25 @@
Settings.System.putFloat(resolver, Settings.System.FONT_SCALE, mCurrentFontScaleValue);
}
+ private void logNewFontScaleSelection(String fontScale) {
+ final int[] textScalingOptions = {
+ TvSettingsEnums.DISPLAY_SOUND_TEXT_SCALING_SMALL,
+ TvSettingsEnums.DISPLAY_SOUND_TEXT_SCALING_DEFAULT,
+ TvSettingsEnums.DISPLAY_SOUND_TEXT_SCALING_LARGE,
+ TvSettingsEnums.DISPLAY_SOUND_TEXT_SCALING_LARGEST,
+ };
+ final String[] entryValues = getContext().getResources()
+ .getStringArray(R.array.font_scale_entry_values);
+ for (int i = 0; i < entryValues.length; i++) {
+ if (fontScale.equals(entryValues[i])) {
+ logEntrySelected(textScalingOptions[i]);
+ break;
+ }
+ }
+ }
+
@Override
protected int getPageId() {
- return SettingsEnums.ACCESSIBILITY_FONT_SIZE;
+ return TvSettingsEnums.DISPLAY_SOUND_TEXT_SCALING;
}
}
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/FontScalePreferenceFragmentCompat.java b/Settings/src/com/android/tv/settings/device/displaysound/FontScalePreferenceFragmentCompat.java
new file mode 100644
index 0000000..bffb3f7
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/displaysound/FontScalePreferenceFragmentCompat.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.tv.settings.device.displaysound;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.TsPreferenceCategory;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * The fragment compat for the "Text scaling" screen in TV Settings.
+ */
+@Keep
+public class FontScalePreferenceFragmentCompat extends RadioPreferencesFragmentCompat {
+ private TsPreferenceCategory mPrefGroup;
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ setPreferencesFromResource(R.xml.font_scale_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_FONT_SCALE;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/FontScalePreviewFragment.java b/Settings/src/com/android/tv/settings/device/displaysound/FontScalePreviewFragment.java
index c192413..d5fa952 100644
--- a/Settings/src/com/android/tv/settings/device/displaysound/FontScalePreviewFragment.java
+++ b/Settings/src/com/android/tv/settings/device/displaysound/FontScalePreviewFragment.java
@@ -87,7 +87,7 @@
sampleText.setMaxLines(lines);
// Ellipsize after the max line change
- int lineEndIndex = sampleText.getLayout().getLineEnd(lines);
+ int lineEndIndex = sampleText.getLayout().getLineEnd(lines - 1);
if (lineEndIndex >= ELLIPSIS.length()) {
String ellipsizedText =
sampleText.getText().subSequence(0, lineEndIndex - ELLIPSIS.length())
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/HdrFormatSelectionFragment.java b/Settings/src/com/android/tv/settings/device/displaysound/HdrFormatSelectionFragment.java
index 0fc2125..06bc716 100644
--- a/Settings/src/com/android/tv/settings/device/displaysound/HdrFormatSelectionFragment.java
+++ b/Settings/src/com/android/tv/settings/device/displaysound/HdrFormatSelectionFragment.java
@@ -21,7 +21,7 @@
import static android.view.Display.HdrCapabilities.HDR_TYPE_HDR10_PLUS;
import static android.view.Display.HdrCapabilities.HDR_TYPE_HLG;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_CLASSIC;
import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
import static com.android.tv.settings.util.InstrumentationUtils.logToggleInteracted;
@@ -44,7 +44,7 @@
import com.android.tv.settings.PreferenceControllerFragment;
import com.android.tv.settings.R;
import com.android.tv.settings.RadioPreference;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/HdrFormatSelectionFragmentCompat.java b/Settings/src/com/android/tv/settings/device/displaysound/HdrFormatSelectionFragmentCompat.java
new file mode 100644
index 0000000..f18ef9a
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/displaysound/HdrFormatSelectionFragmentCompat.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.tv.settings.device.displaysound;
+
+import static com.android.tv.settings.library.PreferenceCompat.STATUS_OFF;
+import static com.android.tv.settings.library.PreferenceCompat.STATUS_ON;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.PreferenceGroup;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+
+/**
+ * This Fragment compat is responsible for allowing the user enable or disable the Hdr types which
+ * are supported by device.
+ */
+@Keep
+public class HdrFormatSelectionFragmentCompat extends RadioPreferencesFragmentCompat {
+ private static final String KEY_HDR_FORMAT_SELECTION_OPTION = "hdr_format_selection_option";
+ private static final String KEY_FORMAT_INFO = "hdr_format_info";
+ private static final String KEY_FORMAT_INFO_ON_MANUAL = "hdr_format_info_on_manual";
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ setPreferencesFromResource(R.xml.hdr_format_selection_compat, null);
+ mPrefGroup = findPreference(KEY_HDR_FORMAT_SELECTION_OPTION);
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat preferenceCompat) {
+ if (preferenceCompat != null && preferenceCompat.getKey().length == 1) {
+ String categoryKey = preferenceCompat.getKey()[0];
+ switch (categoryKey) {
+ case KEY_HDR_FORMAT_SELECTION_OPTION:
+ return super.updatePref(preferenceCompat);
+ case KEY_FORMAT_INFO:
+ case KEY_FORMAT_INFO_ON_MANUAL:
+ if (preferenceCompat.getVisible() == STATUS_OFF) {
+ findPreference(categoryKey).setVisible(false);
+ } else if (preferenceCompat.getVisible() == STATUS_ON) {
+ findPreference(categoryKey).setVisible(true);
+ }
+ RenderUtil.updatePreferenceGroup(
+ ((PreferenceGroup) findPreference(categoryKey)),
+ preferenceCompat.getChildPrefCompats());
+ return null;
+ default:
+ return null;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_HDR_FORMAT_SELECTION;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/MatchContentFrameRateFragment.java b/Settings/src/com/android/tv/settings/device/displaysound/MatchContentFrameRateFragment.java
index 7989620..0772198 100644
--- a/Settings/src/com/android/tv/settings/device/displaysound/MatchContentFrameRateFragment.java
+++ b/Settings/src/com/android/tv/settings/device/displaysound/MatchContentFrameRateFragment.java
@@ -16,7 +16,7 @@
package com.android.tv.settings.device.displaysound;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_CLASSIC;
import static com.android.tv.settings.util.InstrumentationUtils.logToggleInteracted;
import android.app.tvsettings.TvSettingsEnums;
@@ -32,7 +32,7 @@
import com.android.tv.settings.R;
import com.android.tv.settings.RadioPreference;
import com.android.tv.settings.SettingsPreferenceFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
/**
* This Fragment is responsible for allowing the user to express a preference for matching the
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/MatchContentRateFragmentCompat.java b/Settings/src/com/android/tv/settings/device/displaysound/MatchContentRateFragmentCompat.java
new file mode 100644
index 0000000..ec6226e
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/displaysound/MatchContentRateFragmentCompat.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.tv.settings.device.displaysound;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * This Fragment compat is responsible for allowing the user to express a preference for matching
+ * the display frame rate to to the frame rate of a video being played.
+ */
+@Keep
+public class MatchContentRateFragmentCompat extends RadioPreferencesFragmentCompat {
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ setPreferencesFromResource(R.xml.match_content_rate_compat, null);
+ }
+
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_MATCH_CONTENT_FRAME;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/RadioPreferencesFragmentCompat.java b/Settings/src/com/android/tv/settings/device/displaysound/RadioPreferencesFragmentCompat.java
new file mode 100644
index 0000000..6974ad3
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/displaysound/RadioPreferencesFragmentCompat.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.tv.settings.device.displaysound;
+
+import androidx.preference.Preference;
+
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.compat.TsPreferenceCategory;
+import com.android.tv.settings.compat.TsRadioPreference;
+import com.android.tv.settings.library.PreferenceCompat;
+
+/**
+ * The fragment compat for handling a full screen of radio buttons which belong to a single group.
+ */
+public abstract class RadioPreferencesFragmentCompat extends PreferenceControllerFragmentCompat {
+ protected TsPreferenceCategory mPrefGroup;
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat preferenceCompat) {
+ if (preferenceCompat == null) {
+ return null;
+ }
+ if (preferenceCompat.getChildPrefCompats() != null) {
+ if (mPrefGroup == null) {
+ HasKeys pref = RenderUtil.createPreference(getContext(),
+ preferenceCompat);
+ if (pref instanceof TsPreferenceCategory) {
+ mPrefGroup = (TsPreferenceCategory) pref;
+ getPreferenceScreen().addPreference(mPrefGroup);
+ }
+ }
+
+ preferenceCompat.getChildPrefCompats().stream().forEach(
+ childPrefCompat -> {
+ Preference preference = findTargetPreference(childPrefCompat.getKey());
+ if (preference == null) {
+ preference = (Preference) RenderUtil.createPreference(getContext(),
+ childPrefCompat);
+ mPrefGroup.addPreference(preference);
+ }
+ if ((preference instanceof TsRadioPreference)) {
+ final TsRadioPreference radioPref =
+ (TsRadioPreference) preference;
+ RenderUtil.updatePreference(
+ getContext(), radioPref, childPrefCompat,
+ preference.getOrder());
+ radioPref.setRadioGroup(preferenceCompat.getRadioGroup());
+ }
+ }
+ );
+ }
+ return super.updatePref(preferenceCompat);
+ }
+
+
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference) {
+ if (preference instanceof TsRadioPreference) {
+ ((TsRadioPreference) preference).clearOtherRadioPreferences(mPrefGroup);
+ }
+ return super.onPreferenceTreeClick(preference);
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/ResolutionSelectionFragment.java b/Settings/src/com/android/tv/settings/device/displaysound/ResolutionSelectionFragment.java
new file mode 100644
index 0000000..544be4f
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/displaysound/ResolutionSelectionFragment.java
@@ -0,0 +1,288 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.displaysound;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.hardware.display.DisplayManager;
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.os.Handler;
+import android.view.Display;
+import android.widget.Button;
+
+import androidx.annotation.Keep;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceGroup;
+
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.tv.settings.PreferenceControllerFragment;
+import com.android.tv.settings.R;
+import com.android.tv.settings.RadioPreference;
+import com.android.tv.settings.util.ResolutionSelectionUtils;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * This Fragment is responsible for allowing the user to choose the resolution and refresh rate
+ * from the list of resolution and refresh rates which are supported by device.
+ */
+@Keep
+public class ResolutionSelectionFragment extends PreferenceControllerFragment {
+
+ static final String KEY_MODE_SELECTION = "resolution_selection_option";
+ static final String KEY_RESOLUTION_PREFIX = "resolution_selection_";
+ static final String KEY_RESOLUTION_SELECTION_AUTO = "resolution_selection_auto";
+
+ private static final String TAG = ResolutionSelectionFragment.class.getSimpleName();
+ private DisplayManager mDisplayManager;
+ private Display.Mode[] mModes;
+ private int mUserPreferredModeIndex;
+ private PreferenceCategory mResolutionPreferenceCategory;
+
+ static final Set<Integer> STANDARD_RESOLUTIONS_IN_ORDER = Set.of(2160, 1080, 720, 576, 480);
+ static final int DIALOG_TIMEOUT_MILLIS = 12000;
+ static final int DIALOG_START_MILLIS = 1000;
+
+ /** @return the new instance of the class */
+ public static ResolutionSelectionFragment newInstance() {
+ return new ResolutionSelectionFragment();
+ }
+
+ @Override
+ public void onAttach(Context context) {
+ mDisplayManager = getDisplayManager();
+ super.onAttach(context);
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.resolution_selection;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.resolution_selection, null);
+ mResolutionPreferenceCategory = findPreference(KEY_MODE_SELECTION);
+
+ Display display = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
+ mModes = display.getSupportedModes();
+ Arrays.sort(mModes, new Comparator<Display.Mode>() {
+ // Sort in descending order of refresh rate.
+ @Override
+ public int compare(Display.Mode o1, Display.Mode o2) {
+ int resolution1 = Math.min(o1.getPhysicalHeight(), o1.getPhysicalWidth());
+ int resolution2 = Math.min(o2.getPhysicalHeight(), o2.getPhysicalWidth());
+
+ // The resolution which is in list of standard resolutions appears before the one
+ // which is not.
+ if (STANDARD_RESOLUTIONS_IN_ORDER.contains(resolution2)
+ && !STANDARD_RESOLUTIONS_IN_ORDER.contains(resolution1)) {
+ return 1;
+ }
+ if (STANDARD_RESOLUTIONS_IN_ORDER.contains(resolution1)
+ && !STANDARD_RESOLUTIONS_IN_ORDER.contains(resolution2)) {
+ return -1;
+ }
+ if (resolution2 == resolution1) {
+ return (int) o2.getRefreshRate() - (int) o1.getRefreshRate();
+ }
+ return resolution2 - resolution1;
+ }
+ });
+
+ createPreferences();
+
+ mUserPreferredModeIndex = lookupModeIndex(
+ mDisplayManager.getGlobalUserPreferredDisplayMode());
+ if (mUserPreferredModeIndex != -1) {
+ selectRadioPreference(findPreference(KEY_RESOLUTION_PREFIX + mUserPreferredModeIndex));
+ } else {
+ selectRadioPreference(findPreference(KEY_RESOLUTION_SELECTION_AUTO));
+ }
+ }
+
+ private void createPreferences() {
+ RadioPreference pref = new RadioPreference(getContext());
+ pref.setTitle(getContext().getString(R.string.resolution_selection_auto_title));
+ pref.setKey(KEY_RESOLUTION_SELECTION_AUTO);
+
+ Display display = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
+ Display.Mode autoMode = display.getSystemPreferredDisplayMode();
+ pref.setSummary(ResolutionSelectionUtils.getResolutionString(
+ autoMode.getPhysicalWidth(), autoMode.getPhysicalHeight()) + " "
+ + ResolutionSelectionUtils.getRefreshRateString(
+ getContext().getResources(), autoMode.getRefreshRate()));
+ mResolutionPreferenceCategory.addPreference(pref);
+
+ for (int i = 0; i < mModes.length; i++) {
+ mResolutionPreferenceCategory.addPreference(createResolutionPreference(mModes[i], i));
+ }
+ }
+
+ /** Returns a radio preference for each display mode. */
+ private RadioPreference createResolutionPreference(Display.Mode mode, int resolution) {
+ String title = ResolutionSelectionUtils.getResolutionString(
+ mode.getPhysicalWidth(), mode.getPhysicalHeight())
+ + " (" + ResolutionSelectionUtils.getRefreshRateString(
+ getContext().getResources(), mode.getRefreshRate()) + ")";
+
+ String summary = mode.getPhysicalWidth() + " x " + mode.getPhysicalHeight();
+ RadioPreference pref = new RadioPreference(getContext());
+ pref.setTitle(title);
+ pref.setSummary(summary);
+ pref.setKey(KEY_RESOLUTION_PREFIX + resolution);
+ return pref;
+ }
+
+ @VisibleForTesting
+ DisplayManager getDisplayManager() {
+ return getContext().getSystemService(DisplayManager.class);
+ }
+
+ private PreferenceGroup getPreferenceGroup() {
+ return (PreferenceGroup) findPreference(KEY_MODE_SELECTION);
+ }
+
+ private void selectRadioPreference(Preference preference) {
+ final RadioPreference radioPreference = (RadioPreference) preference;
+ radioPreference.setChecked(true);
+ radioPreference.clearOtherRadioPreferences(getPreferenceGroup());
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference) {
+ String key = preference.getKey();
+
+ if (key == null) {
+ return super.onPreferenceTreeClick(preference);
+ }
+
+ if (preference instanceof RadioPreference) {
+ selectRadioPreference(preference);
+
+ Display.Mode newMode = null;
+ Display.Mode previousMode =
+ mDisplayManager.getGlobalUserPreferredDisplayMode();
+ if (key.equals(KEY_RESOLUTION_SELECTION_AUTO)) {
+ mDisplayManager.clearGlobalUserPreferredDisplayMode();
+ } else if (key.contains(KEY_RESOLUTION_PREFIX)) {
+ int modeIndex = Integer.valueOf(key.substring(KEY_RESOLUTION_PREFIX.length()));
+ newMode = mModes[modeIndex];
+ mDisplayManager.setGlobalUserPreferredDisplayMode(newMode);
+ }
+ // Show the dialog after a delay of 1 second. If the dialog or any UX
+ // is shown when the resolution change is under process, the dialog is lost.
+ Display.Mode finalNewMode = newMode;
+ new Handler().postDelayed(new Runnable() {
+ public void run() {
+ showWarningDialogOnResolutionChange(finalNewMode, previousMode);
+ }
+ }, DIALOG_START_MILLIS);
+ }
+
+ return super.onPreferenceTreeClick(preference);
+ }
+
+ /** Returns the index of Display mode that matches UserPreferredMode */
+ public int lookupModeIndex(Display.Mode userPreferredMode) {
+ if (userPreferredMode != null) {
+ for (int i = 0; i < mModes.length; i++) {
+ if (mModes[i].matches(userPreferredMode.getPhysicalWidth(),
+ userPreferredMode.getPhysicalHeight(),
+ userPreferredMode.getRefreshRate())) {
+ return i;
+ }
+ }
+ }
+ return -1;
+ }
+
+ private void setUserPreferredMode(Display.Mode mode) {
+ int modeIndex = lookupModeIndex(mode);
+ if (modeIndex != -1) {
+ selectRadioPreference(findPreference(KEY_RESOLUTION_PREFIX + modeIndex));
+ mDisplayManager.setGlobalUserPreferredDisplayMode(mode);
+ } else {
+ selectRadioPreference(findPreference(KEY_RESOLUTION_SELECTION_AUTO));
+ mDisplayManager.clearGlobalUserPreferredDisplayMode();
+ }
+ }
+
+ private void showWarningDialogOnResolutionChange(
+ Display.Mode currentMode, Display.Mode previousMode) {
+ final String dialogDescription =
+ getResources().getString(R.string.resolution_selection_dialog_desc,
+ ResolutionSelectionUtils.modeToString(currentMode, getContext()));
+ AlertDialog dialog = new AlertDialog.Builder(getContext())
+ .setTitle(R.string.resolution_selection_dialog_title)
+ .setMessage(dialogDescription)
+ .setPositiveButton(
+ R.string.resolution_selection_dialog_ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ })
+ .setNegativeButton(
+ R.string.resolution_selection_dialog_cancel,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ setUserPreferredMode(previousMode);
+ dialog.dismiss();
+ }
+ })
+ .create();
+
+ dialog.setOnShowListener(new DialogInterface.OnShowListener() {
+ @Override
+ public void onShow(final DialogInterface dialog) {
+ final Button cancelButton =
+ ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_NEGATIVE);
+ final CharSequence negativeButtonText = cancelButton.getText();
+ new CountDownTimer(DIALOG_TIMEOUT_MILLIS, 1000) {
+ @Override
+ public void onTick(long millisUntilFinished) {
+ cancelButton.setText(String.format("%s (%d)", negativeButtonText,
+ //add one to timeout so it never displays zero
+ TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) + 1
+ ));
+ }
+ @Override
+ public void onFinish() {
+ if (((AlertDialog) dialog).isShowing()) {
+ dialog.dismiss();
+ }
+ }
+ }.start();
+ }
+ });
+ dialog.show();
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/displaysound/ResolutionSelectionFragmentCompat.java b/Settings/src/com/android/tv/settings/device/displaysound/ResolutionSelectionFragmentCompat.java
new file mode 100644
index 0000000..0e50b2e
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/displaysound/ResolutionSelectionFragmentCompat.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.tv.settings.device.displaysound;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.library.ManagerUtil;
+
+
+/**
+ * This Fragment compat is responsible for allowing the user to choose the resolution and refresh
+ * rate from the list of resolution and refresh rates which are supported by device.
+ */
+@Keep
+public class ResolutionSelectionFragmentCompat extends RadioPreferencesFragmentCompat {
+ private static final String KEY_MODE_SELECTION = "resolution_selection_option";
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ setPreferencesFromResource(R.xml.resolution_selection_compat, null);
+ mPrefGroup = findPreference(KEY_MODE_SELECTION);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_RESOLUTION_SELECTION;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/storage/AllAppsSession.java b/Settings/src/com/android/tv/settings/device/storage/AllAppsSession.java
new file mode 100644
index 0000000..077d2ef
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/storage/AllAppsSession.java
@@ -0,0 +1,230 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.storage;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.UserHandle;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.lifecycle.Lifecycle;
+
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.tv.settings.R;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Manage and retrieve app entries based on current user.
+ */
+public class AllAppsSession {
+ private static final String TAG = "AllAppsSession";
+ private Set<String> mSystemAppPackages;
+ private OnUpdateAppListListener mOnUpdateAppListListener;
+
+ @ApplicationsState.SessionFlags
+ private static final int SESSION_FLAGS =
+ ApplicationsState.FLAG_SESSION_REQUEST_HOME_APP
+ | ApplicationsState.FLAG_SESSION_REQUEST_ICONS
+ | ApplicationsState.FLAG_SESSION_REQUEST_SIZES
+ | ApplicationsState.FLAG_SESSION_REQUEST_LEANBACK_LAUNCHER;
+
+ private ApplicationsState mApplicationsState;
+ private ApplicationsState.Session mSession;
+ private ApplicationsState.AppFilter mFilterAllApps;
+ private ApplicationsState.AppFilter mFilterAllAppsExceptPreinstalled;
+ private final AppFilterType mAppFilterType;
+
+ private ArrayList<ApplicationsState.AppEntry> mAllApps = new ArrayList<>();
+
+ private static final ApplicationsState.AppFilter PREDEFINED_FILTER_ALL_APPS =
+ new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(ApplicationsState.AppEntry info) {
+ return info.info != null;
+ }
+ };
+
+ private final ApplicationsState.AppFilter mPredefinedFilterAllAppsExceptPreinstalled =
+ new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(ApplicationsState.AppEntry info) {
+ return info.info != null
+ && info.info.enabled
+ && info.hasLauncherEntry
+ && info.launcherEntryEnabled
+ && !((info.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_OEM)
+ == ApplicationInfo.PRIVATE_FLAG_OEM)
+ && !((info.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR)
+ == ApplicationInfo.PRIVATE_FLAG_VENDOR)
+ && !((info.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRODUCT)
+ == ApplicationInfo.PRIVATE_FLAG_PRODUCT)
+ && !mSystemAppPackages.contains(info.info.packageName);
+ }
+ };
+
+ public enum AppFilterType {
+ ALL_APPS,
+ ALL_APPS_EXCEPT_PREINSTALLED
+ }
+
+ public AllAppsSession(Context context, String volumeUuid, String volumeName,
+ ApplicationsState applicationsState, Lifecycle lifecycle, AppFilterType appFilterType) {
+ mSystemAppPackages = Arrays.stream(context.getResources()
+ .getStringArray(R.array.system_app_packages)).collect(Collectors.toSet());
+ mApplicationsState = applicationsState;
+ mAppFilterType = appFilterType;
+
+ // The UUID of internal storage is null, so we check if there's a volume name to see if we
+ // should only be showing the apps on the internal storage or all apps.
+ if (!TextUtils.isEmpty(volumeUuid) || !TextUtils.isEmpty(volumeName)) {
+ ApplicationsState.AppFilter volumeFilter =
+ new ApplicationsState.VolumeFilter(volumeUuid);
+
+ mFilterAllApps =
+ new ApplicationsState.CompoundFilter(PREDEFINED_FILTER_ALL_APPS, volumeFilter);
+ mFilterAllAppsExceptPreinstalled =
+ new ApplicationsState.CompoundFilter(mPredefinedFilterAllAppsExceptPreinstalled,
+ volumeFilter);
+ } else {
+ mFilterAllApps = PREDEFINED_FILTER_ALL_APPS;
+ mFilterAllAppsExceptPreinstalled = mPredefinedFilterAllAppsExceptPreinstalled;
+ }
+
+ mSession = mApplicationsState.newSession(new RowUpdateCallbacks(), lifecycle);
+ mSession.setSessionFlags(SESSION_FLAGS);
+ }
+
+ /**
+ * A listener to responding app list updating event.
+ */
+ public interface OnUpdateAppListListener {
+ /**
+ * It will be called when the app list was updated.
+ *
+ * @param entries of the app list.
+ */
+ void onUpdateAppList(@NonNull ArrayList<ApplicationsState.AppEntry> entries);
+ }
+
+ public void setOnUpdateAppListListener(@Nullable OnUpdateAppListListener listener) {
+ mOnUpdateAppListListener = listener;
+ }
+
+ public ArrayList<ApplicationsState.AppEntry> getAllApps() {
+ return mAllApps;
+ }
+
+ private ApplicationsState.AppFilter getFilter() {
+ switch (mAppFilterType) {
+ case ALL_APPS:
+ return mFilterAllApps;
+ case ALL_APPS_EXCEPT_PREINSTALLED:
+ return mFilterAllAppsExceptPreinstalled;
+ default:
+ break;
+ }
+ return null;
+ }
+
+ private void rebuildAllApps() {
+ ArrayList<ApplicationsState.AppEntry> apps =
+ mSession.rebuild(getFilter(), ApplicationsState.ALPHA_COMPARATOR);
+ if (apps != null) {
+ updateAppList(apps);
+ }
+ }
+
+ private void updateAppList(ArrayList<ApplicationsState.AppEntry> entries) {
+ mAllApps = filterAppsInstalledInParentProfile(entries);
+ // Sort the list by app size on descent.
+ mAllApps.sort((c1, c2) -> (c1.size < c2.size ? 1 : c1.size == c2.size ? 0 : -1));
+ if (mOnUpdateAppListListener != null) {
+ mOnUpdateAppListListener.onUpdateAppList(mAllApps);
+ }
+ }
+
+ private ArrayList<ApplicationsState.AppEntry> filterAppsInstalledInParentProfile(
+ @Nullable ArrayList<ApplicationsState.AppEntry> appEntries) {
+ if (appEntries == null) {
+ return new ArrayList<>();
+ } else {
+ return appEntries.stream().filter(appEntry ->
+ UserHandle.getUserId(appEntry.info.uid) == UserHandle.myUserId())
+ .collect(Collectors.toCollection(ArrayList::new));
+ }
+ }
+
+ private class RowUpdateCallbacks implements ApplicationsState.Callbacks {
+ @Override
+ public void onRunningStateChanged(boolean running) {
+ doRebuild();
+ }
+
+ @Override
+ public void onPackageListChanged() {
+ doRebuild();
+ }
+
+ @Override
+ public void onPackageIconChanged() {
+ doRebuild();
+ }
+
+ @Override
+ public void onPackageSizeChanged(String packageName) {
+ doRebuild();
+ }
+
+ @Override
+ public void onAllSizesComputed() {
+ doRebuild();
+ }
+
+ @Override
+ public void onLauncherInfoChanged() {
+ doRebuild();
+ }
+
+ @Override
+ public void onLoadEntriesCompleted() {
+ doRebuild();
+ }
+
+ @Override
+ public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
+ updateAppList(apps);
+ }
+
+ private void doRebuild() {
+ rebuildAllApps();
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/storage/ClearCachedDataPreference.java b/Settings/src/com/android/tv/settings/device/storage/ClearCachedDataPreference.java
new file mode 100644
index 0000000..3ae72cf
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/storage/ClearCachedDataPreference.java
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.storage;
+
+import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
+
+import android.app.tvsettings.TvSettingsEnums;
+import android.content.Context;
+import android.content.pm.IPackageDataObserver;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.text.format.Formatter;
+import android.util.ArraySet;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.leanback.preference.LeanbackSettingsFragmentCompat;
+import androidx.leanback.widget.GuidanceStylist;
+
+import com.android.settingslib.RestrictedPreference;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.tv.settings.R;
+import com.android.tv.settings.device.apps.AppActionPreference;
+import com.android.tv.twopanelsettings.TwoPanelSettingsFragment;
+import com.android.tv.twopanelsettings.slices.InfoFragment;
+
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Preference for handling clear cached data of all apps.
+ */
+public class ClearCachedDataPreference extends RestrictedPreference implements
+ AllAppsSession.OnUpdateAppListListener {
+ private boolean mClearingCache;
+ private AllAppsSession mAllAppsSession;
+ private ApplicationsState mApplicationsState;
+ private PackageManager mPackageManager;
+ FreeUpStorageFragment mFreeUpStorageFragment;
+ private ArraySet<ApplicationsState.AppEntry> mAllApps;
+ private final Handler mHandler = new Handler(null, false);
+
+ public ClearCachedDataPreference(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ public ClearCachedDataPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public ClearCachedDataPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public ClearCachedDataPreference(Context context) {
+ super(context);
+ }
+
+ /**
+ * Initialize the ClearCachedDataPreference with required resources.
+ */
+ public void initialize(AllAppsSession allAppsSession, ApplicationsState applicationsState,
+ PackageManager packageManager, FreeUpStorageFragment freeUpStorageFragment) {
+ mAllAppsSession = allAppsSession;
+ mApplicationsState = applicationsState;
+ mPackageManager = packageManager;
+ mFreeUpStorageFragment = freeUpStorageFragment;
+ mAllAppsSession.setOnUpdateAppListListener(this);
+ setTitle(R.string.device_apps_app_management_clear_cache);
+ setSummary(getContext().getString(R.string.computing_size));
+ }
+
+ /**
+ * Refresh the appearance of the ClearCachedDataPreference, based on the apps info and the
+ * process of clearing caches.
+ */
+ public void refresh() {
+ mAllApps = mAllAppsSession.getAllApps().stream().collect(
+ Collectors.toCollection(ArraySet::new));
+ final Context context = getContext();
+ final long cacheSize = getAllAppsCacheSize();
+ setSummary(mClearingCache ? context.getString(R.string.computing_size)
+ : context.getString(R.string.storage_free_up_clear_cached_data_summary,
+ Formatter.formatFileSize(context, cacheSize)));
+ setEnabled(!mClearingCache && cacheSize > 0);
+ this.setOnPreferenceClickListener(
+ preference -> {
+ logEntrySelected(
+ TvSettingsEnums.SYSTEM_STORAGE_FREE_UP_STORAGE_CLEAR_CACHED_DATA);
+ return false;
+ });
+ }
+
+ @Override
+ public String getFragment() {
+ final Fragment settingsFragment = mFreeUpStorageFragment.getCallbackFragment();
+ if (settingsFragment instanceof TwoPanelSettingsFragment) {
+ // Show info fragment only if the UI is TwoPanel.
+ return ClearCachedDataInfoFragment.class.getName();
+ }
+ // Otherwise, we set the forward fragment as confirmation fragment.
+ return ConfirmationFragment.class.getName();
+ }
+
+ @Override
+ protected void onClick() {
+ final ConfirmationFragment confirmFragment = new ConfirmationFragment();
+ confirmFragment.setOnOkListener(() -> clearCache());
+ final Fragment settingsFragment = mFreeUpStorageFragment.getCallbackFragment();
+ if (settingsFragment instanceof LeanbackSettingsFragmentCompat) {
+ return;
+ } else if (settingsFragment instanceof TwoPanelSettingsFragment) {
+ // Show confirmation fragment in TwoPanel UI.
+ ((TwoPanelSettingsFragment) settingsFragment)
+ .startImmersiveFragment(confirmFragment);
+ } else {
+ throw new IllegalStateException("Not attached to settings fragment??");
+ }
+ }
+
+ @Override
+ public void onUpdateAppList(@NonNull ArrayList<ApplicationsState.AppEntry> entries) {
+ refresh();
+ }
+
+ /**
+ * A class that hosts {@link InfoFragment} for Clear Cached Data preference.
+ */
+ public static class ClearCachedDataInfoFragment extends InfoFragment {
+ protected int getSummaryResId() {
+ return R.string.storage_free_up_clear_cached_data_info;
+ }
+
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = super.onCreateView(inflater, container, savedInstanceState);
+ ((ImageView) view.findViewById(com.android.tv.twopanelsettings.R.id.info_title_icon))
+ .setImageResource(
+ com.android.tv.twopanelsettings.R.drawable.ic_info_outline_base);
+ view.findViewById(com.android.tv.twopanelsettings.R.id.info_title_icon).setVisibility(
+ View.VISIBLE);
+ ((TextView) view.findViewById(
+ com.android.tv.twopanelsettings.R.id.info_summary)).setText(getSummaryResId());
+ view.findViewById(com.android.tv.twopanelsettings.R.id.info_summary).setVisibility(
+ View.VISIBLE);
+ return view;
+ }
+ }
+
+ /**
+ * Fragment for confirming to clear cached data of all apps.
+ */
+ public static class ConfirmationFragment extends AppActionPreference.ConfirmationFragment {
+ private OnOkListener mOnOkListener;
+
+ @NonNull
+ @Override
+ public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
+ return new GuidanceStylist.Guidance(
+ getString(R.string.storage_free_up_clear_cached_data_confirm_title),
+ getString(R.string.storage_free_up_clear_cached_data_confirm_description),
+ null,
+ getContext().getDrawable(R.drawable.ic_settings_backup_restore_132dp));
+ }
+
+ @Override
+ public void onOk() {
+ if (mOnOkListener != null) {
+ mOnOkListener.onOk();
+ }
+ }
+
+ public void setOnOkListener(OnOkListener listener) {
+ mOnOkListener = listener;
+ }
+
+ /**
+ * A listener to respond ok event.
+ */
+ public interface OnOkListener {
+ /**
+ * It will be called when the Ok button was clicked.
+ */
+ void onOk();
+ }
+ }
+
+ private long getAllAppsCacheSize() {
+ long cacheSize = 0;
+ for (ApplicationsState.AppEntry app : mAllApps) {
+ cacheSize += app.cacheSize + app.externalCacheSize;
+ }
+ return cacheSize;
+ }
+
+ private void setClearingCache(boolean clearingCache) {
+ mClearingCache = clearingCache;
+ refresh();
+ }
+
+ private void clearCache() {
+ if (mClearingCache) {
+ return;
+ }
+ setClearingCache(true);
+ Map<String, ApplicationsState.AppEntry> packageNamesClearingCache = mAllApps.stream()
+ .collect(Collectors.toMap(entry -> entry.info.packageName, entry -> entry));
+ ArraySet<String> packageNames = mAllApps.stream().map(
+ entry -> entry.info.packageName).collect(
+ Collectors.toCollection(ArraySet::new));
+ for (String packageName : packageNames) {
+ mPackageManager.deleteApplicationCacheFiles(packageName,
+ new IPackageDataObserver.Stub() {
+ public void onRemoveCompleted(final String packageName,
+ final boolean succeeded) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ ApplicationsState.AppEntry entry =
+ packageNamesClearingCache.get(packageName);
+ packageNamesClearingCache.remove(packageName);
+ if (succeeded) {
+ final int userId = UserHandle.getUserId(entry.info.uid);
+ mApplicationsState.requestSize(packageName, userId);
+ }
+ if (packageNamesClearingCache.isEmpty()) {
+ setClearingCache(false);
+ refresh();
+ }
+ }
+ });
+ }
+ });
+ }
+ refresh();
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/storage/ConfirmClearCacheFragment.java b/Settings/src/com/android/tv/settings/device/storage/ConfirmClearCacheFragment.java
index 9109447..b8b0e28 100644
--- a/Settings/src/com/android/tv/settings/device/storage/ConfirmClearCacheFragment.java
+++ b/Settings/src/com/android/tv/settings/device/storage/ConfirmClearCacheFragment.java
@@ -21,7 +21,7 @@
import android.os.Bundle;
import androidx.annotation.NonNull;
-import androidx.leanback.app.GuidedStepFragment;
+import androidx.leanback.app.GuidedStepSupportFragment;
import androidx.leanback.widget.GuidanceStylist;
import androidx.leanback.widget.GuidedAction;
@@ -29,7 +29,7 @@
import java.util.List;
-public class ConfirmClearCacheFragment extends GuidedStepFragment {
+public class ConfirmClearCacheFragment extends GuidedStepSupportFragment {
@NonNull
@Override
diff --git a/Settings/src/com/android/tv/settings/device/storage/FreeUpStorageFragment.java b/Settings/src/com/android/tv/settings/device/storage/FreeUpStorageFragment.java
new file mode 100644
index 0000000..a7b2500
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/storage/FreeUpStorageFragment.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.storage;
+
+import android.app.tvsettings.TvSettingsEnums;
+import android.os.Bundle;
+import android.text.format.Formatter;
+
+import androidx.annotation.Keep;
+import androidx.preference.Preference;
+
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.tv.settings.R;
+import com.android.tv.settings.SettingsPreferenceFragment;
+import com.android.tv.settings.device.apps.AppsActivity;
+
+/**
+ * Fragment for listing options to free up storage.
+ */
+@Keep
+public class FreeUpStorageFragment extends SettingsPreferenceFragment {
+ private static final String KEY_CLEAR_CACHED_DATA = "ClearCachedData";
+ private static final String KEY_STORAGE_UNINSTALL_APPS = "StorageUninstallApps";
+ private AllAppsSession mAllAppsSessionExceptPreinstalled;
+ private ClearCachedDataPreference mClearCachedDataPreference;
+ private Preference mStorageUninstallAppsPreference;
+ private boolean mAppsListCollected = false;
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ setPreferencesFromResource(R.xml.free_up_storage, null);
+ mStorageUninstallAppsPreference = findPreference(KEY_STORAGE_UNINSTALL_APPS);
+ mStorageUninstallAppsPreference.setSummary(getContext().getString(R.string.computing_size));
+ mAppsListCollected = false;
+
+ final ApplicationsState applicationsState = ApplicationsState.getInstance(
+ getActivity().getApplication());
+
+ final String volumeUuid = getArguments().getString(AppsActivity.EXTRA_VOLUME_UUID);
+ final String volumeName = getArguments().getString(AppsActivity.EXTRA_VOLUME_NAME);
+ final AllAppsSession allAppsSession = new AllAppsSession(getActivity(), volumeUuid,
+ volumeName, applicationsState, getLifecycle(),
+ AllAppsSession.AppFilterType.ALL_APPS);
+ mAllAppsSessionExceptPreinstalled = new AllAppsSession(getActivity(),
+ volumeUuid,
+ volumeName, applicationsState, getLifecycle(),
+ AllAppsSession.AppFilterType.ALL_APPS_EXCEPT_PREINSTALLED);
+ mAllAppsSessionExceptPreinstalled.setOnUpdateAppListListener((apps) -> {
+ updateStorageUninstallAppsPrefSummary();
+ mAppsListCollected = true;
+ });
+
+ mClearCachedDataPreference = findPreference(KEY_CLEAR_CACHED_DATA);
+ mClearCachedDataPreference.initialize(allAppsSession, applicationsState,
+ getContext().getPackageManager(), this);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (mAppsListCollected) {
+ updateStorageUninstallAppsPrefSummary();
+ }
+ }
+
+ @Override
+ protected int getPageId() {
+ return TvSettingsEnums.SYSTEM_STORAGE_FREE_UP_STORAGE;
+ }
+
+ private void updateStorageUninstallAppsPrefSummary() {
+ if (mStorageUninstallAppsPreference != null && mAllAppsSessionExceptPreinstalled != null) {
+ final long size = mAllAppsSessionExceptPreinstalled.getAllApps().stream().map(
+ app -> app.size).reduce(0L,
+ (subtotal, element) -> subtotal + (element > 0 ? element : 0));
+ mStorageUninstallAppsPreference.setSummary(
+ Formatter.formatFileSize(getActivity(), size));
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/storage/MissingStorageFragmentCompat.java b/Settings/src/com/android/tv/settings/device/storage/MissingStorageFragmentCompat.java
new file mode 100644
index 0000000..33d0fcf
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/storage/MissingStorageFragmentCompat.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.storage;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * Missing storage fragment compat for storage settings.
+ */
+@Keep
+public class MissingStorageFragmentCompat extends PreferenceControllerFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.missing_storage_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_MISSING_STORAGE;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/storage/ResetActivity.java b/Settings/src/com/android/tv/settings/device/storage/ResetActivity.java
index b2e7d67..72b88e3 100644
--- a/Settings/src/com/android/tv/settings/device/storage/ResetActivity.java
+++ b/Settings/src/com/android/tv/settings/device/storage/ResetActivity.java
@@ -89,6 +89,7 @@
actions.add(new GuidedAction.Builder(getContext())
.clickAction(GuidedAction.ACTION_ID_OK)
.title(getString(R.string.device_reset))
+ .multilineDescription(true)
.build());
}
diff --git a/Settings/src/com/android/tv/settings/device/storage/StorageFragment.java b/Settings/src/com/android/tv/settings/device/storage/StorageFragment.java
index 4e6cddc..7425181 100644
--- a/Settings/src/com/android/tv/settings/device/storage/StorageFragment.java
+++ b/Settings/src/com/android/tv/settings/device/storage/StorageFragment.java
@@ -36,7 +36,7 @@
import com.android.tv.settings.SettingsPreferenceFragment;
import com.android.tv.settings.device.apps.AppsFragment;
-import java.io.File;
+import java.io.IOException;
import java.util.HashMap;
import java.util.List;
@@ -232,7 +232,12 @@
final long downloadsSize = totalValues(details.mediaSize.get(currentUser),
Environment.DIRECTORY_DOWNLOADS);
- mAvailablePref.setSize(Math.max(0L, details.availSize - cachePartitionSize()));
+ try {
+ mAvailablePref.setSize(mStorageManager.getAllocatableBytes(
+ StorageManager.convert(mVolumeInfo.fsUuid)));
+ } catch (IOException e) {
+ mAvailablePref.setSize(details.availSize);
+ }
mAppsUsagePref.setSize(details.appsSize.get(currentUser));
mDcimUsagePref.setSize(dcimSize);
mMusicUsagePref.setSize(musicSize);
@@ -241,16 +246,6 @@
mMiscUsagePref.setSize(details.miscSize.get(currentUser));
}
- private static long cachePartitionSize() {
- File cache = new File("/cache");
- try {
- return cache.getUsableSpace();
- } catch (SecurityException e) {
- Log.w(TAG, "Cannot determine cache partition size.", e);
- return 0;
- }
- }
-
private static long totalValues(HashMap<String, Long> map, String... keys) {
long total = 0;
if (map != null) {
diff --git a/Settings/src/com/android/tv/settings/device/storage/StorageFragmentCompat.java b/Settings/src/com/android/tv/settings/device/storage/StorageFragmentCompat.java
new file mode 100644
index 0000000..1c3972d
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/storage/StorageFragmentCompat.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.tv.settings.device.storage;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.library.ManagerUtil;
+
+/**
+ * Storage fragment compat for storage settings.
+ */
+@Keep
+public class StorageFragmentCompat extends PreferenceControllerFragmentCompat {
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.storage_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_STORAGE;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/storage/StorageSummaryFragmentCompat.java b/Settings/src/com/android/tv/settings/device/storage/StorageSummaryFragmentCompat.java
new file mode 100644
index 0000000..9a199a2
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/storage/StorageSummaryFragmentCompat.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.tv.settings.device.storage;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.compat.TsPreferenceCategory;
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+
+/**
+ * Storage fragment compat for sotrage summary settings.
+ */
+@Keep
+public class StorageSummaryFragmentCompat extends PreferenceControllerFragmentCompat {
+ private static final String KEY_DEVICE_STORAGE = "device_storage";
+ private static final String KEY_REMOVABLE_STORAGE = "removable_storage";
+ private TsPreferenceCategory mDeviceStorageCategory;
+ private TsPreferenceCategory mRemovableStorageCategory;
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_STORAGE_SUMMARY;
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.storage_summary_compat, null);
+ mDeviceStorageCategory = findPreference(KEY_DEVICE_STORAGE);
+ mRemovableStorageCategory = findPreference(KEY_REMOVABLE_STORAGE);
+ }
+
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat prefCompat) {
+ if (prefCompat.getKey() == null || prefCompat.getKey().length != 1) {
+ return super.updatePref(prefCompat);
+ }
+ if (KEY_DEVICE_STORAGE.equals(prefCompat.getKey()[0])) {
+ RenderUtil.updatePreferenceGroup(
+ mDeviceStorageCategory, prefCompat.getChildPrefCompats());
+ return (HasKeys) mDeviceStorageCategory;
+ } else if (KEY_REMOVABLE_STORAGE.equals(prefCompat.getKey()[0])) {
+ RenderUtil.updatePreferenceGroup(
+ mRemovableStorageCategory, prefCompat.getChildPrefCompats());
+ return (HasKeys) mRemovableStorageCategory;
+
+ }
+ return super.updatePref(prefCompat);
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/device/storage/StorageUninstallAppsFragment.java b/Settings/src/com/android/tv/settings/device/storage/StorageUninstallAppsFragment.java
new file mode 100644
index 0000000..1b42d01
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/storage/StorageUninstallAppsFragment.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.storage;
+
+import android.app.tvsettings.TvSettingsEnums;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Log;
+
+import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.tv.settings.R;
+import com.android.tv.settings.SettingsPreferenceFragment;
+import com.android.tv.settings.device.apps.AppManagementFragment;
+import com.android.tv.settings.device.apps.AppsActivity;
+
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Fragment for listing and managing all installed apps on the device, except pre-installed
+ * (including updated) or system apps .
+ */
+@Keep
+public class StorageUninstallAppsFragment extends SettingsPreferenceFragment implements
+ AllAppsSession.OnUpdateAppListListener {
+ private static final String TAG = "StorageUninstallAppsFragment";
+ private static final String KEY_ALL_APPS_PREFERENCE_GROUP = "AllAppsPreferenceGroup";
+
+ private AllAppsSession mAllAppsSession;
+
+ private PreferenceGroup mAllAppsPreferenceGroup;
+
+ private final Handler mHandler = new Handler(/*callback=*/null, /*async=*/false);
+ private final Map<PreferenceGroup,
+ ArrayList<ApplicationsState.AppEntry>> mUpdateMap = new ArrayMap<>(3);
+ private long mRunAt = Long.MIN_VALUE;
+ private final Runnable mUpdateRunnable = () -> {
+ for (final PreferenceGroup group : mUpdateMap.keySet()) {
+ final ArrayList<ApplicationsState.AppEntry> entries = mUpdateMap.get(group);
+ updateAppListInternal(group, entries);
+ }
+ mUpdateMap.clear();
+ mRunAt = 0;
+ };
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ final ApplicationsState applicationsState = ApplicationsState.getInstance(
+ getActivity().getApplication());
+
+ final String volumeUuid = getArguments().getString(AppsActivity.EXTRA_VOLUME_UUID);
+ final String volumeName = getArguments().getString(AppsActivity.EXTRA_VOLUME_NAME);
+ mAllAppsSession = new AllAppsSession(getActivity(), volumeUuid, volumeName,
+ applicationsState, getLifecycle(),
+ AllAppsSession.AppFilterType.ALL_APPS_EXCEPT_PREINSTALLED);
+ mAllAppsSession.setOnUpdateAppListListener(this);
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.storage_uninstall_apps, null);
+ mAllAppsPreferenceGroup = (PreferenceGroup) findPreference(
+ KEY_ALL_APPS_PREFERENCE_GROUP);
+ }
+
+ @Override
+ public void onUpdateAppList(@NonNull ArrayList<ApplicationsState.AppEntry> entries) {
+ if (mAllAppsPreferenceGroup == null) {
+ Log.d(TAG, "Not updating list for null group");
+ return;
+ }
+ mUpdateMap.put(mAllAppsPreferenceGroup, entries);
+
+ // We can get spammed with updates, so coalesce them to reduce jank and flicker
+ if (mRunAt == Long.MIN_VALUE) {
+ // First run, no delay
+ mHandler.removeCallbacks(mUpdateRunnable);
+ mHandler.post(mUpdateRunnable);
+ } else {
+ if (mRunAt == 0) {
+ mRunAt = SystemClock.uptimeMillis() + 1000;
+ }
+ int delay = (int) (mRunAt - SystemClock.uptimeMillis());
+ delay = delay < 0 ? 0 : delay;
+
+ mHandler.removeCallbacks(mUpdateRunnable);
+ mHandler.postDelayed(mUpdateRunnable, delay);
+ }
+ }
+
+ @Override
+ protected int getPageId() {
+ return TvSettingsEnums.SYSTEM_STORAGE_FREE_UP_STORAGE_UNINSTALL_APPS;
+ }
+
+ private void updateAppListInternal(PreferenceGroup group,
+ ArrayList<ApplicationsState.AppEntry> entries) {
+ if (entries != null) {
+ final Set<String> touched = new ArraySet<>(entries.size());
+ group.removeAll();
+ for (int i = 0; i < entries.size(); i++) {
+ final ApplicationsState.AppEntry entry = entries.get(i);
+ final String packageName = entry.info.packageName;
+ final Preference newPref = bindPreference(
+ new Preference(getPreferenceManager().getContext()), entry);
+ newPref.setOrder(i);
+ group.addPreference(newPref);
+ touched.add(packageName);
+ }
+ for (int i = 0; i < group.getPreferenceCount(); ) {
+ final Preference pref = group.getPreference(i);
+ if (touched.contains(pref.getKey())) {
+ i++;
+ } else {
+ group.removePreference(pref);
+ }
+ }
+ }
+ }
+
+ /**
+ * Creates or updates a preference according to an {@link ApplicationsState.AppEntry} object
+ *
+ * @param preference If non-null, updates this preference object, otherwise creates a new one
+ * @param entry Info to populate preference
+ * @return Updated preference entry
+ */
+ private Preference bindPreference(@NonNull Preference preference,
+ ApplicationsState.AppEntry entry) {
+ preference.setKey(entry.info.packageName);
+ entry.ensureLabel(getContext());
+ preference.setTitle(entry.label);
+ preference.setSummary(entry.sizeStr);
+ preference.setFragment(AppManagementFragment.class.getName());
+ AppManagementFragment.prepareArgs(preference.getExtras(), entry.info.packageName);
+ preference.setIcon(entry.icon);
+ return preference;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/deviceadmin/DeviceAdminAdd.java b/Settings/src/com/android/tv/settings/deviceadmin/DeviceAdminAdd.java
index 041e317..f5ebbad 100644
--- a/Settings/src/com/android/tv/settings/deviceadmin/DeviceAdminAdd.java
+++ b/Settings/src/com/android/tv/settings/deviceadmin/DeviceAdminAdd.java
@@ -261,11 +261,14 @@
return;
}
- // othewise, only the defined default supervision profile owner can be set after user
+ // otherwise, only the defined default supervision profile owner can be set after user
// setup.
final String supervisor = getString(
- com.android.internal.R.string.config_defaultSupervisionProfileOwnerComponent);
- if (supervisor == null) {
+ getResources().getIdentifier("config_defaultSupervisionProfileOwnerComponent",
+ "string", "android"));
+ final String supervisionRolePackage = getString(
+ getResources().getIdentifier("config_systemSupervision", "string", "android"));
+ if (supervisor == null && supervisionRolePackage == null) {
Log.w(TAG, "Unable to set profile owner post-setup, no default supervisor"
+ "profile owner defined");
finish();
@@ -274,7 +277,8 @@
final ComponentName supervisorComponent = ComponentName.unflattenFromString(
supervisor);
- if (who.compareTo(supervisorComponent) != 0) {
+ if (who.compareTo(supervisorComponent) != 0
+ && !who.getPackageName().equals(supervisionRolePackage)) {
Log.w(TAG, "Unable to set non-default profile owner post-setup " + who);
finish();
return;
diff --git a/Settings/src/com/android/tv/settings/enterprise/AdminActionPreferenceControllerBase.java b/Settings/src/com/android/tv/settings/enterprise/AdminActionPreferenceControllerBase.java
index 8da4a8e..c4d1d85 100644
--- a/Settings/src/com/android/tv/settings/enterprise/AdminActionPreferenceControllerBase.java
+++ b/Settings/src/com/android/tv/settings/enterprise/AdminActionPreferenceControllerBase.java
@@ -23,7 +23,8 @@
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.tv.settings.R;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProvider;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import java.util.Date;
diff --git a/Settings/src/com/android/tv/settings/enterprise/AdminGrantedPermissionsPreferenceControllerBase.java b/Settings/src/com/android/tv/settings/enterprise/AdminGrantedPermissionsPreferenceControllerBase.java
index b62214b..b023703 100644
--- a/Settings/src/com/android/tv/settings/enterprise/AdminGrantedPermissionsPreferenceControllerBase.java
+++ b/Settings/src/com/android/tv/settings/enterprise/AdminGrantedPermissionsPreferenceControllerBase.java
@@ -17,13 +17,18 @@
package com.android.tv.settings.enterprise;
import android.content.Context;
+import android.icu.text.MessageFormat;
import androidx.preference.Preference;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.tv.settings.R;
-import com.android.tv.settings.enterprise.apps.ApplicationFeatureProvider;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
public abstract class AdminGrantedPermissionsPreferenceControllerBase extends
AbstractPreferenceController {
@@ -51,9 +56,13 @@
if (num == 0) {
mHasApps = false;
} else {
- preference.setSummary(mContext.getResources().getQuantityString(
- R.plurals.enterprise_privacy_number_packages_lower_bound,
- num, num));
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getResources().getString(
+ R.string.enterprise_privacy_number_packages_lower_bound),
+ Locale.getDefault());
+ Map<String, Object> arguments = new HashMap<>();
+ arguments.put("count", num);
+ preference.setSummary(msgFormat.format(arguments));
mHasApps = true;
}
preference.setVisible(mHasApps);
diff --git a/Settings/src/com/android/tv/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java b/Settings/src/com/android/tv/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java
index 7602f69..412e8b3 100644
--- a/Settings/src/com/android/tv/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java
+++ b/Settings/src/com/android/tv/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java
@@ -22,7 +22,8 @@
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.tv.settings.R;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProvider;
+import com.android.tv.settings.library.overlay.FlavorUtils;
public class AlwaysOnVpnCurrentUserPreferenceController extends AbstractPreferenceController {
diff --git a/Settings/src/com/android/tv/settings/enterprise/AlwaysOnVpnManagedProfilePreferenceController.java b/Settings/src/com/android/tv/settings/enterprise/AlwaysOnVpnManagedProfilePreferenceController.java
index 836d409..97f9e82 100644
--- a/Settings/src/com/android/tv/settings/enterprise/AlwaysOnVpnManagedProfilePreferenceController.java
+++ b/Settings/src/com/android/tv/settings/enterprise/AlwaysOnVpnManagedProfilePreferenceController.java
@@ -19,7 +19,8 @@
import android.content.Context;
import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProvider;
+import com.android.tv.settings.library.overlay.FlavorUtils;
public class AlwaysOnVpnManagedProfilePreferenceController extends AbstractPreferenceController {
diff --git a/Settings/src/com/android/tv/settings/enterprise/ApplicationListFragment.java b/Settings/src/com/android/tv/settings/enterprise/ApplicationListFragment.java
index 635d908..55b381d 100644
--- a/Settings/src/com/android/tv/settings/enterprise/ApplicationListFragment.java
+++ b/Settings/src/com/android/tv/settings/enterprise/ApplicationListFragment.java
@@ -24,8 +24,8 @@
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.tv.settings.PreferenceControllerFragment;
import com.android.tv.settings.R;
-import com.android.tv.settings.enterprise.apps.ApplicationFeatureProvider;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import java.util.ArrayList;
import java.util.List;
diff --git a/Settings/src/com/android/tv/settings/enterprise/ApplicationListPreferenceController.java b/Settings/src/com/android/tv/settings/enterprise/ApplicationListPreferenceController.java
index e4cf8cd..9d2e0aa 100644
--- a/Settings/src/com/android/tv/settings/enterprise/ApplicationListPreferenceController.java
+++ b/Settings/src/com/android/tv/settings/enterprise/ApplicationListPreferenceController.java
@@ -26,8 +26,8 @@
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.widget.AppPreference;
import com.android.tv.settings.SettingsPreferenceFragment;
-import com.android.tv.settings.enterprise.apps.ApplicationFeatureProvider;
-import com.android.tv.settings.enterprise.apps.UserAppInfo;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.enterprise.apps.UserAppInfo;
import java.util.List;
diff --git a/Settings/src/com/android/tv/settings/enterprise/CaCertsPreferenceControllerBase.java b/Settings/src/com/android/tv/settings/enterprise/CaCertsPreferenceControllerBase.java
index 4ecfda7..43a121c 100644
--- a/Settings/src/com/android/tv/settings/enterprise/CaCertsPreferenceControllerBase.java
+++ b/Settings/src/com/android/tv/settings/enterprise/CaCertsPreferenceControllerBase.java
@@ -17,12 +17,18 @@
package com.android.tv.settings.enterprise;
import android.content.Context;
+import android.icu.text.MessageFormat;
import androidx.preference.Preference;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.tv.settings.R;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProvider;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
public abstract class CaCertsPreferenceControllerBase extends AbstractPreferenceController {
@@ -37,8 +43,13 @@
@Override
public void updateState(Preference preference) {
final int certs = getNumberOfCaCerts();
- preference.setSummary(mContext.getResources().getQuantityString(
- R.plurals.enterprise_privacy_number_ca_certs, certs, certs));
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getResources().getString(
+ R.string.enterprise_privacy_number_ca_certs),
+ Locale.getDefault());
+ Map<String, Object> arguments = new HashMap<>();
+ arguments.put("count", certs);
+ preference.setSummary(msgFormat.format(arguments));
}
@Override
diff --git a/Settings/src/com/android/tv/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java b/Settings/src/com/android/tv/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java
index 82252d3..066a302 100644
--- a/Settings/src/com/android/tv/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java
+++ b/Settings/src/com/android/tv/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java
@@ -17,13 +17,18 @@
package com.android.tv.settings.enterprise;
import android.content.Context;
+import android.icu.text.MessageFormat;
import androidx.preference.Preference;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.tv.settings.R;
-import com.android.tv.settings.enterprise.apps.ApplicationFeatureProvider;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
/**
* Forked from:
@@ -53,10 +58,13 @@
available = false;
} else {
available = true;
- preference.setSummary(mContext.getResources().getQuantityString(
- R.plurals.enterprise_privacy_number_packages_lower_bound, num,
- num));
-
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getResources().getString(
+ R.string.enterprise_privacy_number_packages_lower_bound),
+ Locale.getDefault());
+ Map<String, Object> arguments = new HashMap<>();
+ arguments.put("count", num);
+ preference.setSummary(msgFormat.format(arguments));
}
preference.setVisible(available);
});
diff --git a/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacySettingsActivity.java b/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacySettingsActivity.java
index cf4a11b..4c97f3d 100644
--- a/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacySettingsActivity.java
+++ b/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacySettingsActivity.java
@@ -19,13 +19,13 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
public class EnterprisePrivacySettingsActivity extends TvSettingsActivity {
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(EnterprisePrivacySettingsFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacySettingsFragment.java b/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacySettingsFragment.java
index ab6967c..ac7ecca 100644
--- a/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacySettingsFragment.java
+++ b/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacySettingsFragment.java
@@ -21,7 +21,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.tv.settings.PreferenceControllerFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import java.util.List;
diff --git a/Settings/src/com/android/tv/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java b/Settings/src/com/android/tv/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java
index 35496a4..d8d3740 100644
--- a/Settings/src/com/android/tv/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java
+++ b/Settings/src/com/android/tv/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java
@@ -20,6 +20,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
+import android.icu.text.MessageFormat;
import android.os.UserHandle;
import android.os.UserManager;
@@ -32,16 +33,20 @@
import com.android.settingslib.utils.ThreadUtils;
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
-import com.android.tv.settings.enterprise.apps.ApplicationFeatureProvider;
-import com.android.tv.settings.enterprise.apps.EnterpriseDefaultApps;
-import com.android.tv.settings.enterprise.apps.UserAppInfo;
-import com.android.tv.settings.overlay.FeatureFactory;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProvider;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.enterprise.apps.EnterpriseDefaultApps;
+import com.android.tv.settings.library.enterprise.apps.UserAppInfo;
+import com.android.tv.settings.library.overlay.FeatureFactory;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumMap;
+import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
+import java.util.Map;
/**
@@ -187,16 +192,28 @@
case CONTACTS:
return context.getString(R.string.default_contacts_app_title);
case PHONE:
- return context.getResources()
- .getQuantityString(R.plurals.default_phone_app_title, appCount);
+ MessageFormat msgFormatPhone = new MessageFormat(
+ context.getString(R.string.default_phone_app_title),
+ Locale.getDefault());
+ Map<String, Object> argumentsPhone = new HashMap<>();
+ argumentsPhone.put("count", appCount);
+ return msgFormatPhone.format(argumentsPhone);
case MAP:
return context.getString(R.string.default_map_app_title);
case EMAIL:
- return context.getResources()
- .getQuantityString(R.plurals.default_email_app_title, appCount);
+ MessageFormat msgFormatEmail = new MessageFormat(
+ context.getString(R.string.default_email_app_title),
+ Locale.getDefault());
+ Map<String, Object> argumentsEmail = new HashMap<>();
+ argumentsEmail.put("count", appCount);
+ return msgFormatEmail.format(argumentsEmail);
case CAMERA:
- return context.getResources()
- .getQuantityString(R.plurals.default_camera_app_title, appCount);
+ MessageFormat msgFormatCamera = new MessageFormat(
+ context.getString(R.string.default_camera_app_title),
+ Locale.getDefault());
+ Map<String, Object> argumentsCamera = new HashMap<>();
+ argumentsCamera.put("count", appCount);
+ return msgFormatCamera.format(argumentsCamera);
default:
throw new IllegalStateException("Unknown type of default " + typeOfDefault);
}
diff --git a/Settings/src/com/android/tv/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java b/Settings/src/com/android/tv/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java
index 36fda0a..67cfd69 100644
--- a/Settings/src/com/android/tv/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java
+++ b/Settings/src/com/android/tv/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java
@@ -17,6 +17,7 @@
package com.android.tv.settings.enterprise;
import android.content.Context;
+import android.icu.text.MessageFormat;
import android.os.UserHandle;
import android.os.UserManager;
@@ -24,9 +25,13 @@
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.tv.settings.R;
-import com.android.tv.settings.enterprise.apps.ApplicationFeatureProvider;
-import com.android.tv.settings.enterprise.apps.EnterpriseDefaultApps;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.enterprise.apps.EnterpriseDefaultApps;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
/**
* Forked from:
@@ -49,8 +54,13 @@
@Override
public void updateState(Preference preference) {
final int num = getNumberOfEnterpriseSetDefaultApps();
- preference.setSummary(mContext.getResources().getQuantityString(
- R.plurals.enterprise_privacy_number_packages, num, num));
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getResources().getString(
+ R.string.enterprise_privacy_number_packages),
+ Locale.getDefault());
+ Map<String, Object> arguments = new HashMap<>();
+ arguments.put("count", num);
+ preference.setSummary(msgFormat.format(arguments));
}
@Override
diff --git a/Settings/src/com/android/tv/settings/enterprise/FailedPasswordWipePreferenceControllerBase.java b/Settings/src/com/android/tv/settings/enterprise/FailedPasswordWipePreferenceControllerBase.java
index faf58ce..697ecc5 100644
--- a/Settings/src/com/android/tv/settings/enterprise/FailedPasswordWipePreferenceControllerBase.java
+++ b/Settings/src/com/android/tv/settings/enterprise/FailedPasswordWipePreferenceControllerBase.java
@@ -17,12 +17,18 @@
package com.android.tv.settings.enterprise;
import android.content.Context;
+import android.icu.text.MessageFormat;
import androidx.preference.Preference;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.tv.settings.R;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProvider;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
public abstract class FailedPasswordWipePreferenceControllerBase extends
AbstractPreferenceController {
@@ -40,9 +46,13 @@
@Override
public void updateState(Preference preference) {
final int failedPasswordsBeforeWipe = getMaximumFailedPasswordsBeforeWipe();
- preference.setSummary(mContext.getResources().getQuantityString(
- R.plurals.enterprise_privacy_number_failed_password_wipe,
- failedPasswordsBeforeWipe, failedPasswordsBeforeWipe));
+ MessageFormat msgFormat = new MessageFormat(
+ mContext.getResources().getString(
+ R.string.enterprise_privacy_number_failed_password_wipe),
+ Locale.getDefault());
+ Map<String, Object> arguments = new HashMap<>();
+ arguments.put("count", failedPasswordsBeforeWipe);
+ preference.setSummary(msgFormat.format(arguments));
}
@Override
diff --git a/Settings/src/com/android/tv/settings/enterprise/ImePreferenceController.java b/Settings/src/com/android/tv/settings/enterprise/ImePreferenceController.java
index 81261e7..892759e 100644
--- a/Settings/src/com/android/tv/settings/enterprise/ImePreferenceController.java
+++ b/Settings/src/com/android/tv/settings/enterprise/ImePreferenceController.java
@@ -22,7 +22,8 @@
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.tv.settings.R;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProvider;
+import com.android.tv.settings.library.overlay.FlavorUtils;
public class ImePreferenceController extends AbstractPreferenceController {
diff --git a/Settings/src/com/android/tv/settings/enterprise/apps/ApplicationFeatureProviderImpl.java b/Settings/src/com/android/tv/settings/enterprise/apps/ApplicationFeatureProviderImpl.java
deleted file mode 100644
index dd81d53..0000000
--- a/Settings/src/com/android/tv/settings/enterprise/apps/ApplicationFeatureProviderImpl.java
+++ /dev/null
@@ -1,336 +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.tv.settings.enterprise.apps;
-
-import android.Manifest;
-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.ComponentInfo;
-import android.content.pm.IPackageManager;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.content.pm.UserInfo;
-import android.location.LocationManager;
-import android.os.RemoteException;
-import android.os.UserManager;
-import android.service.euicc.EuiccService;
-import android.telecom.DefaultDialerManager;
-import android.text.TextUtils;
-import android.util.ArraySet;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.internal.telephony.SmsApplication;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Forked from:
- * Settings/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
- */
-public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvider {
- private static final String TAG = "AppFeatureProviderImpl";
-
- protected final Context mContext;
- private final PackageManager mPm;
- private final IPackageManager mPms;
- private final DevicePolicyManager mDpm;
- private final UserManager mUm;
- /** Flags to use when querying PackageManager for Euicc component implementations. */
- private static final int EUICC_QUERY_FLAGS =
- PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DEBUG_TRIAGED_MISSING
- | PackageManager.GET_RESOLVED_FILTER;
-
- public ApplicationFeatureProviderImpl(Context context, PackageManager pm,
- IPackageManager pms, DevicePolicyManager dpm) {
- mContext = context.getApplicationContext();
- mPm = pm;
- mPms = pms;
- mDpm = dpm;
- mUm = UserManager.get(mContext);
- }
-
- @Override
- public void calculateNumberOfPolicyInstalledApps(boolean async, NumberOfAppsCallback callback) {
- final CurrentUserAndManagedProfilePolicyInstalledAppCounter counter =
- new CurrentUserAndManagedProfilePolicyInstalledAppCounter(mContext, mPm, callback);
- if (async) {
- counter.execute();
- } else {
- counter.executeInForeground();
- }
- }
-
- @Override
- public void listPolicyInstalledApps(ListOfAppsCallback callback) {
- final CurrentUserPolicyInstalledAppLister lister =
- new CurrentUserPolicyInstalledAppLister(mPm, mUm, callback);
- lister.execute();
- }
-
- @Override
- public void calculateNumberOfAppsWithAdminGrantedPermissions(String[] permissions,
- boolean async, NumberOfAppsCallback callback) {
- final CurrentUserAndManagedProfileAppWithAdminGrantedPermissionsCounter counter =
- new CurrentUserAndManagedProfileAppWithAdminGrantedPermissionsCounter(mContext,
- permissions, mPm, mPms, mDpm, callback);
- if (async) {
- counter.execute();
- } else {
- counter.executeInForeground();
- }
- }
-
- @Override
- public void listAppsWithAdminGrantedPermissions(String[] permissions,
- ListOfAppsCallback callback) {
- final CurrentUserAppWithAdminGrantedPermissionsLister lister =
- new CurrentUserAppWithAdminGrantedPermissionsLister(permissions, mPm, mPms, mDpm,
- mUm, callback);
- lister.execute();
- }
-
- @Override
- public List<UserAppInfo> findPersistentPreferredActivities(int userId, Intent[] intents) {
- final List<UserAppInfo> preferredActivities = new ArrayList<>();
- final Set<UserAppInfo> uniqueApps = new ArraySet<>();
- final UserInfo userInfo = mUm.getUserInfo(userId);
- for (final Intent intent : intents) {
- try {
- final ResolveInfo resolveInfo =
- mPms.findPersistentPreferredActivity(intent, userId);
- if (resolveInfo != null) {
- ComponentInfo componentInfo = null;
- if (resolveInfo.activityInfo != null) {
- componentInfo = resolveInfo.activityInfo;
- } else if (resolveInfo.serviceInfo != null) {
- componentInfo = resolveInfo.serviceInfo;
- } else if (resolveInfo.providerInfo != null) {
- componentInfo = resolveInfo.providerInfo;
- }
- if (componentInfo != null) {
- UserAppInfo info = new UserAppInfo(userInfo, componentInfo.applicationInfo);
- if (uniqueApps.add(info)) {
- preferredActivities.add(info);
- }
- }
- }
- } catch (RemoteException exception) {
- }
- }
- return preferredActivities;
- }
-
- @Override
- public Set<String> getKeepEnabledPackages() {
- // Find current default phone/sms app. We should keep them enabled.
- final Set<String> keepEnabledPackages = new ArraySet<>();
- final String defaultDialer = DefaultDialerManager.getDefaultDialerApplication(mContext);
- if (!TextUtils.isEmpty(defaultDialer)) {
- keepEnabledPackages.add(defaultDialer);
- }
- final ComponentName defaultSms = SmsApplication.getDefaultSmsApplication(
- mContext, true /* updateIfNeeded */);
- if (defaultSms != null) {
- keepEnabledPackages.add(defaultSms.getPackageName());
- }
-
- // Keep Euicc Service enabled.
- final ComponentInfo euicc = findEuiccService(mPm);
- if (euicc != null) {
- keepEnabledPackages.add(euicc.packageName);
- }
-
- keepEnabledPackages.addAll(getEnabledPackageAllowlist());
-
- final LocationManager locationManager = mContext.getSystemService(LocationManager.class);
- final String locationHistoryPackage = locationManager.getExtraLocationControllerPackage();
- if (locationHistoryPackage != null) {
- keepEnabledPackages.add(locationHistoryPackage);
- }
- return keepEnabledPackages;
- }
-
- private Set<String> getEnabledPackageAllowlist() {
- final Set<String> keepEnabledPackages = new ArraySet<>();
-
- if (mPm.getWellbeingPackageName() != null) {
- keepEnabledPackages.add(mPm.getWellbeingPackageName());
- }
- return keepEnabledPackages;
- }
-
- private static class CurrentUserAndManagedProfilePolicyInstalledAppCounter
- extends InstalledAppCounter {
- private NumberOfAppsCallback mCallback;
-
- CurrentUserAndManagedProfilePolicyInstalledAppCounter(Context context,
- PackageManager packageManager, NumberOfAppsCallback callback) {
- super(context, PackageManager.INSTALL_REASON_POLICY, packageManager);
- mCallback = callback;
- }
-
- @Override
- protected void onCountComplete(int num) {
- mCallback.onNumberOfAppsResult(num);
- }
- }
-
- private static class CurrentUserAndManagedProfileAppWithAdminGrantedPermissionsCounter
- extends AppWithAdminGrantedPermissionsCounter {
- private NumberOfAppsCallback mCallback;
-
- CurrentUserAndManagedProfileAppWithAdminGrantedPermissionsCounter(Context context,
- String[] permissions, PackageManager packageManager,
- IPackageManager packageManagerService,
- DevicePolicyManager devicePolicyManager, NumberOfAppsCallback callback) {
- super(context, permissions, packageManager, packageManagerService, devicePolicyManager);
- mCallback = callback;
- }
-
- @Override
- protected void onCountComplete(int num) {
- mCallback.onNumberOfAppsResult(num);
- }
- }
-
- private static class CurrentUserPolicyInstalledAppLister extends InstalledAppLister {
- private ListOfAppsCallback mCallback;
-
- CurrentUserPolicyInstalledAppLister(PackageManager packageManager,
- UserManager userManager, ListOfAppsCallback callback) {
- super(packageManager, userManager);
- mCallback = callback;
- }
-
- @Override
- protected void onAppListBuilt(List<UserAppInfo> list) {
- mCallback.onListOfAppsResult(list);
- }
- }
-
- private static class CurrentUserAppWithAdminGrantedPermissionsLister extends
- AppWithAdminGrantedPermissionsLister {
- private ListOfAppsCallback mCallback;
-
- CurrentUserAppWithAdminGrantedPermissionsLister(String[] permissions,
- PackageManager packageManager, IPackageManager packageManagerService,
- DevicePolicyManager devicePolicyManager, UserManager userManager,
- ListOfAppsCallback callback) {
- super(permissions, packageManager, packageManagerService, devicePolicyManager,
- userManager);
- mCallback = callback;
- }
-
- @Override
- protected void onAppListBuilt(List<UserAppInfo> list) {
- mCallback.onListOfAppsResult(list);
- }
- }
-
- /**
- * Return the component info of the EuiccService to bind to, or null if none were found.
- */
- @VisibleForTesting
- ComponentInfo findEuiccService(PackageManager packageManager) {
- final Intent intent = new Intent(EuiccService.EUICC_SERVICE_INTERFACE);
- final List<ResolveInfo> resolveInfoList =
- packageManager.queryIntentServices(intent, EUICC_QUERY_FLAGS);
- final ComponentInfo bestComponent = findEuiccService(packageManager, resolveInfoList);
- if (bestComponent == null) {
- Log.w(TAG, "No valid EuiccService implementation found");
- }
- return bestComponent;
- }
-
- private ComponentInfo findEuiccService(
- PackageManager packageManager, List<ResolveInfo> resolveInfoList) {
- int bestPriority = Integer.MIN_VALUE;
- ComponentInfo bestComponent = null;
- if (resolveInfoList != null) {
- for (ResolveInfo resolveInfo : resolveInfoList) {
- if (!isValidEuiccComponent(packageManager, resolveInfo)) {
- continue;
- }
-
- if (resolveInfo.filter.getPriority() > bestPriority) {
- bestPriority = resolveInfo.filter.getPriority();
- bestComponent = getComponentInfo(resolveInfo);
- }
- }
- }
-
- return bestComponent;
- }
-
- private boolean isValidEuiccComponent(
- PackageManager packageManager, ResolveInfo resolveInfo) {
- final ComponentInfo componentInfo = getComponentInfo(resolveInfo);
- final String packageName = componentInfo.packageName;
-
- // Verify that the app is privileged (via granting of a privileged permission).
- if (packageManager.checkPermission(
- Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS, packageName)
- != PackageManager.PERMISSION_GRANTED) {
- Log.e(TAG, "Package " + packageName
- + " does not declare WRITE_EMBEDDED_SUBSCRIPTIONS");
- return false;
- }
-
- // Verify that only the system can access the component.
- final String permission;
- if (componentInfo instanceof ServiceInfo) {
- permission = ((ServiceInfo) componentInfo).permission;
- } else if (componentInfo instanceof ActivityInfo) {
- permission = ((ActivityInfo) componentInfo).permission;
- } else {
- throw new IllegalArgumentException("Can only verify services/activities");
- }
- if (!TextUtils.equals(permission, Manifest.permission.BIND_EUICC_SERVICE)) {
- Log.e(TAG, "Package " + packageName
- + " does not require the BIND_EUICC_SERVICE permission");
- return false;
- }
-
- // Verify that the component declares a priority.
- if (resolveInfo.filter == null || resolveInfo.filter.getPriority() == 0) {
- Log.e(TAG, "Package " + packageName + " does not specify a priority");
- return false;
- }
- return true;
- }
-
- private ComponentInfo getComponentInfo(ResolveInfo resolveInfo) {
- if (resolveInfo.activityInfo != null) {
- return resolveInfo.activityInfo;
- }
- if (resolveInfo.serviceInfo != null) {
- return resolveInfo.serviceInfo;
- }
- if (resolveInfo.providerInfo != null) {
- return resolveInfo.providerInfo;
- }
- throw new IllegalStateException("Missing ComponentInfo!");
- }
-}
diff --git a/Settings/src/com/android/tv/settings/help/HelpFragment.java b/Settings/src/com/android/tv/settings/help/HelpFragment.java
index d77b0cc..e32469e 100644
--- a/Settings/src/com/android/tv/settings/help/HelpFragment.java
+++ b/Settings/src/com/android/tv/settings/help/HelpFragment.java
@@ -18,25 +18,30 @@
import static android.content.Context.ACCESSIBILITY_SERVICE;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_VENDOR;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_X;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_CLASSIC;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_TWO_PANEL;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_VENDOR;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_X;
import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
import android.app.tvsettings.TvSettingsEnums;
+import android.content.ComponentName;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
+import android.text.TextUtils;
import android.view.accessibility.AccessibilityManager;
import androidx.annotation.Keep;
import androidx.leanback.widget.VerticalGridView;
import androidx.preference.Preference;
+import com.android.settingslib.accessibility.AccessibilityUtils;
import com.android.tv.settings.MainFragment;
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+
+import java.util.Set;
/**
* The "Help & feedback" screen in TV settings.
@@ -46,6 +51,7 @@
private static final String KEY_SEND_FEEDBACK = "feedback";
private static final String KEY_HELP = "help_center";
+ private static final String TALKBACK_SERVICE_NAME = ".TalkBackService";
private int getPreferenceScreenResId() {
switch (FlavorUtils.getFlavor(getContext())) {
@@ -80,12 +86,12 @@
@Override
public boolean onPreferenceTreeClick(Preference preference) {
- AccessibilityManager am =
- (AccessibilityManager) getContext().getSystemService(ACCESSIBILITY_SERVICE);
- boolean isAccessibilityEnabled = am.isEnabled();
+ // Workaround to only allow click when the input focus and a11y focus are on the same item.
+ // This should only apply when the TalkBack service is on since other a11y services may not
+ // utilize a11y focus (ex. Switch Access).
VerticalGridView listView = (VerticalGridView) getListView();
if (!listView.getChildAt(listView.getSelectedPosition()).isAccessibilityFocused()
- && isAccessibilityEnabled) {
+ && isTalkBackEnabled()) {
return true;
}
switch (preference.getKey()) {
@@ -101,6 +107,25 @@
}
}
+
+ private boolean isTalkBackEnabled() {
+ AccessibilityManager am =
+ (AccessibilityManager) getContext().getSystemService(ACCESSIBILITY_SERVICE);
+ boolean isAccessibilityEnabled = am.isEnabled();
+
+ if (isAccessibilityEnabled) {
+ final Set<ComponentName> enabledServices =
+ AccessibilityUtils.getEnabledServicesFromSettings(getActivity());
+
+ for (final ComponentName componentName : enabledServices) {
+ if (TextUtils.equals(componentName.getShortClassName(), TALKBACK_SERVICE_NAME)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
@Override
protected int getPageId() {
return TvSettingsEnums.FEEDBACK;
diff --git a/Settings/src/com/android/tv/settings/inputmethod/AvailableVirtualKeyboardFragment.java b/Settings/src/com/android/tv/settings/inputmethod/AvailableVirtualKeyboardFragment.java
index df8d7de..5616030 100644
--- a/Settings/src/com/android/tv/settings/inputmethod/AvailableVirtualKeyboardFragment.java
+++ b/Settings/src/com/android/tv/settings/inputmethod/AvailableVirtualKeyboardFragment.java
@@ -31,6 +31,7 @@
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
+import android.os.UserHandle;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
@@ -152,7 +153,7 @@
final boolean isAllowedByOrganization = permittedList == null
|| permittedList.contains(imi.getPackageName());
final InputMethodPreference pref = new InputMethodPreference(
- context, imi, true, isAllowedByOrganization, this);
+ context, imi, isAllowedByOrganization, this, UserHandle.myUserId());
// TODO: Update the icon container in leanback_preference.xml to use LinearLayout.
// This is a workaround to avoid the crash. b/146654624
pref.setIconSize(0);
diff --git a/Settings/src/com/android/tv/settings/inputmethod/AvailableVirtualKeyboardFragmentCompat.java b/Settings/src/com/android/tv/settings/inputmethod/AvailableVirtualKeyboardFragmentCompat.java
new file mode 100644
index 0000000..d5acbf3
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/inputmethod/AvailableVirtualKeyboardFragmentCompat.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.tv.settings.inputmethod;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.Preference;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.compat.TsPreference;
+import com.android.tv.settings.compat.TsSwitchPreference;
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+
+import java.util.List;
+
+/**
+ * Fragment compat for enabling/disabling virtual keyboard IMEs
+ */
+@Keep
+public class AvailableVirtualKeyboardFragmentCompat extends PreferenceControllerFragmentCompat {
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.available_virtual_keyboard_compat, null);
+ }
+
+ @Override
+ public void updateAllPref(List<PreferenceCompat> preferenceCompatList) {
+ if (preferenceCompatList == null) {
+ return;
+ }
+ preferenceCompatList.stream()
+ .forEach(preferenceCompat -> updatePref(preferenceCompat));
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat pref) {
+ if (pref == null) {
+ return null;
+ }
+ String[] key = pref.getKey();
+ Preference preference = findTargetPreference(key);
+ if (preference == null) {
+ if (pref.getType() == PreferenceCompat.TYPE_SWITCH) {
+ preference = new TsSwitchPreference(getContext(), key);
+ } else {
+ preference = new TsPreference(getContext(), key);
+ }
+ getPreferenceScreen().addPreference(preference);
+ }
+ RenderUtil.updatePreference(
+ getContext(), (HasKeys) preference, pref, preference.getOrder());
+ if (pref.hasOnPreferenceChangeListener()) {
+ preference.setOnPreferenceChangeListener(this);
+ }
+ return (HasKeys) preference;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_AVAILABLE_KEYBOARD;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/inputmethod/InputMethodAndSubtypeEnablerActivity.java b/Settings/src/com/android/tv/settings/inputmethod/InputMethodAndSubtypeEnablerActivity.java
index 5f82e79..14a37e3 100644
--- a/Settings/src/com/android/tv/settings/inputmethod/InputMethodAndSubtypeEnablerActivity.java
+++ b/Settings/src/com/android/tv/settings/inputmethod/InputMethodAndSubtypeEnablerActivity.java
@@ -19,7 +19,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
/**
* Activity for android.settings.INPUT_METHOD_SUBTYPE_SETTINGS
@@ -28,7 +27,8 @@
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(InputMethodAndSubtypeEnablerFragment.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(InputMethodAndSubtypeEnablerFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/inputmethod/KeyboardActivity.java b/Settings/src/com/android/tv/settings/inputmethod/KeyboardActivity.java
index 8e87dca..93b8963 100644
--- a/Settings/src/com/android/tv/settings/inputmethod/KeyboardActivity.java
+++ b/Settings/src/com/android/tv/settings/inputmethod/KeyboardActivity.java
@@ -19,7 +19,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
/**
* Wrapper activity for KeyboardFragment
@@ -28,7 +27,8 @@
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(KeyboardFragment.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(KeyboardFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/inputmethod/KeyboardFragment.java b/Settings/src/com/android/tv/settings/inputmethod/KeyboardFragment.java
index 2363bfb..561b1b3 100644
--- a/Settings/src/com/android/tv/settings/inputmethod/KeyboardFragment.java
+++ b/Settings/src/com/android/tv/settings/inputmethod/KeyboardFragment.java
@@ -22,42 +22,53 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.hardware.input.InputManager;
import android.os.Bundle;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.ArraySet;
+import android.util.Log;
import android.view.inputmethod.InputMethodInfo;
import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;
-import com.android.settingslib.applications.DefaultAppInfo;
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
-import com.android.tv.settings.autofill.AutofillHelper;
-import com.android.tv.settings.overlay.FlavorUtils;
-import com.android.tv.settings.util.SliceUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.settingslib.AutofillHelper;
+import com.android.tv.settings.library.settingslib.DefaultAppInfo;
+import com.android.tv.settings.library.settingslib.InputMethodHelper;
+import com.android.tv.settings.library.util.SliceUtils;
+import com.android.tv.settings.library.util.ThreadUtils;
import com.android.tv.twopanelsettings.slices.SlicePreference;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
/**
- * Fragment for managing IMEs and Autofills
+ * Fragment for managing IMEs, Autofills and physical keyboards
*/
@Keep
-public class KeyboardFragment extends SettingsPreferenceFragment {
+public class KeyboardFragment extends SettingsPreferenceFragment implements
+ InputManager.InputDeviceListener {
private static final String TAG = "KeyboardFragment";
+ private static final boolean DEBUG = false;
// Order of input methods, make sure they are inserted between 1 (currentKeyboard) and
// 3 (manageKeyboards).
private static final int INPUT_METHOD_PREFERENCE_ORDER = 2;
+ // Order of physical keyboard setting, in the end
+ private static final int PHYSICAL_KEYBOARD_PREFERENCE_ORDER = 5;
+
@VisibleForTesting
static final String KEY_KEYBOARD_CATEGORY = "keyboardCategory";
@@ -66,6 +77,8 @@
private static final String KEY_KEYBOARD_SETTINGS_PREFIX = "keyboardSettings:";
+ private static final String KEY_PHYSICAL_KEYBOARD_SETTINGS_PREFIX = "physicalKeyboardSettings:";
+
@VisibleForTesting
static final String KEY_AUTOFILL_CATEGORY = "autofillCategory";
@@ -76,6 +89,8 @@
private PackageManager mPm;
+ private InputManager mIm;
+
/**
* @return New fragment instance
*/
@@ -87,6 +102,7 @@
public void onAttach(Context context) {
super.onAttach(context);
mPm = context.getPackageManager();
+ mIm = Objects.requireNonNull(context.getSystemService(InputManager.class));
}
@Override
@@ -107,6 +123,13 @@
public void onResume() {
super.onResume();
updateUi();
+ mIm.registerInputDeviceListener(this, null);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mIm.unregisterInputDeviceListener(this);
}
@VisibleForTesting
@@ -116,12 +139,12 @@
}
private void updateKeyboards() {
- updateCurrentKeyboardPreference((ListPreference) findPreference(KEY_CURRENT_KEYBOARD));
+ updateCurrentKeyboardPreference(findPreference(KEY_CURRENT_KEYBOARD));
updateKeyboardsSettings();
+ scheduleUpdatePhysicalKeyboards(getPreferenceContext());
}
private void updateCurrentKeyboardPreference(ListPreference currentKeyboardPref) {
- final PackageManager packageManager = getContext().getPackageManager();
List<InputMethodInfo> enabledInputMethodInfos = InputMethodHelper
.getEnabledSystemInputMethodList(getContext());
final List<CharSequence> entries = new ArrayList<>(enabledInputMethodInfos.size());
@@ -131,7 +154,7 @@
final String defaultId = InputMethodHelper.getDefaultInputMethodId(getContext());
for (final InputMethodInfo info : enabledInputMethodInfos) {
- entries.add(info.loadLabel(packageManager));
+ entries.add(info.loadLabel(mPm));
final String id = info.getId();
values.add(id);
if (TextUtils.equals(id, defaultId)) {
@@ -152,12 +175,11 @@
private void updateKeyboardsSettings() {
final Context preferenceContext = getPreferenceContext();
- final PackageManager packageManager = getContext().getPackageManager();
List<InputMethodInfo> enabledInputMethodInfos = InputMethodHelper
.getEnabledSystemInputMethodList(getContext());
-
PreferenceScreen preferenceScreen = getPreferenceScreen();
- final Set<String> enabledInputMethodKeys = new ArraySet<>(enabledInputMethodInfos.size());
+ final Set<String> enabledInputMethodKeys = new ArraySet<>(
+ enabledInputMethodInfos.size());
// Add per-IME settings
for (final InputMethodInfo info : enabledInputMethodInfos) {
final String uri = InputMethodHelper.getInputMethodsSettingsUri(getContext(), info);
@@ -179,7 +201,7 @@
preferenceScreen.addPreference(preference);
}
preference.setTitle(getContext().getString(R.string.title_settings,
- info.loadLabel(packageManager)));
+ info.loadLabel(mPm)));
preference.setKey(key);
if (useSlice) {
((SlicePreference) preference).setUri(uri);
@@ -189,13 +211,68 @@
}
enabledInputMethodKeys.add(key);
}
+ removeDisabledPreferencesFromScreen(preferenceScreen, enabledInputMethodKeys,
+ KEY_KEYBOARD_SETTINGS_PREFIX);
+ }
+ void scheduleUpdatePhysicalKeyboards(Context context) {
+ ThreadUtils.postOnBackgroundThread(() -> {
+ final List<PhysicalKeyboardHelper.DeviceInfo> newPhysicalKeyboards =
+ PhysicalKeyboardHelper.getPhysicalKeyboards(context);
+ ThreadUtils.postOnMainThread(() -> updatePhysicalKeyboards(newPhysicalKeyboards));
+ });
+ }
+
+ private void updatePhysicalKeyboards(
+ @NonNull List<PhysicalKeyboardHelper.DeviceInfo> newPhysicalKeyboards) {
+ final PreferenceScreen preferenceScreen = getPreferenceScreen();
+ if (DEBUG) {
+ Log.d(TAG, "updatePhysicalKeyboards: " + newPhysicalKeyboards.toString());
+ }
+ final Set<String> enabledPhysicalKeyboardKeys = new ArraySet<>(newPhysicalKeyboards.size());
+ // Add a setting per physical keyboard device
+ for (PhysicalKeyboardHelper.DeviceInfo deviceInfo :
+ newPhysicalKeyboards) {
+ String key = KEY_PHYSICAL_KEYBOARD_SETTINGS_PREFIX
+ + deviceInfo.mDeviceIdentifier.getDescriptor();
+ Preference pref = preferenceScreen.findPreference(key);
+ if (pref == null) {
+ pref = new Preference(getPreferenceContext());
+ pref.setOrder(PHYSICAL_KEYBOARD_PREFERENCE_ORDER);
+ preferenceScreen.addPreference(pref);
+ }
+ pref.setKey(key);
+ pref.setTitle(getPreferenceContext().getString(
+ com.android.settingslib.R.string.physical_keyboard_title));
+ pref.setSummary(deviceInfo.getSummary());
+ KeyboardLayoutSelectionFragment.prepareArgs(pref.getExtras(),
+ deviceInfo.mDeviceIdentifier,
+ deviceInfo.mDeviceName,
+ deviceInfo.mDeviceId,
+ deviceInfo.mCurrentLayoutDescriptor);
+ pref.setFragment(KeyboardLayoutSelectionFragment.class.getName());
+ enabledPhysicalKeyboardKeys.add(key);
+ }
+ removeDisabledPreferencesFromScreen(preferenceScreen, enabledPhysicalKeyboardKeys,
+ KEY_PHYSICAL_KEYBOARD_SETTINGS_PREFIX);
+ }
+
+ /**
+ * Removes all preferences which start with the key prefix and are not among the enabled keys
+ * from the preference screen.
+ *
+ * @param preferenceScreen The preference screen.
+ * @param enabledKeys The set of enabled keys.
+ * @param keyPrefix The prefix for the keys to be removed.
+ */
+ private void removeDisabledPreferencesFromScreen(PreferenceScreen preferenceScreen,
+ Set<String> enabledKeys, String keyPrefix) {
for (int i = 0; i < preferenceScreen.getPreferenceCount(); ) {
final Preference preference = preferenceScreen.getPreference(i);
final String key = preference.getKey();
if (!TextUtils.isEmpty(key)
- && key.startsWith(KEY_KEYBOARD_SETTINGS_PREFIX)
- && !enabledInputMethodKeys.contains(key)) {
+ && key.startsWith(keyPrefix)
+ && !enabledKeys.contains(key)) {
preferenceScreen.removePreference(preference);
} else {
i++;
@@ -207,8 +284,7 @@
* Update autofill related preferences.
*/
private void updateAutofill() {
- final PreferenceCategory autofillCategory = (PreferenceCategory)
- findPreference(KEY_AUTOFILL_CATEGORY);
+ final PreferenceCategory autofillCategory = findPreference(KEY_AUTOFILL_CATEGORY);
List<DefaultAppInfo> candidates = getAutofillCandidates();
if (candidates.isEmpty()) {
// No need to show keyboard category and autofill category.
@@ -225,7 +301,6 @@
updateAutofillSettings(candidates);
getPreferenceScreen().setTitle(R.string.system_keyboard_autofill);
}
-
}
private List<DefaultAppInfo> getAutofillCandidates() {
@@ -246,8 +321,7 @@
private void updateAutofillSettings(List<DefaultAppInfo> candidates) {
final Context preferenceContext = getPreferenceContext();
- final PreferenceCategory autofillCategory = (PreferenceCategory)
- findPreference(KEY_AUTOFILL_CATEGORY);
+ final PreferenceCategory autofillCategory = findPreference(KEY_AUTOFILL_CATEGORY);
final Set<String> autofillServicesKeys = new ArraySet<>(candidates.size());
for (final DefaultAppInfo info : candidates) {
@@ -269,7 +343,7 @@
autofillServicesKeys.add(key);
}
- for (int i = 0; i < autofillCategory.getPreferenceCount();) {
+ for (int i = 0; i < autofillCategory.getPreferenceCount(); ) {
final Preference preference = autofillCategory.getPreference(i);
final String key = preference.getKey();
if (!TextUtils.isEmpty(key)
@@ -286,4 +360,19 @@
protected int getPageId() {
return TvSettingsEnums.SYSTEM_KEYBOARD;
}
+
+ @Override
+ public void onInputDeviceAdded(int deviceId) {
+ scheduleUpdatePhysicalKeyboards(getPreferenceContext());
+ }
+
+ @Override
+ public void onInputDeviceRemoved(int deviceId) {
+ scheduleUpdatePhysicalKeyboards(getPreferenceContext());
+ }
+
+ @Override
+ public void onInputDeviceChanged(int deviceId) {
+ scheduleUpdatePhysicalKeyboards(getPreferenceContext());
+ }
}
diff --git a/Settings/src/com/android/tv/settings/inputmethod/KeyboardFragmentCompat.java b/Settings/src/com/android/tv/settings/inputmethod/KeyboardFragmentCompat.java
new file mode 100644
index 0000000..70ff4a7
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/inputmethod/KeyboardFragmentCompat.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.tv.settings.inputmethod;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_KEYBOARD;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+
+/**
+ * Fragment compat for managing IMES and Autofills.
+ */
+@Keep
+public class KeyboardFragmentCompat extends PreferenceControllerFragmentCompat {
+ // Order of input methods, make sure they are inserted between 1 (currentKeyboard) and
+ // 3 (manageKeyboards).
+ private static final int INPUT_METHOD_PREFERENCE_ORDER = 2;
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.keyboard_compat, null);
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat prefCompat) {
+ if (prefCompat.getKey() != null && prefCompat.getKey().length > 0
+ && ManagerUtil.KEY_KEYBOARD_SETTINGS.equals(prefCompat.getKey()[0])) {
+ RenderUtil.updatePreferenceGroup(
+ getPreferenceScreen(), prefCompat.getChildPrefCompats(),
+ INPUT_METHOD_PREFERENCE_ORDER);
+ return null;
+ }
+ return super.updatePref(prefCompat);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_KEYBOARD;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/inputmethod/KeyboardLayoutSelectionFragment.java b/Settings/src/com/android/tv/settings/inputmethod/KeyboardLayoutSelectionFragment.java
new file mode 100644
index 0000000..b77c436
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/inputmethod/KeyboardLayoutSelectionFragment.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.inputmethod;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.hardware.input.InputDeviceIdentifier;
+import android.hardware.input.InputManager;
+import android.hardware.input.KeyboardLayout;
+import android.os.Bundle;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.tv.settings.RadioPreference;
+import com.android.tv.settings.SettingsPreferenceFragment;
+import com.android.tv.twopanelsettings.TwoPanelSettingsFragment;
+import com.android.tv.twopanelsettings.slices.SliceFragment;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Presents the user a list of all available keyboard layouts / languages and switches to
+ * the selected layout.
+ */
+public class KeyboardLayoutSelectionFragment extends SettingsPreferenceFragment implements
+ InputManager.InputDeviceListener {
+ private static final String LAYOUT_RADIO_GROUP = "layout";
+ private static final String ARG_DEVICE_NAME = "deviceName";
+ private static final String ARG_LAYOUT_IDENTIFIER = "layoutIdentifier";
+ private static final String ARG_DEVICE_ID = "deviceId";
+ private static final String ARG_INPUT_DEVICE_IDENTIFIER = "inputDeviceIdentifier";
+
+ private InputDeviceIdentifier mInputDeviceIdentifier;
+ private int mDeviceId;
+ private InputManager mIm;
+ private final Map<String, KeyboardLayout> mKeyboardLayoutMap = new HashMap<>();
+
+ /**
+ * Prepares the args with the provided parameters.
+ */
+ public static void prepareArgs(@NonNull Bundle args,
+ @NonNull InputDeviceIdentifier inputDeviceIdentifier,
+ @NonNull String deviceName, int deviceId, @Nullable String currentLayoutIdentifier) {
+ args.putObject(ARG_INPUT_DEVICE_IDENTIFIER, inputDeviceIdentifier);
+ args.putString(ARG_DEVICE_NAME, deviceName);
+ args.putInt(ARG_DEVICE_ID, deviceId);
+ if (currentLayoutIdentifier != null) {
+ args.putString(ARG_LAYOUT_IDENTIFIER, currentLayoutIdentifier);
+ }
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ final Context themedContext = getPreferenceManager().getContext();
+ mInputDeviceIdentifier = getArguments().getParcelable(ARG_INPUT_DEVICE_IDENTIFIER);
+ String mDeviceName = getArguments().getString(ARG_DEVICE_NAME);
+ mDeviceId = getArguments().getInt(ARG_DEVICE_ID);
+ String currentLayoutIdentifier = getArguments().getString(ARG_LAYOUT_IDENTIFIER);
+ final PreferenceScreen screen =
+ getPreferenceManager().createPreferenceScreen(themedContext);
+ screen.setTitle(themedContext.getString(
+ com.android.settingslib.R.string.keyboard_layout_dialog_title));
+ screen.setSummary(mDeviceName);
+ mIm = Objects.requireNonNull(themedContext.getSystemService(InputManager.class));
+ mIm.registerInputDeviceListener(this, null);
+
+ KeyboardLayout[] keyboardLayouts = mIm.getKeyboardLayoutsForInputDevice(
+ mInputDeviceIdentifier);
+ Arrays.sort(keyboardLayouts);
+ RadioPreference activePreference = null;
+ for (KeyboardLayout kl : keyboardLayouts) {
+ final RadioPreference radioPreference = new RadioPreference(themedContext);
+ radioPreference.setKey(kl.getDescriptor());
+ radioPreference.setPersistent(false);
+ radioPreference.setTitle(kl.getLabel());
+ radioPreference.setRadioGroup(LAYOUT_RADIO_GROUP);
+ radioPreference.setLayoutResource(
+ com.android.tv.settings.R.layout.preference_reversed_widget);
+ if (kl.getDescriptor().equals(currentLayoutIdentifier)) {
+ radioPreference.setChecked(true);
+ activePreference = radioPreference;
+ }
+ screen.addPreference(radioPreference);
+ mKeyboardLayoutMap.put(kl.getDescriptor(), kl);
+ }
+
+ if (activePreference != null) {
+ scrollToPreference(activePreference);
+ }
+
+ setPreferenceScreen(screen);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference) {
+ if (preference instanceof RadioPreference) {
+ final RadioPreference radioPreference = (RadioPreference) preference;
+ radioPreference.clearOtherRadioPreferences(getPreferenceScreen());
+ if (radioPreference.isChecked()) {
+ mIm.setCurrentKeyboardLayoutForInputDevice(mInputDeviceIdentifier,
+ mKeyboardLayoutMap.get(radioPreference.getKey()).getDescriptor());
+ } else {
+ radioPreference.setChecked(true);
+ }
+ }
+ return super.onPreferenceTreeClick(preference);
+ }
+
+ @Override
+ protected int getPageId() {
+ return super.getPageId();
+ }
+
+ @Override
+ public void onInputDeviceAdded(int deviceId) {
+ // ignore
+ }
+
+ @Override
+ public void onInputDeviceRemoved(int deviceId) {
+ if (deviceId == mDeviceId) {
+ back();
+ }
+ }
+
+ @Override
+ public void onInputDeviceChanged(int deviceId) {
+ // ignore
+ }
+
+ private void back() {
+ if (getCallbackFragment() instanceof TwoPanelSettingsFragment) {
+ TwoPanelSettingsFragment parentFragment =
+ (TwoPanelSettingsFragment) getCallbackFragment();
+ if (parentFragment.isFragmentInTheMainPanel(this)) {
+ parentFragment.navigateBack();
+ }
+ } else if (getCallbackFragment() instanceof SliceFragment.OnePanelSliceFragmentContainer) {
+ ((SliceFragment.OnePanelSliceFragmentContainer) getCallbackFragment()).navigateBack();
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/inputmethod/PhysicalKeyboardHelper.java b/Settings/src/com/android/tv/settings/inputmethod/PhysicalKeyboardHelper.java
new file mode 100644
index 0000000..7a5abb1
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/inputmethod/PhysicalKeyboardHelper.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.inputmethod;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.hardware.input.InputDeviceIdentifier;
+import android.hardware.input.InputManager;
+import android.hardware.input.KeyboardLayout;
+import android.text.TextUtils;
+import android.view.InputDevice;
+
+import com.android.settingslib.R;
+
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Helper methods to retrieve information about physical keyboard devices.
+ */
+public class PhysicalKeyboardHelper {
+
+ /**
+ * Queries the input manager for a list of physical keyboards.
+ */
+ @NonNull
+ public static List<DeviceInfo> getPhysicalKeyboards(
+ @NonNull Context context) {
+ final List<DeviceInfo> keyboards = new ArrayList<>();
+ final InputManager im = context.getSystemService(InputManager.class);
+ if (im == null) {
+ return new ArrayList<>();
+ }
+ for (int deviceId : InputDevice.getDeviceIds()) {
+ final InputDevice device = InputDevice.getDevice(deviceId);
+ if (device == null || device.isVirtual() || !device.isFullKeyboard()) {
+ continue;
+ }
+ final String currentLayoutDesc =
+ im.getCurrentKeyboardLayoutForInputDevice(device.getIdentifier());
+ keyboards.add(new DeviceInfo(device.getName(), device.getId(),
+ device.getIdentifier(), currentLayoutDesc,
+ getLayoutLabel(currentLayoutDesc, context, im)));
+ }
+
+ // We intentionally don't reuse Comparator because Collator may not be thread-safe.
+ final Collator collator = Collator.getInstance();
+ keyboards.sort((a, b) -> {
+ int result = collator.compare(a.mDeviceName, b.mDeviceName);
+ if (result != 0) {
+ return result;
+ }
+ result = a.mDeviceIdentifier.getDescriptor().compareTo(
+ b.mDeviceIdentifier.getDescriptor());
+ if (result != 0) {
+ return result;
+ }
+ return collator.compare(a.mCurrentLayoutLabel, b.mCurrentLayoutLabel);
+ });
+ return keyboards;
+ }
+
+ private static String getLayoutLabel(@Nullable String currentLayoutDescriptor,
+ @NonNull Context context, @NonNull InputManager im) {
+ if (currentLayoutDescriptor == null) {
+ return context.getString(R.string.keyboard_layout_default_label);
+ }
+ final KeyboardLayout currentLayout = im.getKeyboardLayout(currentLayoutDescriptor);
+ if (currentLayout == null) {
+ return context.getString(R.string.keyboard_layout_default_label);
+ }
+ // If current layout is specified but the layout is null, just return an empty string
+ // instead of falling back to R.string.keyboard_layout_default_label.
+ return TextUtils.emptyIfNull(currentLayout.getLabel());
+ }
+
+ /**
+ * Contains information about a physical keyboard.
+ */
+ public static final class DeviceInfo {
+ @NonNull
+ public final String mDeviceName;
+ public final int mDeviceId;
+ @NonNull
+ public final InputDeviceIdentifier mDeviceIdentifier;
+ @NonNull
+ public final String mCurrentLayoutLabel;
+ @Nullable
+ public final String mCurrentLayoutDescriptor;
+
+ public DeviceInfo(
+ @Nullable String deviceName,
+ int deviceId,
+ @NonNull InputDeviceIdentifier deviceIdentifier,
+ @Nullable String layoutDescriptor,
+ @NonNull String layoutLabel) {
+ mDeviceName = TextUtils.emptyIfNull(deviceName);
+ mDeviceId = deviceId;
+ mDeviceIdentifier = deviceIdentifier;
+ mCurrentLayoutDescriptor = layoutDescriptor;
+ mCurrentLayoutLabel = layoutLabel;
+ }
+
+ public String getSummary() {
+ return mDeviceName + ": " + mCurrentLayoutLabel;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) return true;
+ if (o == null) return false;
+
+ if (!(o instanceof DeviceInfo)) return false;
+
+ final DeviceInfo that = (DeviceInfo) o;
+ if (!TextUtils.equals(mDeviceName, that.mDeviceName)) {
+ return false;
+ }
+ if (!(mDeviceId == that.mDeviceId)) {
+ return false;
+ }
+ if (!Objects.equals(mDeviceIdentifier, that.mDeviceIdentifier)) {
+ return false;
+ }
+ if (!TextUtils.equals(mCurrentLayoutDescriptor, that.mCurrentLayoutDescriptor)) {
+ return false;
+ }
+ if (!TextUtils.equals(mCurrentLayoutLabel, that.mCurrentLayoutLabel)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mDeviceName, mDeviceId, mDeviceIdentifier, mCurrentLayoutLabel,
+ mCurrentLayoutDescriptor);
+ }
+
+ @Override
+ public String toString() {
+ return "DeviceInfo: name=" + mDeviceName + ", id=" + mDeviceId
+ + ", descriptor=" + mDeviceIdentifier.getDescriptor()
+ + ", currentLayoutDescriptor=" + mCurrentLayoutDescriptor
+ + ", currentLayoutLabel=" + mCurrentLayoutLabel;
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/oemlink/AccessibilityServiceActivity.java b/Settings/src/com/android/tv/settings/oemlink/AccessibilityServiceActivity.java
index a2003ab..42db919 100644
--- a/Settings/src/com/android/tv/settings/oemlink/AccessibilityServiceActivity.java
+++ b/Settings/src/com/android/tv/settings/oemlink/AccessibilityServiceActivity.java
@@ -16,7 +16,7 @@
package com.android.tv.settings.oemlink;
-import static com.android.tv.settings.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
+import static com.android.tv.settings.library.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.os.Bundle;
@@ -27,7 +27,6 @@
import com.android.tv.settings.TvSettingsActivity;
import com.android.tv.settings.accessibility.AccessibilityServiceFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
import java.util.List;
@@ -38,7 +37,7 @@
private static final String A11Y_SERVICE_INFO_EXTRA = "accessibilityServiceInfo";
@Override
- protected Fragment createSettingsFragment() {
+ protected Fragment createSettingsFragment() {
if (getIntent() == null || getIntent().getExtras() == null
|| getIntent().getExtras().getParcelable(A11Y_SERVICE_INFO_EXTRA) == null) {
Log.e(TAG, "No accessibility info extras, returning null");
@@ -61,7 +60,8 @@
a11yServiceInfo.getResolveInfo().serviceInfo.name,
a11yServiceInfo.getSettingsActivityName(),
a11yServiceInfo.getResolveInfo().loadLabel(this.getPackageManager()).toString());
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(AccessibilityServiceFragment.class.getName(), args);
}
diff --git a/Settings/src/com/android/tv/settings/oemlink/AccessibilitySettingsActivity.java b/Settings/src/com/android/tv/settings/oemlink/AccessibilitySettingsActivity.java
index 96f8749..dfc9953 100644
--- a/Settings/src/com/android/tv/settings/oemlink/AccessibilitySettingsActivity.java
+++ b/Settings/src/com/android/tv/settings/oemlink/AccessibilitySettingsActivity.java
@@ -16,25 +16,20 @@
package com.android.tv.settings.oemlink;
-import static com.android.tv.settings.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
+import static com.android.tv.settings.library.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
import com.android.tv.settings.accessibility.AccessibilityFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
/** An OEM hook for starting accessibility settings directly. */
public class AccessibilitySettingsActivity extends TvSettingsActivity {
@Override
- protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ protected Fragment createSettingsFragment() {
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(AccessibilityFragment.class.getName(), null);
}
-
- @Override
- protected int getAvailableFlavors() {
- return X_EXPERIENCE_FLAVORS_MASK;
- }
}
diff --git a/Settings/src/com/android/tv/settings/oemlink/FactoryResetActivity.java b/Settings/src/com/android/tv/settings/oemlink/FactoryResetActivity.java
index 5660d0a..a79e3e0 100644
--- a/Settings/src/com/android/tv/settings/oemlink/FactoryResetActivity.java
+++ b/Settings/src/com/android/tv/settings/oemlink/FactoryResetActivity.java
@@ -16,7 +16,7 @@
package com.android.tv.settings.oemlink;
-import static com.android.tv.settings.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
+import static com.android.tv.settings.library.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
import android.app.Activity;
import android.app.AlertDialog;
@@ -30,7 +30,7 @@
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.tv.settings.ActionDisabledByAdminDialogHelper;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
/**
* Oemlink of Factory Reset that takes special mode into consideration before launching the real
diff --git a/Settings/src/com/android/tv/settings/overlay/FeatureFactory.java b/Settings/src/com/android/tv/settings/overlay/FeatureFactory.java
index 132fb46..22f552e 100644
--- a/Settings/src/com/android/tv/settings/overlay/FeatureFactory.java
+++ b/Settings/src/com/android/tv/settings/overlay/FeatureFactory.java
@@ -21,11 +21,11 @@
import androidx.annotation.Keep;
import com.android.tv.settings.SettingsFragmentProvider;
-import com.android.tv.settings.basic.BasicModeFeatureProvider;
-import com.android.tv.settings.enterprise.EnterprisePrivacyFeatureProvider;
-import com.android.tv.settings.enterprise.apps.ApplicationFeatureProvider;
-import com.android.tv.settings.help.SupportFeatureProvider;
-import com.android.tv.settings.startup.StartupVerificationFeatureProvider;
+import com.android.tv.settings.library.basic.BasicModeFeatureProvider;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProvider;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.help.SupportFeatureProvider;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProvider;
/** Interface for feature controllers. Allows customization of the settings app. */
@Keep
@@ -34,18 +34,4 @@
/** Supplies a provider that can create settings fragments. */
SettingsFragmentProvider getSettingsFragmentProvider();
- /** Supplies a support provider. */
- SupportFeatureProvider getSupportFeatureProvider();
-
- /** Supplies a provider for basic mode feature. */
- BasicModeFeatureProvider getBasicModeFeatureProvider();
-
- /** Supplies a provider for startup verification feature. */
- StartupVerificationFeatureProvider getStartupVerificationFeatureProvider();
-
- /** Supplies a provider for enterprise privacy feature */
- EnterprisePrivacyFeatureProvider getEnterprisePrivacyFeatureProvider(Context context);
-
- /** Supplies a provider for application infos */
- ApplicationFeatureProvider getApplicationFeatureProvider(Context context);
}
diff --git a/Settings/src/com/android/tv/settings/overlay/FeatureFactoryImpl.java b/Settings/src/com/android/tv/settings/overlay/FeatureFactoryImpl.java
index ad39f6a..2973069 100644
--- a/Settings/src/com/android/tv/settings/overlay/FeatureFactoryImpl.java
+++ b/Settings/src/com/android/tv/settings/overlay/FeatureFactoryImpl.java
@@ -30,16 +30,16 @@
import com.android.tv.settings.BaseSettingsFragment;
import com.android.tv.settings.SettingsFragmentProvider;
-import com.android.tv.settings.basic.BasicModeFeatureProvider;
-import com.android.tv.settings.basic.BasicModeFeatureProviderImpl;
-import com.android.tv.settings.enterprise.EnterprisePrivacyFeatureProvider;
-import com.android.tv.settings.enterprise.EnterprisePrivacyFeatureProviderImpl;
-import com.android.tv.settings.enterprise.apps.ApplicationFeatureProvider;
-import com.android.tv.settings.enterprise.apps.ApplicationFeatureProviderImpl;
-import com.android.tv.settings.help.SupportFeatureProvider;
-import com.android.tv.settings.help.SupportFeatureProviderImpl;
-import com.android.tv.settings.startup.StartupVerificationFeatureProvider;
-import com.android.tv.settings.startup.StartupVerificationFeatureProviderImpl;
+import com.android.tv.settings.library.basic.BasicModeFeatureProvider;
+import com.android.tv.settings.library.basic.BasicModeFeatureProviderImpl;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProvider;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProviderImpl;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProviderImpl;
+import com.android.tv.settings.library.help.SupportFeatureProvider;
+import com.android.tv.settings.library.help.SupportFeatureProviderImpl;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProvider;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProviderImpl;
/**
* Default implementation of the feature factory.
@@ -49,54 +49,11 @@
private static final String TAG = "FeatureFactoryImpl";
- private EnterprisePrivacyFeatureProvider mEnterprisePrivacyFeatureProvider;
- private ApplicationFeatureProvider mApplicationFeatureProvider;
-
@Override
public SettingsFragmentProvider getSettingsFragmentProvider() {
return SettingsFragment::newInstance;
}
- @Override
- public SupportFeatureProvider getSupportFeatureProvider() {
- return new SupportFeatureProviderImpl();
- }
-
- @Override
- public BasicModeFeatureProvider getBasicModeFeatureProvider() {
- return new BasicModeFeatureProviderImpl();
- }
-
- @Override
- public StartupVerificationFeatureProvider getStartupVerificationFeatureProvider() {
- return new StartupVerificationFeatureProviderImpl();
- }
-
- @Override
- public EnterprisePrivacyFeatureProvider getEnterprisePrivacyFeatureProvider(Context context) {
- if (mEnterprisePrivacyFeatureProvider == null) {
- final Context appContext = context.getApplicationContext();
- mEnterprisePrivacyFeatureProvider = new EnterprisePrivacyFeatureProviderImpl(appContext,
- appContext.getSystemService(DevicePolicyManager.class),
- appContext.getPackageManager(), UserManager.get(appContext),
- appContext.getSystemService(ConnectivityManager.class),
- appContext.getSystemService(VpnManager.class), appContext.getResources());
- }
- return mEnterprisePrivacyFeatureProvider;
- }
-
- @Override
- public ApplicationFeatureProvider getApplicationFeatureProvider(Context context) {
- if (mApplicationFeatureProvider == null) {
- final Context appContext = context.getApplicationContext();
- mApplicationFeatureProvider = new ApplicationFeatureProviderImpl(appContext,
- appContext.getPackageManager(),
- AppGlobals.getPackageManager(),
- appContext.getSystemService(DevicePolicyManager.class));
- }
- return mApplicationFeatureProvider;
- }
-
/** A settings fragment suitable for displaying in the default (one panel) layout. */
public static class SettingsFragment extends BaseSettingsFragment {
diff --git a/Settings/src/com/android/tv/settings/overlay/FeatureFactoryImplTwoPanel.java b/Settings/src/com/android/tv/settings/overlay/FeatureFactoryImplTwoPanel.java
index 97067ca..87e3dae 100644
--- a/Settings/src/com/android/tv/settings/overlay/FeatureFactoryImplTwoPanel.java
+++ b/Settings/src/com/android/tv/settings/overlay/FeatureFactoryImplTwoPanel.java
@@ -33,16 +33,16 @@
import androidx.preference.PreferenceScreen;
import com.android.tv.settings.SettingsFragmentProvider;
-import com.android.tv.settings.basic.BasicModeFeatureProvider;
-import com.android.tv.settings.basic.BasicModeFeatureProviderImpl;
-import com.android.tv.settings.enterprise.EnterprisePrivacyFeatureProvider;
-import com.android.tv.settings.enterprise.EnterprisePrivacyFeatureProviderImpl;
-import com.android.tv.settings.enterprise.apps.ApplicationFeatureProvider;
-import com.android.tv.settings.enterprise.apps.ApplicationFeatureProviderImpl;
-import com.android.tv.settings.help.SupportFeatureProvider;
-import com.android.tv.settings.help.SupportFeatureProviderImpl;
-import com.android.tv.settings.startup.StartupVerificationFeatureProvider;
-import com.android.tv.settings.startup.StartupVerificationFeatureProviderImpl;
+import com.android.tv.settings.library.basic.BasicModeFeatureProvider;
+import com.android.tv.settings.library.basic.BasicModeFeatureProviderImpl;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProvider;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProviderImpl;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProviderImpl;
+import com.android.tv.settings.library.help.SupportFeatureProvider;
+import com.android.tv.settings.library.help.SupportFeatureProviderImpl;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProvider;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProviderImpl;
import com.android.tv.settings.system.LeanbackPickerDialogFragment;
import com.android.tv.settings.system.LeanbackPickerDialogPreference;
import com.android.tv.twopanelsettings.TwoPanelSettingsFragment;
@@ -53,56 +53,10 @@
protected static final String TAG = "FeatureFactoryImplTwoP";
- private EnterprisePrivacyFeatureProvider mEnterprisePrivacyFeatureProvider;
- private ApplicationFeatureProvider mApplicationFeatureProvider;
-
@Override
public SettingsFragmentProvider getSettingsFragmentProvider() {
return SettingsFragment::newInstance;
}
-
- @Override
- public SupportFeatureProvider getSupportFeatureProvider() {
- return new SupportFeatureProviderImpl();
- }
-
- @Override
- public BasicModeFeatureProvider getBasicModeFeatureProvider() {
- return new BasicModeFeatureProviderImpl();
- }
-
- @Override
- public StartupVerificationFeatureProvider getStartupVerificationFeatureProvider() {
- return new StartupVerificationFeatureProviderImpl();
- }
-
- @Override
- public EnterprisePrivacyFeatureProvider getEnterprisePrivacyFeatureProvider(Context context) {
- if (mEnterprisePrivacyFeatureProvider == null) {
- final Context appContext = context.getApplicationContext();
- mEnterprisePrivacyFeatureProvider = new EnterprisePrivacyFeatureProviderImpl(appContext,
- appContext.getSystemService(DevicePolicyManager.class),
- appContext.getPackageManager(),
- UserManager.get(appContext),
- appContext.getSystemService(ConnectivityManager.class),
- appContext.getSystemService(VpnManager.class),
- appContext.getResources());
- }
- return mEnterprisePrivacyFeatureProvider;
- }
-
- @Override
- public ApplicationFeatureProvider getApplicationFeatureProvider(Context context) {
- if (mApplicationFeatureProvider == null) {
- final Context appContext = context.getApplicationContext();
- mApplicationFeatureProvider = new ApplicationFeatureProviderImpl(appContext,
- appContext.getPackageManager(),
- AppGlobals.getPackageManager(),
- appContext.getSystemService(DevicePolicyManager.class));
- }
- return mApplicationFeatureProvider;
- }
-
/**
* A settings fragment suitable for displaying in the two panel layout. Handles launching
* fragments and dialogs in a reasonably generic way.
diff --git a/Settings/src/com/android/tv/settings/overlay/FeatureFactoryImplX.java b/Settings/src/com/android/tv/settings/overlay/FeatureFactoryImplX.java
index 859d5b9..58a6888 100644
--- a/Settings/src/com/android/tv/settings/overlay/FeatureFactoryImplX.java
+++ b/Settings/src/com/android/tv/settings/overlay/FeatureFactoryImplX.java
@@ -18,24 +18,14 @@
import androidx.annotation.Keep;
-import com.android.tv.settings.basic.BasicModeFeatureProvider;
-import com.android.tv.settings.basic.BasicModeFeatureProviderImplX;
-import com.android.tv.settings.startup.StartupVerificationFeatureProvider;
-import com.android.tv.settings.startup.StartupVerificationFeatureProviderImplX;
+import com.android.tv.settings.library.basic.BasicModeFeatureProvider;
+import com.android.tv.settings.library.basic.BasicModeFeatureProviderImplX;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProvider;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProviderImplX;
/** Implementation of {@FeatureFactory} that can be utilized with resource overlay. */
@Keep
public class FeatureFactoryImplX extends FeatureFactoryImplTwoPanel {
protected static final String TAG = "FeatureFactoryImplX";
-
- @Override
- public BasicModeFeatureProvider getBasicModeFeatureProvider() {
- return new BasicModeFeatureProviderImplX();
- }
-
- @Override
- public StartupVerificationFeatureProvider getStartupVerificationFeatureProvider() {
- return new StartupVerificationFeatureProviderImplX();
- }
}
diff --git a/Settings/src/com/android/tv/settings/privacy/NotificationAccessActivity.java b/Settings/src/com/android/tv/settings/privacy/NotificationAccessActivity.java
index b6e395e..cf5b425 100644
--- a/Settings/src/com/android/tv/settings/privacy/NotificationAccessActivity.java
+++ b/Settings/src/com/android/tv/settings/privacy/NotificationAccessActivity.java
@@ -16,20 +16,20 @@
package com.android.tv.settings.privacy;
-import static com.android.tv.settings.overlay.FlavorUtils.ALL_FLAVORS_MASK;
+import static com.android.tv.settings.library.overlay.FlavorUtils.ALL_FLAVORS_MASK;
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
import com.android.tv.settings.device.apps.specialaccess.NotificationAccess;
-import com.android.tv.settings.overlay.FlavorUtils;
/** The Activity that shows notification access settings UI. */
public class NotificationAccessActivity extends TvSettingsActivity {
@Override
- protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ protected Fragment createSettingsFragment() {
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(NotificationAccess.class.getName(), null);
}
diff --git a/Settings/src/com/android/tv/settings/privacy/PhysicalPrivacyUnblockFragment.java b/Settings/src/com/android/tv/settings/privacy/PhysicalPrivacyUnblockFragment.java
new file mode 100644
index 0000000..c7e6728
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/privacy/PhysicalPrivacyUnblockFragment.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.privacy;
+
+import static android.hardware.SensorPrivacyManager.TOGGLE_TYPE_HARDWARE;
+
+import android.content.Context;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
+import android.hardware.SensorPrivacyManager;
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.Keep;
+import androidx.fragment.app.FragmentActivity;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.SettingsPreferenceFragment;
+
+
+/**
+ * A fragment that shows info on how to unblock sensors blocked by a physical privacy switch.
+ * Dismisses itself when physical privacy is disabled.
+ */
+@Keep
+public class PhysicalPrivacyUnblockFragment extends SettingsPreferenceFragment {
+ public static final String TOGGLE_EXTRA = "toggle";
+
+ private PrivacyToggle mToggle;
+ private SensorPrivacyManager mSensorPrivacyManager;
+ private final SensorPrivacyManager.OnSensorPrivacyChangedListener mPrivacyChangedListener =
+ (sensor, enabled) -> updateSensorPrivacyState();
+ private Preference mImagePreference;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ mSensorPrivacyManager = (SensorPrivacyManager)
+ getContext().getSystemService(Context.SENSOR_PRIVACY_SERVICE);
+
+ mToggle = (PrivacyToggle) getArguments().get(TOGGLE_EXTRA);
+ if (mToggle == null) {
+ throw new IllegalArgumentException("PrivacyToggle extra missing");
+ }
+
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ if (mImagePreference != null) {
+ Drawable image = mImagePreference.getIcon();
+ if (image instanceof Animatable) {
+ ((Animatable) image).start();
+ }
+ }
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ mSensorPrivacyManager.addSensorPrivacyListener(mToggle.sensor,
+ mPrivacyChangedListener);
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ Context themedContext = getPreferenceManager().getContext();
+ PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(themedContext);
+
+ screen.setTitle(mToggle.physicalPrivacyEnabledInfoTitle);
+
+ mImagePreference = new Preference(themedContext);
+ mImagePreference.setLayoutResource(R.layout.image_preference);
+ mImagePreference.setIcon(mToggle.physicalPrivacyEnabledInfoPanelImage);
+ mImagePreference.setSelectable(false);
+ screen.addPreference(mImagePreference);
+
+ Preference preference = new Preference(themedContext);
+ preference.setSummary(mToggle.physicalPrivacyEnabledInfoPanelText);
+ screen.addPreference(preference);
+
+ updateSensorPrivacyState();
+
+ setPreferenceScreen(screen);
+ }
+
+ private void updateSensorPrivacyState() {
+ boolean physicalPrivacyEnabled = mSensorPrivacyManager.isSensorPrivacyEnabled(
+ TOGGLE_TYPE_HARDWARE, mToggle.sensor);
+ if (!physicalPrivacyEnabled) {
+ FragmentActivity activity = getActivity();
+ if (isResumed() && !getParentFragmentManager().popBackStackImmediate()
+ && activity != null) {
+ activity.onBackPressed();
+ }
+ }
+ }
+
+ @Override
+ public void onDestroyView() {
+ mSensorPrivacyManager.removeSensorPrivacyListener(mToggle.sensor, mPrivacyChangedListener);
+ super.onDestroyView();
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/privacy/PhysicalPrivacyUnblockInfoFragment.java b/Settings/src/com/android/tv/settings/privacy/PhysicalPrivacyUnblockInfoFragment.java
new file mode 100644
index 0000000..a006c4c
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/privacy/PhysicalPrivacyUnblockInfoFragment.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.privacy;
+
+import android.content.Context;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
+
+import com.android.tv.settings.R;
+import com.android.tv.twopanelsettings.slices.InfoFragment;
+
+
+/**
+ * A {@link InfoFragment} that hosts the preview pane of the physical privacy enabled info box when
+ * it is focused.
+ */
+@Keep
+public class PhysicalPrivacyUnblockInfoFragment extends InfoFragment {
+
+ private static final String TAG = "PhysicalPrivacyUnblockInfoFragment";
+ public static final String TOGGLE_EXTRA = "toggle";
+
+ private PrivacyToggle mToggle;
+
+ @Override
+ public void onAttach(@NonNull Context context) {
+ super.onAttach(context);
+ mToggle = (PrivacyToggle) getArguments().get(TOGGLE_EXTRA);
+ if (mToggle == null) {
+ Log.e(TAG, "toggle not set as an extra");
+ }
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+
+ View view = super.onCreateView(inflater, container, savedInstanceState);
+
+ ImageView infoImage = view.findViewById(R.id.info_image);
+ infoImage.setImageResource(mToggle.physicalPrivacyEnabledInfoPanelImage);
+
+ ImageView icon = view.findViewById(R.id.info_title_icon);
+ icon.setImageResource(R.drawable.ic_info_outline_base);
+ icon.setVisibility(View.VISIBLE);
+
+ TextView titleView = view.findViewById(R.id.info_title);
+ titleView.setVisibility(View.VISIBLE);
+ titleView.setText(mToggle.physicalPrivacyEnabledInfoTitle);
+
+ TextView infoSummary = view.findViewById(R.id.info_summary);
+ infoSummary.setText(mToggle.physicalPrivacyEnabledInfoPanelText);
+
+ return view;
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+
+ ImageView infoImage = getView().findViewById(R.id.info_image);
+ if (infoImage != null) {
+ Drawable image = infoImage.getDrawable();
+ if (image instanceof Animatable) {
+ ((Animatable) image).start();
+ }
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/privacy/PrivacyFragment.java b/Settings/src/com/android/tv/settings/privacy/PrivacyFragment.java
index 04b6d29..44c961a 100644
--- a/Settings/src/com/android/tv/settings/privacy/PrivacyFragment.java
+++ b/Settings/src/com/android/tv/settings/privacy/PrivacyFragment.java
@@ -16,8 +16,8 @@
package com.android.tv.settings.privacy;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_VENDOR;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_X;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_VENDOR;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_X;
import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
import android.app.tvsettings.TvSettingsEnums;
@@ -31,8 +31,8 @@
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
-import com.android.tv.settings.util.SliceUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.SliceUtils;
import com.android.tv.twopanelsettings.slices.CustomContentDescriptionPreference;
import com.android.tv.twopanelsettings.slices.SlicePreference;
@@ -51,6 +51,7 @@
private static final String KEY_MIC = "microphone";
private static final String KEY_CAMERA = "camera";
private static final String KEY_UPDATE = "update";
+ private static final String TOP_LEVEL_SLICE_URI = "top_level_settings_slice_uri";
private int getPreferenceScreenResId() {
switch (FlavorUtils.getFlavor(getContext())) {
@@ -129,7 +130,9 @@
@Nullable Preference overlaySecuritySlicePreference) {
return overlaySecuritySlicePreference instanceof SlicePreference
&& SliceUtils.isSettingsSliceEnabled(
- getContext(), ((SlicePreference) overlaySecuritySlicePreference).getUri());
+ getContext(),
+ ((SlicePreference) overlaySecuritySlicePreference).getUri(),
+ TOP_LEVEL_SLICE_URI);
}
private void showOverlaySecuritySlicePreference(
@@ -158,7 +161,9 @@
@Nullable Preference updateSlicePreference) {
return updateSlicePreference instanceof SlicePreference
&& SliceUtils.isSettingsSliceEnabled(
- getContext(), ((SlicePreference) updateSlicePreference).getUri());
+ getContext(),
+ ((SlicePreference) updateSlicePreference).getUri(),
+ TOP_LEVEL_SLICE_URI);
}
@Override
diff --git a/Settings/src/com/android/tv/settings/privacy/PrivacyFragmentCompat.java b/Settings/src/com/android/tv/settings/privacy/PrivacyFragmentCompat.java
new file mode 100644
index 0000000..bc6d9d2
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/privacy/PrivacyFragmentCompat.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.tv.settings.privacy;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_PRIVACY;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+
+/**
+ * The fragment compat for privacy policies screen in Settings.
+ */
+@Keep
+public class PrivacyFragmentCompat extends PreferenceControllerFragmentCompat {
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ setPreferencesFromResource(R.xml.privacy_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_PRIVACY;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/privacy/PrivacyToggle.java b/Settings/src/com/android/tv/settings/privacy/PrivacyToggle.java
index 3e2f1c3..4a985a3 100644
--- a/Settings/src/com/android/tv/settings/privacy/PrivacyToggle.java
+++ b/Settings/src/com/android/tv/settings/privacy/PrivacyToggle.java
@@ -16,7 +16,9 @@
package com.android.tv.settings.privacy;
+import android.annotation.DrawableRes;
import android.annotation.Nullable;
+import android.annotation.StringRes;
import android.app.AppOpsManager;
import android.content.Context;
import android.hardware.SensorPrivacyManager;
@@ -33,6 +35,11 @@
R.string.camera_toggle_title,
R.string.camera_toggle_info_title,
R.string.camera_toggle_info_content,
+ R.string.camera_physical_privacy_enabled_title,
+ R.string.camera_physical_privacy_enabled_text,
+ R.drawable.ic_camera_off_base,
+ R.drawable.camera_physical_privacy_enabled_panel_image,
+ R.string.camera_physical_privacy_enabled_panel_text,
R.string.open_camera_permissions,
"android.permission-group.CAMERA",
SensorPrivacyManager.Sensors.CAMERA,
@@ -45,6 +52,11 @@
R.string.mic_toggle_title,
R.string.mic_toggle_info_title,
R.string.mic_toggle_info_content,
+ R.string.microphone_physical_privacy_enabled_title,
+ R.string.microphone_physical_privacy_enabled_text,
+ R.drawable.ic_mic_off_base,
+ R.drawable.microphone_physical_privacy_enabled_panel_image,
+ R.string.microphone_physical_privacy_enabled_panel_text,
R.string.open_mic_permissions,
"android.permission-group.MICROPHONE",
SensorPrivacyManager.Sensors.MICROPHONE,
@@ -52,24 +64,52 @@
"mic_toggle_enabled"
);
+ @StringRes
public final int screenTitle;
+ @StringRes
public final int toggleTitle;
+ @StringRes
public final int toggleInfoTitle;
+ @StringRes
public final int toggleInfoText;
+ @StringRes
public final int appPermissionsTitle;
+ @StringRes
+ public final int physicalPrivacyEnabledInfoTitle;
+ @StringRes
+ public final int physicalPrivacyEnabledInfoText;
+ @DrawableRes
+ public final int physicalPrivacyEnabledIcon;
+ @DrawableRes
+ public final int physicalPrivacyEnabledInfoPanelImage;
+ @StringRes
+ public final int physicalPrivacyEnabledInfoPanelText;
+
public final String permissionsGroupName;
@Sensor
public final int sensor;
public final int[] appOps;
public final String deviceConfigName;
- PrivacyToggle(int screenTitle, int toggleTitle, int toggleInfoTitle, int toggleInfoText,
- int appPermissionsTitle, String permissionsGroupName, @Sensor int sensor, int[] appOps,
+
+ PrivacyToggle(@StringRes int screenTitle, @StringRes int toggleTitle,
+ @StringRes int toggleInfoTitle, @StringRes int toggleInfoText,
+ @StringRes int physicalPrivacyEnabledInfoTitle,
+ @StringRes int physicalPrivacyEnabledInfoText,
+ @DrawableRes int physicalPrivacyEnabledIcon,
+ @DrawableRes int physicalPrivacyEnabledInfoPanelImage,
+ @StringRes int physicalPrivacyEnabledInfoPanelText, @StringRes int appPermissionsTitle,
+ String permissionsGroupName, @Sensor int sensor, int[] appOps,
String deviceConfigName) {
this.screenTitle = screenTitle;
this.toggleTitle = toggleTitle;
this.toggleInfoTitle = toggleInfoTitle;
this.toggleInfoText = toggleInfoText;
+ this.physicalPrivacyEnabledInfoTitle = physicalPrivacyEnabledInfoTitle;
+ this.physicalPrivacyEnabledInfoText = physicalPrivacyEnabledInfoText;
+ this.physicalPrivacyEnabledIcon = physicalPrivacyEnabledIcon;
+ this.physicalPrivacyEnabledInfoPanelImage = physicalPrivacyEnabledInfoPanelImage;
+ this.physicalPrivacyEnabledInfoPanelText = physicalPrivacyEnabledInfoPanelText;
this.appPermissionsTitle = appPermissionsTitle;
this.permissionsGroupName = permissionsGroupName;
this.sensor = sensor;
diff --git a/Settings/src/com/android/tv/settings/privacy/SensorFragment.java b/Settings/src/com/android/tv/settings/privacy/SensorFragment.java
index 63f8bd1..6a22a03 100644
--- a/Settings/src/com/android/tv/settings/privacy/SensorFragment.java
+++ b/Settings/src/com/android/tv/settings/privacy/SensorFragment.java
@@ -17,23 +17,33 @@
package com.android.tv.settings.privacy;
import static android.hardware.SensorPrivacyManager.Sources.SETTINGS;
+import static android.hardware.SensorPrivacyManager.TOGGLE_TYPE_HARDWARE;
+import static android.hardware.SensorPrivacyManager.TOGGLE_TYPE_SOFTWARE;
+
+import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_CLASSIC;
import android.content.Context;
import android.content.Intent;
import android.hardware.SensorPrivacyManager;
import android.os.Bundle;
import android.util.Log;
+import android.view.View;
+import android.view.ViewTreeObserver;
import androidx.annotation.Keep;
+import androidx.leanback.widget.VerticalGridView;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceGroupAdapter;
+import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
import com.android.tv.settings.device.apps.AppManagementFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.privacy.RecentlyAccessedByUtils;
import java.util.ArrayList;
import java.util.List;
@@ -56,14 +66,11 @@
private static final String SENSOR_TOGGLE_KEY = "sensor_toggle";
private PrivacyToggle mToggle;
private SwitchPreference mSensorToggle;
+ private Preference mPhysicalPrivacyEnabledInfo;
private SensorPrivacyManager mSensorPrivacyManager;
private final SensorPrivacyManager.OnSensorPrivacyChangedListener mPrivacyChangedListener =
- (sensor, enabled) -> {
- if (mSensorToggle != null) {
- mSensorToggle.setChecked(!enabled);
- }
- };
+ (sensor, enabled) -> updateSensorPrivacyState();
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -75,9 +82,17 @@
throw new IllegalArgumentException("PrivacyToggle extra missing");
}
- // Calling super at the end, otherwise mSensorPrivacyManager and mToggle are not initialized
- // during onCreatePreferences.
super.onCreate(savedInstanceState);
+ getPreferenceManager().setPreferenceComparisonCallback(
+ new PreferenceManager.SimplePreferenceComparisonCallback());
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ mSensorPrivacyManager.addSensorPrivacyListener(mToggle.sensor,
+ mPrivacyChangedListener);
+ updateSensorPrivacyState();
}
@Override
@@ -87,13 +102,39 @@
screen.setTitle(mToggle.screenTitle);
+ addPhysicalPrivacyEnabledInfo(screen, themedContext);
addSensorToggleWithInfo(screen, themedContext);
addRecentAppsGroup(screen, themedContext);
addPermissionControllerPreference(screen, themedContext);
+ updateSensorPrivacyState();
setPreferenceScreen(screen);
}
+ private void addPhysicalPrivacyEnabledInfo(PreferenceScreen screen, Context themedContext) {
+ mPhysicalPrivacyEnabledInfo = new Preference(themedContext);
+ mPhysicalPrivacyEnabledInfo.setLayoutResource(
+ R.layout.sensor_physical_privacy_enabled_info);
+ mPhysicalPrivacyEnabledInfo.setSelectable(true);
+ mPhysicalPrivacyEnabledInfo.setTitle(mToggle.physicalPrivacyEnabledInfoTitle);
+ mPhysicalPrivacyEnabledInfo.setSummary(mToggle.physicalPrivacyEnabledInfoText);
+ mPhysicalPrivacyEnabledInfo.setIcon(mToggle.physicalPrivacyEnabledIcon);
+
+ // Use InfoFragment when using 2-panel settings
+ if (FlavorUtils.getFlavor(getContext()) == FLAVOR_CLASSIC) {
+ mPhysicalPrivacyEnabledInfo.setFragment(PhysicalPrivacyUnblockFragment.class.getName());
+ mPhysicalPrivacyEnabledInfo.getExtras().putObject(
+ PhysicalPrivacyUnblockFragment.TOGGLE_EXTRA, mToggle);
+ } else {
+ mPhysicalPrivacyEnabledInfo.setFragment(
+ PhysicalPrivacyUnblockInfoFragment.class.getName());
+ mPhysicalPrivacyEnabledInfo.getExtras().putObject(
+ PhysicalPrivacyUnblockInfoFragment.TOGGLE_EXTRA, mToggle);
+ }
+
+ screen.addPreference(mPhysicalPrivacyEnabledInfo);
+ }
+
/**
* Adds the sensor toggle with an InfoFragment (in two-panel mode) or an info text below (in
* one-panel mode).
@@ -107,22 +148,58 @@
mSensorToggle.setFragment(SensorToggleInfoFragment.class.getName());
mSensorToggle.getExtras().putObject(SensorToggleInfoFragment.TOGGLE_EXTRA, mToggle);
- // If privacy is enabled, the sensor access is turned off
- mSensorToggle.setChecked(
- !mSensorPrivacyManager.isSensorPrivacyEnabled(mToggle.sensor));
- mSensorPrivacyManager.addSensorPrivacyListener(mToggle.sensor,
- mPrivacyChangedListener);
-
if (!FlavorUtils.isTwoPanel(themedContext)) {
// Show the toggle info text beneath instead.
Preference toggleInfo = new Preference(themedContext);
- toggleInfo.setLayoutResource(R.xml.sensor_toggle_info);
+ toggleInfo.setLayoutResource(R.layout.sensor_toggle_info);
toggleInfo.setSummary(mToggle.toggleInfoText);
toggleInfo.setSelectable(false);
screen.addPreference(toggleInfo);
}
}
+ private void updateSensorPrivacyState() {
+ boolean softwarePrivacyEnabled = mSensorPrivacyManager.isSensorPrivacyEnabled(
+ TOGGLE_TYPE_SOFTWARE, mToggle.sensor);
+ boolean physicalPrivacyEnabled = mSensorPrivacyManager.isSensorPrivacyEnabled(
+ TOGGLE_TYPE_HARDWARE, mToggle.sensor);
+
+ if (DEBUG) {
+ Log.v(TAG,
+ "softwarePrivacyEnabled=" + softwarePrivacyEnabled + ", physicalPrivacyEnabled="
+ + physicalPrivacyEnabled);
+ }
+ // If privacy is enabled, the sensor access is turned off
+ mSensorToggle.setChecked(!softwarePrivacyEnabled && !physicalPrivacyEnabled);
+ mSensorToggle.setEnabled(!physicalPrivacyEnabled);
+ mPhysicalPrivacyEnabledInfo.setVisible(physicalPrivacyEnabled);
+
+ if (physicalPrivacyEnabled) {
+ selectPreference(mPhysicalPrivacyEnabledInfo);
+ }
+ }
+
+ private void selectPreference(Preference preference) {
+ scrollToPreference(preference);
+ if (getListView() instanceof VerticalGridView) {
+ VerticalGridView listView = (VerticalGridView) getListView();
+ PreferenceGroupAdapter adapter = (PreferenceGroupAdapter) (listView.getAdapter());
+
+ ViewTreeObserver.OnPreDrawListener listener = new ViewTreeObserver.OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ listView.post(() -> {
+ int position = adapter.getPreferenceAdapterPosition(preference);
+ listView.setSelectedPositionSmooth(position);
+ });
+ listView.getViewTreeObserver().removeOnPreDrawListener(this);
+ return true;
+ }
+ };
+ listView.getViewTreeObserver().addOnPreDrawListener(listener);
+ }
+ }
+
/**
* Adds section that shows an expandable list of apps that have recently accessed the sensor.
*/
@@ -189,16 +266,21 @@
}
@Override
- public void onDestroy() {
+ public void onDestroyView() {
mSensorPrivacyManager.removeSensorPrivacyListener(mToggle.sensor, mPrivacyChangedListener);
- super.onDestroy();
+ super.onDestroyView();
}
@Override
public boolean onPreferenceTreeClick(Preference preference) {
if (SENSOR_TOGGLE_KEY.equals(preference.getKey())) {
- mSensorPrivacyManager.setSensorPrivacy(SETTINGS, mToggle.sensor,
- !mSensorToggle.isChecked());
+ boolean physicalPrivacyEnabled = mSensorPrivacyManager.isSensorPrivacyEnabled(
+ TOGGLE_TYPE_HARDWARE, mToggle.sensor);
+ if (!physicalPrivacyEnabled) {
+ mSensorPrivacyManager.setSensorPrivacy(SETTINGS, mToggle.sensor,
+ !mSensorToggle.isChecked());
+ }
+ updateSensorPrivacyState();
return true;
}
return super.onPreferenceTreeClick(preference);
diff --git a/Settings/src/com/android/tv/settings/privacy/SensorFragmentCompat.java b/Settings/src/com/android/tv/settings/privacy/SensorFragmentCompat.java
new file mode 100644
index 0000000..c5b5407
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/privacy/SensorFragmentCompat.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.tv.settings.privacy;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_SENSOR;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.compat.TsCollapsibleCategory;
+import com.android.tv.settings.library.PreferenceCompat;
+
+/**
+ * The fragment compat for the microphone/camera settings screen in TV settings.
+ * Allows the user to turn of the respective sensor.
+ */
+@Keep
+public class SensorFragmentCompat extends PreferenceControllerFragmentCompat {
+ private static final String KEY_RECENT_REQUESTS = "recent_requests";
+ private static final String KEY_COLLAPSE = "collapse";
+ private Preference mCollapsePref;
+ private Preference mRecentQuestsCategory;
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ setPreferencesFromResource(R.xml.sensor_compat, null);
+ mCollapsePref = findTargetPreference(new String[]{KEY_COLLAPSE});
+ mRecentQuestsCategory = findTargetPreference(new String[]{KEY_RECENT_REQUESTS});
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateCollapsePref();
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat prefCompat) {
+ super.updatePref(prefCompat);
+ if (prefCompat.getKey().length == 1
+ && prefCompat.getKey()[0].equals(KEY_RECENT_REQUESTS)
+ && prefCompat.getChildPrefCompats() != null) {
+ RenderUtil.updatePreferenceGroup(
+ ((PreferenceGroup) findPreference(prefCompat.getKey()[0])),
+ prefCompat.getChildPrefCompats());
+ updateCollapsePref();
+ }
+ return null;
+ }
+
+ private void updateCollapsePref() {
+ // Once user click "See all", collapse preference should be hidden, this behavior is
+ // different from "See all networks" in Wi-Fi settings screen.
+ if (mCollapsePref != null) {
+ mCollapsePref.setVisible(mRecentQuestsCategory instanceof TsCollapsibleCategory
+ && mRecentQuestsCategory.isVisible()
+ && ((TsCollapsibleCategory) mRecentQuestsCategory).shouldShowCollapsePref()
+ && ((TsCollapsibleCategory) mRecentQuestsCategory).isCollapsed());
+ }
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference) {
+ if (preference.getKey() != null && preference.getKey().equals(KEY_COLLAPSE)) {
+ final boolean collapse = !((TsCollapsibleCategory) mRecentQuestsCategory).isCollapsed();
+ ((TsCollapsibleCategory) mRecentQuestsCategory).setCollapsed(collapse);
+ mCollapsePref.setVisible(false);
+ return true;
+ }
+ return super.onPreferenceTreeClick(preference);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_SENSOR;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/privacy/SensorToggleActivity.java b/Settings/src/com/android/tv/settings/privacy/SensorToggleActivity.java
index ba7b9f7..19a1314 100644
--- a/Settings/src/com/android/tv/settings/privacy/SensorToggleActivity.java
+++ b/Settings/src/com/android/tv/settings/privacy/SensorToggleActivity.java
@@ -22,7 +22,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
/**
* Activity allowing microphone/camera privacy management.
@@ -57,7 +56,8 @@
Bundle args = new Bundle();
args.putObject(SensorFragment.TOGGLE_EXTRA, toggle);
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(SensorFragment.class.getName(), args);
}
diff --git a/Settings/src/com/android/tv/settings/privacy/SensorToggleInfoFragment.java b/Settings/src/com/android/tv/settings/privacy/SensorToggleInfoFragment.java
index 3531856..625a3c3 100644
--- a/Settings/src/com/android/tv/settings/privacy/SensorToggleInfoFragment.java
+++ b/Settings/src/com/android/tv/settings/privacy/SensorToggleInfoFragment.java
@@ -16,6 +16,9 @@
package com.android.tv.settings.privacy;
+import static android.hardware.SensorPrivacyManager.TOGGLE_TYPE_HARDWARE;
+import static android.hardware.SensorPrivacyManager.TOGGLE_TYPE_SOFTWARE;
+
import android.content.Context;
import android.hardware.SensorPrivacyManager;
import android.os.Bundle;
@@ -34,7 +37,7 @@
/**
- * An {@InfoFragment} that hosts preview pane of the sensor fragment when the toggle is
+ * A {@link InfoFragment} that hosts the preview pane of the sensor fragment when the toggle is
* focused.
*/
@Keep
@@ -49,7 +52,7 @@
private PrivacyToggle mToggle;
private final SensorPrivacyManager.OnSensorPrivacyChangedListener mPrivacyChangedListener =
- (sensor, enabled) -> updateTitle(!enabled);
+ (sensor, enabled) -> updateTitle();
@Override
public void onAttach(@NonNull Context context) {
@@ -80,21 +83,31 @@
mTitleView = view.findViewById(R.id.info_title);
mTitleView.setVisibility(View.VISIBLE);
- updateTitle(!mSensorPrivacyManager.isSensorPrivacyEnabled(mToggle.sensor));
+ updateTitle();
mSensorPrivacyManager.addSensorPrivacyListener(mToggle.sensor,
mPrivacyChangedListener);
return view;
}
- private void updateTitle(boolean enabled) {
+ private void updateTitle() {
+ if (mTitleView == null) {
+ return;
+ }
+
+ boolean softwarePrivacyEnabled = mSensorPrivacyManager.isSensorPrivacyEnabled(
+ TOGGLE_TYPE_SOFTWARE, mToggle.sensor);
+ boolean physicalPrivacyEnabled = mSensorPrivacyManager.isSensorPrivacyEnabled(
+ TOGGLE_TYPE_HARDWARE, mToggle.sensor);
+ boolean accessAllowed = !softwarePrivacyEnabled && !physicalPrivacyEnabled;
String toggleState = getString(
- enabled ? R.string.sensor_toggle_info_on : R.string.sensor_toggle_info_off);
+ accessAllowed ? R.string.sensor_toggle_info_on : R.string.sensor_toggle_info_off);
mTitleView.setText(getString(mToggle.toggleInfoTitle, toggleState));
}
@Override
public void onDestroyView() {
mSensorPrivacyManager.removeSensorPrivacyListener(mToggle.sensor, mPrivacyChangedListener);
+ mTitleView = null;
super.onDestroyView();
}
}
diff --git a/Settings/src/com/android/tv/settings/service/ISettingsService.aidl b/Settings/src/com/android/tv/settings/service/ISettingsService.aidl
deleted file mode 100644
index c0a2a13..0000000
--- a/Settings/src/com/android/tv/settings/service/ISettingsService.aidl
+++ /dev/null
@@ -1,36 +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.tv.settings.service;
-
-import com.android.tv.settings.service.ISettingsServiceListener;
-import com.android.tv.settings.service.PreferenceParcelable;
-import android.os.Bundle;
-
-interface ISettingsService {
- List<PreferenceParcelable> getPreferences(int state);
- PreferenceParcelable getPreference(int state, String key);
- void registerListener(ISettingsServiceListener listener);
- void unRegisterListener(ISettingsServiceListener listener);
- void onCreate(int state, in Bundle extras);
- void onStart(int state);
- void onResume(int state);
- void onPause(int state);
- void onStop(int state);
- void onDestroy(int state);
- void onPreferenceClick(int state, String key, boolean status);
- void grantSliceAccess(String packageName, String uri);
-}
\ No newline at end of file
diff --git a/Settings/src/com/android/tv/settings/service/ISettingsServiceListener.aidl b/Settings/src/com/android/tv/settings/service/ISettingsServiceListener.aidl
deleted file mode 100644
index 989f522..0000000
--- a/Settings/src/com/android/tv/settings/service/ISettingsServiceListener.aidl
+++ /dev/null
@@ -1,24 +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.tv.settings.service;
-
-import com.android.tv.settings.service.PreferenceParcelable;
-interface ISettingsServiceListener {
- void notifyUpdate(int state, in PreferenceParcelable preferenceParcelable);
- void notifyUpdateAll(int state, in List<PreferenceParcelable> preferences);
- void notifyUpdateScreenTitle(int state, String title);
-}
\ No newline at end of file
diff --git a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.java b/Settings/src/com/android/tv/settings/service/PreferenceParcelable.java
deleted file mode 100644
index b17f278..0000000
--- a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.java
+++ /dev/null
@@ -1,295 +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.tv.settings.service;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.util.ArrayMap;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-public class PreferenceParcelable implements Parcelable {
- public static final byte TYPE_RPEFERENCE = 0;
- public static final byte TYPE_PREFERENCE_CATEGORY = 1;
- public static final byte TYPE_PREFERENCE_ACCESS_POINT = 2;
- public static final byte TYPE_PREFERENCE_WIFI_COLLAPSE_CATEGORY = 3;
-
- private final String[] key;
- private String title;
- private String summary;
- private String contentDescription;
- private Bundle extras;
- private Intent intent;
-
- // 0 : preference, 1 : preferenceCategory, 2 : AccessPointPreference
- private byte type;
-
- // Provide extra information for particular type
- private Map<String, String> infoMap;
-
- // 0 : not updated, 1 : unchecked, 2 : checked
- private byte checked;
-
- // 0 : not updated, 1 : ininvisble, 2: visible
- private byte visible;
- private List<PreferenceParcelable> childPrefParcelables;
-
- public List<PreferenceParcelable> getChildPreferences() {
- return childPrefParcelables;
- }
-
- public void setChildPrefParcelables(
- List<PreferenceParcelable> childPrefParcelables) {
- this.childPrefParcelables = childPrefParcelables;
- }
-
- public List<PreferenceParcelable> getChildPrefParcelables() {
- if (childPrefParcelables == null) {
- childPrefParcelables = new ArrayList<>();
- }
- return childPrefParcelables;
- }
-
- public PreferenceParcelable(String key) {
- this.key = new String[]{key};
- }
-
- public PreferenceParcelable(String[] key) {
- this.key = key;
- }
-
- public PreferenceParcelable(String[] key, String title) {
- this.key = key;
- this.title = title;
- }
-
- public PreferenceParcelable(String[] key, String title, String summary) {
- this(key, title);
- this.summary = summary;
- }
-
- public String[] getKey() {
- return key;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public String getSummary() {
- return summary;
- }
-
- public void setSummary(String summary) {
- this.summary = summary;
- }
-
-
- public String getContentDescription() {
- return contentDescription;
- }
-
- public int getType() {
- return type;
- }
-
- public void setType(byte type) {
- this.type = type;
- }
-
- public Map<String, String> getInfoMap() {
- if (infoMap == null) {
- infoMap = new ArrayMap<>();
- }
- return infoMap;
- }
-
- public void setInfoMap(Map<String, String> info) {
- this.infoMap = info;
- }
-
- public void addInfo(String key, String value) {
- if (infoMap == null) {
- infoMap = new ArrayMap<>();
- }
- infoMap.put(key, value);
- }
-
- public String getInfo(String key) {
- if (infoMap == null || !infoMap.containsKey(key)) {
- return null;
- }
- return infoMap.get(key);
- }
-
-
- public void setContentDescription(String contentDescription) {
- this.contentDescription = contentDescription;
- }
-
- public byte getChecked() {
- return checked;
- }
-
- public void setChecked(byte checked) {
- this.checked = checked;
- }
-
- public void setChecked(boolean checked) {
- setChecked(ServiceUtil.getChecked(checked));
- }
-
- public void setVisible(boolean visible) {
- setVisible(ServiceUtil.getVisible(visible));
- }
-
- public byte getVisible() {
- return visible;
- }
-
- public void setVisible(byte visible) {
- this.visible = visible;
- }
-
- public Bundle getExtras() {
- return extras;
- }
-
- public void setExtras(Bundle extras) {
- this.extras = extras;
- }
-
- public Intent getIntent() {
- return intent;
- }
-
- public void setIntent(Intent intent) {
- this.intent = intent;
- }
-
- public void initChildPreferences() {
- childPrefParcelables = new ArrayList<>();
- }
-
- public void addChildPrefParcelable(PreferenceParcelable childPrefParcelable) {
- if (childPrefParcelables == null) {
- childPrefParcelables = new ArrayList<>();
- }
- childPrefParcelables.add(childPrefParcelable);
- }
-
- @Override
- public String toString() {
- return "PreferenceParcelable{" +
- "key='" + Arrays.toString(key) + '\'' +
- ", title='" + title + '\'' +
- ", summary='" + summary + '\'' +
- ", contentDescription='" + contentDescription + '\'' +
- ", type=" + type +
- ", extras=" + extras +
- ", intent=" + intent +
- ", infoMap=" + infoMap +
- ", checked=" + checked +
- ", visible=" + visible +
- ", childPrefParcelables=" + childPrefParcelables +
- '}';
- }
-
- public PreferenceParcelable immutableCopy() {
- PreferenceParcelable copy = new PreferenceParcelable(Arrays.copyOf(key, key.length));
- copy.setTitle(title);
- copy.setSummary(summary);
- copy.setType(type);
- copy.setChecked(checked);
- copy.setVisible(visible);
- copy.setContentDescription(contentDescription);
- if (extras != null) {
- copy.setExtras(new Bundle(extras));
- }
- if (intent != null) {
- copy.setIntent(new Intent(intent));
- }
- Map<String, String> infoMapCopy = new ArrayMap<>();
- if (infoMap != null) {
- infoMapCopy.putAll(infoMap);
- }
- copy.setInfoMap(infoMapCopy);
- if (childPrefParcelables != null) {
- copy.setChildPrefParcelables(childPrefParcelables.stream()
- .map(PreferenceParcelable::immutableCopy).collect(Collectors.toList()));
- }
- return copy;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeStringArray(key);
- dest.writeString(title);
- dest.writeString(summary);
- dest.writeString(contentDescription);
- dest.writeByte(checked);
- dest.writeByte(visible);
- dest.writeByte(type);
- dest.writeBundle(extras);
- dest.writeParcelable(intent, flags);
- dest.writeMap(infoMap);
- dest.writeParcelableList(childPrefParcelables, flags);
- }
-
- public static final Creator<PreferenceParcelable> CREATOR =
- new Creator<PreferenceParcelable>() {
- @Override
- public PreferenceParcelable createFromParcel(Parcel source) {
- PreferenceParcelable preferenceParcelable = new PreferenceParcelable(
- source.createStringArray());
- preferenceParcelable.setTitle(source.readString());
- preferenceParcelable.setSummary(source.readString());
- preferenceParcelable.setContentDescription(source.readString());
- preferenceParcelable.setChecked(source.readByte());
- preferenceParcelable.setVisible(source.readByte());
- preferenceParcelable.setType(source.readByte());
- preferenceParcelable.setExtras(source.readBundle());
- preferenceParcelable.setIntent(
- source.readParcelable(Intent.class.getClassLoader()));
- source.readMap(preferenceParcelable.getInfoMap(), Map.class.getClassLoader());
- source.readParcelableList(
- preferenceParcelable.getChildPrefParcelables(),
- PreferenceParcelable.class.getClassLoader());
- return preferenceParcelable;
- }
-
- @Override
- public PreferenceParcelable[] newArray(int size) {
- return new PreferenceParcelable[size];
- }
- };
-}
\ No newline at end of file
diff --git a/Settings/src/com/android/tv/settings/service/ServiceUtil.java b/Settings/src/com/android/tv/settings/service/ServiceUtil.java
deleted file mode 100644
index 4571846..0000000
--- a/Settings/src/com/android/tv/settings/service/ServiceUtil.java
+++ /dev/null
@@ -1,45 +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.tv.settings.service;
-
-public final class ServiceUtil {
- public static final int STATE_NETWORK_MAIN = 0;
- public static final int STATE_WIFI_DETAILS = 1;
-
- public static final String INFO_INTENT = "intent";
- public static final String INFO_NEXT_STATE = "next_state";
- public static final String INFO_WIFI_SIGNAL_LEVEL = "wifi_signal_level";
- public static final String INFO_COLLAPSE = "collapse";
-
- private ServiceUtil() {}
-
- static byte getChecked(boolean checked) {
- return checked ? (byte) 2 : (byte) 1;
- }
-
- static byte getVisible(boolean visible) {
- return visible ? (byte) 2 : (byte) 1;
- }
-
- static boolean isChecked(PreferenceParcelable pref) {
- return pref.getChecked() == 2 ? true : false;
- }
-
- static boolean isVisible(PreferenceParcelable pref) {
- return pref.getVisible() == 2 ? true : false;
- }
-}
diff --git a/Settings/src/com/android/tv/settings/service/SettingsService.java b/Settings/src/com/android/tv/settings/service/SettingsService.java
deleted file mode 100644
index 1db7b3c..0000000
--- a/Settings/src/com/android/tv/settings/service/SettingsService.java
+++ /dev/null
@@ -1,187 +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.tv.settings.service;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.util.Pair;
-
-import androidx.annotation.Nullable;
-
-import com.android.tv.settings.service.ISettingsService;
-import com.android.tv.settings.service.ISettingsServiceListener;
-import com.android.tv.settings.service.data.State;
-import com.android.tv.settings.service.data.StateUtil;
-import com.android.tv.twopanelsettings.slices.ContextSingleton;
-
-import java.util.List;
-
-public class SettingsService extends Service {
- private static final String TAG = "TvSettingsService";
- private static final boolean DEBUG = true;
- private final Handler mHandler = new Handler();
- private final ArrayMap<Integer, Pair<State, Integer>> mStateMap = new ArrayMap<>();
-
- private ISettingsServiceListener mListener;
-
- private final ISettingsService.Stub mBinder = new ISettingsService.Stub() {
-
- @Override
- public List<PreferenceParcelable> getPreferences(int state) {
- return null;
- }
-
- @Override
- public PreferenceParcelable getPreference(int state, String key) {
- return null;
- }
-
- @Override
- public void registerListener(ISettingsServiceListener listener) {
- mHandler.post(() -> {
- mListener = listener;
- });
- }
-
- @Override
- public void unRegisterListener(ISettingsServiceListener listener) {
- mHandler.post(() -> {
- mListener = null;
- });
- }
-
- @Override
- public void onCreate(int state, Bundle extras) {
- mHandler.post(() -> {
- if (DEBUG) {
- Log.d(TAG, "onCreate " + state);
- }
- SettingsService.this.onCreateFragment(state, extras);
- });
- }
-
- @Override
- public void onStart(int state) {
- mHandler.post(() -> {
- if (DEBUG) {
- Log.d(TAG, "onStart " + state);
- }
- SettingsService.this.onStartFragment(state);
- });
- }
-
- @Override
- public void onResume(int state) {
- mHandler.post(() -> {
- if (DEBUG) {
- Log.d(TAG, "onResume " + state);
- }
- SettingsService.this.onResumeFragment(state);
- });
-
- }
-
- @Override
- public void onPause(int state) {
- mHandler.post(() -> {
- if (DEBUG) {
- Log.d(TAG, "onPause " + state);
- }
- SettingsService.this.onPauseFragment(state);
- });
- }
-
- @Override
- public void onStop(int state) {
- mHandler.post(() -> {
- if (DEBUG) {
- Log.d(TAG, "onStop " + state);
- }
- SettingsService.this.onStopFragment(state);
- });
- }
-
- @Override
- public void onDestroy(int state) {
- mHandler.post(() -> {
- if (DEBUG) {
- Log.d(TAG, "onDestroy " + state);
- }
- SettingsService.this.onDestroyFragment(state);
- });
- }
-
- @Override
- public void onPreferenceClick(int state, String key, boolean status) {
- mHandler.post(() -> {
- if (DEBUG) {
- Log.d(TAG, "onPreferenceTreeClick " + state + " " + key);
- }
- SettingsService.this.onPreferenceClick(state, key, status);
- });
- }
-
- @Override
- public void grantSliceAccess(String packageName, String uri) {
- ContextSingleton.getInstance()
- .grantFullAccess(getApplicationContext(), uri, packageName);
- }
- };
-
- void onCreateFragment(int state, Bundle extras) {
- StateUtil.createState(
- getApplicationContext(), state, mListener, mStateMap).onCreate(extras);
- }
-
- void onStartFragment(int state) {
- StateUtil.getState(state, mStateMap).onStart();
- }
-
-
- void onResumeFragment(int state) {
- StateUtil.getState(state, mStateMap).onResume();
- }
-
- void onStopFragment(int state) {
- StateUtil.getState(state, mStateMap).onStop();
- }
-
- void onPauseFragment(int state) {
- StateUtil.getState(state, mStateMap).onPause();
- }
-
- void onDestroyFragment(int state) {
- StateUtil.getState(state, mStateMap).onDestroy();
- StateUtil.removeState(state, mStateMap);
- }
-
- void onPreferenceClick(int state, String key, boolean status) {
- StateUtil.getState(state, mStateMap).onPreferenceTreeClick(key, status);
- }
-
-
- @Nullable
- @Override
- public IBinder onBind(Intent intent) {
- return mBinder;
- }
-}
diff --git a/Settings/src/com/android/tv/settings/service/data/PreferenceParcelableManager.java b/Settings/src/com/android/tv/settings/service/data/PreferenceParcelableManager.java
deleted file mode 100644
index 846dddb..0000000
--- a/Settings/src/com/android/tv/settings/service/data/PreferenceParcelableManager.java
+++ /dev/null
@@ -1,76 +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.tv.settings.service.data;
-
-import android.util.ArrayMap;
-
-import com.android.tv.settings.service.PreferenceParcelable;
-
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/** Manage preference parcelables. */
-public class PreferenceParcelableManager {
- private final Map<String, PreferenceParcelable> prefParcelables;
-
- public PreferenceParcelableManager() {
- prefParcelables = new ArrayMap<>();
- }
-
- public void addPrefParcelable(PreferenceParcelable preferenceParcelable) {
- prefParcelables.put(getKey(preferenceParcelable.getKey()), preferenceParcelable);
- }
-
- public PreferenceParcelable getOrCreatePrefParcelable(String key) {
- return getOrCreatePrefParcelable(new String[]{key});
- }
-
- public PreferenceParcelable getOrCreatePrefParcelable(String[] key) {
- String compoundKey = getKey(key);
- if (!prefParcelables.containsKey(compoundKey)) {
- prefParcelables.put(compoundKey, new PreferenceParcelable(key));
- }
- return prefParcelables.get(compoundKey);
- }
-
- public PreferenceParcelable prefParcelableCopy(String[] key) {
- return prefParcelables.get(getKey(key)).immutableCopy();
- }
-
- public PreferenceParcelable prefParcelableCopy(String key) {
- PreferenceParcelable preferenceParcelable = prefParcelables.get(getKey(new String[]{key}));
- if (preferenceParcelable != null) {
- return preferenceParcelable.immutableCopy();
- }
- return null;
- }
-
- public static PreferenceParcelable prefParcelableCopy(
- PreferenceParcelable preferenceParcelable) {
- return preferenceParcelable.immutableCopy();
- }
-
- public static List<PreferenceParcelable> prefParcelablesCopy(List<PreferenceParcelable> prefs) {
- return prefs.stream().map(pref -> pref.immutableCopy()).collect(Collectors.toList());
- }
-
- private static String getKey(String[] key) {
- return Stream.of(key).collect(Collectors.joining(" "));
- }
-}
diff --git a/Settings/src/com/android/tv/settings/service/data/StateUtil.java b/Settings/src/com/android/tv/settings/service/data/StateUtil.java
deleted file mode 100644
index 82cf869..0000000
--- a/Settings/src/com/android/tv/settings/service/data/StateUtil.java
+++ /dev/null
@@ -1,69 +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.tv.settings.service.data;
-
-import static com.android.tv.settings.service.ServiceUtil.STATE_NETWORK_MAIN;
-import static com.android.tv.settings.service.ServiceUtil.STATE_WIFI_DETAILS;
-
-import android.content.Context;
-import android.util.Pair;
-
-import com.android.tv.settings.service.ISettingsServiceListener;
-import com.android.tv.settings.service.network.NetworkMainState;
-import com.android.tv.settings.service.network.WifiDetailsState;
-
-import java.util.Map;
-
-public final class StateUtil {
- private StateUtil() {
- }
-
- public static State createState(
- Context context, int stateIdentifier, ISettingsServiceListener listener,
- Map<Integer, Pair<State, Integer>> stateMap) {
- State state = null;
- switch (stateIdentifier) {
- case STATE_NETWORK_MAIN:
- state = new NetworkMainState(context, listener);
- break;
- case STATE_WIFI_DETAILS:
- state = new WifiDetailsState(context, listener);
- break;
- default:
- // no-op
- }
- if (!stateMap.containsKey(stateIdentifier)) {
- stateMap.put(stateIdentifier, new Pair(state, 0));
- }
- Pair<State, Integer> stateAndCount = stateMap.get(stateIdentifier);
- stateMap.put(stateIdentifier, new Pair<>(stateAndCount.first, stateAndCount.second + 1));
- return stateAndCount.first;
- }
-
- public static State getState(int stateIdentifier, Map<Integer, Pair<State, Integer>> stateMap) {
- return stateMap.get(stateIdentifier).first;
- }
-
- public static void removeState(
- int stateIdentifier, Map<Integer, Pair<State, Integer>> stateMap) {
- Pair<State, Integer> stateAndCount = stateMap.get(stateIdentifier);
- stateMap.put(stateIdentifier, new Pair(stateAndCount.first, stateAndCount.second - 1));
- if (stateAndCount.second == 1) {
- stateMap.remove(stateIdentifier);
- }
- }
-}
diff --git a/Settings/src/com/android/tv/settings/service/network/NetworkMainState.java b/Settings/src/com/android/tv/settings/service/network/NetworkMainState.java
deleted file mode 100644
index 3b14888..0000000
--- a/Settings/src/com/android/tv/settings/service/network/NetworkMainState.java
+++ /dev/null
@@ -1,355 +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.tv.settings.service.network;
-
-import static com.android.tv.settings.service.ServiceUtil.INFO_COLLAPSE;
-import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
-import static com.android.tv.settings.util.InstrumentationUtils.logToggleInteracted;
-
-import android.app.tvsettings.TvSettingsEnums;
-import android.content.Context;
-import android.net.NetworkCapabilities;
-import android.net.NetworkInfo;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.provider.Settings;
-import android.util.Log;
-
-import com.android.settingslib.wifi.AccessPoint;
-import com.android.tv.settings.R;
-import com.android.tv.settings.connectivity.ConnectivityListener;
-import com.android.tv.settings.connectivity.WifiConnectionActivity;
-import com.android.tv.settings.service.ISettingsServiceListener;
-import com.android.tv.settings.service.PreferenceParcelable;
-import com.android.tv.settings.service.ServiceUtil;
-import com.android.tv.settings.service.data.PreferenceParcelableManager;
-import com.android.tv.settings.service.data.State;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/** State to provide data for rendering NetworkFragment. */
-public class NetworkMainState implements State, AccessPoint.AccessPointListener,
- ConnectivityListener.WifiNetworkListener, ConnectivityListener.Listener {
- private static final String TAG = "NetworkMainState";
- private static final boolean DEBUG = true;
- private static final String KEY_WIFI_ENABLE = "wifi_enable";
- private static final String KEY_WIFI_LIST = "wifi_list";
- private static final String KEY_WIFI_COLLAPSE = "wifi_collapse";
- private static final String KEY_WIFI_OTHER = "wifi_other";
- private static final String KEY_WIFI_ADD = "wifi_add";
- private static final String KEY_WIFI_ALWAYS_SCAN = "wifi_always_scan";
- private static final String KEY_ETHERNET = "ethernet";
- private static final String KEY_ETHERNET_STATUS = "ethernet_status";
- private static final String KEY_ETHERNET_PROXY = "ethernet_proxy";
- private static final String KEY_ETHERNET_DHCP = "ethernet_dhcp";
- private static final String KEY_DATA_SAVER_SLICE = "data_saver_slice";
- private static final String KEY_DATA_ALERT_SLICE = "data_alert_slice";
- private static final String KEY_NETWORK_DIAGNOSTICS = "network_diagnostics";
- private static final int INITIAL_UPDATE_DELAY = 500;
-
- PreferenceParcelable mEnableWifiPref;
- PreferenceParcelable mCollapsePref;
- PreferenceParcelable mAddPref;
- PreferenceParcelable mEthernetCategory;
- PreferenceParcelable mEthernetStatusPref;
- PreferenceParcelable mEthernetProxyPref;
- PreferenceParcelable mAlwaysScan;
- PreferenceParcelable mWifiNetworkCategoryPref;
- PreferenceParcelableManager mPreferenceParcelableManager;
- private NetworkModule mNetworkModule;
- private final Context mContext;
- private final ISettingsServiceListener mServiceListener;
- private final Handler mHandler = new Handler();
- private long mNoWifiUpdateBeforeMillis;
- private final Runnable mInitialUpdateWifiListRunnable = new Runnable() {
- @Override
- public void run() {
- mNoWifiUpdateBeforeMillis = 0;
- updateWifiList();
- }
- };
-
- public NetworkMainState(Context context, ISettingsServiceListener listener) {
- mServiceListener = listener;
- mContext = context;
- }
-
- @Override
- public void onCreate(Bundle extras) {
- mNetworkModule = NetworkModule.getInstance(mContext);
- mPreferenceParcelableManager = new PreferenceParcelableManager();
- mEnableWifiPref = mPreferenceParcelableManager.getOrCreatePrefParcelable(KEY_WIFI_ENABLE);
- mAlwaysScan = mPreferenceParcelableManager.getOrCreatePrefParcelable(KEY_WIFI_ALWAYS_SCAN);
- mCollapsePref = mPreferenceParcelableManager.getOrCreatePrefParcelable(KEY_WIFI_COLLAPSE);
- mCollapsePref.addInfo(INFO_COLLAPSE, "true");
- mAddPref = mPreferenceParcelableManager.getOrCreatePrefParcelable(KEY_WIFI_ADD);
- mEthernetCategory = mPreferenceParcelableManager.getOrCreatePrefParcelable(KEY_ETHERNET);
- mEthernetStatusPref = mPreferenceParcelableManager.getOrCreatePrefParcelable(
- KEY_ETHERNET_STATUS);
- mEthernetProxyPref = mPreferenceParcelableManager.getOrCreatePrefParcelable(
- KEY_ETHERNET_PROXY);
- mWifiNetworkCategoryPref = mPreferenceParcelableManager.getOrCreatePrefParcelable(
- KEY_WIFI_LIST);
- mWifiNetworkCategoryPref.addInfo(INFO_COLLAPSE, "true");
- mWifiNetworkCategoryPref.setType(
- PreferenceParcelable.TYPE_PREFERENCE_WIFI_COLLAPSE_CATEGORY);
- }
-
- @Override
- public void onStart() {
- mNetworkModule.addState(this);
- mNetworkModule.getConnectivityListener().setWifiListener(this);
- mNoWifiUpdateBeforeMillis = SystemClock.elapsedRealtime() + INITIAL_UPDATE_DELAY;
- mNetworkModule.getConnectivityListener().start();
- updateWifiList();
- }
-
- @Override
- public void onResume() {
- updateConnectivity();
- }
-
- @Override
- public void onPause() {
- }
-
- @Override
- public void onStop() {
- mNetworkModule.getConnectivityListener().stop();
- mNetworkModule.removeState(this);
- }
-
- @Override
- public void onDestroy() {
- }
-
- private void updateWifiList() {
- if (!mNetworkModule.isWifiHardwarePresent() ||
- !mNetworkModule.getConnectivityListener().isWifiEnabledOrEnabling()) {
- mNoWifiUpdateBeforeMillis = 0;
- return;
- }
-
- final long now = SystemClock.elapsedRealtime();
- if (mNoWifiUpdateBeforeMillis > now) {
- mHandler.removeCallbacks(mInitialUpdateWifiListRunnable);
- mHandler.postDelayed(mInitialUpdateWifiListRunnable,
- mNoWifiUpdateBeforeMillis - now);
- return;
- }
-
- final Collection<AccessPoint> accessPoints =
- mNetworkModule.getConnectivityListener().getAvailableNetworks();
- mWifiNetworkCategoryPref.initChildPreferences();
- for (final AccessPoint accessPoint : accessPoints) {
- accessPoint.setListener(this);
- PreferenceParcelable accessPointPref = new PreferenceParcelable(
- new String[]{KEY_WIFI_LIST, accessPoint.getKey()});
- accessPointPref.setTitle(accessPoint.getTitle());
- accessPointPref.setType(PreferenceParcelable.TYPE_PREFERENCE_ACCESS_POINT);
- accessPointPref.addInfo(ServiceUtil.INFO_WIFI_SIGNAL_LEVEL,
- String.valueOf(accessPoint.getLevel()));
- if (accessPoint.isActive() && !isCaptivePortal(accessPoint)) {
- Bundle apBundle = new Bundle();
- accessPoint.saveWifiState(apBundle);
- accessPointPref.setExtras(apBundle);
- accessPointPref.addInfo(ServiceUtil.INFO_NEXT_STATE, String.valueOf(
- ServiceUtil.STATE_WIFI_DETAILS));
- accessPointPref.setIntent(null);
- } else {
- accessPointPref.setIntent(
- WifiConnectionActivity.createIntent(mContext, accessPoint));
- }
- mWifiNetworkCategoryPref.addChildPrefParcelable(accessPointPref);
- }
- mNetworkModule.setAccessPoints(mWifiNetworkCategoryPref.getChildPrefParcelables());
- try {
- mServiceListener.notifyUpdate(getStateIdentifier(),
- PreferenceParcelableManager.prefParcelableCopy(mWifiNetworkCategoryPref));
- } catch (RemoteException e) {
- Log.e(TAG, "remote failed: " + e);
- }
- }
-
- @Override
- public void onPreferenceTreeClick(String key, boolean status) {
- switch (key) {
- case KEY_WIFI_ENABLE:
- mNetworkModule.getConnectivityListener().setWifiEnabled(status);
- mEnableWifiPref.setChecked(status);
- break;
- case KEY_WIFI_COLLAPSE:
- boolean collapse = !("true".equals(
- mWifiNetworkCategoryPref.getInfo(ServiceUtil.INFO_COLLAPSE)));
- mWifiNetworkCategoryPref.addInfo(ServiceUtil.INFO_COLLAPSE,
- String.valueOf(collapse));
- mCollapsePref.addInfo(ServiceUtil.INFO_COLLAPSE, String.valueOf(collapse));
- logEntrySelected(
- collapse
- ? TvSettingsEnums.NETWORK_SEE_FEWER
- : TvSettingsEnums.NETWORK_SEE_ALL);
- try {
- mServiceListener.notifyUpdate(getStateIdentifier(),
- PreferenceParcelableManager.prefParcelableCopy(
- mWifiNetworkCategoryPref));
- } catch (RemoteException e) {
- Log.e(TAG, "remote failed: " + e);
- }
- break;
- case KEY_WIFI_ALWAYS_SCAN:
- mAlwaysScan.setChecked(status);
- Settings.Global.putInt(mContext.getContentResolver(),
- Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE,
- status ? 1 : 0);
- logToggleInteracted(
- TvSettingsEnums.NETWORK_ALWAYS_SCANNING_NETWORKS, status);
- break;
- case KEY_ETHERNET_STATUS:
- break;
- case KEY_WIFI_ADD:
- logEntrySelected(TvSettingsEnums.NETWORK_ADD_NEW_NETWORK);
- break;
- case KEY_ETHERNET_DHCP:
- logEntrySelected(TvSettingsEnums.NETWORK_ETHERNET_IP_SETTINGS);
- break;
- case KEY_ETHERNET_PROXY:
- logEntrySelected(TvSettingsEnums.NETWORK_ETHERNET_PROXY_SETTINGS);
- break;
- default:
- // no-op
- }
- try {
- mServiceListener.notifyUpdate(getStateIdentifier(),
- mPreferenceParcelableManager.prefParcelableCopy(key));
- } catch (RemoteException e) {
- Log.e(TAG, "remote failed: " + e);
- }
- }
-
-
- private void updateConnectivity() {
- List<PreferenceParcelable> preferenceParcelables = new ArrayList<>();
- final boolean wifiEnabled = mNetworkModule.isWifiHardwarePresent()
- && mNetworkModule.getConnectivityListener().isWifiEnabledOrEnabling();
- mEnableWifiPref.setChecked(wifiEnabled);
- preferenceParcelables.add(mEnableWifiPref);
-
- mWifiNetworkCategoryPref.setVisible(wifiEnabled);
- preferenceParcelables.add(mWifiNetworkCategoryPref);
-
- mCollapsePref.setVisible(wifiEnabled);
- preferenceParcelables.add(mCollapsePref);
-
- mAddPref.setVisible(wifiEnabled);
- preferenceParcelables.add(mAddPref);
-
-
- if (!wifiEnabled) {
- updateWifiList();
- }
-
- int scanAlwaysAvailable = 0;
- try {
- scanAlwaysAvailable = Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE);
- } catch (Settings.SettingNotFoundException e) {
- // Ignore
- }
-
- mAlwaysScan.setChecked(scanAlwaysAvailable == 1);
- mAlwaysScan.setContentDescription(
- mContext.getString(R.string.wifi_setting_always_scan_content_description));
-
- final boolean ethernetAvailable =
- mNetworkModule.getConnectivityListener().isEthernetAvailable();
- mEthernetCategory.setVisible(ethernetAvailable);
- mEthernetStatusPref.setVisible(ethernetAvailable);
- mEthernetProxyPref.setVisible(ethernetAvailable);
- preferenceParcelables.add(mEthernetCategory);
- preferenceParcelables.add(mEthernetStatusPref);
- preferenceParcelables.add(mEthernetProxyPref);
- if (ethernetAvailable) {
- final boolean ethernetConnected =
- mNetworkModule.getConnectivityListener().isEthernetConnected();
- mEthernetStatusPref.setTitle(ethernetConnected
- ? mContext.getString(R.string.connected)
- : mContext.getString(R.string.not_connected));
- mEthernetStatusPref.setSummary(
- mNetworkModule.getConnectivityListener().getEthernetIpAddress());
- }
-
- try {
- mServiceListener.notifyUpdateAll(getStateIdentifier(),
- PreferenceParcelableManager.prefParcelablesCopy(preferenceParcelables));
- } catch (RemoteException e) {
- Log.e(TAG, "remote failed: " + e);
- }
- }
-
- @Override
- public void onAccessPointChanged(AccessPoint accessPoint) {
- PreferenceParcelable accessPointPref = new PreferenceParcelable(
- new String[]{KEY_WIFI_LIST, accessPoint.getKey()});
- try {
- mServiceListener.notifyUpdate(getStateIdentifier(),
- PreferenceParcelableManager.prefParcelableCopy(accessPointPref));
- } catch (RemoteException e) {
- Log.e(TAG, "remote failed: " + e);
- }
- }
-
- @Override
- public void onLevelChanged(AccessPoint accessPoint) {
- PreferenceParcelable accessPointPref = new PreferenceParcelable(
- new String[]{KEY_WIFI_LIST, accessPoint.getKey()});
- try {
- mServiceListener.notifyUpdate(getStateIdentifier(),
- PreferenceParcelableManager.prefParcelableCopy(accessPointPref));
- } catch (RemoteException e) {
- Log.e(TAG, "remote failed: " + e);
- }
- }
-
- @Override
- public void onWifiListChanged() {
- updateWifiList();
- }
-
-
- @Override
- public int getStateIdentifier() {
- return ServiceUtil.STATE_NETWORK_MAIN;
- }
-
- private boolean isCaptivePortal(AccessPoint accessPoint) {
- if (accessPoint.getDetailedState() != NetworkInfo.DetailedState.CONNECTED) {
- return false;
- }
- NetworkCapabilities nc = mNetworkModule.getConnectivityManager().getNetworkCapabilities(
- mNetworkModule.getWifiManager().getCurrentNetwork());
- return nc != null && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
- }
-
- @Override
- public void onConnectivityChange() {
- updateConnectivity();
- }
-}
diff --git a/Settings/src/com/android/tv/settings/service/network/WifiDetailsState.java b/Settings/src/com/android/tv/settings/service/network/WifiDetailsState.java
deleted file mode 100644
index 7f69cac..0000000
--- a/Settings/src/com/android/tv/settings/service/network/WifiDetailsState.java
+++ /dev/null
@@ -1,284 +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.tv.settings.service.network;
-
-import static com.android.tv.settings.util.InstrumentationUtils.logEntrySelected;
-
-import android.app.tvsettings.TvSettingsEnums;
-import android.content.Context;
-import android.net.IpConfiguration;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiInfo;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.settingslib.wifi.AccessPoint;
-import com.android.tv.settings.R;
-import com.android.tv.settings.connectivity.ConnectivityListener;
-import com.android.tv.settings.connectivity.EditIpSettingsActivity;
-import com.android.tv.settings.connectivity.EditProxySettingsActivity;
-import com.android.tv.settings.service.ISettingsServiceListener;
-import com.android.tv.settings.service.PreferenceParcelable;
-import com.android.tv.settings.service.ServiceUtil;
-import com.android.tv.settings.service.data.PreferenceParcelableManager;
-import com.android.tv.settings.service.data.State;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class WifiDetailsState implements State,
- ConnectivityListener.Listener, ConnectivityListener.WifiNetworkListener {
- private static final String TAG = "WifiDetailsState";
- private final Context mContext;
- private final ISettingsServiceListener mServiceListener;
- private NetworkModule mNetworkModule;
- private AccessPoint mAccessPoint;
- PreferenceParcelableManager mPreferenceParcelableManager;
-
- private static final String KEY_CONNECTION_STATUS = "connection_status";
- private static final String KEY_IP_ADDRESS = "ip_address";
- private static final String KEY_MAC_ADDRESS = "mac_address";
- private static final String KEY_SIGNAL_STRENGTH = "signal_strength";
- private static final String KEY_RANDOM_MAC = "random_mac";
- private static final String KEY_PROXY_SETTINGS = "proxy_settings";
- private static final String KEY_IP_SETTINGS = "ip_settings";
- private static final String KEY_FORGET_NETWORK = "forget_network";
-
- private static final String VALUE_MAC_RANDOM = "random";
- private static final String VALUE_MAC_DEVICE = "device";
-
-
- private PreferenceParcelable mConnectionStatusPref;
- private PreferenceParcelable mIpAddressPref;
- private PreferenceParcelable mMacAddressPref;
- private PreferenceParcelable mSignalStrengthPref;
- // TODO: add support for list preference.
-// private ListPreference mRandomMacPref;
- private PreferenceParcelable mProxySettingsPref;
- private PreferenceParcelable mIpSettingsPref;
- private PreferenceParcelable mForgetNetworkPref;
-
- public WifiDetailsState(Context context, ISettingsServiceListener listener) {
- mServiceListener = listener;
- mContext = context;
- mNetworkModule = NetworkModule.getInstance(mContext);
- }
-
- @Override
- public void onCreate(Bundle extras) {
- mNetworkModule = NetworkModule.getInstance(mContext);
- mPreferenceParcelableManager = new PreferenceParcelableManager();
- mAccessPoint = mNetworkModule.getAccessPoint(extras);
- try {
- mServiceListener.notifyUpdateScreenTitle(getStateIdentifier(),
- String.valueOf(mAccessPoint.getSsid()));
- } catch (RemoteException e) {
- Log.e(TAG, "Cannot set title for screen " + e);
- }
- mConnectionStatusPref = mPreferenceParcelableManager.getOrCreatePrefParcelable(
- KEY_CONNECTION_STATUS);
- mIpAddressPref = mPreferenceParcelableManager.getOrCreatePrefParcelable(KEY_IP_ADDRESS);
- mMacAddressPref = mPreferenceParcelableManager.getOrCreatePrefParcelable(KEY_MAC_ADDRESS);
- mSignalStrengthPref = mPreferenceParcelableManager.getOrCreatePrefParcelable(
- KEY_SIGNAL_STRENGTH);
-// mRandomMacPref = (ListPreference) findPreference(KEY_RANDOM_MAC);
- mProxySettingsPref = mPreferenceParcelableManager.getOrCreatePrefParcelable(
- KEY_PROXY_SETTINGS);
- mIpSettingsPref = mPreferenceParcelableManager.getOrCreatePrefParcelable(KEY_IP_SETTINGS);
- mForgetNetworkPref = mPreferenceParcelableManager.getOrCreatePrefParcelable(
- KEY_FORGET_NETWORK);
- }
-
- @Override
- public void onStart() {
- mNetworkModule.addState(this);
- mNetworkModule.getConnectivityListener().setWifiListener(this);
- mNetworkModule.getConnectivityListener().start();
- }
-
- @Override
- public void onResume() {
- update();
- }
-
- @Override
- public void onPause() {
-
- }
-
- @Override
- public void onStop() {
- mNetworkModule.getConnectivityListener().stop();
- mNetworkModule.removeState(this);
- }
-
- @Override
- public void onDestroy() {
-
- }
-
- @Override
- public void onPreferenceTreeClick(String key, boolean status) {
- switch (key) {
- case KEY_PROXY_SETTINGS:
- logEntrySelected(TvSettingsEnums.NETWORK_AP_INFO_PROXY_SETTINGS);
- break;
- case KEY_IP_SETTINGS:
- logEntrySelected(TvSettingsEnums.NETWORK_AP_INFO_IP_SETTINGS);
- break;
- case KEY_FORGET_NETWORK:
- logEntrySelected(TvSettingsEnums.NETWORK_AP_INFO_FORGET_NETWORK);
- break;
- default:
- // no-op
- }
- }
-
- @Override
- public int getStateIdentifier() {
- return ServiceUtil.STATE_WIFI_DETAILS;
- }
-
- @Override
- public void onConnectivityChange() {
- update();
- }
-
- @Override
- public void onWifiListChanged() {
- final List<AccessPoint> accessPoints = mNetworkModule
- .getConnectivityListener().getAvailableNetworks();
- for (final AccessPoint accessPoint : accessPoints) {
- if (TextUtils.equals(mAccessPoint.getSsidStr(), accessPoint.getSsidStr())
- && mAccessPoint.getSecurity() == accessPoint.getSecurity()) {
- // Make sure we're not holding on to the one we inflated from the bundle, because
- // it won't be updated
- mAccessPoint = accessPoint;
- break;
- }
- }
- update();
- }
-
- private void update() {
- List<PreferenceParcelable> preferenceParcelables = new ArrayList<>();
- if (mAccessPoint == null) {
- return;
- }
- final boolean active = mAccessPoint.isActive();
-
- mConnectionStatusPref.setSummary(active
- ? mContext.getString(R.string.connected)
- : mContext.getString(R.string.not_connected));
- mIpAddressPref.setVisible(active);
- mSignalStrengthPref.setVisible(active);
- preferenceParcelables.add(mConnectionStatusPref);
- preferenceParcelables.add(mIpAddressPref);
- preferenceParcelables.add(mSignalStrengthPref);
- preferenceParcelables.add(mMacAddressPref);
- preferenceParcelables.add(mProxySettingsPref);
- preferenceParcelables.add(mIpSettingsPref);
- preferenceParcelables.add(mForgetNetworkPref);
-
- if (active) {
- mIpAddressPref.setSummary(mNetworkModule.getConnectivityListener().getWifiIpAddress());
- mSignalStrengthPref.setSummary(getSignalStrength());
- }
-
- // Mac address related Preferences (info entry and random mac setting entry)
- String macAddress = mNetworkModule.getConnectivityListener()
- .getWifiMacAddress(mAccessPoint);
- if (active && !TextUtils.isEmpty(macAddress)) {
- mMacAddressPref.setVisible(true);
- updateMacAddressPref(macAddress);
-// updateRandomMacPref();
- } else {
- mMacAddressPref.setVisible(false);
-// mRandomMacPref.setVisible(false);
- }
-
- WifiConfiguration wifiConfiguration = mAccessPoint.getConfig();
- if (wifiConfiguration != null) {
- final int networkId = wifiConfiguration.networkId;
- IpConfiguration.ProxySettings proxySettings =
- wifiConfiguration.getIpConfiguration().getProxySettings();
- mProxySettingsPref.setSummary(proxySettings == IpConfiguration.ProxySettings.NONE
- ? mContext.getString(R.string.wifi_action_proxy_none)
- : mContext.getString(R.string.wifi_action_proxy_manual));
- mProxySettingsPref.setIntent(EditProxySettingsActivity.createIntent(mContext,
- networkId));
-
- IpConfiguration.IpAssignment ipAssignment =
- wifiConfiguration.getIpConfiguration().getIpAssignment();
- mIpSettingsPref.setSummary(ipAssignment == IpConfiguration.IpAssignment.STATIC
- ? mContext.getString(R.string.wifi_action_static)
- : mContext.getString(R.string.wifi_action_dhcp));
- mIpSettingsPref.setIntent(EditIpSettingsActivity.createIntent(mContext, networkId));
-
- // TODO : use full activity to replace this
-// mForgetNetworkPref.setFragment(WifiDetailsFragment.ForgetNetworkConfirmFragment
-// .class.getName());
-// WifiDetailsFragment.ForgetNetworkConfirmFragment.prepareArgs(mForgetNetworkPref
-// .getExtras(), mAccessPoint);
- }
-
- mProxySettingsPref.setVisible(wifiConfiguration != null);
- mIpSettingsPref.setVisible(wifiConfiguration != null);
- mForgetNetworkPref.setVisible(wifiConfiguration != null);
- try {
- mServiceListener.notifyUpdateAll(getStateIdentifier(),
- PreferenceParcelableManager.prefParcelablesCopy(preferenceParcelables));
- } catch (RemoteException e) {
- Log.e(TAG, "remote failed: " + e);
- }
- }
-
-
- private void updateMacAddressPref(String macAddress) {
- if (WifiInfo.DEFAULT_MAC_ADDRESS.equals(macAddress)) {
- mMacAddressPref.setSummary(mContext.getString(R.string.mac_address_not_available));
- } else {
- mMacAddressPref.setSummary(macAddress);
- }
- if (mAccessPoint == null || mAccessPoint.getConfig() == null) {
- return;
- }
- // For saved Passpoint network, framework doesn't have the field to keep the MAC choice
- // persistently, so Passpoint network will always use the default value so far, which is
- // randomized MAC address, so don't need to modify title.
- if (mAccessPoint.isPasspoint() || mAccessPoint.isPasspointConfig()) {
- return;
- }
- mMacAddressPref.setTitle(
- (mAccessPoint.getConfig().macRandomizationSetting
- == WifiConfiguration.RANDOMIZATION_PERSISTENT)
- ? mContext.getString(R.string.title_randomized_mac_address)
- : mContext.getString(R.string.title_mac_address));
- }
-
-
- private String getSignalStrength() {
- String[] signalLevels = mContext.getResources()
- .getStringArray(R.array.wifi_signal_strength);
- int strength = mNetworkModule.getConnectivityListener()
- .getWifiSignalStrength(signalLevels.length);
- return signalLevels[strength];
- }
-
-}
diff --git a/Settings/src/com/android/tv/settings/slice/SliceActivity.java b/Settings/src/com/android/tv/settings/slice/SliceActivity.java
index ea60538..8856edd 100644
--- a/Settings/src/com/android/tv/settings/slice/SliceActivity.java
+++ b/Settings/src/com/android/tv/settings/slice/SliceActivity.java
@@ -21,7 +21,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
import com.android.tv.twopanelsettings.slices.SliceFragment;
import com.android.tv.twopanelsettings.slices.SlicesConstants;
@@ -52,7 +51,8 @@
}
bundle.putString(SlicesConstants.TAG_TARGET_URI, sliceUri);
bundle.putString(SlicesConstants.TAG_SCREEN_TITLE, getScreenTitle());
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
.newSettingsFragment(SliceFragment.class.getName(), bundle);
}
diff --git a/Settings/src/com/android/tv/settings/system/AppLanguageActivity.java b/Settings/src/com/android/tv/settings/system/AppLanguageActivity.java
new file mode 100644
index 0000000..500a08f
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/system/AppLanguageActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.system;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.tv.settings.TvSettingsActivity;
+
+public class AppLanguageActivity extends TvSettingsActivity {
+
+ @Override
+ protected Fragment createSettingsFragment() {
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(LanguageFragment.class.getName(), null);
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/system/CaptionSettingsFragment.java b/Settings/src/com/android/tv/settings/system/CaptionSettingsFragment.java
index de319be..45fe364 100644
--- a/Settings/src/com/android/tv/settings/system/CaptionSettingsFragment.java
+++ b/Settings/src/com/android/tv/settings/system/CaptionSettingsFragment.java
@@ -35,7 +35,7 @@
import com.android.settingslib.accessibility.AccessibilityUtils;
import com.android.tv.settings.BaseSettingsFragment;
import com.android.tv.settings.R;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import java.util.Locale;
@@ -168,6 +168,7 @@
boolean enabled = mCaptioningManager.isEnabled();
if (enabled) {
mPreviewText.setVisibility(View.VISIBLE);
+ mPreviewWindow.setVisibility(View.VISIBLE);
Activity activity = getActivity();
mPreviewText.setStyle(mStyleId);
mPreviewText.setTextSize(mFontScale * mDefaultFontSize);
@@ -192,6 +193,7 @@
mPreviewText.invalidate();
} else {
mPreviewText.setVisibility(View.INVISIBLE);
+ mPreviewWindow.setVisibility(View.INVISIBLE);
}
}
}
diff --git a/Settings/src/com/android/tv/settings/system/DateTimeActivity.java b/Settings/src/com/android/tv/settings/system/DateTimeActivity.java
index 92b6171..b8abb5f 100644
--- a/Settings/src/com/android/tv/settings/system/DateTimeActivity.java
+++ b/Settings/src/com/android/tv/settings/system/DateTimeActivity.java
@@ -19,13 +19,13 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
public class DateTimeActivity extends TvSettingsActivity {
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(DateTimeFragment.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(DateTimeFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/system/DateTimeFragmentCompat.java b/Settings/src/com/android/tv/settings/system/DateTimeFragmentCompat.java
new file mode 100644
index 0000000..174431e
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/system/DateTimeFragmentCompat.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.tv.settings.system;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_SYSTEM_DATE_TIME;
+
+import android.os.Bundle;
+import android.os.SystemProperties;
+import android.os.UserManager;
+
+import androidx.annotation.Keep;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceManager;
+
+import com.android.settingslib.datetime.ZoneGetter;
+import com.android.tv.settings.R;
+import com.android.tv.settings.RestrictedPreferenceAdapter;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.system.DateTimeState;
+
+import java.util.Calendar;
+
+/**
+ * The date and time screen in TV settings.
+ */
+@Keep
+public class DateTimeFragmentCompat extends PreferenceControllerFragmentCompat {
+ private static final String KEY_AUTO_DATE_TIME = "auto_date_time";
+ private static final String KEY_SET_DATE = "set_date";
+ private static final String KEY_SET_TIME = "set_time";
+ private static final String KEY_SET_TIME_ZONE = "set_time_zone";
+ private static final String KEY_USE_24_HOUR = "use_24_hour";
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_SYSTEM_DATE_TIME;
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ getPreferenceManager()
+ .setPreferenceComparisonCallback(
+ new PreferenceManager.SimplePreferenceComparisonCallback());
+ setPreferencesFromResource(R.xml.date_time_compat, null);
+
+ Preference datePref = findPreference(KEY_SET_DATE);
+ Preference timePref = findPreference(KEY_SET_TIME);
+ final boolean tsTimeCapable = SystemProperties.getBoolean("ro.config.ts.date.time", false);
+ final ListPreference autoDateTimePref =
+ (ListPreference) findPreference(KEY_AUTO_DATE_TIME);
+ autoDateTimePref.setOnPreferenceChangeListener(this);
+ if (tsTimeCapable) {
+ autoDateTimePref.setEntries(R.array.auto_date_time_ts_entries);
+ autoDateTimePref.setEntryValues(R.array.auto_date_time_ts_entry_values);
+ }
+
+ Preference time24Pref = findPreference(KEY_USE_24_HOUR);
+ time24Pref.setOnPreferenceChangeListener(this);
+
+ Preference timeZonePref = findPreference(KEY_SET_TIME_ZONE);
+ final String userRestriction = UserManager.DISALLOW_CONFIG_DATE_TIME;
+ RestrictedPreferenceAdapter.adapt(datePref, userRestriction);
+ RestrictedPreferenceAdapter.adapt(timePref, userRestriction);
+ RestrictedPreferenceAdapter.adapt(timeZonePref, userRestriction);
+ RestrictedPreferenceAdapter.adapt(autoDateTimePref, userRestriction);
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat prefCompat) {
+ HasKeys preference = super.updatePref(prefCompat);
+ if (preference == null) {
+ return null;
+ }
+ String[] key = preference.getKeys();
+ final Calendar now = getDateTimeState().getNow();
+ switch (key[0]) {
+ case KEY_SET_TIME_ZONE:
+ ((Preference) preference).setSummary(
+ ZoneGetter.getTimeZoneOffsetAndName(getActivity(),
+ now.getTimeZone(), now.getTime()).toString());
+ break;
+ default:
+ }
+ return preference;
+ }
+
+ private DateTimeState getDateTimeState() {
+ return (DateTimeState) super.getState();
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/system/InputsActivity.java b/Settings/src/com/android/tv/settings/system/InputsActivity.java
index abe1fe5..ac92197 100644
--- a/Settings/src/com/android/tv/settings/system/InputsActivity.java
+++ b/Settings/src/com/android/tv/settings/system/InputsActivity.java
@@ -19,7 +19,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
/**
* Activity to control TV input settings.
@@ -28,7 +27,8 @@
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(InputsFragment.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(InputsFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/system/InputsFragment.java b/Settings/src/com/android/tv/settings/system/InputsFragment.java
index 9c45084..3c15523 100644
--- a/Settings/src/com/android/tv/settings/system/InputsFragment.java
+++ b/Settings/src/com/android/tv/settings/system/InputsFragment.java
@@ -17,11 +17,12 @@
package com.android.tv.settings.system;
import android.content.Context;
+import android.hardware.hdmi.HdmiControlManager;
+import android.icu.text.MessageFormat;
import android.media.tv.TvInputInfo;
import android.media.tv.TvInputManager;
import android.os.Bundle;
import android.os.UserHandle;
-import android.provider.Settings;
import android.text.TextUtils;
import androidx.annotation.Keep;
@@ -32,6 +33,8 @@
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
+import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
@@ -47,6 +50,7 @@
private static final String KEY_HDMI_CONTROL = "hdmi_control";
private static final String KEY_DEVICE_AUTO_OFF = "device_auto_off";
private static final String KEY_TV_AUTO_ON = "tv_auto_on";
+ private static final String ICU_PLURAL_COUNT = "count";
private PreferenceGroup mConnectedGroup;
private PreferenceGroup mStandbyGroup;
@@ -57,6 +61,7 @@
private TwoStatePreference mTvAutoOnPref;
private TvInputManager mTvInputManager;
+ private HdmiControlManager mHdmiControlManager;
private Map<String, String> mCustomLabels;
private Set<String> mHiddenIds;
@@ -68,6 +73,7 @@
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mTvInputManager = (TvInputManager) getContext().getSystemService(Context.TV_INPUT_SERVICE);
+ mHdmiControlManager = getContext().getSystemService(HdmiControlManager.class);
}
@Override
@@ -95,10 +101,12 @@
}
private void refresh() {
- mHdmiControlPref.setChecked(readCecOption(Settings.Global.HDMI_CONTROL_ENABLED));
- mDeviceAutoOffPref.setChecked(readCecOption(
- Settings.Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED));
- mTvAutoOnPref.setChecked(readCecOption(Settings.Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED));
+ mHdmiControlPref.setChecked(mHdmiControlManager.getHdmiCecEnabled()
+ == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
+ mDeviceAutoOffPref.setChecked(mHdmiControlManager.getTvSendStandbyOnSleep()
+ == HdmiControlManager.TV_SEND_STANDBY_ON_SLEEP_ENABLED);
+ mTvAutoOnPref.setChecked(mHdmiControlManager.getTvWakeOnOneTouchPlay()
+ == HdmiControlManager.TV_WAKE_ON_ONE_TOUCH_PLAY_ENABLED);
for (TvInputInfo info : mTvInputManager.getTvInputList()) {
if (info.getType() == TvInputInfo.TYPE_TUNER
@@ -140,21 +148,31 @@
}
final int connectedCount = mConnectedGroup.getPreferenceCount();
- mConnectedGroup.setTitle(getResources().getQuantityString(
- R.plurals.inputs_header_connected_input,
- connectedCount));
+ MessageFormat msgFormat = new MessageFormat(
+ getResources().getString(R.string.inputs_header_connected_input),
+ Locale.getDefault());
+ Map<String, Object> arguments = new HashMap<>();
+ arguments.put(ICU_PLURAL_COUNT, connectedCount);
+ String songsFound = msgFormat.format(arguments);
+ mConnectedGroup.setTitle(msgFormat.format(arguments));
mConnectedGroup.setVisible(connectedCount > 0);
final int standbyCount = mStandbyGroup.getPreferenceCount();
- mStandbyGroup.setTitle(getResources().getQuantityString(
- R.plurals.inputs_header_standby_input,
- standbyCount));
+ msgFormat = new MessageFormat(
+ getResources().getString(R.string.inputs_header_standby_input),
+ Locale.getDefault());
+ arguments = new HashMap<>();
+ arguments.put(ICU_PLURAL_COUNT, standbyCount);
+ mStandbyGroup.setTitle(msgFormat.format(arguments));
mStandbyGroup.setVisible(standbyCount > 0);
final int disconnectedCount = mDisconnectedGroup.getPreferenceCount();
- mDisconnectedGroup.setTitle(getResources().getQuantityString(
- R.plurals.inputs_header_disconnected_input,
- disconnectedCount));
+ msgFormat = new MessageFormat(
+ getResources().getString(R.string.inputs_header_disconnected_input),
+ Locale.getDefault());
+ arguments = new HashMap<>();
+ arguments.put(ICU_PLURAL_COUNT, disconnectedCount);
+ mDisconnectedGroup.setTitle(msgFormat.format(arguments));
mDisconnectedGroup.setVisible(disconnectedCount > 0);
}
@@ -166,28 +184,24 @@
}
switch (key) {
case KEY_HDMI_CONTROL:
- writeCecOption(Settings.Global.HDMI_CONTROL_ENABLED, mHdmiControlPref.isChecked());
+ mHdmiControlManager.setHdmiCecEnabled(mHdmiControlPref.isChecked()
+ ? HdmiControlManager.HDMI_CEC_CONTROL_ENABLED
+ : HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
return true;
case KEY_DEVICE_AUTO_OFF:
- writeCecOption(Settings.Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
- mDeviceAutoOffPref.isChecked());
+ mHdmiControlManager.setTvSendStandbyOnSleep(mDeviceAutoOffPref.isChecked()
+ ? HdmiControlManager.TV_SEND_STANDBY_ON_SLEEP_ENABLED
+ : HdmiControlManager.TV_SEND_STANDBY_ON_SLEEP_DISABLED);
return true;
case KEY_TV_AUTO_ON:
- writeCecOption(Settings.Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED,
- mTvAutoOnPref.isChecked());
+ mHdmiControlManager.setTvWakeOnOneTouchPlay(mTvAutoOnPref.isChecked()
+ ? HdmiControlManager.TV_WAKE_ON_ONE_TOUCH_PLAY_ENABLED
+ : HdmiControlManager.TV_WAKE_ON_ONE_TOUCH_PLAY_DISABLED);
return true;
}
return super.onPreferenceTreeClick(preference);
}
- private boolean readCecOption(String key) {
- return Settings.Global.getInt(getContext().getContentResolver(), key, 1) == 1;
- }
-
- private void writeCecOption(String key, boolean value) {
- Settings.Global.putInt(getContext().getContentResolver(), key, value ? 1 : 0);
- }
-
private class InputPreference extends Preference {
public InputPreference(Context context) {
super(context);
diff --git a/Settings/src/com/android/tv/settings/system/LanguageActivity.java b/Settings/src/com/android/tv/settings/system/LanguageActivity.java
index e8cf73a..489eeb8 100644
--- a/Settings/src/com/android/tv/settings/system/LanguageActivity.java
+++ b/Settings/src/com/android/tv/settings/system/LanguageActivity.java
@@ -19,13 +19,13 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
public class LanguageActivity extends TvSettingsActivity {
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(LanguageFragment.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(LanguageFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/system/LanguageFragmentCompat.java b/Settings/src/com/android/tv/settings/system/LanguageFragmentCompat.java
new file mode 100644
index 0000000..8e4f8a3
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/system/LanguageFragmentCompat.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.tv.settings.system;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.Preference;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.compat.TsRadioPreference;
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+
+import java.util.Arrays;
+
+/**
+ * Fragment compat for language settings screen in TV Settings.
+ */
+@Keep
+public class LanguageFragmentCompat extends PreferenceControllerFragmentCompat {
+ private static final String[] LANGUAGE_RADIO_GROUP = new String[]{"language"};
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.language_compat, null);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_LANGUAGE;
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat preferenceCompat) {
+ if (preferenceCompat == null) {
+ return null;
+ }
+ if (Arrays.equals(preferenceCompat.getKey(), LANGUAGE_RADIO_GROUP)
+ && preferenceCompat.getChildPrefCompats() != null) {
+ preferenceCompat.getChildPrefCompats().stream().forEach(
+ childPrefCompat -> {
+ Preference preference = findTargetPreference(childPrefCompat.getKey());
+ if (preference == null) {
+ preference = (Preference) RenderUtil.createPreference(getContext(),
+ childPrefCompat);
+ getPreferenceScreen().addPreference(preference);
+ }
+ if ((preference instanceof TsRadioPreference)) {
+ final TsRadioPreference languagePref = (TsRadioPreference) preference;
+ RenderUtil.updatePreference(
+ getContext(), languagePref, childPrefCompat,
+ preference.getOrder());
+ languagePref.setRadioGroup(LANGUAGE_RADIO_GROUP[0]);
+ if (childPrefCompat.isFocused()) {
+ final Preference focusedPref = preference;
+ scrollToPreference(focusedPref.getKey());
+ }
+ }
+ }
+ );
+ }
+ return null;
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference) {
+ if (preference instanceof TsRadioPreference) {
+ ((TsRadioPreference) preference).clearOtherRadioPreferences(getPreferenceScreen());
+ }
+ return super.onPreferenceTreeClick(preference);
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/system/LocationActivity.java b/Settings/src/com/android/tv/settings/system/LocationActivity.java
index e6e2ce6..6c13e83 100644
--- a/Settings/src/com/android/tv/settings/system/LocationActivity.java
+++ b/Settings/src/com/android/tv/settings/system/LocationActivity.java
@@ -19,7 +19,6 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
/**
* Controls location settings.
@@ -28,7 +27,8 @@
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(LocationFragment.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(LocationFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/system/LocationFragment.java b/Settings/src/com/android/tv/settings/system/LocationFragment.java
index df4791e..3f4a25d 100644
--- a/Settings/src/com/android/tv/settings/system/LocationFragment.java
+++ b/Settings/src/com/android/tv/settings/system/LocationFragment.java
@@ -48,7 +48,7 @@
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
import com.android.tv.settings.device.apps.AppManagementFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import com.android.tv.twopanelsettings.SummaryListPreference;
import java.util.ArrayList;
diff --git a/Settings/src/com/android/tv/settings/system/LocationFragmentCompat.java b/Settings/src/com/android/tv/settings/system/LocationFragmentCompat.java
new file mode 100644
index 0000000..6705767
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/system/LocationFragmentCompat.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.tv.settings.system;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_LOCATION;
+
+import android.os.Bundle;
+
+import androidx.annotation.Keep;
+import androidx.preference.PreferenceGroup;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.compat.HasKeys;
+import com.android.tv.settings.compat.PreferenceControllerFragmentCompat;
+import com.android.tv.settings.compat.RenderUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+
+/**
+ * The fragment compat for location settings screen in TV settings.
+ */
+@Keep
+public class LocationFragmentCompat extends PreferenceControllerFragmentCompat {
+ private static final String KEY_RECENT_LOCATION_REQUESTS = "recent_location_requests";
+
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ setPreferencesFromResource(R.xml.location_compat, null);
+ }
+
+ @Override
+ public HasKeys updatePref(PreferenceCompat prefCompat) {
+ super.updatePref(prefCompat);
+ if (prefCompat.getKey().length == 1
+ && prefCompat.getKey()[0].equals(KEY_RECENT_LOCATION_REQUESTS)
+ && prefCompat.getChildPrefCompats() != null) {
+ RenderUtil.updatePreferenceGroup(
+ ((PreferenceGroup) findPreference(prefCompat.getKey()[0])),
+ prefCompat.getChildPrefCompats());
+ }
+ return null;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_LOCATION;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/system/SecurityActivity.java b/Settings/src/com/android/tv/settings/system/SecurityActivity.java
index 378430f..c6c02cc 100644
--- a/Settings/src/com/android/tv/settings/system/SecurityActivity.java
+++ b/Settings/src/com/android/tv/settings/system/SecurityActivity.java
@@ -19,13 +19,13 @@
import androidx.fragment.app.Fragment;
import com.android.tv.settings.TvSettingsActivity;
-import com.android.tv.settings.overlay.FlavorUtils;
public class SecurityActivity extends TvSettingsActivity {
@Override
protected Fragment createSettingsFragment() {
- return FlavorUtils.getFeatureFactory(this).getSettingsFragmentProvider()
- .newSettingsFragment(SecurityFragment.class.getName(), null);
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(SecurityFragment.class.getName(), null);
}
}
diff --git a/Settings/src/com/android/tv/settings/system/SecurityFragment.java b/Settings/src/com/android/tv/settings/system/SecurityFragment.java
index 031b705..11e5274 100644
--- a/Settings/src/com/android/tv/settings/system/SecurityFragment.java
+++ b/Settings/src/com/android/tv/settings/system/SecurityFragment.java
@@ -52,8 +52,8 @@
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
import com.android.tv.settings.dialog.PinDialogFragment;
+import com.android.tv.settings.library.users.RestrictedProfileModel;
import com.android.tv.settings.users.AppRestrictionsFragment;
-import com.android.tv.settings.users.RestrictedProfileModel;
import com.android.tv.settings.users.RestrictedProfilePinDialogFragment;
import com.android.tv.settings.users.RestrictedProfilePinStorage;
import com.android.tv.settings.users.UserSwitchListenerService;
@@ -395,7 +395,7 @@
case PIN_MODE_RESTRICTED_PROFILE_DELETE:
mUiThreadHandler.post(() -> {
mRestrictedProfile.removeUser();
- UserSwitchListenerService.updateLaunchPoint(getActivity(), false);
+ UserSwitchListenerService.onUserCreatedOrDeleted(getActivity());
refresh();
});
break;
@@ -480,7 +480,7 @@
if (result == null) {
return;
}
- UserSwitchListenerService.updateLaunchPoint(mContext, true);
+ UserSwitchListenerService.onUserCreatedOrDeleted(mContext);
LocalBroadcastManager.getInstance(mContext).sendBroadcast(
new Intent(ACTION_RESTRICTED_PROFILE_CREATED)
.putExtra(EXTRA_RESTRICTED_PROFILE_INFO, result));
diff --git a/Settings/src/com/android/tv/settings/system/TextToSpeechActivity.java b/Settings/src/com/android/tv/settings/system/TextToSpeechActivity.java
new file mode 100644
index 0000000..fc0a724
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/system/TextToSpeechActivity.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.system;
+
+import androidx.fragment.app.Fragment;
+
+import com.android.tv.settings.TvSettingsActivity;
+
+/**
+ * Controls Text-to-Speech settings.
+ */
+public class TextToSpeechActivity extends TvSettingsActivity {
+
+ @Override
+ protected Fragment createSettingsFragment() {
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(TextToSpeechFragment.class.getName(), null);
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/system/TextToSpeechFragment.java b/Settings/src/com/android/tv/settings/system/TextToSpeechFragment.java
index 75d59e2..066a98f 100644
--- a/Settings/src/com/android/tv/settings/system/TextToSpeechFragment.java
+++ b/Settings/src/com/android/tv/settings/system/TextToSpeechFragment.java
@@ -253,6 +253,9 @@
* Called when the TTS engine is initialized.
*/
public void onInitEngine(int status) {
+ if (mTts == null) {
+ return;
+ }
if (status == TextToSpeech.SUCCESS) {
if (DBG) Log.d(TAG, "TTS engine for settings screen initialized.");
checkDefaultLocale();
diff --git a/Settings/src/com/android/tv/settings/system/TtsEnginePreference.java b/Settings/src/com/android/tv/settings/system/TtsEnginePreference.java
index 127394f..6692fc3 100644
--- a/Settings/src/com/android/tv/settings/system/TtsEnginePreference.java
+++ b/Settings/src/com/android/tv/settings/system/TtsEnginePreference.java
@@ -140,6 +140,9 @@
if (mSharedState.getCurrentChecked() != null) {
mSharedState.getCurrentChecked().setChecked(false);
}
+ if (current != null) {
+ current.setChecked(true);
+ }
mSharedState.setCurrentChecked(current);
mSharedState.setCurrentKey(getKey());
callChangeListener(mSharedState.getCurrentKey());
diff --git a/Settings/src/com/android/tv/settings/system/TtsEngineSettingsFragment.java b/Settings/src/com/android/tv/settings/system/TtsEngineSettingsFragment.java
index 0affcd4..737c6fc 100644
--- a/Settings/src/com/android/tv/settings/system/TtsEngineSettingsFragment.java
+++ b/Settings/src/com/android/tv/settings/system/TtsEngineSettingsFragment.java
@@ -191,7 +191,8 @@
checkTtsData();
getActivity().registerReceiver(mLanguagesChangedReceiver,
- new IntentFilter(TextToSpeech.Engine.ACTION_TTS_DATA_INSTALLED));
+ new IntentFilter(TextToSpeech.Engine.ACTION_TTS_DATA_INSTALLED),
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
@Override
diff --git a/Settings/src/com/android/tv/settings/system/development/AdbDeviceDetailsFragment.java b/Settings/src/com/android/tv/settings/system/development/AdbDeviceDetailsFragment.java
new file mode 100644
index 0000000..f816afb
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/system/development/AdbDeviceDetailsFragment.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.system.development;
+
+import android.content.Context;
+import android.debug.IAdbManager;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.util.Log;
+
+import androidx.leanback.app.GuidedStepSupportFragment;
+import androidx.leanback.widget.GuidanceStylist;
+import androidx.leanback.widget.GuidedAction;
+
+import com.android.tv.settings.R;
+
+import java.util.List;
+
+/**
+ * Fragment shown when clicking on a paired device in the Wireless
+ * Debugging fragment.
+ */
+public class AdbDeviceDetailsFragment extends GuidedStepSupportFragment {
+ private static final String TAG = "AdbDeviceDetailsFragment";
+
+ private static final String ARG_DEVICE_NAME = "device_name";
+ private static final String ARG_FINGERPRINT = "fingerprint";
+
+ private IAdbManager mAdbManager;
+
+ /**
+ * Function for transferring device name and fingerprint.
+ */
+ public static void prepareArgs(Bundle args, String deviceName, String fingerprint) {
+ args.putString(ARG_DEVICE_NAME, deviceName);
+ args.putString(ARG_FINGERPRINT, fingerprint);
+ }
+
+ @Override
+ public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
+ String fingerprint = String.format(getString(R.string.adb_device_fingerprint_title_format,
+ getArguments().getString(ARG_FINGERPRINT)));
+ return new GuidanceStylist.Guidance(
+ getString(R.string.adb_device_forget),
+ fingerprint,
+ getArguments().getString(ARG_DEVICE_NAME),
+ getContext().getDrawable(R.drawable.ic_laptop_132dp)
+ );
+ }
+
+ @Override
+ public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+ mAdbManager = IAdbManager.Stub.asInterface(ServiceManager.getService(Context.ADB_SERVICE));
+ final Context context = getContext();
+ actions.add(new GuidedAction.Builder(context)
+ .title(getString(R.string.settings_ok))
+ .clickAction(GuidedAction.ACTION_ID_OK)
+ .build());
+ actions.add(new GuidedAction.Builder(context)
+ .title(getString(R.string.settings_cancel))
+ .clickAction(GuidedAction.ACTION_ID_CANCEL)
+ .build());
+ }
+
+ @Override
+ public void onGuidedActionClicked(GuidedAction action) {
+ if (action.getId() == GuidedAction.ACTION_ID_OK) {
+ try {
+ Log.d(TAG, "Unpairing device");
+ mAdbManager.unpairDevice(getArguments().getString(ARG_FINGERPRINT));
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to forget the device");
+ }
+ getFragmentManager().popBackStack();
+ } else if (action.getId() == GuidedAction.ACTION_ID_CANCEL) {
+ getFragmentManager().popBackStack();
+ } else {
+ super.onGuidedActionClicked(action);
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/system/development/AdbPairedDevicePreference.java b/Settings/src/com/android/tv/settings/system/development/AdbPairedDevicePreference.java
new file mode 100644
index 0000000..69f49e3
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/system/development/AdbPairedDevicePreference.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.system.development;
+
+import android.content.Context;
+import android.debug.PairDevice;
+
+import androidx.preference.Preference;
+
+import com.android.tv.settings.R;
+
+/**
+ * An AP preference for the currently connected AP
+ */
+public class AdbPairedDevicePreference extends Preference {
+ private PairDevice mPairedDevice;
+
+ /**
+ * Constructor for creating an instance by a given PairDevice object.
+ */
+ public AdbPairedDevicePreference(PairDevice pairedDevice, Context context) {
+ super(context);
+ mPairedDevice = pairedDevice;
+ refresh();
+ launchAdbDeviceDetailsFragment();
+ }
+
+ /**
+ * Refreshes the preference bound to the paired device previously passed in.
+ */
+ public void refresh() {
+ setTitle();
+ setIcon();
+ }
+
+ /**
+ * Function for updating the newly given PairDevice object in the preference.
+ */
+ public void setPairedDevice(PairDevice pairedDevice) {
+ mPairedDevice = pairedDevice;
+ }
+
+ private void setTitle() {
+ if (mPairedDevice != null) {
+ this.setTitle(mPairedDevice.name);
+ this.setSummary(mPairedDevice.connected
+ ? this.getContext().getText(
+ R.string.adb_wireless_device_connected_summary)
+ : "");
+ }
+ }
+
+ private void setIcon() {
+ this.setIcon(R.drawable.ic_settings);
+ }
+
+ private void launchAdbDeviceDetailsFragment() {
+ // For sending to the device details fragment.
+ this.setFragment(AdbDeviceDetailsFragment.class.getName());
+ if (mPairedDevice != null) {
+ AdbDeviceDetailsFragment.prepareArgs(
+ this.getExtras(), mPairedDevice.name, mPairedDevice.guid);
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/system/development/DevelopmentActivity.java b/Settings/src/com/android/tv/settings/system/development/DevelopmentActivity.java
index 966f272..98f02ae 100644
--- a/Settings/src/com/android/tv/settings/system/development/DevelopmentActivity.java
+++ b/Settings/src/com/android/tv/settings/system/development/DevelopmentActivity.java
@@ -18,27 +18,14 @@
import androidx.fragment.app.Fragment;
-import com.android.tv.settings.BaseSettingsFragment;
import com.android.tv.settings.TvSettingsActivity;
public class DevelopmentActivity extends TvSettingsActivity {
@Override
protected Fragment createSettingsFragment() {
- return SettingsFragment.newInstance();
+ return com.android.tv.settings.overlay.FlavorUtils.getFeatureFactory(
+ this).getSettingsFragmentProvider()
+ .newSettingsFragment(DevelopmentFragment.class.getName(), null);
}
-
- public static class SettingsFragment extends BaseSettingsFragment {
-
- public static SettingsFragment newInstance() {
- return new SettingsFragment();
- }
-
- @Override
- public void onPreferenceStartInitialScreen() {
- final DevelopmentFragment fragment = DevelopmentFragment.newInstance();
- startPreferenceFragment(fragment);
- }
- }
-
}
diff --git a/Settings/src/com/android/tv/settings/system/development/DevelopmentFragment.java b/Settings/src/com/android/tv/settings/system/development/DevelopmentFragment.java
index fa4c414..4519e86 100644
--- a/Settings/src/com/android/tv/settings/system/development/DevelopmentFragment.java
+++ b/Settings/src/com/android/tv/settings/system/development/DevelopmentFragment.java
@@ -18,7 +18,7 @@
import static android.view.CrossWindowBlurListeners.CROSS_WINDOW_BLUR_SUPPORTED;
-import static com.android.tv.settings.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
+import static com.android.tv.settings.library.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
import android.Manifest;
import android.app.Activity;
@@ -35,12 +35,21 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.database.ContentObserver;
import android.hardware.usb.UsbManager;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkRequest;
+import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.BatteryManager;
import android.os.Build;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -52,6 +61,7 @@
import android.sysprop.DisplayProperties;
import android.text.TextUtils;
import android.util.Log;
+import android.util.Pair;
import android.view.IWindowManager;
import android.view.LayoutInflater;
import android.view.ThreadedRenderer;
@@ -73,10 +83,10 @@
import com.android.tv.settings.R;
import com.android.tv.settings.RestrictedPreferenceAdapter;
import com.android.tv.settings.SettingsPreferenceFragment;
-import com.android.tv.settings.overlay.FlavorUtils;
-import com.android.tv.settings.system.development.audio.AudioDebug;
-import com.android.tv.settings.system.development.audio.AudioMetrics;
-import com.android.tv.settings.system.development.audio.AudioReaderException;
+import com.android.tv.settings.library.system.development.audio.AudioDebug;
+import com.android.tv.settings.library.system.development.audio.AudioMetrics;
+import com.android.tv.settings.library.system.development.audio.AudioReaderException;
+import com.android.tv.settings.library.overlay.FlavorUtils;
import java.util.ArrayList;
import java.util.HashSet;
@@ -161,8 +171,6 @@
private static final String TERMINAL_APP_PACKAGE = "com.android.terminal";
- private static final String KEY_CONVERT_FBE = "convert_to_file_encryption";
-
private static final int RESULT_DEBUG_APP = 1000;
private static final int RESULT_MOCK_LOCATION_APP = 1001;
@@ -174,6 +182,8 @@
private static final String STATE_SHOWING_DIALOG_KEY = "showing_dialog_key";
+ private static final String TOGGLE_ADB_WIRELESS_KEY = "toggle_adb_wireless";
+
private String mPendingDialogKey;
private IWindowManager mWindowManager;
@@ -254,6 +264,8 @@
private SwitchPreference mForceResizable;
+ private Preference mWirelessDebugging;
+
private final ArrayList<Preference> mAllPrefs = new ArrayList<>();
private final ArrayList<SwitchPreference> mResetSwitchPrefs
@@ -265,10 +277,16 @@
private AudioDebug mAudioDebug;
+ private ConnectivityManager mConnectivityManager;
+
public static DevelopmentFragment newInstance() {
return new DevelopmentFragment();
}
+ private final Handler mHandler = new Handler(Looper.getMainLooper());
+ private final NetworkCallback mNetworkCallback = new NetworkCallback();
+ private ContentObserver mToggleContentObserver;
+
@Override
public void onCreate(Bundle icicle) {
@@ -291,6 +309,19 @@
(boolean successful) -> onAudioRecorded(successful),
(AudioMetrics.Data data) -> updateAudioRecordingMetrics(data));
+ mConnectivityManager = getContext().getSystemService(ConnectivityManager.class);
+
+ mToggleContentObserver = new ContentObserver(new Handler(Looper.myLooper())) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ updateWirelessDebuggingPreference();
+ }
+ };
+ mContentResolver.registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.ADB_WIFI_ENABLED),
+ false,
+ mToggleContentObserver);
+
super.onCreate(icicle);
}
@@ -399,6 +430,8 @@
mMobileDataAlwaysOn = findAndInitSwitchPref(MOBILE_DATA_ALWAYS_ON);
mUsbConfiguration = addListRestrictedPreference(USB_CONFIGURATION_KEY,
UserManager.DISALLOW_USB_FILE_TRANSFER);
+ // Only show those functions that are available
+ listOnlySettableUsbConfigurationValues();
mWindowAnimationScale = addListPreference(WINDOW_ANIMATION_SCALE_KEY);
mTransitionAnimationScale = addListPreference(TRANSITION_ANIMATION_SCALE_KEY);
@@ -438,35 +471,14 @@
removePreferenceForProduction(hdcpChecking);
}
- // TODO: implement UI for TV
- removePreference(KEY_CONVERT_FBE);
-/*
- // Please import android.sysprop.CryptoProperties when you uncomment this block.
- PreferenceScreen convertFbePreference =
- (PreferenceScreen) findPreference(KEY_CONVERT_FBE);
-
- try {
- IBinder service = ServiceManager.getService("mount");
- IMountService mountService = IMountService.Stub.asInterface(service);
- if (!mountService.isConvertibleToFBE()) {
- removePreference(KEY_CONVERT_FBE);
- } else if (CryptoProperties.type().orElse(CryptoProperties.type_values.NONE) ==
- CryptoProperties.type_values.FILE) {
- convertFbePreference.setEnabled(false);
- convertFbePreference.setSummary(getResources()
- .getString(R.string.convert_to_file_encryption_done));
- }
- } catch(RemoteException e) {
- removePreference(KEY_CONVERT_FBE);
- }
-*/
-
mColorModePreference = (ColorModePreference) findPreference(KEY_COLOR_MODE);
mColorModePreference.updateCurrentAndSupported();
if (mColorModePreference.getColorModeCount() < 2) {
removePreference(KEY_COLOR_MODE);
mColorModePreference = null;
}
+
+ mWirelessDebugging = findPreference(TOGGLE_ADB_WIRELESS_KEY);
}
private void removePreference(String key) {
@@ -586,6 +598,13 @@
recreateDialogForKey(mPendingDialogKey);
mPendingDialogKey = null;
}
+
+ mConnectivityManager.registerNetworkCallback(
+ new NetworkRequest.Builder()
+ .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+ .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
+ .build(),
+ mNetworkCallback);
}
@Override
@@ -596,6 +615,7 @@
}
mAudioDebug.cancelRecording();
+ mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
}
@Override
@@ -626,6 +646,7 @@
public void onDestroy() {
super.onDestroy();
dismissDialogs();
+ mContentResolver.unregisterContentObserver(mToggleContentObserver);
}
void updateSwitchPreference(SwitchPreference switchPreference, boolean value) {
@@ -1358,24 +1379,60 @@
mMobileDataAlwaysOn.isChecked() ? 1 : 0);
}
- private void updateUsbConfigurationValues() {
+ private void listOnlySettableUsbConfigurationValues() {
final UsbManager manager = (UsbManager) getActivity().getSystemService(Context.USB_SERVICE);
mUsbConfiguration.updatePreference(p -> p.setVisible(manager != null));
if (manager != null) {
- String[] values = getResources().getStringArray(R.array.usb_configuration_values);
- String[] titles = getResources().getStringArray(R.array.usb_configuration_titles);
+ final List<Pair<String, String>> usbConfigurationValueTitlePairs =
+ getSettableUsbConfigurationValueTitlePairs();
+ final String[] usbConfigurationValues = usbConfigurationValueTitlePairs.stream()
+ .map(usbConfigurationValueTitlePair -> usbConfigurationValueTitlePair.first)
+ .toArray(String[]::new);
+ final String[] usbConfigurationTitles = usbConfigurationValueTitlePairs.stream()
+ .map(usbConfigurationValueTitlePair -> usbConfigurationValueTitlePair.second)
+ .toArray(String[]::new);
+ mUsbConfiguration.updatePreference(listPreference -> {
+ listPreference.setEntryValues(usbConfigurationValues);
+ listPreference.setEntries(usbConfigurationTitles);
+ });
+ }
+ }
+
+ private List<Pair<String, String>> getSettableUsbConfigurationValueTitlePairs() {
+ final String[] values = getResources().getStringArray(R.array.usb_configuration_values);
+ final String[] titles = getResources().getStringArray(R.array.usb_configuration_titles);
+ final List<Pair<String, String>> settableUsbConfigurationValueTitlePairs =
+ new ArrayList<>();
+ for (int i = 0; i < values.length; i++) {
+ if (UsbManager.areSettableFunctions(UsbManager.usbFunctionsFromString(values[i]))) {
+ settableUsbConfigurationValueTitlePairs.add(Pair.create(values[i], titles[i]));
+ }
+ }
+ return settableUsbConfigurationValueTitlePairs;
+ }
+
+ private void updateUsbConfigurationValues() {
+ final UsbManager manager = (UsbManager) getActivity().getSystemService(Context.USB_SERVICE);
+ if (mUsbConfiguration == null) {
+ return;
+ }
+ mUsbConfiguration.updatePreference(p -> p.setVisible(manager != null));
+ if (manager != null) {
+ final List<Pair<String, String>> usbConfigurationValueTitlePairs =
+ getSettableUsbConfigurationValueTitlePairs();
int index = 0;
long functions = manager.getCurrentFunctions();
- for (int i = 0; i < titles.length; i++) {
- if ((functions & UsbManager.usbFunctionsFromString(values[i])) != 0) {
+ for (int i = 0; i < usbConfigurationValueTitlePairs.size(); i++) {
+ if ((functions & UsbManager.usbFunctionsFromString(
+ usbConfigurationValueTitlePairs.get(i).first)) != 0) {
index = i;
break;
}
}
final int updateIndex = index;
mUsbConfiguration.updatePreference(listPreference -> {
- listPreference.setValue(values[updateIndex]);
- listPreference.setSummary(titles[updateIndex]);
+ listPreference.setValue(usbConfigurationValueTitlePairs.get(updateIndex).first);
+ listPreference.setSummary(usbConfigurationValueTitlePairs.get(updateIndex).second);
listPreference.setOnPreferenceChangeListener(this);
});
}
@@ -1782,4 +1839,41 @@
return false;
}
}
+
+ private void updateWirelessDebuggingPreference() {
+ if (mWirelessDebugging == null) {
+ return;
+ }
+
+ if (!isNetworkConnected()) {
+ mWirelessDebugging.setSummary(R.string.connectivity_summary_no_network_connected);
+ } else {
+ boolean enabled = Settings.Global.getInt(mContentResolver,
+ Settings.Global.ADB_WIFI_ENABLED, 1) != 0;
+ if (enabled) {
+ mWirelessDebugging.setSummary(R.string.enabled);
+ } else {
+ mWirelessDebugging.setSummary(R.string.disabled);
+ }
+ }
+ }
+
+ private boolean isNetworkConnected() {
+ NetworkInfo activeNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
+ return activeNetworkInfo != null && activeNetworkInfo.isConnected();
+ }
+
+ private class NetworkCallback extends ConnectivityManager.NetworkCallback {
+ @Override
+ public void onAvailable(Network network) {
+ super.onAvailable(network);
+ mHandler.post(() -> updateWirelessDebuggingPreference());
+ }
+
+ @Override
+ public void onLost(Network network) {
+ super.onLost(network);
+ mHandler.post(() -> updateWirelessDebuggingPreference());
+ }
+ }
}
diff --git a/Settings/src/com/android/tv/settings/system/development/WirelessDebuggingFragment.java b/Settings/src/com/android/tv/settings/system/development/WirelessDebuggingFragment.java
new file mode 100644
index 0000000..399cdbe
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/system/development/WirelessDebuggingFragment.java
@@ -0,0 +1,632 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.system.development;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.debug.AdbManager;
+import android.debug.FingerprintAndPairDevice;
+import android.debug.IAdbManager;
+import android.debug.PairDevice;
+import android.graphics.drawable.Drawable;
+import android.net.ConnectivityManager;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkRequest;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.Keep;
+import androidx.leanback.app.GuidedStepSupportFragment;
+import androidx.leanback.widget.GuidanceStylist;
+import androidx.leanback.widget.GuidedAction;
+import androidx.leanback.widget.GuidedActionsStylist;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.RadioPreference;
+import com.android.tv.settings.SettingsPreferenceFragment;
+
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Fragment shown when clicking in the "Wireless Debugging" preference in
+ * the developer options.
+ */
+@Keep
+public class WirelessDebuggingFragment extends SettingsPreferenceFragment {
+ private static final String TAG = "WirelessDebuggingFrag";
+
+ private static final String PREF_KEY_ADB_WIRELESS_SELECTION_OPTION =
+ "adb_wireless_selection_option";
+ private static final String PREF_KEY_ADB_WIRELESS_SELECTION_DISABLE =
+ "adb_wireless_selection_disable";
+ private static final String PREF_KEY_ADB_WIRELESS_SELECTION_ENABLE =
+ "adb_wireless_selection_enable";
+ private static final String PREF_KEY_ADB_CODE_PAIRING = "adb_pair_method_code_pref";
+ private static final String PREF_KEY_ADB_DEVICE_NAME = "adb_device_name_pref";
+ private static final String PREF_KEY_ADB_IP_ADDR = "adb_ip_addr_pref";
+ private static final String PREF_KEY_PAIRED_DEVICES_CATEGORY = "adb_paired_devices_category";
+
+ private IAdbManager mAdbManager;
+ private ContentObserver mToggleContentObserver;
+ private ConnectivityManager mConnectivityManager;
+ private final Handler mHandler = new Handler(Looper.getMainLooper());
+ private IntentFilter mIntentFilter;
+
+ private PreferenceCategory mAdbWirelessSelectionOption;
+ private RadioPreference mAdbWirelessSelectionDisable;
+ private RadioPreference mAdbWirelessSelectionEnable;
+ private Preference mCodePairingPreference;
+ private Preference mDeviceNamePreference;
+ private Preference mIpAddrPreference;
+ private PreferenceCategory mPairedDevicesCategory;
+
+ private final WifiNetworkCallback mWifiNetworkCallback = new WifiNetworkCallback();
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION.equals(action)) {
+ Map<String, PairDevice> newPairedDevicesList =
+ (HashMap<String, PairDevice>) intent.getSerializableExtra(
+ AdbManager.WIRELESS_DEVICES_EXTRA);
+ updatePairedDevicePreferences(newPairedDevicesList);
+ } else if (AdbManager.WIRELESS_DEBUG_STATE_CHANGED_ACTION.equals(action)) {
+ int status = intent.getIntExtra(AdbManager.WIRELESS_STATUS_EXTRA,
+ AdbManager.WIRELESS_STATUS_DISCONNECTED);
+ if (status == AdbManager.WIRELESS_STATUS_CONNECTED
+ || status == AdbManager.WIRELESS_STATUS_DISCONNECTED) {
+ updateAdbIpAddressPreference();
+ }
+ }
+ }
+ };
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(getPreferenceScreenResId(), null);
+
+ addPreferences();
+ showBlankPreferences();
+
+ mAdbManager = IAdbManager.Stub.asInterface(ServiceManager.getService(
+ Context.ADB_SERVICE));
+ mToggleContentObserver = new ContentObserver(new Handler(Looper.myLooper())) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ updatePreferenceState();
+ }
+ };
+
+ mConnectivityManager = getContext().getSystemService(ConnectivityManager.class);
+
+ mIntentFilter = new IntentFilter(AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION);
+ mIntentFilter.addAction(AdbManager.WIRELESS_DEBUG_STATE_CHANGED_ACTION);
+
+ initAdbWirelessSelectionOptionPreference();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ getContext().getContentResolver().registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.ADB_WIFI_ENABLED),
+ false,
+ mToggleContentObserver);
+ mConnectivityManager.registerNetworkCallback(
+ new NetworkRequest.Builder()
+ .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+ .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
+ .build(),
+ mWifiNetworkCallback);
+ getActivity().registerReceiver(mReceiver, mIntentFilter);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ getContext().getContentResolver().unregisterContentObserver(mToggleContentObserver);
+ mConnectivityManager.unregisterNetworkCallback(mWifiNetworkCallback);
+ getActivity().unregisterReceiver(mReceiver);
+ }
+
+ private int getPreferenceScreenResId() {
+ return R.xml.adb_wireless_settings;
+ }
+
+ private void addPreferences() {
+ mAdbWirelessSelectionOption = findPreference(PREF_KEY_ADB_WIRELESS_SELECTION_OPTION);
+ mAdbWirelessSelectionDisable = findPreference(PREF_KEY_ADB_WIRELESS_SELECTION_DISABLE);
+ mAdbWirelessSelectionEnable = findPreference(PREF_KEY_ADB_WIRELESS_SELECTION_ENABLE);
+ mCodePairingPreference = findPreference(PREF_KEY_ADB_CODE_PAIRING);
+ mDeviceNamePreference = findPreference(PREF_KEY_ADB_DEVICE_NAME);
+ mIpAddrPreference = findPreference(PREF_KEY_ADB_IP_ADDR);
+ mPairedDevicesCategory = findPreference(PREF_KEY_PAIRED_DEVICES_CATEGORY);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference) {
+ switch (preference.getKey()) {
+ case PREF_KEY_ADB_WIRELESS_SELECTION_ENABLE:
+ setWirelessDebuggingRadioButtonEnabled(true);
+ Settings.Global.putInt(getContext().getContentResolver(),
+ Settings.Global.ADB_WIFI_ENABLED,
+ 1);
+ break;
+ case PREF_KEY_ADB_WIRELESS_SELECTION_DISABLE:
+ setWirelessDebuggingRadioButtonEnabled(false);
+ Settings.Global.putInt(getContext().getContentResolver(),
+ Settings.Global.ADB_WIFI_ENABLED,
+ 0);
+ break;
+ }
+ return super.onPreferenceTreeClick(preference);
+ }
+
+ private void initAdbWirelessSelectionOptionPreference() {
+ boolean enabled = Settings.Global.getInt(getContext().getContentResolver(),
+ Settings.Global.ADB_WIFI_ENABLED, 1) != 0;
+ setWirelessDebuggingRadioButtonEnabled(enabled);
+ }
+
+ private void updatePreferenceState() {
+ if (!isNetworkConnected()) {
+ showBlankPreferences();
+ } else {
+ boolean enabled = Settings.Global.getInt(getContext().getContentResolver(),
+ Settings.Global.ADB_WIFI_ENABLED, 1) != 0;
+ if (enabled) {
+ showDebuggingPreferences();
+ try {
+ FingerprintAndPairDevice[] newList = mAdbManager.getPairedDevices();
+ Map<String, PairDevice> newMap = new HashMap<>();
+ for (FingerprintAndPairDevice pair : newList) {
+ newMap.put(pair.keyFingerprint, pair.device);
+ }
+ updatePairedDevicePreferences(newMap);
+ int connectionPort = mAdbManager.getAdbWirelessPort();
+ if (connectionPort > 0) {
+ Log.i(TAG, "onEnabled(): connect_port=" + connectionPort);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to request the paired list for Adb wireless");
+ }
+ updateAdbIpAddressPreference();
+ } else {
+ showOffMessage();
+ }
+ }
+ }
+
+ private void showBlankPreferences() {
+ if (mAdbWirelessSelectionOption != null) {
+ mAdbWirelessSelectionOption.setVisible(false);
+ }
+ if (mCodePairingPreference != null) {
+ mCodePairingPreference.setVisible(false);
+ }
+ if (mDeviceNamePreference != null) {
+ mDeviceNamePreference.setVisible(false);
+ }
+ if (mIpAddrPreference != null) {
+ mIpAddrPreference.setVisible(false);
+ }
+ if (mPairedDevicesCategory != null) {
+ mPairedDevicesCategory.setVisible(false);
+ }
+ }
+
+ private void showOffMessage() {
+ setWirelessDebuggingRadioButtonEnabled(false);
+ if (mAdbWirelessSelectionOption != null) {
+ mAdbWirelessSelectionOption.setVisible(true);
+ }
+ if (mCodePairingPreference != null) {
+ mCodePairingPreference.setVisible(false);
+ }
+ if (mDeviceNamePreference != null) {
+ mDeviceNamePreference.setVisible(false);
+ }
+ if (mIpAddrPreference != null) {
+ mIpAddrPreference.setVisible(false);
+ }
+ if (mPairedDevicesCategory != null) {
+ mPairedDevicesCategory.setVisible(false);
+ }
+ }
+
+ private void showDebuggingPreferences() {
+ setWirelessDebuggingRadioButtonEnabled(true);
+ if (mAdbWirelessSelectionOption != null) {
+ mAdbWirelessSelectionOption.setVisible(true);
+ }
+ if (mCodePairingPreference != null) {
+ mCodePairingPreference.setVisible(true);
+ }
+ if (mDeviceNamePreference != null) {
+ mDeviceNamePreference.setSummary(getDeviceName());
+ mDeviceNamePreference.setVisible(true);
+ }
+ if (mIpAddrPreference != null) {
+ mIpAddrPreference.setVisible(true);
+ }
+ if (mPairedDevicesCategory != null) {
+ mPairedDevicesCategory.setVisible(true);
+ }
+ }
+
+ private void setWirelessDebuggingRadioButtonEnabled(boolean enabled) {
+ if (mAdbWirelessSelectionEnable != null) {
+ mAdbWirelessSelectionEnable.setChecked(enabled);
+ }
+ if (mAdbWirelessSelectionDisable != null) {
+ mAdbWirelessSelectionDisable.setChecked(!enabled);
+ }
+ }
+
+ private void updatePairedDevicePreferences(Map<String, PairDevice> newList) {
+ if (newList == null) {
+ mPairedDevicesCategory.removeAll();
+ return;
+ }
+ for (int i = 0; i < mPairedDevicesCategory.getPreferenceCount(); i++) {
+ AdbPairedDevicePreference p =
+ (AdbPairedDevicePreference) mPairedDevicesCategory.getPreference(i);
+ // Remove any devices no longer on the newList
+ if (!newList.containsKey(p.getKey())) {
+ mPairedDevicesCategory.removePreference(p);
+ } else {
+ // It is in the newList. Just update the PairDevice value
+ p.setPairedDevice(newList.get(p.getKey()));
+ p.refresh();
+ }
+ }
+ // Add new devices if any.
+ for (Map.Entry<String, PairDevice> entry :
+ newList.entrySet()) {
+ if (mPairedDevicesCategory.findPreference(entry.getKey()) == null) {
+ AdbPairedDevicePreference p =
+ new AdbPairedDevicePreference(entry.getValue(),
+ mPairedDevicesCategory.getContext());
+ p.setKey(entry.getKey());
+ mPairedDevicesCategory.addPreference(p);
+ }
+ }
+ }
+
+ private void updateAdbIpAddressPreference() {
+ if (mIpAddrPreference != null) {
+ String ipAddress = getIpAddressPort();
+ mIpAddrPreference.setSummary(ipAddress);
+ }
+ }
+
+ private String getDeviceName() {
+ String deviceName = Settings.Global.getString(getContext().getContentResolver(),
+ Settings.Global.DEVICE_NAME);
+ if (deviceName == null) {
+ deviceName = Build.MODEL;
+ }
+ return deviceName;
+ }
+
+ private boolean isNetworkConnected() {
+ NetworkInfo activeNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
+ return activeNetworkInfo != null && activeNetworkInfo.isConnected();
+ }
+
+ private String getIpAddressPort() {
+ String ipAddress = getWifiIpv4Address();
+ if (ipAddress != null) {
+ int port = getAdbWirelessPort();
+ if (port <= 0) {
+ return getString(R.string.status_unavailable);
+ } else {
+ ipAddress += ":" + port;
+ }
+ return ipAddress;
+ } else {
+ return getString(R.string.status_unavailable);
+ }
+ }
+
+ private int getAdbWirelessPort() {
+ try {
+ return mAdbManager.getAdbWirelessPort();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to get the adb wifi port");
+ }
+ return 0;
+ }
+
+ private String getWifiIpv4Address() {
+ LinkProperties prop = mConnectivityManager.getLinkProperties(
+ mConnectivityManager.getActiveNetwork());
+ return formatIpAddresses(prop);
+ }
+
+ private static String formatIpAddresses(LinkProperties prop) {
+ if (prop == null) {
+ return null;
+ }
+
+ Iterator<LinkAddress> iter = prop.getAllLinkAddresses().iterator();
+ if (!iter.hasNext()) {
+ return null;
+ }
+
+ StringBuilder addresses = new StringBuilder();
+ while (iter.hasNext()) {
+ InetAddress addr = iter.next().getAddress();
+ if (addr instanceof Inet4Address) {
+ addresses.append(addr.getHostAddress());
+ break;
+ }
+ }
+ return addresses.toString();
+ }
+
+ private class WifiNetworkCallback extends ConnectivityManager.NetworkCallback {
+ @Override
+ public void onAvailable(Network network) {
+ super.onAvailable(network);
+ mHandler.post(() -> updatePreferenceState());
+ }
+
+ @Override
+ public void onLost(Network network) {
+ super.onLost(network);
+ mHandler.post(() -> updatePreferenceState());
+ }
+ }
+
+ /**
+ * Fragment for showing the pairing code and IP address & port to pair the device
+ */
+ @Keep
+ public static class PairingCodeFragment extends GuidedStepSupportFragment {
+ private String mPairingCode;
+ private String mIpAddressPort;
+
+ private ImageView mIconView;
+ private TextView mPairingCodeTitleTextView;
+ private TextView mPairingCodeTextView;
+ private TextView mIpAddressPortTitleTextView;
+ private TextView mIpAddressPortTextView;
+
+ private IAdbManager mAdbManager;
+ private IntentFilter mIntentFilter;
+ private ConnectivityManager mConnectivityManager;
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION.equals(action)) {
+ Integer res = intent.getIntExtra(
+ AdbManager.WIRELESS_STATUS_EXTRA,
+ AdbManager.WIRELESS_STATUS_FAIL);
+
+ if (res.equals(AdbManager.WIRELESS_STATUS_PAIRING_CODE)) {
+ String pairingCode = intent.getStringExtra(
+ AdbManager.WIRELESS_PAIRING_CODE_EXTRA);
+ Log.d(TAG, "Received 6 digit pairing code: " + pairingCode);
+ mPairingCode = pairingCode;
+ refresh(mPairingCode, mIpAddressPort);
+ } else if (res.equals(AdbManager.WIRELESS_STATUS_CONNECTED)) {
+ int port = intent.getIntExtra(AdbManager.WIRELESS_DEBUG_PORT_EXTRA, 0);
+ Log.i(TAG, "Got pairing code port=" + port);
+ String ipAddr = getWifiIpv4Address() + ":" + port;
+ mIpAddressPort = ipAddr;
+ refresh(mPairingCode, mIpAddressPort);
+ }
+ }
+ }
+ };
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mConnectivityManager = getContext().getSystemService(ConnectivityManager.class);
+ mIntentFilter = new IntentFilter(AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION);
+ mAdbManager = IAdbManager.Stub.asInterface(ServiceManager.getService(
+ Context.ADB_SERVICE));
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ getActivity().registerReceiver(mReceiver, mIntentFilter);
+ try {
+ mAdbManager.enablePairingByPairingCode();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to enable pairing");
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ getActivity().unregisterReceiver(mReceiver);
+ try {
+ mAdbManager.disablePairing();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to disable pairing");
+ }
+ }
+
+ @Override
+ public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
+ Drawable networkIcon;
+ if (isWifiNetwork()) {
+ networkIcon = getContext().getDrawable(R.drawable.ic_adb_wifi_132dp);
+ } else {
+ networkIcon = getContext().getDrawable(R.drawable.ic_adb_ethernet_132dp);
+ }
+ return new GuidanceStylist.Guidance(
+ getString(R.string.adb_pairing_device_dialog_title),
+ null,
+ null,
+ networkIcon
+ );
+ }
+
+ @Override
+ public void onCreateActions(List<GuidedAction> actions,
+ Bundle savedInstanceState) {
+ actions.add(new GuidedAction.Builder(getContext())
+ .build());
+ }
+
+ @Override
+ public GuidanceStylist onCreateGuidanceStylist() {
+ return new GuidanceStylist() {
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Guidance guidance) {
+ View view = super.onCreateView(inflater, container, guidance);
+ mIconView = getIconView();
+ return view;
+ }
+ };
+ }
+
+ @Override
+ public GuidedActionsStylist onCreateActionsStylist() {
+ return new GuidedActionsStylist() {
+ @Override
+ public int onProvideItemLayoutId() {
+ return R.layout.pairing_code_guided_action;
+ }
+
+ @Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent) {
+ ViewHolder viewHolder = super.onCreateViewHolder(parent);
+ mPairingCodeTitleTextView =
+ viewHolder.itemView.findViewById(R.id.pairing_code_title);
+ mPairingCodeTextView =
+ viewHolder.itemView.findViewById(R.id.pairing_code);
+ mIpAddressPortTitleTextView =
+ viewHolder.itemView.findViewById(R.id.ip_address_port_title);
+ mIpAddressPortTextView =
+ viewHolder.itemView.findViewById(R.id.ip_address_port);
+
+ if (mPairingCodeTitleTextView != null) {
+ mPairingCodeTitleTextView.setText(isWifiNetwork()
+ ? R.string.adb_pairing_device_dialog_pairing_code_label
+ : R.string.adb_pairing_device_dialog_ethernet_pairing_code_label);
+ }
+ if (mPairingCodeTextView != null) {
+ mPairingCodeTextView.setText(mPairingCode);
+ }
+ if (mIpAddressPortTitleTextView != null) {
+ mIpAddressPortTitleTextView.setText(
+ R.string.adb_wireless_ip_addr_preference_title);
+ }
+ if (mIpAddressPortTextView != null) {
+ mIpAddressPortTextView.setText(mIpAddressPort);
+ }
+
+ return viewHolder;
+ }
+ };
+ }
+
+ private void refresh(String pairingCode, String ipAddressPort) {
+ mPairingCode = pairingCode;
+ mIpAddressPort = ipAddressPort;
+ boolean isWifiNetwork = isWifiNetwork();
+
+ if (mIconView != null) {
+ mIconView.setImageDrawable(isWifiNetwork
+ ? getContext().getDrawable(R.drawable.ic_adb_wifi_132dp)
+ : getContext().getDrawable(R.drawable.ic_adb_ethernet_132dp));
+ }
+
+ if (mPairingCodeTitleTextView != null) {
+ mPairingCodeTitleTextView.setText(isWifiNetwork
+ ? R.string.adb_pairing_device_dialog_pairing_code_label
+ : R.string.adb_pairing_device_dialog_ethernet_pairing_code_label);
+ }
+ if (mPairingCodeTextView != null) {
+ mPairingCodeTextView.setText(mPairingCode);
+ }
+ if (mIpAddressPortTextView != null) {
+ mIpAddressPortTextView.setText(mIpAddressPort);
+ }
+ }
+
+ private boolean isWifiNetwork() {
+ NetworkInfo activeNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
+ return activeNetworkInfo != null && activeNetworkInfo.isConnected()
+ && ConnectivityManager.TYPE_ETHERNET != activeNetworkInfo.getType();
+ }
+
+ private String getWifiIpv4Address() {
+ LinkProperties prop = mConnectivityManager.getLinkProperties(
+ mConnectivityManager.getActiveNetwork());
+ return formatIpAddresses(prop);
+ }
+
+ private static String formatIpAddresses(LinkProperties prop) {
+ if (prop == null) {
+ return null;
+ }
+
+ Iterator<LinkAddress> iter = prop.getAllLinkAddresses().iterator();
+ if (!iter.hasNext()) {
+ return null;
+ }
+
+ StringBuilder addresses = new StringBuilder();
+ while (iter.hasNext()) {
+ InetAddress addr = iter.next().getAddress();
+ if (addr instanceof Inet4Address) {
+ addresses.append(addr.getHostAddress());
+ break;
+ }
+ }
+ return addresses.toString();
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/users/AppRestrictionsFragment.java b/Settings/src/com/android/tv/settings/users/AppRestrictionsFragment.java
index 5aa891d..fb3556a 100644
--- a/Settings/src/com/android/tv/settings/users/AppRestrictionsFragment.java
+++ b/Settings/src/com/android/tv/settings/users/AppRestrictionsFragment.java
@@ -41,6 +41,7 @@
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
+import android.util.EventLog;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@@ -558,14 +559,14 @@
if (intent.getPackage() != null && intent.getPackage().equals(packageName)) {
return;
}
- // Activity can be started if intent resolves to multiple activities
- List<ResolveInfo> resolveInfos = AppRestrictionsFragment.this.mPackageManager
- .queryIntentActivities(intent, 0 /* no flags */);
- if (resolveInfos.size() != 1) {
- return;
+ ResolveInfo resolveInfo = mPackageManager.resolveActivity(
+ intent, PackageManager.MATCH_DEFAULT_ONLY);
+
+ if (resolveInfo == null) {
+ throw new ActivityNotFoundException("No result for resolving " + intent);
}
// Prevent potential privilege escalation
- ActivityInfo activityInfo = resolveInfos.get(0).activityInfo;
+ ActivityInfo activityInfo = resolveInfo.activityInfo;
if (!packageName.equals(activityInfo.packageName)) {
throw new SecurityException("Application " + packageName
+ " is not allowed to start activity " + intent);
@@ -595,8 +596,16 @@
}
return true;
} else if (preference.getIntent() != null) {
- assertSafeToStartCustomActivity(preference.getIntent(),
+
+ try {
+ assertSafeToStartCustomActivity(preference.getIntent(),
getPackageFromKey(preference.getKey()));
+ } catch (ActivityNotFoundException | SecurityException e) {
+ // return without startActivity
+ Log.e(TAG, "Cannot start restrictionsIntent " + e);
+ EventLog.writeEvent(0x534e4554, "200688991", -1 /* UID */, "");
+ return true;
+ }
try {
startActivityForResult(preference.getIntent(),
generateCustomActivityRequestCode(preference));
diff --git a/Settings/src/com/android/tv/settings/users/UserSwitchListenerService.java b/Settings/src/com/android/tv/settings/users/UserSwitchListenerService.java
index d260158..6be907e 100644
--- a/Settings/src/com/android/tv/settings/users/UserSwitchListenerService.java
+++ b/Settings/src/com/android/tv/settings/users/UserSwitchListenerService.java
@@ -31,6 +31,8 @@
import android.os.UserManager;
import android.util.Log;
+import com.android.tv.settings.library.users.RestrictedProfileModel;
+
public class UserSwitchListenerService extends Service {
private static final boolean DEBUG = false;
@@ -42,37 +44,61 @@
private static final String
ON_BOOT_USER_ID_PREFERENCE = "UserSwitchOnBootBroadcastReceiver.userId";
+ private final UserSwitchObserver mUserSwitchObserver = new UserSwitchObserver() {
+ @Override
+ public void onUserSwitchComplete(int newUserId) {
+ if (DEBUG) {
+ Log.d(TAG, "user has been foregrounded: " + newUserId);
+ }
+ setBootUser(UserSwitchListenerService.this, newUserId);
+ }
+ };
+
public static class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
- boolean isSystemUser = UserManager.get(context).isSystemUser();
- if (isSystemUser) {
- context.startService(new Intent(context, UserSwitchListenerService.class));
- int bootUserId = getBootUser(context);
- if (DEBUG) {
- Log.d(TAG, "boot completed, user is " + UserHandle.myUserId()
- + " boot user id: " + bootUserId);
- }
+ int bootUserId = getBootUser(context);
+ if (DEBUG) {
+ Log.d(TAG, "boot completed, user is " + UserHandle.myUserId()
+ + " boot user id: " + bootUserId);
+ }
+ if (UserManager.get(context).isSystemUser()) {
if (UserHandle.myUserId() != bootUserId) {
switchUserNow(bootUserId);
}
}
- updateLaunchPoint(context, new RestrictedProfileModel(context).getUser() != null);
+ onUserCreatedOrDeleted(context);
}
}
- public static void updateLaunchPoint(Context context, boolean enableLaunchPoint) {
+ /** The UserSwitchListenerService is only ever needed when there is a restricted profile. */
+ private static boolean hasRestrictedProfile(Context context) {
+ return new RestrictedProfileModel(context).getUser() != null;
+ }
+
+ /**
+ * Enable or disable the restricted profile launcher entry activity as well as the
+ * {@link UserSwitchListenerService} depending on whether there is a restricted profile.
+ */
+ public static void onUserCreatedOrDeleted(final Context context) {
+ final boolean restrictedProfile = hasRestrictedProfile(context);
if (DEBUG) {
- Log.d(TAG, "updating launch point: " + enableLaunchPoint);
+ Log.d(TAG, "updating restricted profile : " + restrictedProfile);
}
- PackageManager pm = context.getPackageManager();
- ComponentName compName = new ComponentName(context,
- RESTRICTED_PROFILE_LAUNCHER_ENTRY_ACTIVITY);
- pm.setComponentEnabledSetting(compName,
- enableLaunchPoint ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
+ context.getPackageManager().setComponentEnabledSetting(new ComponentName(context,
+ RESTRICTED_PROFILE_LAUNCHER_ENTRY_ACTIVITY), restrictedProfile
+ ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
+
+ if (restrictedProfile) {
+ context.startServiceAsUser(new Intent(context, UserSwitchListenerService.class),
+ UserHandle.SYSTEM);
+ } else {
+ context.stopServiceAsUser(new Intent(context, UserSwitchListenerService.class),
+ UserHandle.SYSTEM);
+ }
}
static void setBootUser(Context context, int userId) {
@@ -101,26 +127,30 @@
super.onCreate();
try {
ActivityManager.getService().registerUserSwitchObserver(
- new UserSwitchObserver() {
- @Override
- public void onUserSwitchComplete(int newUserId) throws RemoteException {
- if (DEBUG) {
- Log.d(TAG, "user has been foregrounded: " + newUserId);
- }
- setBootUser(UserSwitchListenerService.this, newUserId);
- }
- }, UserSwitchListenerService.class.getName());
+ mUserSwitchObserver,
+ UserSwitchListenerService.class.getName());
} catch (RemoteException e) {
+ Log.e(TAG, "Caught exception while registering UserSwitchObserver", e);
}
}
@Override
public void onDestroy() {
+ try {
+ ActivityManager.getService().unregisterUserSwitchObserver(mUserSwitchObserver);
+ } catch (RemoteException e) {
+ // Not much we can do here
+ }
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
+ if (!hasRestrictedProfile(this)) {
+ stopSelf();
+ Log.w(TAG, "no restricted profiles found! Immediately finishing "
+ + UserSwitchListenerService.class.getSimpleName());
+ }
return START_STICKY;
}
diff --git a/Settings/src/com/android/tv/settings/util/ResolutionSelectionUtils.java b/Settings/src/com/android/tv/settings/util/ResolutionSelectionUtils.java
new file mode 100644
index 0000000..ed4c733
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/util/ResolutionSelectionUtils.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.tv.settings.util;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.view.Display;
+
+import com.android.tv.settings.R;
+
+/** This utility class for Resolution Setting **/
+public class ResolutionSelectionUtils {
+
+ /**
+ * Returns the refresh rate converted to a string. If the refresh rate has only 0s after the
+ * floating point, they are removed. The unit "Hz" is added to end of refresh rate.
+ */
+ public static String getRefreshRateString(Resources resources, float refreshRate) {
+ float roundedRefreshRate = Math.round(refreshRate * 100.0f) / 100.0f;
+ if (roundedRefreshRate % 1 == 0) {
+ return ((int) roundedRefreshRate) + " "
+ + resources.getString(R.string.resolution_selection_hz);
+ } else {
+ return roundedRefreshRate + " " + resources.getString(R.string.resolution_selection_hz);
+ }
+ }
+
+ /**
+ * Returns the resolution converted to a string. The unit "p" is added to end of refresh rate.
+ * If the resolution in 2160p, the string returned is "4k".
+ */
+ public static String getResolutionString(int width, int height) {
+ int resolution = Math.min(width, height);
+ if (resolution == 2160) {
+ return "4k";
+ }
+ return resolution + "p";
+ }
+
+ /**
+ * Returns the {@link Display.Mode} converted to a string.
+ * Format: Resolution + "p" + RefreshRate + "Hz"
+ */
+ public static String modeToString(Display.Mode mode, Context context) {
+ if (mode == null) {
+ return context.getString(R.string.resolution_selection_auto_title);
+ }
+ String modeString = getResolutionString(mode.getPhysicalWidth(), mode.getPhysicalHeight());
+ modeString += " " + getRefreshRateString(context.getResources(), mode.getRefreshRate());
+ return modeString;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/util/bluetooth/OWNERS b/Settings/src/com/android/tv/settings/util/bluetooth/OWNERS
index 192011b..27b70e3 100644
--- a/Settings/src/com/android/tv/settings/util/bluetooth/OWNERS
+++ b/Settings/src/com/android/tv/settings/util/bluetooth/OWNERS
@@ -1,2 +1 @@
-apanicke@google.com
jamuraa@google.com
diff --git a/Settings/src/com/android/tv/settings/vendor/VendorActivity.java b/Settings/src/com/android/tv/settings/vendor/VendorActivity.java
index ed860ba..bdc5cce 100644
--- a/Settings/src/com/android/tv/settings/vendor/VendorActivity.java
+++ b/Settings/src/com/android/tv/settings/vendor/VendorActivity.java
@@ -16,7 +16,7 @@
package com.android.tv.settings.vendor;
-import static com.android.tv.settings.overlay.FlavorUtils.FLAVOR_VENDOR;
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_VENDOR;
import com.android.tv.settings.R;
import com.android.tv.settings.slice.SliceActivity;
diff --git a/Settings/src/com/android/tv/settings/widget/AccessPointPreference.java b/Settings/src/com/android/tv/settings/widget/AccessPointPreference.java
index b42b61e..537a4b5 100644
--- a/Settings/src/com/android/tv/settings/widget/AccessPointPreference.java
+++ b/Settings/src/com/android/tv/settings/widget/AccessPointPreference.java
@@ -9,7 +9,6 @@
import android.graphics.drawable.StateListDrawable;
import android.net.wifi.WifiConfiguration;
import android.os.Looper;
-import android.os.UserHandle;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.SparseArray;
@@ -22,9 +21,9 @@
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
-import com.android.tv.settings.R;
import com.android.settingslib.wifi.AccessPoint;
import com.android.settingslib.wifi.AccessPoint.Speed;
+import com.android.tv.settings.R;
public class AccessPointPreference extends Preference {
diff --git a/Settings/src/com/android/tv/settings/widget/TvAccessPointPreference.java b/Settings/src/com/android/tv/settings/widget/TvAccessPointPreference.java
index b231c43..24bb13c 100644
--- a/Settings/src/com/android/tv/settings/widget/TvAccessPointPreference.java
+++ b/Settings/src/com/android/tv/settings/widget/TvAccessPointPreference.java
@@ -24,7 +24,7 @@
import com.android.settingslib.wifi.AccessPoint;
import com.android.tv.settings.R;
-import com.android.tv.settings.overlay.FlavorUtils;
+import com.android.tv.settings.library.overlay.FlavorUtils;
/**
* Preference for overriding wifi icons
diff --git a/Settings/tests/robotests/src/com/android/tv/settings/MainFragmentTest.java b/Settings/tests/robotests/src/com/android/tv/settings/MainFragmentTest.java
index 3f05c7b..b788d17 100644
--- a/Settings/tests/robotests/src/com/android/tv/settings/MainFragmentTest.java
+++ b/Settings/tests/robotests/src/com/android/tv/settings/MainFragmentTest.java
@@ -23,12 +23,14 @@
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
import static org.robolectric.shadow.api.Shadow.extract;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
+import android.icu.text.MessageFormat;
import android.telephony.SignalStrength;
import androidx.preference.Preference;
@@ -44,7 +46,11 @@
import org.robolectric.RuntimeEnvironment;
import org.robolectric.shadows.ShadowAccountManager;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Optional;
import java.util.Set;
@RunWith(RobolectricTestRunner.class)
@@ -65,7 +71,7 @@
final Preference networkPref = mock(Preference.class);
doReturn(networkPref).when(mMainFragment).findPreference(MainFragment.KEY_NETWORK);
final ConnectivityListener listener = mock(ConnectivityListener.class);
- mMainFragment.mConnectivityListener = listener;
+ mMainFragment.mConnectivityListenerOptional = Optional.of(listener);
doReturn(false).when(listener).isEthernetAvailable();
doReturn(false).when(listener).isCellConnected();
@@ -82,7 +88,7 @@
final Preference networkPref = mock(Preference.class);
doReturn(networkPref).when(mMainFragment).findPreference(MainFragment.KEY_NETWORK);
final ConnectivityListener listener = mock(ConnectivityListener.class);
- mMainFragment.mConnectivityListener = listener;
+ mMainFragment.mConnectivityListenerOptional = Optional.of(listener);
doReturn(true).when(listener).isEthernetAvailable();
doReturn(false).when(listener).isCellConnected();
@@ -99,7 +105,7 @@
final Preference networkPref = mock(Preference.class);
doReturn(networkPref).when(mMainFragment).findPreference(MainFragment.KEY_NETWORK);
final ConnectivityListener listener = mock(ConnectivityListener.class);
- mMainFragment.mConnectivityListener = listener;
+ mMainFragment.mConnectivityListenerOptional = Optional.of(listener);
doReturn(true).when(listener).isEthernetAvailable();
doReturn(false).when(listener).isCellConnected();
@@ -116,7 +122,7 @@
final Preference networkPref = mock(Preference.class);
doReturn(networkPref).when(mMainFragment).findPreference(MainFragment.KEY_NETWORK);
final ConnectivityListener listener = mock(ConnectivityListener.class);
- mMainFragment.mConnectivityListener = listener;
+ mMainFragment.mConnectivityListenerOptional = Optional.of(listener);
doReturn(false).when(listener).isEthernetAvailable();
doReturn(false).when(listener).isCellConnected();
@@ -165,7 +171,7 @@
final Preference networkPref = mock(Preference.class);
doReturn(networkPref).when(mMainFragment).findPreference(MainFragment.KEY_NETWORK);
final ConnectivityListener listener = mock(ConnectivityListener.class);
- mMainFragment.mConnectivityListener = listener;
+ mMainFragment.mConnectivityListenerOptional = Optional.of(listener);
doReturn(false).when(listener).isEthernetAvailable();
doReturn(false).when(listener).isCellConnected();
@@ -182,7 +188,7 @@
final Preference networkPref = mock(Preference.class);
doReturn(networkPref).when(mMainFragment).findPreference(MainFragment.KEY_NETWORK);
final ConnectivityListener listener = mock(ConnectivityListener.class);
- mMainFragment.mConnectivityListener = listener;
+ mMainFragment.mConnectivityListenerOptional = Optional.of(listener);
doReturn(false).when(listener).isEthernetAvailable();
doReturn(true).when(listener).isCellConnected();
@@ -269,8 +275,13 @@
mMainFragment.updateAccountPrefInfo();
verify(accountsPref, atLeastOnce()).setIcon(R.drawable.ic_accounts_and_sign_in);
- String summary = RuntimeEnvironment.application.getResources()
- .getQuantityString(R.plurals.accounts_category_summary, 2, 2);
+ MessageFormat msgFormat = new MessageFormat(
+ RuntimeEnvironment.application.getResources().getString(
+ R.string.accounts_category_summary),
+ Locale.getDefault());
+ Map<String, Object> arguments = new HashMap<>();
+ arguments.put("count", 2);
+ String summary = msgFormat.format(arguments);
verify(accountsPref, atLeastOnce()).setSummary(summary);
assertTrue(mMainFragment.mHasAccounts);
}
@@ -305,4 +316,24 @@
assertTrue(mMainFragment.mHasBtAccessories);
}
+
+ @Test
+ public void
+ updateConnectivity_givenConnectivityListenerNull_thenNetworkPreferenceIsNotUpdated() {
+ /*
+ Currently this is only a unit test that verifies that MainFragment
+ does not try to update network preference when ConnectivityListener
+ is null.
+ TODO:
+ Add test to verify that ConnectivityListener is null when wifi scan
+ optimisation is enabled.
+ */
+ final Preference networkPreference = mock(Preference.class);
+ doReturn(networkPreference).when(mMainFragment).findPreference(MainFragment.KEY_NETWORK);
+ mMainFragment.mConnectivityListenerOptional = Optional.empty();
+
+ mMainFragment.updateConnectivity();
+
+ verifyZeroInteractions(networkPreference);
+ }
}
diff --git a/Settings/tests/robotests/src/com/android/tv/settings/connectivity/WifiConfigHelperTest.java b/Settings/tests/robotests/src/com/android/tv/settings/connectivity/WifiConfigHelperTest.java
index 0092e19..fb818c9 100644
--- a/Settings/tests/robotests/src/com/android/tv/settings/connectivity/WifiConfigHelperTest.java
+++ b/Settings/tests/robotests/src/com/android/tv/settings/connectivity/WifiConfigHelperTest.java
@@ -78,6 +78,8 @@
assertEquals(R.string.proxy_error_invalid_exclusion_list,
WifiConfigHelper.validate("abc", "1234", "&8"));
assertEquals(0, WifiConfigHelper.validate("Android-TV", "1234", "*.abc"));
+ assertEquals(R.string.proxy_error_invalid_exclusion_list,
+ WifiConfigHelper.validate("abc", "1234", ".google.com", true));
}
private boolean isDoubleQuoted(String s) {
diff --git a/Settings/tests/robotests/src/com/android/tv/settings/device/apps/NotificationsPreferenceTest.java b/Settings/tests/robotests/src/com/android/tv/settings/device/apps/NotificationsPreferenceTest.java
index b851aa9..4bc9528 100644
--- a/Settings/tests/robotests/src/com/android/tv/settings/device/apps/NotificationsPreferenceTest.java
+++ b/Settings/tests/robotests/src/com/android/tv/settings/device/apps/NotificationsPreferenceTest.java
@@ -205,7 +205,8 @@
inUnblockableResList ? new String[]{packageName} : mEmptyNonBlockableAppsList;
when(mResources.getStringArray(
- com.android.internal.R.array.config_nonBlockableNotificationPackages
+ mResources.getIdentifier("config_nonBlockableNotificationPackages",
+ "array", "android")
)).thenReturn(unblockableResList);
}
}
diff --git a/Settings/tests/robotests/src/com/android/tv/settings/device/displaysound/AdvancedVolumeFragmentTest.java b/Settings/tests/robotests/src/com/android/tv/settings/device/displaysound/AdvancedVolumeFragmentTest.java
index 73334d9..569219e 100644
--- a/Settings/tests/robotests/src/com/android/tv/settings/device/displaysound/AdvancedVolumeFragmentTest.java
+++ b/Settings/tests/robotests/src/com/android/tv/settings/device/displaysound/AdvancedVolumeFragmentTest.java
@@ -26,6 +26,7 @@
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.media.AudioFormat;
@@ -125,7 +126,7 @@
ArgumentCaptor<Integer> audioFormat = ArgumentCaptor.forClass(Integer.class);
ArgumentCaptor<Boolean> formatEnabled = ArgumentCaptor.forClass(Boolean.class);
- verify(mAudioManager).setSurroundFormatEnabled(
+ verify(mAudioManager, times(4)).setSurroundFormatEnabled(
audioFormat.capture(), formatEnabled.capture());
assertThat(audioFormat.getValue()).isEqualTo(AudioFormat.ENCODING_DTS);
assertThat(formatEnabled.getValue()).isTrue();
@@ -153,7 +154,7 @@
ArgumentCaptor<Integer> audioFormat = ArgumentCaptor.forClass(Integer.class);
ArgumentCaptor<Boolean> formatEnabled = ArgumentCaptor.forClass(Boolean.class);
- verify(mAudioManager).setSurroundFormatEnabled(
+ verify(mAudioManager, times(4)).setSurroundFormatEnabled(
audioFormat.capture(), formatEnabled.capture());
assertThat(audioFormat.getValue()).isEqualTo(AudioFormat.ENCODING_DTS);
assertThat(formatEnabled.getValue()).isFalse();
diff --git a/Settings/tests/robotests/src/com/android/tv/settings/device/displaysound/DisplaySoundFragmentTest.java b/Settings/tests/robotests/src/com/android/tv/settings/device/displaysound/DisplaySoundFragmentTest.java
new file mode 100644
index 0000000..9ad847d
--- /dev/null
+++ b/Settings/tests/robotests/src/com/android/tv/settings/device/displaysound/DisplaySoundFragmentTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.displaysound;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import android.hardware.display.DisplayManager;
+import android.view.Display;
+
+import androidx.preference.Preference;
+
+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.androidx.fragment.FragmentController;
+
+@RunWith(RobolectricTestRunner.class)
+public class DisplaySoundFragmentTest {
+ private static final String KEY_RESOLUTION_TITLE = "resolution_selection";
+
+ @Mock
+ private DisplayManager mDisplayManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testNoSystemPreferredDisplayMode_hidesDisplayModeSetting() {
+ Display.Mode[] modes = new Display.Mode[] {
+ new Display.Mode(0, 800, 600, 120),
+ new Display.Mode(1, 800, 600, 60)
+ };
+ DisplaySoundFragment fragment =
+ createDisplaySoundFragmentWith(modes, modes[1], null);
+
+ Preference resolutionPreference =
+ fragment.getPreferenceScreen().findPreference(KEY_RESOLUTION_TITLE);
+ assertThat(resolutionPreference).isEqualTo(null);
+ }
+
+ @Test
+ public void testWithSystemPreferredDisplayMode_showsDisplayModeSetting() {
+ Display.Mode[] modes = new Display.Mode[] {
+ new Display.Mode(0, 800, 600, 120),
+ new Display.Mode(1, 800, 600, 60)
+ };
+ DisplaySoundFragment fragment =
+ createDisplaySoundFragmentWith(modes, modes[1], modes[1]);
+
+ Preference resolutionPreference =
+ fragment.getPreferenceScreen().findPreference(KEY_RESOLUTION_TITLE);
+ assertThat(resolutionPreference).isNotEqualTo(null);
+ }
+
+ private DisplaySoundFragment createDisplaySoundFragmentWith(
+ Display.Mode[] supportedModes, Display.Mode userPreferredMode,
+ Display.Mode systemPreferredMode) {
+ Display display = spy(Display.class);
+ doReturn(supportedModes).when(display).getSupportedModes();
+ doReturn(systemPreferredMode).when(display).getSystemPreferredDisplayMode();
+ doReturn(display).when(mDisplayManager).getDisplay(Display.DEFAULT_DISPLAY);
+
+ DisplaySoundFragment fragment = spy(DisplaySoundFragment.class);
+ doReturn(mDisplayManager).when(fragment).getDisplayManager();
+
+ return FragmentController.of(fragment)
+ .create()
+ .start()
+ .get();
+ }
+}
diff --git a/Settings/tests/robotests/src/com/android/tv/settings/device/displaysound/ResolutionSelectionFragmentTest.java b/Settings/tests/robotests/src/com/android/tv/settings/device/displaysound/ResolutionSelectionFragmentTest.java
new file mode 100644
index 0000000..ec93729
--- /dev/null
+++ b/Settings/tests/robotests/src/com/android/tv/settings/device/displaysound/ResolutionSelectionFragmentTest.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.device.displaysound;
+
+import static com.android.tv.settings.device.displaysound.ResolutionSelectionFragment.KEY_RESOLUTION_PREFIX;
+import static com.android.tv.settings.device.displaysound.ResolutionSelectionFragment.KEY_RESOLUTION_SELECTION_AUTO;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.hardware.display.DisplayManager;
+import android.view.Display;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+
+import com.android.tv.settings.R;
+import com.android.tv.settings.RadioPreference;
+
+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.shadows.androidx.fragment.FragmentController;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+@RunWith(RobolectricTestRunner.class)
+public class ResolutionSelectionFragmentTest {
+ @Mock
+ private DisplayManager mDisplayManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testOnPreferenceTreeClick_selectAuto() {
+ Display.Mode[] modes = new Display.Mode[] {
+ new Display.Mode(0, 800, 600, 120),
+ new Display.Mode(1, 800, 600, 60),
+ new Display.Mode(2, 2160, 2160, 60),
+ new Display.Mode(3, 2160, 2160, 120),
+ };
+ ResolutionSelectionFragment fragment =
+ createResolutionSelectionFragmentWith(modes);
+ RadioPreference preference = fragment.findPreference(KEY_RESOLUTION_SELECTION_AUTO);
+
+ fragment.onPreferenceTreeClick(preference);
+
+ verify(mDisplayManager).clearGlobalUserPreferredDisplayMode();
+ assertThat(preference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void testOnPreferenceTreeClick_selectMode() {
+ Display.Mode[] modes = new Display.Mode[] {
+ new Display.Mode(0, 800, 600, 120),
+ new Display.Mode(1, 800, 600, 60),
+ new Display.Mode(2, 2160, 2160, 60),
+ new Display.Mode(3, 2160, 2160, 120),
+ };
+ ResolutionSelectionFragment fragment =
+ createResolutionSelectionFragmentWith(modes);
+ RadioPreference preference = fragment.findPreference(KEY_RESOLUTION_PREFIX + 2);
+
+ fragment.onPreferenceTreeClick(preference);
+
+ ArgumentCaptor<Display.Mode> mode = ArgumentCaptor.forClass(Display.Mode.class);
+ verify(mDisplayManager).setGlobalUserPreferredDisplayMode(mode.capture());
+ assertThat(mode.getValue().getPhysicalHeight()).isEqualTo(600);
+ assertThat(mode.getValue().getPhysicalWidth()).isEqualTo(800);
+ assertThat(mode.getValue().getRefreshRate()).isEqualTo(120);
+ assertThat(preference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void testGetPreferenceScreen_returnsCorrectModeDescriptions() {
+ Display.Mode[] modes = new Display.Mode[] {
+ new Display.Mode(0, 600, 800, 59.944f),
+ new Display.Mode(1, 800, 1200, 60),
+ new Display.Mode(2, 576, 576, 60),
+ new Display.Mode(3, 800, 1200, 120),
+ new Display.Mode(4, 600, 800, 120),
+ new Display.Mode(5, 2160, 2160, 60),
+ new Display.Mode(5, 2160, 2160, 59.944f),
+ };
+ ResolutionSelectionFragment fragment =
+ createResolutionSelectionFragmentWith(modes);
+
+ assertThat(fragment.getPreferenceScreen().getPreferenceCount()).isEqualTo(1);
+ Preference modePreference = fragment.getPreferenceScreen().getPreference(0);
+ assertThat(getChildrenTitles(modePreference)).containsExactly(
+ fragment.getContext().getString(R.string.resolution_selection_auto_title),
+ "4k (60 Hz)",
+ "4k (59.94 Hz)",
+ "576p (60 Hz)",
+ "800p (120 Hz)",
+ "800p (60 Hz)",
+ "600p (120 Hz)",
+ "600p (59.94 Hz)");
+
+ assertThat(getChildrenSummaries(modePreference)).containsExactly(
+ "2160 x 2160",
+ "2160 x 2160",
+ "576 x 576",
+ "800 x 1200",
+ "800 x 1200",
+ "600 x 800",
+ "600 x 800");
+ }
+
+ @Test
+ public void testGetUserPreferredDisplayMode_selectsCorrectPreference() {
+ Display.Mode[] modes = new Display.Mode[] {
+ new Display.Mode(1, 800, 1200, 120),
+ new Display.Mode(2, 800, 1200, 60),
+ new Display.Mode(0, 600, 800, 120)
+ };
+ Display.Mode userPreferredMode = modes[1];
+ ResolutionSelectionFragment fragment =
+ createResolutionSelectionFragmentWith(modes, userPreferredMode);
+
+ RadioPreference autoPreference = fragment.findPreference(KEY_RESOLUTION_SELECTION_AUTO);
+ assertThat(autoPreference.isChecked()).isFalse();
+ RadioPreference preference = fragment.findPreference(KEY_RESOLUTION_PREFIX + 0);
+ assertThat(preference.isChecked()).isFalse();
+ preference = fragment.findPreference(KEY_RESOLUTION_PREFIX + 1);
+ assertThat(preference.isChecked()).isTrue();
+ preference = fragment.findPreference(KEY_RESOLUTION_PREFIX + 2);
+ assertThat(preference.isChecked()).isFalse();
+
+ fragment =
+ createResolutionSelectionFragmentWith(modes, null);
+
+ autoPreference = fragment.findPreference(KEY_RESOLUTION_SELECTION_AUTO);
+ assertThat(autoPreference.isChecked()).isTrue();
+ preference = fragment.findPreference(KEY_RESOLUTION_PREFIX + 0);
+ assertThat(preference.isChecked()).isFalse();
+ preference = fragment.findPreference(KEY_RESOLUTION_PREFIX + 1);
+ assertThat(preference.isChecked()).isFalse();
+ preference = fragment.findPreference(KEY_RESOLUTION_PREFIX + 2);
+ assertThat(preference.isChecked()).isFalse();
+ }
+
+ private ResolutionSelectionFragment createResolutionSelectionFragmentWith(
+ Display.Mode[] supportedModes) {
+ return createResolutionSelectionFragmentWith(supportedModes, null);
+ }
+
+ private ResolutionSelectionFragment createResolutionSelectionFragmentWith(
+ Display.Mode[] supportedModes, Display.Mode userPreferredMode) {
+ Display display = spy(Display.class);
+ doReturn(supportedModes).when(display).getSupportedModes();
+ Display.Mode systemPreferredMode = supportedModes[0];
+ doReturn(systemPreferredMode).when(display).getSystemPreferredDisplayMode();
+ doReturn(display).when(mDisplayManager).getDisplay(Display.DEFAULT_DISPLAY);
+
+ ResolutionSelectionFragment fragment = spy(ResolutionSelectionFragment.class);
+ doReturn(mDisplayManager).when(fragment).getDisplayManager();
+ doReturn(userPreferredMode).when(mDisplayManager).getGlobalUserPreferredDisplayMode();
+
+ return FragmentController.of(fragment)
+ .create()
+ .start()
+ .get();
+ }
+
+ private List<String> getChildrenTitles(Preference preference) {
+ PreferenceCategory category = (PreferenceCategory) preference;
+
+ return IntStream.range(0, category.getPreferenceCount())
+ .mapToObj(i -> category.getPreference(i).getTitle().toString())
+ .collect(Collectors.toList());
+ }
+
+ private List<String> getChildrenSummaries(Preference preference) {
+ PreferenceCategory category = (PreferenceCategory) preference;
+
+ return IntStream.range(1, category.getPreferenceCount())
+ .mapToObj(i -> category.getPreference(i).getSummary().toString())
+ .collect(Collectors.toList());
+ }
+}
diff --git a/Settings/tests/robotests/src/com/android/tv/settings/users/RestrictedProfileTest.java b/Settings/tests/robotests/src/com/android/tv/settings/users/RestrictedProfileTest.java
index 03210c9..0169823 100644
--- a/Settings/tests/robotests/src/com/android/tv/settings/users/RestrictedProfileTest.java
+++ b/Settings/tests/robotests/src/com/android/tv/settings/users/RestrictedProfileTest.java
@@ -31,6 +31,8 @@
import android.os.UserHandle;
import android.os.UserManager;
+import com.android.tv.settings.library.users.RestrictedProfileModel;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/SettingsAPI/Android.bp b/SettingsAPI/Android.bp
new file mode 100644
index 0000000..04ad3f0
--- /dev/null
+++ b/SettingsAPI/Android.bp
@@ -0,0 +1,48 @@
+// 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 {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+
+android_library {
+
+ name: "TvSettingsAPI",
+ srcs: [
+ "java/**/*.java",
+ ],
+
+ platform_apis: true,
+ static_libs: [
+ "androidx-constraintlayout_constraintlayout",
+ "androidx.recyclerview_recyclerview",
+ "androidx.preference_preference",
+ "androidx.appcompat_appcompat",
+ "androidx.legacy_legacy-preference-v14",
+ "androidx.leanback_leanback-preference",
+ "androidx.leanback_leanback",
+ "androidx.lifecycle_lifecycle-extensions",
+ "androidx.lifecycle_lifecycle-common-java8",
+ "androidx.annotation_annotation",
+ "zxing-core-1.7",
+ ],
+
+ errorprone: {
+ enabled: false,
+ },
+
+ min_sdk_version: "29",
+}
+
diff --git a/SettingsAPI/AndroidManifest.xml b/SettingsAPI/AndroidManifest.xml
new file mode 100644
index 0000000..ca33300
--- /dev/null
+++ b/SettingsAPI/AndroidManifest.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.tv.settings.library">
+
+ <uses-sdk
+ android:minSdkVersion="31" />
+
+ <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+ <uses-permission android:name="android.permission.BACKUP"/>
+ <uses-permission android:name="android.permission.BLUETOOTH"/>
+ <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
+ <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
+ <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
+ <uses-permission android:name="android.permission.DELETE_CACHE_FILES"/>
+ <uses-permission android:name="android.permission.DUMP"/>
+ <uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"/>
+ <uses-permission android:name="android.permission.GET_ACCOUNTS_PRIVILEGED"/>
+ <uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
+ <uses-permission android:name="android.permission.INJECT_EVENTS"/>
+ <uses-permission android:name="android.permission.INTERNET"/>
+ <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
+ <uses-permission android:name="android.permission.MANAGE_DEBUGGING"/>
+ <uses-permission android:name="android.permission.MANAGE_SCOPED_ACCESS_DIRECTORY_PERMISSIONS"/>
+ <uses-permission android:name="android.permission.MANAGE_USERS"/>
+ <uses-permission android:name="android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS"/>
+ <uses-permission android:name="android.permission.READ_PROFILE"/>
+ <uses-permission android:name="android.permission.NETWORK_SETTINGS"/>
+ <uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG"/>
+ <uses-permission android:name="android.permission.PEERS_MAC_ADDRESS"/>
+ <uses-permission android:name="android.permission.READ_CONTACTS"/>
+ <uses-permission android:name="android.permission.REBOOT"/>
+ <uses-permission android:name="android.permission.RECORD_AUDIO"/>
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+ <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
+ <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"/>
+ <uses-permission android:name="android.permission.SUGGEST_MANUAL_TIME_AND_ZONE"/>
+ <uses-permission android:name="android.permission.SET_TIME"/>
+ <uses-permission android:name="android.permission.SET_TIME_ZONE"/>
+ <uses-permission android:name="android.permission.USE_RESERVED_DISK"/>
+ <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"/>
+ <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
+ <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
+ <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
+ <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES"/>
+ <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
+ <uses-permission android:name="com.google.android.assistant.READ_HOTWORD_STATE"/>
+ <uses-permission android:name="com.google.android.assistant.WRITE_HOTWORD_STATE"/>
+ <uses-permission android:name="android.permission.MANAGE_SLICE_PERMISSIONS"/>
+</manifest>
diff --git a/SettingsAPI/java/com/android/tv/settings/library/ManagerUtil.java b/SettingsAPI/java/com/android/tv/settings/library/ManagerUtil.java
new file mode 100644
index 0000000..6e5f4ab
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/ManagerUtil.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.tv.settings.library;
+
+import static com.android.tv.settings.library.PreferenceCompat.STATUS_OFF;
+import static com.android.tv.settings.library.PreferenceCompat.STATUS_ON;
+
+import android.annotation.SystemApi;
+
+/**
+ * @hide Provide constants and utility methods.
+ */
+@SystemApi
+public final class ManagerUtil {
+ public static final int OFFSET_MULTIPLIER = 100000;
+ public static final int STATE_EMPTY = -1;
+ public static final int STATE_NETWORK = 0;
+ public static final int STATE_WIFI_DETAILS = 1;
+ public static final int STATE_DEVICE_MAIN = 2;
+ public static final int STATE_APPS = 3;
+ public static final int STATE_ALL_APPS = 4;
+ public static final int STATE_APP_MANAGEMENT = 5;
+ public static final int STATE_SPECIAL_ACCESS = 6;
+ public static final int STATE_HIGH_POWER = 7;
+ public static final int STATE_NOTIFICATION_ACCESS = 8;
+ public static final int STATE_APP_USAGE_ACCESS = 9;
+ public static final int STATE_SYSTEM_ALERT_WINDOW = 10;
+ public static final int STATE_WRITE_SETTINGS = 11;
+ public static final int STATE_PICTURE_IN_PICTURE = 12;
+ public static final int STATE_ALARMS_AND_REMINDERS = 13;
+ public static final int STATE_EXTERNAL_SOURCES = 14;
+ public static final int STATE_SYSTEM_DATE_TIME = 15;
+ public static final int STATE_SYSTEM_ABOUT = 16;
+ public static final int STATE_KEYBOARD = 17;
+ public static final int STATE_AVAILABLE_KEYBOARD = 18;
+ public static final int STATE_AUTO_FILL_PICKER_STATE = 19;
+ public static final int STATE_LANGUAGE = 20;
+ public static final int STATE_ACCESSIBILITY = 21;
+ public static final int STATE_ACCESSIBILITY_SERVICE = 22;
+ public static final int STATE_ACCESSIBILITY_SHORTCUT = 23;
+ public static final int STATE_ACCESSIBILITY_SHORTCUT_SERVICE = 24;
+ public static final int STATE_STORAGE = 25;
+ public static final int STATE_STORAGE_SUMMARY = 26;
+ public static final int STATE_MISSING_STORAGE = 27;
+ public static final int STATE_POWER_AND_ENERGY = 28;
+ public static final int STATE_ENERGY_SAVER = 29;
+ public static final int STATE_DAYDREAM = 30;
+ public static final int STATE_DISPLAY_SOUND = 31;
+ public static final int STATE_FONT_SCALE = 32;
+ public static final int STATE_MATCH_CONTENT_FRAME = 33;
+ public static final int STATE_ADVANCED_DISPLAY = 34;
+ public static final int STATE_ADVANCED_VOLUME = 35;
+ public static final int STATE_HDR_FORMAT_SELECTION = 36;
+ public static final int STATE_LOCATION = 37;
+ public static final int STATE_SENSOR = 38;
+ public static final int STATE_PRIVACY = 39;
+ public static final int STATE_RESOLUTION_SELECTION = 40;
+ public static final int STATE_DEVELOPMENT = 41;
+ public static final int STATE_LEGAL = 42;
+ public static final String KEY_KEYBOARD_SETTINGS = "autofillSettings";
+ public static final String INFO_INTENT = "intent";
+ public static final String INFO_WIFI_SIGNAL_LEVEL = "wifi_signal_level";
+ /** Argument key containing the current font scale value. */
+ public static final String INFO_CURRENT_FONT_SCALE_VALUE = "current_font_scale_value";
+ /** Argument key containing the font scale value this fragment will preview. */
+ public static final String INFO_PREVIEW_FONT_SCALE_VALUE = "preview_font_scale_value";
+
+ private ManagerUtil() {
+ }
+
+ static byte getChecked(boolean checked) {
+ return checked ? STATUS_ON : STATUS_OFF;
+ }
+
+ static byte getSelectable(boolean selectable) {
+ return selectable ? STATUS_ON : STATUS_OFF;
+ }
+
+ static byte getVisible(boolean visible) {
+ return visible ? STATUS_ON : STATUS_OFF;
+ }
+
+ static byte getEnabled(boolean enabled) {
+ return enabled ? STATUS_ON : STATUS_OFF;
+ }
+
+ static byte getPersistent(boolean persistent) {
+ return persistent ? STATUS_ON : STATUS_OFF;
+ }
+
+
+ /**
+ * @hide Return whether the preference is checked.
+ * 0 : not updated, 1 : unchecked, 2 : checked
+ */
+ @SystemApi
+ public static boolean isChecked(PreferenceCompat pref) {
+ return pref.getChecked() == STATUS_ON;
+ }
+
+ /**
+ * @hide Return whether the preference is visible.
+ * 0 : not updated, 1 : invisible, 2 : visible
+ */
+ @SystemApi
+ public static boolean isVisible(PreferenceCompat pref) {
+ return pref.getVisible() == STATUS_OFF;
+ }
+
+ /**
+ * @param state state identifier
+ * @param requestCode requestCode
+ * @return compound code
+ * @hide Calculate the compound code based on the state identifier and request code.
+ */
+ @SystemApi
+ public static int calculateCompoundCode(int state, int requestCode) {
+ return OFFSET_MULTIPLIER * (state + 1) + requestCode;
+ }
+
+ /**
+ * @param code compound code
+ * @return state identifier
+ * @hide Get the state identifier based on the compound code.
+ */
+ @SystemApi
+ public static int getStateIdentifier(int code) {
+ if (code < OFFSET_MULTIPLIER) {
+ return -1;
+ }
+ return code / OFFSET_MULTIPLIER - 1;
+ }
+
+ /**
+ * @param code compound code
+ * @return request code
+ * @hide Return the request code for a particular state.
+ */
+ @SystemApi
+ public static int getRequestCode(int code) {
+ return code % OFFSET_MULTIPLIER;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/PreferenceCompat.java b/SettingsAPI/java/com/android/tv/settings/library/PreferenceCompat.java
new file mode 100644
index 0000000..a0fb665
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/PreferenceCompat.java
@@ -0,0 +1,626 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library;
+
+import android.annotation.SystemApi;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.IntStream;
+
+/**
+ * @hide
+ * Hold the data of a Settings Preference.
+ */
+@SystemApi
+public class PreferenceCompat {
+ public static final byte TYPE_PREFERENCE = 0;
+ public static final byte TYPE_PREFERENCE_CATEGORY = 1;
+ public static final byte TYPE_PREFERENCE_ACCESS_POINT = 2;
+ public static final byte TYPE_PREFERENCE_COLLAPSE_CATEGORY = 3;
+ public static final byte TYPE_LIST = 4;
+ public static final byte TYPE_SWITCH = 5;
+ public static final byte TYPE_RADIO = 6;
+ public static final byte TYPE_DIALOG = 7;
+
+ public static final byte STATUS_UNASSIGNED = 0;
+ public static final byte STATUS_OFF = 1;
+ public static final byte STATUS_ON = 2;
+
+ private final String[] mKey;
+ private String mTitle;
+ private String mSummary;
+ private String mContentDescription;
+ private Bundle mExtras;
+ private Intent mIntent;
+ private Drawable mIcon;
+ private CharSequence[] mEntries;
+ private CharSequence[] mEntryValues;
+ private int mValueIndex;
+ private String mValue;
+ private boolean mHasSlice;
+ private String mSliceUri;
+ private String mMessage;
+ private String mNeutralButtonText;
+ private String mNegativeButtonText;
+ private String mPositiveButtonText;
+
+ // 0 : preference, 1 : preferenceCategory, 2 : AccessPointPreference
+ private byte mType;
+
+ // 0 : not updated, 1 : unchecked, 2 : checked
+ private byte mChecked;
+
+ // 0 : not updated, 1 : invisible, 2: visible
+ private byte mVisible;
+
+ // 0: not updated, 1 :not selectable, 2: selectable
+ private byte mSelectable;
+
+ // 0: not updated, 1 :not selectable, 2: selectable
+ private byte mEnabled;
+
+ // 0: not updated, 1 :not focused, 2: focused
+ private boolean mIsFocused;
+
+ private boolean mShouldRemove;
+
+ // Indicate whether there is on preference change listener
+ private boolean mHasOnPreferenceChangeListener;
+
+ // Indicates whether the preference is a restricted preference.
+ private boolean mIsRestricted;
+
+ // Indicates whether the preference is disabled by admin.
+ private boolean mIsDisabledByAdmin;
+
+ private byte mPersistent;
+
+ private String mRadioGroup;
+
+ // Next state of the current state, -1 to indicate there is no next state.
+ private Integer mNextState;
+
+ private List<PreferenceCompat> mChildPrefCompats;
+
+ /** @hide */
+ @SystemApi
+ public void setChildPrefCompats(
+ List<PreferenceCompat> childPrefCompats) {
+ this.mChildPrefCompats = childPrefCompats;
+ }
+
+ /** @hide */
+ @SystemApi
+ public List<PreferenceCompat> getChildPrefCompats() {
+ if (mChildPrefCompats == null) {
+ mChildPrefCompats = new ArrayList<>();
+ }
+ return mChildPrefCompats;
+ }
+
+ /** @hide */
+ @SystemApi
+ public int getChildPrefsCount() {
+ return mChildPrefCompats == null ? 0 : mChildPrefCompats.size();
+ }
+
+ /** @hide */
+ @SystemApi
+ public void clearChildPrefCompats() {
+ mChildPrefCompats = new ArrayList<>();
+ }
+
+ /** @hide */
+ @SystemApi
+ public PreferenceCompat findChildPreferenceCompat(String[] prefKey) {
+ if (prefKey == null || prefKey.length != this.mKey.length + 1) {
+ return null;
+ }
+ if (IntStream.range(0, mKey.length).anyMatch(i -> !(mKey[i].equals(prefKey[i])))) {
+ return null;
+ }
+ if (mChildPrefCompats != null) {
+ return mChildPrefCompats.stream()
+ .filter(preferenceParcelable ->
+ preferenceParcelable.getKey()[preferenceParcelable.getKey().length - 1]
+ .equals(prefKey[prefKey.length - 1]))
+ .findFirst()
+ .orElse(null);
+ }
+ return null;
+ }
+
+ /** @hide */
+ @SystemApi
+ public PreferenceCompat(String key) {
+ this.mKey = new String[]{key};
+ }
+
+ /** @hide */
+ @SystemApi
+ public PreferenceCompat(String[] key) {
+ this.mKey = key;
+ }
+
+ /** @hide */
+ @SystemApi
+ public PreferenceCompat(String[] key, String title) {
+ this.mKey = key;
+ this.mTitle = title;
+ }
+
+ /** @hide */
+ @SystemApi
+ public PreferenceCompat(String[] key, String title, String summary) {
+ this(key, title);
+ this.mSummary = summary;
+ }
+
+ /** @hide */
+ @SystemApi
+ public String[] getKey() {
+ return mKey;
+ }
+
+ /** @hide */
+ @SystemApi
+ public String getTitle() {
+ return mTitle;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setTitle(String title) {
+ this.mTitle = title;
+ }
+
+ /** @hide */
+ @SystemApi
+ public String getSummary() {
+ return mSummary;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setSummary(String summary) {
+ this.mSummary = summary;
+ }
+
+ /** @hide */
+ @SystemApi
+ public Drawable getIcon() {
+ return mIcon;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setIcon(Drawable icon) {
+ this.mIcon = icon;
+ }
+
+ /** @hide */
+ @SystemApi
+ public String getContentDescription() {
+ return mContentDescription;
+ }
+
+ /** @hide */
+ @SystemApi
+ public String getMessage() {
+ return mMessage;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setMessage(String message) {
+ this.mMessage = message;
+ }
+
+ /** @hide */
+ @SystemApi
+ public String getNeutralButtonText() {
+ return mNeutralButtonText;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setNeutralButtonText(String neutralButtonText) {
+ this.mNeutralButtonText = neutralButtonText;
+ }
+
+ /** @hide */
+ @SystemApi
+ public String getNegativeButtonText() {
+ return mNegativeButtonText;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setNegativeButtonText(String negativeButtonText) {
+ this.mNegativeButtonText = negativeButtonText;
+ }
+
+ /** @hide */
+ @SystemApi
+ public String getPositiveButtonText() {
+ return mPositiveButtonText;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setPositiveButtonText(String positiveButtonText) {
+ this.mPositiveButtonText = positiveButtonText;
+ }
+
+ /** @hide */
+ @SystemApi
+ public int getType() {
+ return mType;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setType(byte type) {
+ this.mType = type;
+ }
+
+ /** @hide */
+ @SystemApi
+ public CharSequence[] getEntries() {
+ return mEntries;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setEntries(CharSequence[] entries) {
+ mEntries = entries;
+ }
+
+ /** @hide */
+ @SystemApi
+ public CharSequence[] getEntryValues() {
+ return mEntryValues;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setEntryValues(CharSequence[] entryValues) {
+ mEntryValues = entryValues;
+ }
+
+ /** @hide */
+ @SystemApi
+ public int getValueIndex() {
+ return mValueIndex;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setValueIndex(int valueIndex) {
+ mValueIndex = valueIndex;
+ }
+
+ /** @hide */
+ @SystemApi
+ public String getValue() {
+ return mValue;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setValue(String value) {
+ mValue = value;
+ }
+
+ /** @hide */
+ @SystemApi
+ public boolean hasSlice() {
+ return mHasSlice;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setHasSlice(boolean hasSlice) {
+ mHasSlice = hasSlice;
+ }
+
+ /** @hide */
+ @SystemApi
+ public String getSliceUri() {
+ return mSliceUri;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setSliceUri(String sliceUri) {
+ mSliceUri = sliceUri;
+ }
+
+ /** @hide */
+ @SystemApi
+ public boolean shouldRemove() {
+ return mShouldRemove;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setShouldRemove(boolean shouldRemove) {
+ mShouldRemove = shouldRemove;
+ }
+
+ /** @hide */
+ @SystemApi
+ public boolean hasOnPreferenceChangeListener() {
+ return mHasOnPreferenceChangeListener;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setHasOnPreferenceChangeListener(boolean hasOnPreferenceChangeListener) {
+ mHasOnPreferenceChangeListener = hasOnPreferenceChangeListener;
+ }
+
+ /** @hide */
+ @SystemApi
+ public Integer getNextState() {
+ return mNextState;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setNextState(Integer nextState) {
+ mNextState = nextState;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setContentDescription(String contentDescription) {
+ this.mContentDescription = contentDescription;
+ }
+
+ /** @hide */
+ @SystemApi
+ public byte getChecked() {
+ return mChecked;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setChecked(byte checked) {
+ this.mChecked = checked;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setChecked(boolean checked) {
+ setChecked(ManagerUtil.getChecked(checked));
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setVisible(boolean visible) {
+ setVisible(ManagerUtil.getVisible(visible));
+ }
+
+ /** @hide */
+ @SystemApi
+ public byte getVisible() {
+ return mVisible;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setVisible(byte visible) {
+ this.mVisible = visible;
+ }
+
+ /** @hide */
+ @SystemApi
+ public byte getSelectable() {
+ return mSelectable;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setSelectable(byte selectable) {
+ this.mSelectable = selectable;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setSelectable(boolean selectable) {
+ this.mSelectable = ManagerUtil.getSelectable(selectable);
+ }
+
+ /** @hide */
+ @SystemApi
+ public byte getEnabled() {
+ return mEnabled;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setEnabled(byte enabled) {
+ this.mEnabled = enabled;
+ }
+
+ /** @hide */
+ @SystemApi
+ public boolean isRestricted() {
+ return mIsRestricted;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setRestricted(boolean restricted) {
+ mIsRestricted = restricted;
+ }
+
+ /** @hide */
+ @SystemApi
+ public boolean isDisabledByAdmin() {
+ return mIsDisabledByAdmin;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setDisabledByAdmin(boolean disabledByAdmin) {
+ mIsDisabledByAdmin = disabledByAdmin;
+ }
+
+ /** @hide */
+ @SystemApi
+ public byte getPersistent() {
+ return mPersistent;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setPersistent(byte persistent) {
+ mPersistent = persistent;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setPersistent(boolean persistent) {
+ setPersistent(ManagerUtil.getPersistent(persistent));
+ }
+
+ /** @hide */
+ @SystemApi
+ public String getRadioGroup() {
+ return mRadioGroup;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setRadioGroup(String radioGroup) {
+ mRadioGroup = radioGroup;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setEnabled(boolean enabled) {
+ setEnabled(ManagerUtil.getEnabled(enabled));
+ }
+
+ /** @hide */
+ @SystemApi
+ public boolean isFocused() {
+ return mIsFocused;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setFocused(boolean focused) {
+ mIsFocused = focused;
+ }
+
+ /** @hide */
+ @SystemApi
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setExtras(Bundle extras) {
+ this.mExtras = extras;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void addInfo(String key, Object value) {
+ if (mExtras == null) {
+ mExtras = new Bundle();
+ }
+ mExtras.putObject(key, value);
+ }
+
+ /** @hide */
+ @SystemApi
+ public Object getInfo(String key) {
+ if (mExtras != null) {
+ return mExtras.get(key);
+ }
+ return null;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void getInfo(String key, int value) {
+ if (mExtras == null) {
+ mExtras = new Bundle();
+ }
+ mExtras.putInt(key, value);
+ }
+
+ /** @hide */
+ @SystemApi
+ public Intent getIntent() {
+ return mIntent;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void setIntent(Intent intent) {
+ this.mIntent = intent;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void initChildPreferences() {
+ mChildPrefCompats = new ArrayList<>();
+ }
+
+ /** @hide */
+ @SystemApi
+ public void addChildPrefCompat(PreferenceCompat childPrefCompat) {
+ if (mChildPrefCompats == null) {
+ mChildPrefCompats = new ArrayList<>();
+ }
+ mChildPrefCompats.add(childPrefCompat);
+ }
+
+ @Override
+ public String toString() {
+ return "PreferenceCompat{"
+ + "mKey=" + Arrays.toString(mKey)
+ + ", mTitle='" + mTitle + '\''
+ + ", mSummary='" + mSummary + '\''
+ + ", mContentDescription='" + mContentDescription
+ + '\'' + ", mExtras=" + mExtras
+ + ", mIntent=" + mIntent
+ + ", mIcon=" + mIcon
+ + ", mValue='" + mValue + '\''
+ + ", mType=" + mType
+ + ", mChecked=" + mChecked
+ + ", mVisible=" + mVisible
+ + ", mSelectable=" + mSelectable
+ + ", mEnabled=" + mEnabled
+ + ", mShouldRemove=" + mShouldRemove
+ + ", mHasOnPreferenceChangeListener=" + mHasOnPreferenceChangeListener
+ + ", mNextState=" + mNextState
+ + ", mChildPrefCompats=" + mChildPrefCompats
+ + '}';
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/SettingsManager.java b/SettingsAPI/java/com/android/tv/settings/library/SettingsManager.java
new file mode 100644
index 0000000..97216da
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/SettingsManager.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library;
+
+import android.annotation.SystemApi;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.android.tv.settings.library.data.StateManager;
+
+import java.util.List;
+
+/**
+ * @hide Provides access to TvSettings data.
+ */
+@SystemApi
+public final class SettingsManager {
+ private static final String TAG = "TvSettingsManager";
+ private com.android.tv.settings.library.UIUpdateCallback mUIUpdateCallback;
+ private final Context mContext;
+
+ /** @hide */
+ @SystemApi
+ public SettingsManager(Context context) {
+ this.mContext = context;
+ }
+
+ /** @hide */
+ @SystemApi
+ public List<PreferenceCompat> getPreferences(int state) {
+ return null;
+ }
+
+ /** @hide */
+ @SystemApi
+ public PreferenceCompat getPreference(int state, String key) {
+ return null;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void registerListener(com.android.tv.settings.library.UIUpdateCallback callback) {
+ mUIUpdateCallback = callback;
+ }
+
+ /** @hide */
+ @SystemApi
+ public void unRegisterListener() {
+ mUIUpdateCallback = null;
+ }
+
+
+ /** @hide */
+ @SystemApi
+ public State createState(int stateIdentifier) {
+ return StateManager.createState(mContext, stateIdentifier, mUIUpdateCallback);
+ }
+
+ /** @hide */
+ @SystemApi
+ public void onAttach(State state) {
+ state.onAttach();
+ }
+
+ /** @hide */
+ @SystemApi
+ public void onCreate(State state, Bundle extras) {
+ state.onCreate(extras);
+ }
+
+ /** @hide */
+ @SystemApi
+ public void onStart(State state) {
+ state.onStart();
+ }
+
+ /** @hide */
+ @SystemApi
+ public void onResume(State state) {
+ state.onResume();
+ }
+
+ /** @hide */
+ @SystemApi
+ public void onPause(State state) {
+ state.onPause();
+ }
+
+ /** @hide */
+ @SystemApi
+ public void onStop(State state) {
+ state.onStop();
+ }
+
+ /** @hide */
+ @SystemApi
+ public void onDestroy(State state) {
+ state.onDestroy();
+ }
+
+ /** @hide */
+ @SystemApi
+ public boolean onPreferenceClick(State state, String[] key, boolean status) {
+ if (state == null || key == null || key.length == 0) {
+ return false;
+ }
+ return state.onPreferenceTreeClick(key, status);
+ }
+
+ /** @hide */
+ @SystemApi
+ public void onDisplayPreferenceDialog(State state, String[] key) {
+ if (state != null && key != null && key.length > 0) {
+ state.onDisplayDialogPreference(key);
+ }
+ }
+
+ /** @hide */
+ @SystemApi
+ public void onActivityResult(State state, int code, int resultCode, Intent data) {
+ state.onActivityResult(ManagerUtil.getRequestCode(code), resultCode, data);
+ }
+
+ /** @hide */
+ @SystemApi
+ public boolean onPreferenceChange(State state, String[] key, Object newValue) {
+ return state.onPreferenceChange(key, newValue);
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/service/data/State.java b/SettingsAPI/java/com/android/tv/settings/library/State.java
similarity index 65%
rename from Settings/src/com/android/tv/settings/service/data/State.java
rename to SettingsAPI/java/com/android/tv/settings/library/State.java
index 6d0a7e1..5f6a3c9 100644
--- a/Settings/src/com/android/tv/settings/service/data/State.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/State.java
@@ -14,12 +14,17 @@
* limitations under the License.
*/
-package com.android.tv.settings.service.data;
+package com.android.tv.settings.library;
+import android.content.Intent;
import android.os.Bundle;
-/** Implement this to provide data for each settings screen. */
+/*
+ * Implement this to provide data for each settings screen.
+ */
public interface State {
+ void onAttach();
+
void onCreate(Bundle extras);
void onStart();
@@ -32,7 +37,15 @@
void onDestroy();
- void onPreferenceTreeClick(String key, boolean status);
+ void onDetach();
+
+ boolean onPreferenceTreeClick(String[] key, boolean status);
+
+ void onActivityResult(int requestCode, int resultCode, Intent data);
+
+ boolean onPreferenceChange(String[] key, Object newValue);
int getStateIdentifier();
+
+ void onDisplayDialogPreference(String[] key);
}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/UIUpdateCallback.java b/SettingsAPI/java/com/android/tv/settings/library/UIUpdateCallback.java
new file mode 100644
index 0000000..15bbbf2
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/UIUpdateCallback.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.tv.settings.library;
+
+import android.annotation.SystemApi;
+
+import java.util.List;
+
+/**
+ * @hide
+ * Callback for updating UI.
+ */
+@SystemApi
+public interface UIUpdateCallback {
+ /**
+ * @hide
+ * Notify to update preferenceCompat in a fragment.
+ * @param state state identifier of the fragment
+ * @param preferenceCompat the updated preferenceCompat
+ */
+ @SystemApi
+ void notifyUpdate(int state, PreferenceCompat preferenceCompat);
+
+ /**
+ * @hide
+ * Notify to update a list of preferenceCompats.
+ * @param state state identifier of the fragment
+ * @param preferences the updated list of preferenceCompats
+ */
+ @SystemApi
+ void notifyUpdateAll(int state, List<PreferenceCompat> preferences);
+
+ /**
+ * @hide
+ * Notify to update title of a fragment.
+ * @param state state identifier of the fragment
+ * @param title the updated title
+ */
+ @SystemApi
+ void notifyUpdateScreenTitle(int state, String title);
+
+ /**
+ * @hide
+ * Notify to navigate backward
+ */
+ @SystemApi
+ void notifyNavigateBackward(int state);
+
+
+ /**
+ * @hide
+ * Notify to navigate forward
+ */
+ @SystemApi
+ void notifyNavigateForward(int state);
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/about/AboutState.java b/SettingsAPI/java/com/android/tv/settings/library/about/AboutState.java
new file mode 100644
index 0000000..a1c3594
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/about/AboutState.java
@@ -0,0 +1,481 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.about;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_SYSTEM_ABOUT;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ResolveInfo;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.os.SELinux;
+import android.os.SystemClock;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.telephony.CarrierConfigManager;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.Toast;
+
+import androidx.annotation.Keep;
+import androidx.annotation.Nullable;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.State;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtils;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtilsInternal;
+import com.android.tv.settings.library.util.LibUtils;
+import com.android.tv.settings.library.util.PreferenceCompatUtils;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The "About" screen in TV settings.
+ */
+@Keep
+public class AboutState implements State {
+ private static final String TAG = "AboutFragment";
+
+ private static final String KEY_MANUAL = "manual";
+ private static final String KEY_REGULATORY_INFO = "regulatory_info";
+ private static final String KEY_SYSTEM_UPDATE_SETTINGS = "system_update_settings";
+ private static final String PROPERTY_URL_SAFETYLEGAL = "ro.url.safetylegal";
+ private static final String PROPERTY_SELINUX_STATUS = "ro.build.selinux";
+ private static final String KEY_KERNEL_VERSION = "kernel_version";
+ private static final String KEY_BUILD_NUMBER = "build_number";
+ private static final String KEY_DEVICE_MODEL = "device_model";
+ private static final String KEY_SELINUX_STATUS = "selinux_status";
+ private static final String KEY_BASEBAND_VERSION = "baseband_version";
+ private static final String KEY_FIRMWARE_VERSION = "firmware_version";
+ private static final String KEY_SECURITY_PATCH = "security_patch";
+ private static final String KEY_UPDATE_SETTING = "additional_system_update_settings";
+ private static final String KEY_EQUIPMENT_ID = "fcc_equipment_id";
+ private static final String PROPERTY_EQUIPMENT_ID = "ro.ril.fccid";
+ private static final String KEY_DEVICE_FEEDBACK = "device_feedback";
+ private static final String KEY_SAFETY_LEGAL = "safetylegal";
+ private static final String KEY_DEVICE_NAME = "device_name";
+ private static final String KEY_TUTORIALS = "tutorials";
+ private static final String KEY_RESET = "reset";
+ private static final String KEY_RESET_OPTIONS = "reset_options";
+
+ static final int TAPS_TO_BE_A_DEVELOPER = 7;
+
+ long[] mHits = new long[3];
+ int mDevHitCountdown;
+ Toast mDevHitToast;
+
+ private UserManager mUm;
+
+ private final BroadcastReceiver mDeviceNameReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ refreshDeviceName();
+ }
+ };
+
+ private final Context context;
+ private final UIUpdateCallback uiUpdateCallback;
+ private PreferenceCompat mFirmwareVersionPref;
+ private PreferenceCompat mDeviceTutorialsPref;
+ private PreferenceCompat mMDeviceTutorialsPref;
+
+ public AboutState(Context context, UIUpdateCallback uiUpdateCallback) {
+ this.context = context;
+ this.uiUpdateCallback = uiUpdateCallback;
+ }
+
+ private PreferenceCompatManager mPreferenceCompatManager;
+
+ @Override
+ public void onAttach() {
+ // no-op
+ }
+
+ @Override
+ public void onCreate(Bundle extra) {
+ mUm = UserManager.get(context);
+
+ mPreferenceCompatManager = new PreferenceCompatManager();
+ refreshDeviceName();
+ final PreferenceCompat deviceNamePref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_DEVICE_NAME);
+ PreferenceCompatUtils.resolveSystemActivityOrRemove(context, preferenceCompats,
+ deviceNamePref, 0);
+
+ mFirmwareVersionPref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_FIRMWARE_VERSION);
+ mFirmwareVersionPref.setSummary(Build.VERSION.RELEASE_OR_CODENAME);
+ mFirmwareVersionPref.setEnabled(true);
+
+ final PreferenceCompat securityPatchPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_SECURITY_PATCH);
+ final String patch = DeviceInfoUtils.getSecurityPatch();
+ if (!TextUtils.isEmpty(patch)) {
+ securityPatchPref.setSummary(patch);
+ } else {
+ removePreference(securityPatchPref);
+ }
+
+ mPreferenceCompatManager.getOrCreatePrefCompat(KEY_DEVICE_MODEL).setSummary(
+ Build.MODEL + DeviceInfoUtils.getMsvSuffix());
+ mPreferenceCompatManager.getOrCreatePrefCompat(KEY_EQUIPMENT_ID)
+ .setSummary(getSystemPropertySummary(PROPERTY_EQUIPMENT_ID));
+
+ final PreferenceCompat buildNumberPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_BUILD_NUMBER);
+ buildNumberPref.setSummary(Build.DISPLAY);
+ buildNumberPref.setEnabled(true);
+ mPreferenceCompatManager.getOrCreatePrefCompat(KEY_KERNEL_VERSION)
+ .setSummary(DeviceInfoUtils.getFormattedKernelVersion(context));
+
+ final PreferenceCompat selinuxPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_SELINUX_STATUS);
+ if (!SELinux.isSELinuxEnabled()) {
+ selinuxPref.setSummary(ResourcesUtil.getString(context, "selinux_status_disabled"));
+ } else if (!SELinux.isSELinuxEnforced()) {
+ selinuxPref.setSummary(ResourcesUtil.getString(context, "selinux_status_permissive"));
+ }
+
+ // Remove selinux information if property is not present
+ if (TextUtils.isEmpty(SystemProperties.get(PROPERTY_SELINUX_STATUS))) {
+ removePreference(selinuxPref);
+ }
+
+ // Remove Safety information preference if PROPERTY_URL_SAFETYLEGAL is not set
+ if (TextUtils.isEmpty(SystemProperties.get(PROPERTY_URL_SAFETYLEGAL))) {
+ removePreference(mPreferenceCompatManager.getOrCreatePrefCompat(KEY_SAFETY_LEGAL));
+ }
+
+ // Remove Equipment id preference if FCC ID is not set by RIL
+ if (TextUtils.isEmpty(SystemProperties.get(PROPERTY_EQUIPMENT_ID))) {
+ removePreference(mPreferenceCompatManager.getOrCreatePrefCompat(KEY_EQUIPMENT_ID));
+ }
+
+ // Remove Baseband version if wifi-only device
+ if (Utils.isWifiOnly(context)) {
+ removePreference(mPreferenceCompatManager.getOrCreatePrefCompat(KEY_BASEBAND_VERSION));
+ }
+
+ // Don't show feedback option if there is no reporter.
+ if (TextUtils.isEmpty(DeviceInfoUtils.getFeedbackReporterPackage(context))) {
+ removePreference(mPreferenceCompatManager.getOrCreatePrefCompat(KEY_DEVICE_FEEDBACK));
+ }
+
+ final PreferenceCompat resetPreference = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_RESET);
+ resetPreference.setContentDescription(
+ ResourcesUtil.getString(context, "factory_reset_content_description"));
+
+ // Don't show the reset options if factory reset is restricted
+ final PreferenceCompat resetOptionsPreference =
+ mPreferenceCompatManager.getOrCreatePrefCompat(KEY_RESET_OPTIONS);
+ if (resetOptionsPreference != null
+ && RestrictedLockUtilsInternal.checkIfRestrictionEnforced(context,
+ UserManager.DISALLOW_FACTORY_RESET, UserHandle.myUserId()) != null) {
+ // TODO (b/194102677): Handle setFragment(null);
+// resetOptionsPreference.setFragment(null);
+ }
+
+ final PreferenceCompat updateSettingsPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_SYSTEM_UPDATE_SETTINGS);
+ updateSettingsPref.setContentDescription(
+ ResourcesUtil.getString(context, "system_update_content_description"));
+
+ if (mUm.isAdminUser()) {
+ final Intent systemUpdateIntent = new Intent(Settings.ACTION_SYSTEM_UPDATE_SETTINGS);
+ final ResolveInfo info =
+ LibUtils.systemIntentIsHandled(context, systemUpdateIntent);
+ if (info == null) {
+ removePreference(updateSettingsPref);
+ } else {
+ updateSettingsPref.setTitle(info.loadLabel(context.getPackageManager()).toString());
+ }
+ } else if (updateSettingsPref != null) {
+ // Remove for secondary users
+ removePreference(updateSettingsPref);
+ }
+
+ // Read platform settings for additional system update setting
+ if (!ResourcesUtil.getBoolean(context, "config_additional_system_update_setting_enable")) {
+ removePreference(mPreferenceCompatManager.getOrCreatePrefCompat(KEY_UPDATE_SETTING));
+ }
+
+ // Remove manual entry if none present.
+ if (!ResourcesUtil.getBoolean(context, "config_show_manual")) {
+ removePreference(mPreferenceCompatManager.getOrCreatePrefCompat(KEY_MANUAL));
+ }
+
+ // Remove regulatory information if none present.
+ final PreferenceCompat regulatoryPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_REGULATORY_INFO);
+ PreferenceCompatUtils.resolveSystemActivityOrRemove(context, preferenceCompats,
+ regulatoryPref, 0);
+
+ if (uiUpdateCallback != null) {
+ uiUpdateCallback.notifyUpdateAll(getStateIdentifier(), preferenceCompats);
+ }
+ }
+
+ List<PreferenceCompat> preferenceCompats = new ArrayList<>();
+
+ private void removePreference(@Nullable PreferenceCompat preference) {
+ if (preference != null) {
+ preferenceCompats.remove(preference);
+ }
+ }
+
+ @Override
+ public void onStart() {
+ refreshDeviceName();
+
+ context.registerReceiver(mDeviceNameReceiver,
+ new IntentFilter(DeviceManager.ACTION_DEVICE_NAME_UPDATE),
+ Context.RECEIVER_EXPORTED_UNAUDITED);
+ }
+
+ @Override
+ public void onResume() {
+ mDevHitCountdown = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(context)
+ ? -1 : TAPS_TO_BE_A_DEVELOPER;
+ mDevHitToast = null;
+ updateTutorials();
+ }
+
+ @Override
+ public void onPause() {
+
+ }
+
+ @Override
+ public void onStop() {
+ context.unregisterReceiver(mDeviceNameReceiver);
+ }
+
+ @Override
+ public void onDestroy() {
+
+ }
+
+ @Override
+ public void onDetach() {
+
+ }
+
+ private void refreshDeviceName() {
+ final PreferenceCompat deviceNamePref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_DEVICE_NAME);
+ if (deviceNamePref != null) {
+ deviceNamePref.setSummary(DeviceManager.getDeviceName(context));
+ }
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ boolean handled = true;
+ switch (key[0]) {
+ case KEY_FIRMWARE_VERSION:
+ System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
+ mHits[mHits.length - 1] = SystemClock.uptimeMillis();
+ if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
+ if (mUm.hasUserRestriction(UserManager.DISALLOW_FUN)) {
+ final RestrictedLockUtils.EnforcedAdmin admin = RestrictedLockUtilsInternal
+ .checkIfRestrictionEnforced(context, UserManager.DISALLOW_FUN,
+ UserHandle.myUserId());
+ if (admin != null) {
+ RestrictedLockUtils.sendShowAdminSupportDetailsIntent(context,
+ admin);
+ }
+
+ Log.d(TAG, "Sorry, no fun for you!");
+ return false;
+ }
+
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setClassName("android",
+ "PlatLogoActivity");
+ try {
+ context.startActivity(intent);
+ } catch (Exception e) {
+ Log.e(TAG, "Unable to start activity " + intent.toString());
+ }
+ }
+ break;
+ case KEY_BUILD_NUMBER:
+// logEntrySelected(TvSettingsEnums.SYSTEM_ABOUT_BUILD);
+ // Don't enable developer options for secondary users.
+ if (!mUm.isAdminUser()) {
+ return true;
+ }
+
+ if (mUm.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) {
+ final RestrictedLockUtils.EnforcedAdmin admin = RestrictedLockUtilsInternal
+ .checkIfRestrictionEnforced(context,
+ UserManager.DISALLOW_DEBUGGING_FEATURES, UserHandle.myUserId());
+ if (admin != null) {
+ RestrictedLockUtils.sendShowAdminSupportDetailsIntent(context, admin);
+ }
+ return true;
+ }
+
+ if (mDevHitCountdown > 0) {
+ mDevHitCountdown--;
+ if (mDevHitCountdown == 0) {
+ DevelopmentSettingsEnabler
+ .setDevelopmentSettingsEnabled(context, true);
+ if (mDevHitToast != null) {
+ mDevHitToast.cancel();
+ }
+ mDevHitToast = Toast.makeText(context,
+ ResourcesUtil.getString(context, "show_dev_on"),
+ Toast.LENGTH_LONG);
+ mDevHitToast.show();
+ // This is good time to index the Developer Options
+// Index.getInstance(
+// getActivity().getApplicationContext()).updateFromClassNameResource(
+// DevelopmentSettings.class.getName(), true, true);
+ } else if (mDevHitCountdown > 0
+ && mDevHitCountdown < (TAPS_TO_BE_A_DEVELOPER - 2)) {
+ if (mDevHitToast != null) {
+ mDevHitToast.cancel();
+ }
+ mDevHitToast = Toast
+ .makeText(context, ResourcesUtil.getQuantityString(
+ context, "show_dev_countdown", mDevHitCountdown,
+ mDevHitCountdown),
+ Toast.LENGTH_SHORT);
+ mDevHitToast.show();
+ }
+ } else if (mDevHitCountdown < 0) {
+ if (mDevHitToast != null) {
+ mDevHitToast.cancel();
+ }
+ mDevHitToast = Toast.makeText(context,
+ ResourcesUtil.getString(context, "show_dev_already"),
+ Toast.LENGTH_LONG);
+ mDevHitToast.show();
+ }
+ break;
+ case KEY_DEVICE_FEEDBACK:
+ sendFeedback();
+ break;
+ case KEY_SYSTEM_UPDATE_SETTINGS:
+// logEntrySelected(TvSettingsEnums.SYSTEM_ABOUT_SYSTEM_UPDATE);
+ CarrierConfigManager configManager = (CarrierConfigManager)
+ context.getSystemService(Context.CARRIER_CONFIG_SERVICE);
+ PersistableBundle b = configManager.getConfig();
+ if (b != null &&
+ b.getBoolean(CarrierConfigManager.KEY_CI_ACTION_ON_SYS_UPDATE_BOOL)) {
+ ciActionOnSysUpdate(b);
+ }
+ context.startActivity(new Intent(Settings.ACTION_SYSTEM_UPDATE_SETTINGS));
+ break;
+ case KEY_DEVICE_NAME:
+// logEntrySelected(TvSettingsEnums.SYSTEM_ABOUT_DEVICE_NAME);
+ break;
+ case KEY_RESET:
+// logEntrySelected(TvSettingsEnums.SYSTEM_ABOUT_FACTORY_RESET);
+ Intent factoryResetIntent = new Intent();
+ factoryResetIntent.setClassName(
+ "com.android.tv.settings",
+ "com.android.tv.settings.device.storage.ResetActivity");
+ context.startActivity(factoryResetIntent);
+ break;
+ default:
+ handled = false;
+ }
+ return handled;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ return false;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_SYSTEM_ABOUT;
+ }
+
+ /**
+ * Trigger client initiated action (send intent) on system update
+ */
+ private void ciActionOnSysUpdate(PersistableBundle b) {
+ String intentStr = b.getString(CarrierConfigManager.
+ KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING);
+ if (!TextUtils.isEmpty(intentStr)) {
+ String extra = b.getString(CarrierConfigManager.
+ KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING);
+ String extraVal = b.getString(CarrierConfigManager.
+ KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING);
+
+ Intent intent = new Intent(intentStr);
+ if (!TextUtils.isEmpty(extra)) {
+ intent.putExtra(extra, extraVal);
+ }
+ Log.d(TAG, "ciActionOnSysUpdate: broadcasting intent " + intentStr +
+ " with extra " + extra + ", " + extraVal);
+ context.getApplicationContext().sendBroadcast(intent);
+ }
+ }
+
+ private String getSystemPropertySummary(String property) {
+ return SystemProperties.get(property,
+ ResourcesUtil.getString(context, "device_info_default"));
+ }
+
+ private void sendFeedback() {
+ String reporterPackage = DeviceInfoUtils.getFeedbackReporterPackage(context);
+ if (TextUtils.isEmpty(reporterPackage)) {
+ return;
+ }
+ Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
+ intent.setPackage(reporterPackage);
+ context.startActivity(intent);
+ }
+
+ private void updateTutorials() {
+ mMDeviceTutorialsPref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_TUTORIALS);
+ if (mMDeviceTutorialsPref != null) {
+ final ResolveInfo info = LibUtils.systemIntentIsHandled(context,
+ mMDeviceTutorialsPref.getIntent());
+ mMDeviceTutorialsPref.setVisible(info != null);
+ if (info != null) {
+ mMDeviceTutorialsPref.setTitle(
+ info.loadLabel(context.getPackageManager()).toString());
+ }
+ }
+ }
+
+ @Override
+ public void onDisplayDialogPreference(String[] key) {
+
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/about/DevelopmentSettingsEnabler.java b/SettingsAPI/java/com/android/tv/settings/library/about/DevelopmentSettingsEnabler.java
new file mode 100644
index 0000000..b34afe0
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/about/DevelopmentSettingsEnabler.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.about;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.os.UserManager;
+import android.provider.Settings;
+
+
+public class DevelopmentSettingsEnabler {
+
+ public static final String DEVELOPMENT_SETTINGS_CHANGED_ACTION =
+ "com.android.settingslib.development.DevelopmentSettingsEnabler.SETTINGS_CHANGED";
+
+ private DevelopmentSettingsEnabler() {
+ }
+
+ public static void setDevelopmentSettingsEnabled(Context context, boolean enable) {
+ Settings.Global.putInt(context.getContentResolver(),
+ Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, enable ? 1 : 0);
+ context.sendBroadcast(new Intent(DEVELOPMENT_SETTINGS_CHANGED_ACTION));
+ }
+
+ public static boolean isDevelopmentSettingsEnabled(Context context) {
+ final UserManager um = context.getSystemService(UserManager.class);
+ final boolean settingEnabled = Settings.Global.getInt(context.getContentResolver(),
+ Settings.Global.DEVELOPMENT_SETTINGS_ENABLED,
+ Build.TYPE.equals("eng") ? 1 : 0) != 0;
+ final boolean hasRestriction = um.hasUserRestriction(
+ UserManager.DISALLOW_DEBUGGING_FEATURES);
+ final boolean isAdmin = um.isAdminUser();
+ return isAdmin && !hasRestriction && settingEnabled;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/about/DeviceInfoUtils.java b/SettingsAPI/java/com/android/tv/settings/library/about/DeviceInfoUtils.java
new file mode 100644
index 0000000..3bca7fc
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/about/DeviceInfoUtils.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.tv.settings.library.about;
+
+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.Build;
+import android.system.Os;
+import android.system.StructUtsname;
+import android.telephony.PhoneNumberUtils;
+import android.telephony.SubscriptionInfo;
+import android.telephony.TelephonyManager;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
+import android.text.TextUtils;
+import android.text.format.DateFormat;
+
+import androidx.annotation.VisibleForTesting;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class DeviceInfoUtils {
+ private static final String TAG = "DeviceInfoUtils";
+
+ private static final String FILENAME_MSV = "/sys/board_properties/soc/msv";
+
+ /**
+ * Reads a line from the specified file.
+ *
+ * @param filename the file to read from
+ * @return the first line, if any.
+ * @throws IOException if the file couldn't be read
+ */
+ private static String readLine(String filename) throws IOException {
+ BufferedReader reader = new BufferedReader(new FileReader(filename), 256);
+ try {
+ return reader.readLine();
+ } finally {
+ reader.close();
+ }
+ }
+
+ public static String getFormattedKernelVersion(Context context) {
+ return formatKernelVersion(context, Os.uname());
+ }
+
+ @VisibleForTesting
+ static String formatKernelVersion(Context context, StructUtsname uname) {
+ // Example:
+ // 4.9.29-g958411d
+ // #1 SMP PREEMPT Wed Jun 7 00:06:03 CST 2017
+ final String VERSION_REGEX =
+ "(#\\d+) " + /* group 1: "#1" */
+ "(?:.*?)?"
+ + /* ignore: optional SMP, PREEMPT, and any CONFIG_FLAGS */
+ "((Sun|Mon|Tue|Wed|Thu|Fri|Sat).+)"; /* group 2: "Thu Jun 28 11:02:39 PDT
+ 2012" */
+ Matcher m = Pattern.compile(VERSION_REGEX).matcher(uname.version);
+
+ // Example output:
+ // 4.9.29-g958411d
+ // #1 Wed Jun 7 00:06:03 CST 2017
+ return new StringBuilder().append(uname.release)
+ .append("\n")
+ .append(m.group(1))
+ .append(" ")
+ .append(m.group(2)).toString();
+ }
+
+ /**
+ * Returns " (ENGINEERING)" if the msv file has a zero value, else returns "".
+ *
+ * @return a string to append to the model number description.
+ */
+ public static String getMsvSuffix() {
+ // Production devices should have a non-zero value. If we can't read it, assume it's a
+ // production device so that we don't accidentally show that it's an ENGINEERING device.
+ try {
+ String msv = readLine(FILENAME_MSV);
+ // Parse as a hex number. If it evaluates to a zero, then it's an engineering build.
+ if (Long.parseLong(msv, 16) == 0) {
+ return " (ENGINEERING)";
+ }
+ } catch (IOException | NumberFormatException e) {
+ // Fail quietly, as the file may not exist on some devices, or may be unreadable
+ }
+ return "";
+ }
+
+ public static String getFeedbackReporterPackage(Context context) {
+ final String feedbackReporter = "";
+ if (TextUtils.isEmpty(feedbackReporter)) {
+ // Reporter not configured. Return.
+ return feedbackReporter;
+ }
+ // Additional checks to ensure the reporter is on system image, and reporter is
+ // configured to listen to the intent. Otherwise, don't show the "send feedback" option.
+ final Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
+
+ PackageManager pm = context.getPackageManager();
+ List<ResolveInfo> resolvedPackages =
+ pm.queryIntentActivities(intent, PackageManager.GET_RESOLVED_FILTER);
+ for (ResolveInfo info : resolvedPackages) {
+ if (info.activityInfo != null) {
+ if (!TextUtils.isEmpty(info.activityInfo.packageName)) {
+ try {
+ ApplicationInfo ai =
+ pm.getApplicationInfo(info.activityInfo.packageName, 0);
+ if ((ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+ // Package is on the system image
+ if (TextUtils.equals(
+ info.activityInfo.packageName, feedbackReporter)) {
+ return feedbackReporter;
+ }
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ // No need to do anything here.
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public static String getSecurityPatch() {
+ String patch = Build.VERSION.SECURITY_PATCH;
+ if (!"".equals(patch)) {
+ try {
+ SimpleDateFormat template = new SimpleDateFormat("yyyy-MM-dd");
+ Date patchDate = template.parse(patch);
+ String format = DateFormat.getBestDateTimePattern(Locale.getDefault(), "dMMMMyyyy");
+ patch = DateFormat.format(format, patchDate).toString();
+ } catch (ParseException e) {
+ // broken parse; fall through and use the raw string
+ }
+ return patch;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Format a phone number.
+ *
+ * @param subscriptionInfo {@link SubscriptionInfo} subscription information.
+ * @return Returns formatted phone number.
+ */
+ public static String getFormattedPhoneNumber(Context context,
+ SubscriptionInfo subscriptionInfo) {
+ String formattedNumber = null;
+ if (subscriptionInfo != null) {
+ final TelephonyManager telephonyManager = context.getSystemService(
+ TelephonyManager.class);
+ final String rawNumber = telephonyManager.createForSubscriptionId(
+ subscriptionInfo.getSubscriptionId()).getLine1Number();
+ if (!TextUtils.isEmpty(rawNumber)) {
+ formattedNumber = PhoneNumberUtils.formatNumber(rawNumber);
+ }
+ }
+ return formattedNumber;
+ }
+
+ public static String getFormattedPhoneNumbers(Context context,
+ List<SubscriptionInfo> subscriptionInfoList) {
+ StringBuilder sb = new StringBuilder();
+ if (subscriptionInfoList != null) {
+ final TelephonyManager telephonyManager = context.getSystemService(
+ TelephonyManager.class);
+ final int count = subscriptionInfoList.size();
+ for (SubscriptionInfo subscriptionInfo : subscriptionInfoList) {
+ final String rawNumber = telephonyManager.createForSubscriptionId(
+ subscriptionInfo.getSubscriptionId()).getLine1Number();
+ if (!TextUtils.isEmpty(rawNumber)) {
+ sb.append(PhoneNumberUtils.formatNumber(rawNumber)).append("\n");
+ }
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * To get the formatting text for display in a potentially opposite-directionality context
+ * without garbling.
+ *
+ * @param subscriptionInfo {@link SubscriptionInfo} subscription information.
+ * @return Returns phone number with Bidi format.
+ */
+ public static String getBidiFormattedPhoneNumber(Context context,
+ SubscriptionInfo subscriptionInfo) {
+ final String phoneNumber = getFormattedPhoneNumber(context, subscriptionInfo);
+ return BidiFormatter.getInstance().unicodeWrap(phoneNumber, TextDirectionHeuristics.LTR);
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/about/DeviceManager.java b/SettingsAPI/java/com/android/tv/settings/library/about/DeviceManager.java
new file mode 100644
index 0000000..817428e
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/about/DeviceManager.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.about;
+
+import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.util.Log;
+
+
+public class DeviceManager {
+
+ private static final String TAG = "DeviceManager";
+
+ public static final String ACTION_DEVICE_NAME_UPDATE =
+ "com.android.tv.settings.name.DeviceManager.DEVICE_NAME_UPDATE";
+
+ /**
+ * Retrieves the name from Settings.Global.DEVICE_NAME
+ *
+ * @param context A context that can access Settings.Global
+ * @return The device name.
+ */
+ public static String getDeviceName(Context context) {
+ return Settings.Global.getString(context.getContentResolver(), Settings.Global.DEVICE_NAME);
+ }
+
+ /**
+ * Sets the system device name.
+ *
+ * For now it will explicitly call the different discoverable services that haven't been ported
+ * to use the Settings.Global.DEVICE_NAME entry.
+ *
+ * @param context A context that can access Settings.Global
+ * @param name The new device name.
+ */
+ public static void setDeviceName(Context context, String name) {
+ Settings.Global.putString(context.getContentResolver(), Settings.Global.DEVICE_NAME, name);
+ BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
+ if (btAdapter != null) {
+ btAdapter.setName(name);
+ } else {
+ Log.v(TAG, "Bluetooth adapter is null. Running on device without bluetooth?");
+ }
+ context.sendBroadcast(new Intent(ACTION_DEVICE_NAME_UPDATE));
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/about/LegalState.java b/SettingsAPI/java/com/android/tv/settings/library/about/LegalState.java
new file mode 100644
index 0000000..b7920ae
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/about/LegalState.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.tv.settings.library.about;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_LEGAL;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.State;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.PreferenceCompatUtils;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LegalState implements State {
+ private static final String KEY_TERMS = "terms";
+ private static final String KEY_LICENSE = "license";
+ private static final String KEY_COPYRIGHT = "copyright";
+ private static final String KEY_WEBVIEW_LICENSE = "webview_license";
+ private static final String KEY_ADS = "ads";
+ private static final String KEY_CONSUMER_INFORMATION = "consumer_information";
+
+ private final Context mContext;
+ private final UIUpdateCallback mUIUpdateCallback;
+
+ private PreferenceCompatManager mPreferenceCompatManager;
+
+ public LegalState(Context context, UIUpdateCallback uiUpdateCallback) {
+ this.mContext = context;
+ this.mUIUpdateCallback = uiUpdateCallback;
+ }
+
+ @Override
+ public void onAttach() {
+
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ mPreferenceCompatManager = new PreferenceCompatManager();
+
+ final List<PreferenceCompat> preferenceList = new ArrayList<>();
+ final PreferenceCompat termsPreference = mPreferenceCompatManager
+ .getOrCreatePrefCompat(KEY_TERMS);
+ termsPreference.setIntent(new Intent().setAction("android.settings.TERMS"));
+ preferenceList.add(termsPreference);
+
+ final PreferenceCompat licensePreference = mPreferenceCompatManager
+ .getOrCreatePrefCompat(KEY_LICENSE);
+ licensePreference.setIntent(new Intent().setAction("android.settings.LICENSE"));
+ preferenceList.add(licensePreference);
+
+ final PreferenceCompat copyrightPreference = mPreferenceCompatManager
+ .getOrCreatePrefCompat(KEY_COPYRIGHT);
+ copyrightPreference.setIntent(new Intent().setAction("android.settings.COPYRIGHT"));
+ preferenceList.add(copyrightPreference);
+
+ final PreferenceCompat webViewLicensePreference = mPreferenceCompatManager
+ .getOrCreatePrefCompat(KEY_WEBVIEW_LICENSE);
+ webViewLicensePreference.setIntent(new Intent()
+ .setAction("android.settings.WEBVIEW_LICENSE"));
+ preferenceList.add(webViewLicensePreference);
+
+ final PreferenceCompat adsPreference = mPreferenceCompatManager
+ .getOrCreatePrefCompat(KEY_ADS);
+ adsPreference.setIntent(new Intent()
+ .setAction("com.google.android.gms.settings.ADS_PRIVACY"));
+ preferenceList.add(adsPreference);
+
+ final PreferenceCompat consumerInformationDialogPreference =
+ mPreferenceCompatManager.getOrCreatePrefCompat(KEY_CONSUMER_INFORMATION);
+ consumerInformationDialogPreference.setMessage(
+ ResourcesUtil.getString(mContext, "consumer_information_message"));
+ consumerInformationDialogPreference.setPositiveButtonText(
+ ResourcesUtil.getString(mContext, "consumer_information_button_ok"));
+ consumerInformationDialogPreference.setType(PreferenceCompat.TYPE_DIALOG);
+ preferenceList.add(consumerInformationDialogPreference);
+
+ PreferenceCompatUtils.resolveSystemActivityOrRemove(
+ mContext,
+ preferenceList,
+ termsPreference,
+ 0);
+ PreferenceCompatUtils.resolveSystemActivityOrRemove(
+ mContext,
+ preferenceList,
+ licensePreference,
+ 0);
+ PreferenceCompatUtils.resolveSystemActivityOrRemove(
+ mContext,
+ preferenceList,
+ copyrightPreference,
+ 0);
+ PreferenceCompatUtils.resolveSystemActivityOrRemove(
+ mContext,
+ preferenceList,
+ webViewLicensePreference,
+ 0);
+ if (FlavorUtils.isTwoPanel(mContext)) {
+ preferenceList.remove(adsPreference);
+ } else {
+ PreferenceCompatUtils.resolveSystemActivityOrRemove(
+ mContext,
+ preferenceList,
+ adsPreference,
+ 0);
+ }
+
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdateAll(STATE_LEGAL, preferenceList);
+ }
+ }
+
+ @Override
+ public void onStart() {
+
+ }
+
+ @Override
+ public void onResume() {
+
+ }
+
+ @Override
+ public void onPause() {
+
+ }
+
+ @Override
+ public void onStop() {
+
+ }
+
+ @Override
+ public void onDestroy() {
+
+ }
+
+ @Override
+ public void onDetach() {
+
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ return false;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ return false;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_LEGAL;
+ }
+
+ @Override
+ public void onDisplayDialogPreference(String[] key) {
+ final PreferenceCompat consumerInformationDialogPreference =
+ mPreferenceCompatManager.getPrefCompat(key);
+ if (consumerInformationDialogPreference != null) {
+ new AlertDialog.Builder(mContext)
+ .setMessage(consumerInformationDialogPreference.getMessage())
+ .setPositiveButton(
+ consumerInformationDialogPreference.getPositiveButtonText(),
+ (dialog, which) -> {})
+ .show();
+ }
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/about/Utils.java b/SettingsAPI/java/com/android/tv/settings/library/about/Utils.java
new file mode 100644
index 0000000..265bc34
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/about/Utils.java
@@ -0,0 +1,316 @@
+package com.android.tv.settings.library.about;
+
+import android.annotation.ColorInt;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.Signature;
+import android.content.res.ColorStateList;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
+import android.graphics.drawable.Drawable;
+import android.media.AudioManager;
+import android.net.NetworkCapabilities;
+import android.net.vcn.VcnTransportInfo;
+import android.net.wifi.WifiInfo;
+import android.os.BatteryManager;
+import android.telephony.AccessNetworkConstants;
+import android.telephony.NetworkRegistrationInfo;
+import android.telephony.ServiceState;
+import android.telephony.TelephonyManager;
+
+import androidx.annotation.NonNull;
+import androidx.core.graphics.drawable.RoundedBitmapDrawable;
+import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
+
+import java.text.NumberFormat;
+
+public class Utils {
+
+ /** Formats a double from 0.0..100.0 with an option to round **/
+ public static String formatPercentage(double percentage, boolean round) {
+ final int localPercentage = round ? Math.round((float) percentage) : (int) percentage;
+ return formatPercentage(localPercentage);
+ }
+
+ /** Formats the ratio of amount/total as a percentage. */
+ public static String formatPercentage(long amount, long total) {
+ return formatPercentage(((double) amount) / total);
+ }
+
+ /** Formats an integer from 0..100 as a percentage. */
+ public static String formatPercentage(int percentage) {
+ return formatPercentage(((double) percentage) / 100.0);
+ }
+
+ /** Formats a double from 0.0..1.0 as a percentage. */
+ public static String formatPercentage(double percentage) {
+ return NumberFormat.getPercentInstance().format(percentage);
+ }
+
+ public static int getBatteryLevel(Intent batteryChangedIntent) {
+ int level = batteryChangedIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
+ int scale = batteryChangedIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
+ return (level * 100) / scale;
+ }
+
+ public static ColorStateList getColorAccent(Context context) {
+ return getColorAttr(context, android.R.attr.colorAccent);
+ }
+
+ public static ColorStateList getColorError(Context context) {
+ return getColorAttr(context, android.R.attr.colorError);
+ }
+
+ @ColorInt
+ public static int getColorAccentDefaultColor(Context context) {
+ return getColorAttrDefaultColor(context, android.R.attr.colorAccent);
+ }
+
+ @ColorInt
+ public static int getColorErrorDefaultColor(Context context) {
+ return getColorAttrDefaultColor(context, android.R.attr.colorError);
+ }
+
+ @ColorInt
+ public static int getColorStateListDefaultColor(Context context, int resId) {
+ final ColorStateList list =
+ context.getResources().getColorStateList(resId, context.getTheme());
+ return list.getDefaultColor();
+ }
+
+ /**
+ * This method computes disabled color from normal color
+ *
+ * @param context the context
+ * @param inputColor normal color.
+ * @return disabled color.
+ */
+ @ColorInt
+ public static int getDisabled(Context context, int inputColor) {
+ return applyAlphaAttr(context, android.R.attr.disabledAlpha, inputColor);
+ }
+
+ @ColorInt
+ public static int applyAlphaAttr(Context context, int attr, int inputColor) {
+ TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+ float alpha = ta.getFloat(0, 0);
+ ta.recycle();
+ return applyAlpha(alpha, inputColor);
+ }
+
+ @ColorInt
+ public static int applyAlpha(float alpha, int inputColor) {
+ alpha *= Color.alpha(inputColor);
+ return Color.argb((int) (alpha), Color.red(inputColor), Color.green(inputColor),
+ Color.blue(inputColor));
+ }
+
+ @ColorInt
+ public static int getColorAttrDefaultColor(Context context, int attr) {
+ TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+ @ColorInt int colorAccent = ta.getColor(0, 0);
+ ta.recycle();
+ return colorAccent;
+ }
+
+ public static ColorStateList getColorAttr(Context context, int attr) {
+ TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+ ColorStateList stateList = null;
+ try {
+ stateList = ta.getColorStateList(0);
+ } finally {
+ ta.recycle();
+ }
+ return stateList;
+ }
+
+ public static int getThemeAttr(Context context, int attr) {
+ return getThemeAttr(context, attr, 0);
+ }
+
+ public static int getThemeAttr(Context context, int attr, int defaultValue) {
+ TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+ int theme = ta.getResourceId(0, defaultValue);
+ ta.recycle();
+ return theme;
+ }
+
+ public static Drawable getDrawable(Context context, int attr) {
+ TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+ Drawable drawable = ta.getDrawable(0);
+ ta.recycle();
+ return drawable;
+ }
+
+ /**
+ * Create a color matrix suitable for a ColorMatrixColorFilter that modifies only the color but
+ * preserves the alpha for a given drawable
+ *
+ * @return a color matrix that uses the source alpha and given color
+ */
+ public static ColorMatrix getAlphaInvariantColorMatrixForColor(@ColorInt int color) {
+ int r = Color.red(color);
+ int g = Color.green(color);
+ int b = Color.blue(color);
+
+ ColorMatrix cm = new ColorMatrix(new float[]{
+ 0, 0, 0, 0, r,
+ 0, 0, 0, 0, g,
+ 0, 0, 0, 0, b,
+ 0, 0, 0, 1, 0});
+
+ return cm;
+ }
+
+ /**
+ * Create a ColorMatrixColorFilter to tint a drawable but retain its alpha characteristics
+ *
+ * @return a ColorMatrixColorFilter which changes the color of the output but is invariant on
+ * the source alpha
+ */
+ public static ColorFilter getAlphaInvariantColorFilterForColor(@ColorInt int color) {
+ return new ColorMatrixColorFilter(getAlphaInvariantColorMatrixForColor(color));
+ }
+
+
+ private static Signature getFirstSignature(PackageInfo pkg) {
+ if (pkg != null && pkg.signatures != null && pkg.signatures.length > 0) {
+ return pkg.signatures[0];
+ }
+ return null;
+ }
+
+ private static Signature getSystemSignature(PackageManager pm) {
+ try {
+ final PackageInfo sys = pm.getPackageInfo("android", PackageManager.GET_SIGNATURES);
+ return getFirstSignature(sys);
+ } catch (NameNotFoundException e) {
+ }
+ return null;
+ }
+
+ public static boolean isWifiOnly(Context context) {
+ return !context.getSystemService(TelephonyManager.class).isDataCapable();
+ }
+
+
+
+ /**
+ * get that {@link AudioManager#getMode()} is in ringing/call/communication(VoIP) status.
+ */
+ public static boolean isAudioModeOngoingCall(Context context) {
+ final AudioManager audioManager = context.getSystemService(AudioManager.class);
+ final int audioMode = audioManager.getMode();
+ return audioMode == AudioManager.MODE_RINGTONE
+ || audioMode == AudioManager.MODE_IN_CALL
+ || audioMode == AudioManager.MODE_IN_COMMUNICATION;
+ }
+
+ /**
+ * Return the service state is in-service or not.
+ * To make behavior consistent with SystemUI and Settings/AboutPhone/SIM status UI
+ *
+ * @param serviceState Service state. {@link ServiceState}
+ */
+ public static boolean isInService(ServiceState serviceState) {
+ if (serviceState == null) {
+ return false;
+ }
+ int state = getCombinedServiceState(serviceState);
+ return state != ServiceState.STATE_POWER_OFF
+ && state != ServiceState.STATE_OUT_OF_SERVICE
+ && state != ServiceState.STATE_EMERGENCY_ONLY;
+ }
+
+ /**
+ * Return the combined service state.
+ * To make behavior consistent with SystemUI and Settings/AboutPhone/SIM status UI
+ *
+ * @param serviceState Service state. {@link ServiceState}
+ */
+ public static int getCombinedServiceState(ServiceState serviceState) {
+ if (serviceState == null) {
+ return ServiceState.STATE_OUT_OF_SERVICE;
+ }
+
+ // Consider the device to be in service if either voice or data
+ // service is available. Some SIM cards are marketed as data-only
+ // and do not support voice service, and on these SIM cards, we
+ // want to show signal bars for data service as well as the "no
+ // service" or "emergency calls only" text that indicates that voice
+ // is not available. Note that we ignore the IWLAN service state
+ // because that state indicates the use of VoWIFI and not cell service
+ final int state = serviceState.getState();
+ final int dataState = serviceState.getDataRegistrationState();
+
+ if (state == ServiceState.STATE_OUT_OF_SERVICE
+ || state == ServiceState.STATE_EMERGENCY_ONLY) {
+ if (dataState == ServiceState.STATE_IN_SERVICE && isNotInIwlan(serviceState)) {
+ return ServiceState.STATE_IN_SERVICE;
+ }
+ }
+ return state;
+ }
+
+ private static boolean isNotInIwlan(ServiceState serviceState) {
+ final NetworkRegistrationInfo networkRegWlan = serviceState.getNetworkRegistrationInfo(
+ NetworkRegistrationInfo.DOMAIN_PS,
+ AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
+ if (networkRegWlan == null) {
+ return true;
+ }
+
+ final boolean isInIwlan = (networkRegWlan.getRegistrationState()
+ == NetworkRegistrationInfo.REGISTRATION_STATE_HOME)
+ || (networkRegWlan.getRegistrationState()
+ == NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);
+ return !isInIwlan;
+ }
+
+ /**
+ * Returns a bitmap with rounded corner.
+ *
+ * @param context application context.
+ * @param source bitmap to apply round corner.
+ * @param cornerRadius corner radius value.
+ */
+ public static Bitmap convertCornerRadiusBitmap(@NonNull Context context,
+ @NonNull Bitmap source, @NonNull float cornerRadius) {
+ final Bitmap roundedBitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(),
+ Bitmap.Config.ARGB_8888);
+ final RoundedBitmapDrawable drawable =
+ RoundedBitmapDrawableFactory.create(context.getResources(), source);
+ drawable.setAntiAlias(true);
+ drawable.setCornerRadius(cornerRadius);
+ final Canvas canvas = new Canvas(roundedBitmap);
+ drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+ drawable.draw(canvas);
+ return roundedBitmap;
+ }
+
+ /**
+ * Returns the WifiInfo for the underlying WiFi network of the VCN network, returns null if the
+ * input NetworkCapabilities is not for a VCN network with underlying WiFi network.
+ *
+ * @param networkCapabilities NetworkCapabilities of the network.
+ */
+ @Nullable
+ public static WifiInfo tryGetWifiInfoForVcn(NetworkCapabilities networkCapabilities) {
+ if (networkCapabilities.getTransportInfo() == null
+ || !(networkCapabilities.getTransportInfo() instanceof VcnTransportInfo)) {
+ return null;
+ }
+ VcnTransportInfo vcnTransportInfo =
+ (VcnTransportInfo) networkCapabilities.getTransportInfo();
+ return vcnTransportInfo.getWifiInfo();
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/accessibility/AccessibilityServiceState.java b/SettingsAPI/java/com/android/tv/settings/library/accessibility/AccessibilityServiceState.java
new file mode 100644
index 0000000..f3580da
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/accessibility/AccessibilityServiceState.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.accessibility;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_ACCESSIBILITY_SERVICE;
+import static com.android.tv.settings.library.PreferenceCompat.STATUS_ON;
+
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.text.TextUtils;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.State;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.device.apps.AppActionPreferenceController;
+import com.android.tv.settings.library.settingslib.AccessibilityUtils;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtils;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtilsInternal;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.List;
+import java.util.Set;
+
+/** State corresponding to {@code AccessibilityServiceFragmentCompat}. */
+public class AccessibilityServiceState implements State {
+ private static final String ARG_PACKAGE_NAME = "packageName";
+ private static final String ARG_SERVICE_NAME = "serviceName";
+ private static final String ARG_SETTINGS_ACTIVITY_NAME = "settingsActivityName";
+ private static final String ARG_LABEL = "label";
+ private static final String EXTRA_CHECKED = "checked";
+ private static final String KEY_SCREEN = "screen";
+ private static final String KEY_ENABLE = "enable";
+ private static final String KEY_SETTING = "setting";
+
+ private static final int REQUEST_SELECT_ACCESSIBILITY_SHORTCUT_SERVICE = 1;
+
+ private final Context mContext;
+ private final UIUpdateCallback mUIUpdateCallback;
+ private PreferenceCompatManager mPreferenceCompatManager;
+ private Bundle mExtras;
+
+ private PreferenceCompat mScreen;
+ private PreferenceCompat mEnablePref;
+
+ public AccessibilityServiceState(Context context, UIUpdateCallback callback) {
+ mUIUpdateCallback = callback;
+ mContext = context;
+ }
+
+ /**
+ * Put args in bundle
+ *
+ * @param args Bundle to prepare
+ * @param packageName Package of accessibility service
+ * @param serviceName Class of accessibility service
+ * @param activityName Class of accessibility service settings activity
+ * @param label Screen title
+ */
+ public static Bundle prepareArgs(Bundle args, String packageName, String serviceName,
+ String activityName, String label) {
+ args.putString(ARG_PACKAGE_NAME, packageName);
+ args.putString(ARG_SERVICE_NAME, serviceName);
+ args.putString(ARG_SETTINGS_ACTIVITY_NAME, activityName);
+ args.putString(ARG_LABEL, label);
+ return args;
+ }
+
+ @Override
+ public void onAttach() {
+ // no-op
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ mPreferenceCompatManager = new PreferenceCompatManager();
+ mExtras = extras;
+
+ mScreen = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_SCREEN);
+
+ mEnablePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_ENABLE);
+ mEnablePref.setRestricted(true);
+ mEnablePref.setTitle(
+ ResourcesUtil.getString(mContext, "system_accessibility_status"));
+ mEnablePref.setType(PreferenceCompat.TYPE_SWITCH);
+
+ final PreferenceCompat settingsPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_SETTING);
+ settingsPref.setTitle(
+ ResourcesUtil.getString(mContext, "system_accessibility_config"));
+ final String activityName = extras.getString(ARG_SETTINGS_ACTIVITY_NAME);
+ if (!TextUtils.isEmpty(activityName)) {
+ final String packageName = extras.getString(ARG_PACKAGE_NAME);
+ settingsPref.setIntent(new Intent(Intent.ACTION_MAIN)
+ .setComponent(new ComponentName(packageName, activityName)));
+ } else {
+ settingsPref.setEnabled(false);
+ }
+ settingsPref.setType(PreferenceCompat.TYPE_PREFERENCE);
+
+ mScreen.addChildPrefCompat(mEnablePref);
+ mScreen.addChildPrefCompat(settingsPref);
+
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mScreen);
+ mUIUpdateCallback.notifyUpdateScreenTitle(getStateIdentifier(),
+ extras.getString(ARG_LABEL));
+ }
+
+ @Override
+ public void onStart() {
+ // no-op
+ }
+
+ @Override
+ public void onResume() {
+ updateEnablePref();
+ }
+
+ @Override
+ public void onPause() {
+ // no-op
+ }
+
+ @Override
+ public void onStop() {
+ // no-op
+ }
+
+ @Override
+ public void onDestroy() {
+ // no-op
+ }
+
+ @Override
+ public void onDetach() {
+ // no-op
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ if (key[0].equals(KEY_ENABLE) && !mEnablePref.isDisabledByAdmin()) {
+ // Prepare confirmation dialog and reverts switch until result comes back.
+ updateEnablePref();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ switch (requestCode) {
+ case REQUEST_SELECT_ACCESSIBILITY_SHORTCUT_SERVICE:
+ if (resultCode == Activity.RESULT_OK) {
+ final String packageName = mExtras.getString(ARG_PACKAGE_NAME);
+ final String serviceName = mExtras.getString(ARG_SERVICE_NAME);
+ final ComponentName componentName = new ComponentName(packageName, serviceName);
+ final boolean enabled = data.getBooleanExtra(EXTRA_CHECKED, false);
+ AccessibilityUtils.setAccessibilityServiceState(mContext, componentName,
+ enabled);
+ if (mEnablePref != null) {
+ mEnablePref.setChecked(enabled);
+ }
+ }
+ break;
+ default:
+ }
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ final String serviceKey = key[0];
+ switch (serviceKey) {
+ case KEY_ENABLE:
+ Intent intentEnableConfirm = new Intent(
+ AppActionPreferenceController.INTENT_CONFIRMATION);
+ intentEnableConfirm.putExtra(AppActionPreferenceController.EXTRA_GUIDANCE_TITLE,
+ mExtras.getString(ARG_LABEL));
+ intentEnableConfirm.putExtra(EXTRA_CHECKED,
+ !(mEnablePref.getChecked() == STATUS_ON));
+ ((Activity) mContext).startActivityForResult(intentEnableConfirm,
+ ManagerUtil.calculateCompoundCode(
+ getStateIdentifier(),
+ REQUEST_SELECT_ACCESSIBILITY_SHORTCUT_SERVICE));
+ return true;
+ default:
+ }
+ return false;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_ACCESSIBILITY_SERVICE;
+ }
+
+ private void updateEnablePref() {
+ final String packageName = mExtras.getString(ARG_PACKAGE_NAME);
+ final String serviceName = mExtras.getString(ARG_SERVICE_NAME);
+ final ComponentName serviceComponent = new ComponentName(packageName, serviceName);
+ final Set<ComponentName> enabledServices =
+ AccessibilityUtils.getEnabledServicesFromSettings(mContext);
+ final boolean enabled = enabledServices.contains(serviceComponent);
+ mEnablePref.setChecked(enabled);
+
+ DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
+ final List<String> permittedServices = dpm.getPermittedAccessibilityServices(
+ UserHandle.myUserId());
+ final boolean serviceAllowed = permittedServices == null
+ || permittedServices.contains(packageName);
+
+ if (serviceAllowed || enabled) {
+ mEnablePref.setEnabled(true);
+ } else {
+ // Disable accessibility service that are not permitted.
+ final RestrictedLockUtils.EnforcedAdmin admin =
+ RestrictedLockUtilsInternal.checkIfAccessibilityServiceDisallowed(
+ mContext, packageName, UserHandle.myUserId());
+ if (admin != null) {
+ mEnablePref.setDisabledByAdmin(true);
+ } else {
+ mEnablePref.setEnabled(false);
+ }
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mScreen);
+ }
+
+ @Override
+ public void onDisplayDialogPreference(String[] key) {
+
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/accessibility/AccessibilityShortcutServiceState.java b/SettingsAPI/java/com/android/tv/settings/library/accessibility/AccessibilityShortcutServiceState.java
new file mode 100644
index 0000000..8c0240b
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/accessibility/AccessibilityShortcutServiceState.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.tv.settings.library.accessibility;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_ACCESSIBILITY_SHORTCUT_SERVICE;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.accessibility.AccessibilityManager;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.State;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.device.apps.AppActionPreferenceController;
+
+import java.util.HashSet;
+import java.util.List;
+
+/** State corresponding to {@code AccessibilityShortcutServiceFragmentCompat}. */
+public class AccessibilityShortcutServiceState implements State {
+ private static final String TAG = "AccessibilityShortcutServiceState";
+ private static final String EXTRA_SERVICE_KEY = "extra_service_key";
+ private static final String SERVICE_RADIO_GROUP = "service_group";
+ private static final String KEY_SCREEN = "screen";
+ private static final int REQUEST_SELECT_ACCESSIBILITY_SHORTCUT_SERVICE = 1;
+
+ private final Context mContext;
+ private final UIUpdateCallback mUIUpdateCallback;
+ private final PreferenceCompatManager mPreferenceCompatManager = new PreferenceCompatManager();
+ private PreferenceCompat mScreen;
+ private final HashSet<String> mServiceKeys = new HashSet<>();
+
+ public AccessibilityShortcutServiceState(Context context, UIUpdateCallback callback) {
+ mUIUpdateCallback = callback;
+ mContext = context;
+ }
+
+ @Override
+ public void onAttach() {
+ // no-op
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ mScreen = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_SCREEN);
+
+ final List<AccessibilityServiceInfo> installedServices = mContext
+ .getSystemService(AccessibilityManager.class)
+ .getInstalledAccessibilityServiceList();
+ final PackageManager packageManager = mContext.getPackageManager();
+ final String currentService = AccessibilityShortcutState.getCurrentService(mContext);
+ mScreen.initChildPreferences();
+ mServiceKeys.clear();
+ for (AccessibilityServiceInfo service : installedServices) {
+ final String serviceString = service.getComponentName().flattenToString();
+ mServiceKeys.add(serviceString);
+ final PreferenceCompat preference = mPreferenceCompatManager.getOrCreatePrefCompat(
+ serviceString);
+ preference.setType(PreferenceCompat.TYPE_RADIO);
+ if (TextUtils.equals(currentService, serviceString)) {
+ preference.setChecked(true);
+ }
+ preference.setPersistent(false);
+ preference.setRadioGroup(SERVICE_RADIO_GROUP);
+ preference.setTitle(service.getResolveInfo().loadLabel(packageManager).toString());
+
+ mScreen.addChildPrefCompat(preference);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mScreen);
+ }
+
+ @Override
+ public void onStart() {
+ // no-op
+ }
+
+ @Override
+ public void onResume() {
+ // no-op
+ }
+
+ @Override
+ public void onPause() {
+
+ }
+
+ @Override
+ public void onStop() {
+ // no-op
+ }
+
+ @Override
+ public void onDestroy() {
+ // no-op
+ }
+
+ @Override
+ public void onDetach() {
+ // no-op
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ // no-op
+ return false;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ switch (requestCode) {
+ case REQUEST_SELECT_ACCESSIBILITY_SHORTCUT_SERVICE:
+ if (resultCode == Activity.RESULT_OK) {
+ final String componentString = data.getStringExtra(EXTRA_SERVICE_KEY);
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
+ componentString);
+ }
+ updateSelection();
+ break;
+ default:
+ }
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ final String serviceKey = key[0];
+ if (mServiceKeys.contains(serviceKey)) {
+ final String currentService = AccessibilityShortcutState.getCurrentService(
+ mContext);
+ if ((Boolean) newValue && !TextUtils.equals(serviceKey, currentService)) {
+ PreferenceCompat preference = mPreferenceCompatManager.getPrefCompat(key);
+ final ComponentName cn = ComponentName.unflattenFromString(serviceKey);
+ final CharSequence label = preference.getTitle();
+
+ Intent i = new Intent(AppActionPreferenceController.INTENT_CONFIRMATION);
+ i.putExtra(AppActionPreferenceController.EXTRA_GUIDANCE_TITLE,
+ preference.getTitle());
+ i.putExtra(EXTRA_SERVICE_KEY, serviceKey);
+ ((Activity) mContext).startActivityForResult(i,
+ ManagerUtil.calculateCompoundCode(
+ getStateIdentifier(),
+ REQUEST_SELECT_ACCESSIBILITY_SHORTCUT_SERVICE));
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_ACCESSIBILITY_SHORTCUT_SERVICE;
+ }
+
+ private void updateSelection() {
+ final String currentService = AccessibilityShortcutState.getCurrentService(mContext);
+ final List<PreferenceCompat> childPrefs = mScreen.getChildPrefCompats();
+ for (PreferenceCompat pref : childPrefs) {
+ boolean shouldEnable = currentService.equals(pref.getKey()[0]);
+ if (pref != null) {
+ pref.setChecked(shouldEnable);
+ }
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mScreen);
+ }
+
+ @Override
+ public void onDisplayDialogPreference(String[] key) {
+
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/accessibility/AccessibilityShortcutState.java b/SettingsAPI/java/com/android/tv/settings/library/accessibility/AccessibilityShortcutState.java
new file mode 100644
index 0000000..abe6c2c
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/accessibility/AccessibilityShortcutState.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.tv.settings.library.accessibility;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_ACCESSIBILITY_SHORTCUT;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.accessibility.AccessibilityManager;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.State;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.settingslib.AccessibilityUtils;
+
+import java.util.List;
+
+/** State corresponding to {@code AccessibilityShortcutFragmentCompat} */
+public class AccessibilityShortcutState implements State {
+ private static final String KEY_ENABLE = "enable";
+ private static final String KEY_SERVICE = "service";
+ private static final String ACCESSIBILITY_SHORTCUT_STORE = "accessibility_shortcut";
+ private static final String LAST_SHORTCUT_SERVICE = "last_shortcut_service";
+
+ private final Context mContext;
+ private final UIUpdateCallback mUIUpdateCallback;
+ private PreferenceCompatManager mPreferenceCompatManager;
+ private SharedPreferences mSharedPref;
+
+ public AccessibilityShortcutState(Context context, UIUpdateCallback callback) {
+ mUIUpdateCallback = callback;
+ mContext = context;
+ }
+
+ @Override
+ public void onAttach() {
+ // no-op
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ mPreferenceCompatManager = new PreferenceCompatManager();
+
+ final PreferenceCompat enablePref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_ENABLE);
+ String enabledComponents = Settings.Secure.getString(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE);
+ mSharedPref = mContext.getSharedPreferences(
+ ACCESSIBILITY_SHORTCUT_STORE, Context.MODE_PRIVATE);
+ boolean shortcutEnabled = !TextUtils.isEmpty(enabledComponents)
+ || TextUtils.isEmpty(getLastShortcutService());
+ enablePref.setChecked(shortcutEnabled);
+ setAccessibilityShortcutEnabled(shortcutEnabled);
+ }
+
+ @Override
+ public void onStart() {
+ // no-op
+ }
+
+ @Override
+ public void onResume() {
+ updateServicePrefSummary(/*notifyUIUpdate=*/true);
+ }
+
+ @Override
+ public void onPause() {
+ // no-op
+ }
+
+ @Override
+ public void onStop() {
+ // no-op
+ }
+
+ @Override
+ public void onDestroy() {
+ // no-op
+ }
+
+ @Override
+ public void onDetach() {
+ // no-op
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ return false;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // no-op
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ return false;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_ACCESSIBILITY_SHORTCUT;
+ }
+
+ private void updateServicePrefSummary(boolean notifyUIUpdate) {
+ final PreferenceCompat servicePref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_SERVICE);
+ final List<AccessibilityServiceInfo> installedServices = mContext
+ .getSystemService(AccessibilityManager.class)
+ .getInstalledAccessibilityServiceList();
+ final PackageManager packageManager = mContext.getPackageManager();
+ final String currentService = getCurrentService(mContext);
+ for (AccessibilityServiceInfo service : installedServices) {
+ final String serviceString = service.getComponentName().flattenToString();
+ if (TextUtils.equals(currentService, serviceString)) {
+ if (servicePref != null) {
+ servicePref.setSummary(
+ service.getResolveInfo().loadLabel(packageManager).toString());
+ }
+ putLastShortcutService(currentService);
+ }
+ }
+ if (notifyUIUpdate) {
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), servicePref);
+ }
+ }
+
+ public void setAccessibilityShortcutEnabled(boolean enabled) {
+ if (enabled) {
+ String updatedComponent = getLastShortcutService();
+ if (!TextUtils.isEmpty(updatedComponent)) {
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, updatedComponent);
+ updateServicePrefSummary(/*notifyUIUpdate=*/false);
+ }
+ } else {
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, "");
+ final PreferenceCompat servicePref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_SERVICE);
+ servicePref.setSummary("");
+ }
+ final PreferenceCompat servicePref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_SERVICE);
+ servicePref.setEnabled(enabled);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), servicePref);
+ }
+
+ public static String getCurrentService(Context context) {
+ String shortcutServiceString = AccessibilityUtils
+ .getShortcutTargetServiceComponentNameString(context, UserHandle.myUserId());
+ if (shortcutServiceString != null) {
+ ComponentName shortcutName = ComponentName.unflattenFromString(shortcutServiceString);
+ if (shortcutName != null) {
+ return shortcutName.flattenToString();
+ }
+ }
+ return null;
+ }
+
+ private String getLastShortcutService() {
+ return mSharedPref.getString(LAST_SHORTCUT_SERVICE, "");
+ }
+
+ private void putLastShortcutService(String s) {
+ mSharedPref.edit().putString(LAST_SHORTCUT_SERVICE, s).apply();
+ }
+
+ @Override
+ public void onDisplayDialogPreference(String[] key) {
+
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/accessibility/AccessibilityState.java b/SettingsAPI/java/com/android/tv/settings/library/accessibility/AccessibilityState.java
new file mode 100644
index 0000000..96a449b
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/accessibility/AccessibilityState.java
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.accessibility;
+
+import static android.content.Context.ACCESSIBILITY_SERVICE;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_ACCESSIBILITY;
+import static com.android.tv.settings.library.PreferenceCompat.STATUS_ON;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ServiceInfo;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.accessibility.AccessibilityManager;
+
+import com.android.internal.accessibility.util.AccessibilityUtils;
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.State;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtils;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtilsInternal;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.List;
+import java.util.Set;
+
+/** State corresponding to {@code AccessibilityStateCompat} */
+public class AccessibilityState implements State {
+ private static final String TAG = "AccessibilityState";
+ private static final String TOGGLE_HIGH_TEXT_CONTRAST_KEY = "toggle_high_text_contrast";
+ private static final String TOGGLE_AUDIO_DESCRIPTION_KEY = "toggle_audio_description";
+ private static final String ACCESSIBILITY_SERVICES_KEY = "system_accessibility_services";
+
+ private PreferenceCompat mServicesPref;
+ private PreferenceCompat mHighContrastPreference;
+ private PreferenceCompat mAudioDescriptionPreference;
+
+ private final AccessibilityManager.AccessibilityStateChangeListener
+ mAccessibilityStateChangeListener = enabled -> refreshServices();
+
+ private final Context mContext;
+ private final UIUpdateCallback mUIUpdateCallback;
+ private PreferenceCompatManager mPreferenceCompatManager;
+
+ public AccessibilityState(Context context, UIUpdateCallback callback) {
+ mUIUpdateCallback = callback;
+ mContext = context;
+ }
+
+ @Override
+ public void onAttach() {
+ // no-op
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ mPreferenceCompatManager = new PreferenceCompatManager();
+ mHighContrastPreference = mPreferenceCompatManager.getOrCreatePrefCompat(
+ TOGGLE_HIGH_TEXT_CONTRAST_KEY);
+ mHighContrastPreference.setChecked(Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, 0) == 1);
+
+ mAudioDescriptionPreference = mPreferenceCompatManager.getOrCreatePrefCompat(
+ TOGGLE_AUDIO_DESCRIPTION_KEY);
+ mAudioDescriptionPreference.setChecked(Settings.Secure.getInt(
+ mContext.getContentResolver(),
+ Settings.Secure.ENABLED_ACCESSIBILITY_AUDIO_DESCRIPTION_BY_DEFAULT, 0) == 1);
+
+ mServicesPref = mPreferenceCompatManager.getOrCreatePrefCompat(ACCESSIBILITY_SERVICES_KEY);
+ refreshServices();
+ AccessibilityManager am = (AccessibilityManager)
+ mContext.getSystemService(ACCESSIBILITY_SERVICE);
+ if (am != null) {
+ am.addAccessibilityStateChangeListener(mAccessibilityStateChangeListener);
+ }
+ }
+
+ @Override
+ public void onStart() {
+ // no-op
+ }
+
+ @Override
+ public void onResume() {
+ refreshServices();
+ }
+
+ @Override
+ public void onPause() {
+ // no-op
+ }
+
+ @Override
+ public void onStop() {
+ AccessibilityManager am = (AccessibilityManager)
+ mContext.getSystemService(ACCESSIBILITY_SERVICE);
+ if (am != null && mServicesPref != null) {
+ am.removeAccessibilityStateChangeListener(mAccessibilityStateChangeListener);
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ // no-op
+ }
+
+ @Override
+ public void onDetach() {
+ // no-op
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ if (TextUtils.equals(key[0], TOGGLE_HIGH_TEXT_CONTRAST_KEY)) {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED,
+ (mHighContrastPreference.getChecked() == STATUS_ON ? 1 : 0));
+ return true;
+ } else if (TextUtils.equals(key[0], TOGGLE_AUDIO_DESCRIPTION_KEY)) {
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.ENABLED_ACCESSIBILITY_AUDIO_DESCRIPTION_BY_DEFAULT,
+ (mAudioDescriptionPreference.getChecked() == STATUS_ON ? 1 : 0));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // no-op
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ if (TextUtils.equals(key[0], TOGGLE_HIGH_TEXT_CONTRAST_KEY)) {
+ final boolean value = (Boolean) newValue;
+ mHighContrastPreference.setChecked(value);
+ refreshToggleHighTextContrastUI();
+ return true;
+ } else if (TextUtils.equals(key[0], TOGGLE_AUDIO_DESCRIPTION_KEY)) {
+ final boolean value = (Boolean) newValue;
+ mAudioDescriptionPreference.setChecked(value);
+ refreshToggleAudioDescriptionUI();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_ACCESSIBILITY;
+ }
+
+ private void refreshServicesUI() {
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mServicesPref);
+ }
+ }
+
+ private void refreshToggleHighTextContrastUI() {
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mHighContrastPreference);
+ }
+ }
+
+ private void refreshToggleAudioDescriptionUI() {
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mAudioDescriptionPreference);
+ }
+ }
+
+ private void refreshServices() {
+ if (mServicesPref == null) {
+ return;
+ }
+ DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
+ final List<AccessibilityServiceInfo> installedServiceInfos =
+ mContext.getSystemService(AccessibilityManager.class)
+ .getInstalledAccessibilityServiceList();
+ final Set<ComponentName> enabledServices =
+ AccessibilityUtils.getEnabledServicesFromSettings(mContext, UserHandle.myUserId());
+ final List<String> permittedServices = dpm.getPermittedAccessibilityServices(
+ UserHandle.myUserId());
+
+ final boolean accessibilityEnabled = Settings.Secure.getInt(
+ mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
+
+ mServicesPref.initChildPreferences();
+ for (final AccessibilityServiceInfo accInfo : installedServiceInfos) {
+ final ServiceInfo serviceInfo = accInfo.getResolveInfo().serviceInfo;
+ final ComponentName componentName = new ComponentName(serviceInfo.packageName,
+ serviceInfo.name);
+
+ final boolean serviceEnabled = accessibilityEnabled
+ && enabledServices.contains(componentName);
+ // permittedServices null means all accessibility services are allowed.
+ final boolean serviceAllowed = permittedServices == null
+ || permittedServices.contains(serviceInfo.packageName);
+
+ final String title = accInfo.getResolveInfo()
+ .loadLabel(mContext.getPackageManager()).toString();
+
+ final String key = "ServicePref:" + componentName.flattenToString();
+ PreferenceCompat servicePref = mPreferenceCompatManager.getOrCreatePrefCompat(key);
+ servicePref.setRestricted(true);
+ servicePref.setTitle(title);
+ servicePref.setSummary(
+ serviceEnabled ? ResourcesUtil.getString(mContext, "settings_on")
+ : ResourcesUtil.getString(mContext, "settings_off"));
+ Bundle extra = new Bundle();
+ AccessibilityServiceState.prepareArgs(extra, serviceInfo.packageName,
+ serviceInfo.name,
+ accInfo.getSettingsActivityName(),
+ title);
+ servicePref.setExtras(extra);
+
+ if (serviceAllowed || serviceEnabled) {
+ servicePref.setEnabled(true);
+ servicePref.setNextState(ManagerUtil.STATE_ACCESSIBILITY_SERVICE);
+ } else {
+ // Disable accessibility service that are not permitted.
+ final RestrictedLockUtils.EnforcedAdmin admin =
+ RestrictedLockUtilsInternal.checkIfAccessibilityServiceDisallowed(
+ mContext, serviceInfo.packageName, UserHandle.myUserId());
+ if (admin != null) {
+ servicePref.setDisabledByAdmin(true);
+ } else {
+ servicePref.setEnabled(false);
+ }
+ servicePref.setNextState(null);
+ }
+
+ mServicesPref.addChildPrefCompat(servicePref);
+ }
+ refreshServicesUI();
+ }
+
+ @Override
+ public void onDisplayDialogPreference(String[] key) {
+
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/basic/BasicModeFeatureProvider.java b/SettingsAPI/java/com/android/tv/settings/library/basic/BasicModeFeatureProvider.java
similarity index 90%
rename from Settings/src/com/android/tv/settings/basic/BasicModeFeatureProvider.java
rename to SettingsAPI/java/com/android/tv/settings/library/basic/BasicModeFeatureProvider.java
index ce51b64..702a028 100644
--- a/Settings/src/com/android/tv/settings/basic/BasicModeFeatureProvider.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/basic/BasicModeFeatureProvider.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.basic;
+package com.android.tv.settings.library.basic;
import android.app.Activity;
import android.content.Context;
@@ -25,13 +25,13 @@
public interface BasicModeFeatureProvider {
/**
- * @param context
* @return whether the device is in basic mode.
*/
boolean isBasicMode(@NonNull Context context);
/**
* Attempt to start the Activity for exiting basic mode.
+ *
* @param activity the Activity to start the basic mode exit Activity from
*/
void startBasicModeExitActivity(@NonNull Activity activity);
diff --git a/Settings/src/com/android/tv/settings/basic/BasicModeFeatureProviderImpl.java b/SettingsAPI/java/com/android/tv/settings/library/basic/BasicModeFeatureProviderImpl.java
similarity index 91%
rename from Settings/src/com/android/tv/settings/basic/BasicModeFeatureProviderImpl.java
rename to SettingsAPI/java/com/android/tv/settings/library/basic/BasicModeFeatureProviderImpl.java
index d9e04eb..5dbc58b 100644
--- a/Settings/src/com/android/tv/settings/basic/BasicModeFeatureProviderImpl.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/basic/BasicModeFeatureProviderImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.basic;
+package com.android.tv.settings.library.basic;
import android.app.Activity;
import android.content.Context;
diff --git a/Settings/src/com/android/tv/settings/basic/BasicModeFeatureProviderImplX.java b/SettingsAPI/java/com/android/tv/settings/library/basic/BasicModeFeatureProviderImplX.java
similarity index 85%
rename from Settings/src/com/android/tv/settings/basic/BasicModeFeatureProviderImplX.java
rename to SettingsAPI/java/com/android/tv/settings/library/basic/BasicModeFeatureProviderImplX.java
index 37217be..cf174f0 100644
--- a/Settings/src/com/android/tv/settings/basic/BasicModeFeatureProviderImplX.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/basic/BasicModeFeatureProviderImplX.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.basic;
+package com.android.tv.settings.library.basic;
import android.app.Activity;
import android.content.ComponentName;
@@ -28,7 +28,7 @@
import androidx.annotation.NonNull;
-import com.android.tv.settings.R;
+import com.android.tv.settings.library.util.ResourcesUtil;
import java.util.List;
@@ -42,7 +42,8 @@
@Override
public boolean isBasicMode(@NonNull Context context) {
- final String providerUriString = context.getString(R.string.basic_mode_provider_uri);
+ final String providerUriString = ResourcesUtil.getString(context,
+ "basic_mode_provider_uri");
if (TextUtils.isEmpty(providerUriString)) {
Log.e(TAG, "ContentProvider for basic mode is undefined.");
return false;
@@ -64,10 +65,11 @@
@Override
public void startBasicModeExitActivity(@NonNull Activity activity) {
- final String basicModeExitPackage = activity.getString(R.string.basic_mode_exit_package);
+ final String basicModeExitPackage = ResourcesUtil.getString(activity,
+ "basic_mode_exit_package");
final String basicModeExitComponent =
- activity.getString(R.string.basic_mode_exit_component);
- final String basicModeExitData = activity.getString(R.string.basic_mode_exit_data);
+ ResourcesUtil.getString(activity, "basic_mode_exit_component");
+ final String basicModeExitData = ResourcesUtil.getString(activity, "basic_mode_exit_data");
if (TextUtils.isEmpty(basicModeExitPackage) || TextUtils.isEmpty(basicModeExitComponent)
|| TextUtils.isEmpty(basicModeExitData)) {
Log.e(TAG, "Basic mode exit activity undefined.");
diff --git a/Settings/src/com/android/tv/settings/service/data/Module.java b/SettingsAPI/java/com/android/tv/settings/library/data/Module.java
similarity index 89%
rename from Settings/src/com/android/tv/settings/service/data/Module.java
rename to SettingsAPI/java/com/android/tv/settings/library/data/Module.java
index efcb368..9a3cb55 100644
--- a/Settings/src/com/android/tv/settings/service/data/Module.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/data/Module.java
@@ -14,7 +14,9 @@
* limitations under the License.
*/
-package com.android.tv.settings.service.data;
+package com.android.tv.settings.library.data;
+
+import com.android.tv.settings.library.State;
/** Implement this to provide back-end data for multiple states. */
public interface Module {
diff --git a/SettingsAPI/java/com/android/tv/settings/library/data/PreferenceCompatManager.java b/SettingsAPI/java/com/android/tv/settings/library/data/PreferenceCompatManager.java
new file mode 100644
index 0000000..18f1721
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/data/PreferenceCompatManager.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.tv.settings.library.data;
+
+import android.util.ArrayMap;
+
+import com.android.tv.settings.library.PreferenceCompat;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/** Manage the creation and removal of {@link PreferenceCompat} for a state. */
+public class PreferenceCompatManager {
+ private final Map<String, PreferenceCompat> mPrefCompats = new ArrayMap<>();
+
+ public PreferenceCompat getOrCreatePrefCompat(String key) {
+ return getOrCreatePrefCompat(new String[]{key});
+ }
+
+ /**
+ * Get or create the preferenceCompat with the specified key.
+ *
+ * @param key key of the preferenceCompat
+ * @return preferenceCompat with the specified key.
+ */
+ public PreferenceCompat getOrCreatePrefCompat(String[] key) {
+ if (key == null) {
+ return null;
+ }
+ String compoundKey = getKey(key);
+ if (!mPrefCompats.containsKey(compoundKey)) {
+ mPrefCompats.put(compoundKey, new PreferenceCompat(key));
+ }
+ return mPrefCompats.get(compoundKey);
+ }
+
+ /**
+ * Get the preferenceCompat, used in
+ * {@link PreferenceControllerState#onPreferenceChange(String[],
+ * Object)}
+ * or {@link PreferenceControllerState#onPreferenceTreeClick(String[], boolean)}
+ *
+ * @param key key of the preferenceCompat
+ * @return preferenceCompat with the specified key, or null if does not exist.
+ */
+ public PreferenceCompat getPrefCompat(String[] key) {
+ if (key == null) {
+ return null;
+ }
+ String compoundKey = getKey(key);
+ return mPrefCompats.get(compoundKey);
+ }
+
+ public static String getKey(String[] key) {
+ return Stream.of(key).collect(Collectors.joining(" "));
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/data/PreferenceControllerState.java b/SettingsAPI/java/com/android/tv/settings/library/data/PreferenceControllerState.java
new file mode 100644
index 0000000..3fe1d10
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/data/PreferenceControllerState.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.tv.settings.library.data;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.android.tv.settings.library.State;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.lifecycle.Lifecycle;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * State for managing preferenceCompats controlled through {@link AbstractPreferenceController} and
+ * provide Lifecycle components.
+ */
+public abstract class PreferenceControllerState implements State {
+ private static final String TAG = "PreferenceControllerState";
+ protected final Context mContext;
+ protected UIUpdateCallback mUIUpdateCallback;
+ protected PreferenceCompatManager mPreferenceCompatManager;
+ protected List<AbstractPreferenceController> mPreferenceControllers = new ArrayList<>();
+ private Lifecycle mLifecycle;
+
+ public PreferenceControllerState(Context context, UIUpdateCallback callback) {
+ mUIUpdateCallback = callback;
+ mContext = context;
+ mPreferenceCompatManager = new PreferenceCompatManager();
+ }
+
+ @Override
+ public void onAttach() {
+ mLifecycle = new Lifecycle();
+ mLifecycle.onAttach();
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ mLifecycle.onCreate(extras);
+ List<AbstractPreferenceController> controllers = onCreatePreferenceControllers(mContext);
+ if (controllers == null) {
+ controllers = new ArrayList<>();
+ }
+ mPreferenceControllers.addAll(controllers);
+ initAllPreferenceControllers();
+ }
+
+ @Override
+ public void onStart() {
+ mLifecycle.onStart();
+ updateAllPreferenceControllers();
+ }
+
+ @Override
+ public void onResume() {
+ mLifecycle.onResume();
+ }
+
+ @Override
+ public void onPause() {
+ mLifecycle.onPause();
+ }
+
+ @Override
+ public void onStop() {
+ mLifecycle.onStop();
+ }
+
+ @Override
+ public void onDestroy() {
+ mLifecycle.onDestroy();
+ }
+
+ @Override
+ public void onDetach() {
+ // no-op
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ Collection<AbstractPreferenceController> controllers =
+ new ArrayList<>(mPreferenceControllers);
+ for (AbstractPreferenceController controller : controllers) {
+ if (keyEquals(key, controller.getPreferenceKey())) {
+ return controller.handlePreferenceTreeClick(status);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ Collection<AbstractPreferenceController> controllers =
+ new ArrayList<>(mPreferenceControllers);
+ for (AbstractPreferenceController controller : controllers) {
+ if (keyEquals(key, controller.getPreferenceKey())) {
+ return controller.handlePreferenceChange(newValue);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // no-op
+ }
+
+ @Override
+ public abstract int getStateIdentifier();
+
+ protected void initAllPreferenceControllers() {
+ Collection<AbstractPreferenceController> controllers =
+ new ArrayList<>(mPreferenceControllers);
+ for (AbstractPreferenceController controller : controllers) {
+ if (controller.isAvailable()) {
+ controller.initAndNotify();
+ }
+ }
+ }
+
+ /**
+ * Update state of each preference managed by PreferenceController.
+ */
+ protected void updateAllPreferenceControllers() {
+ Collection<AbstractPreferenceController> controllers =
+ new ArrayList<>(mPreferenceControllers);
+ for (AbstractPreferenceController controller : controllers) {
+ if (controller.isAvailable()) {
+ controller.updateAndNotify();
+ }
+ }
+ }
+
+ /**
+ * Get a list of {@link AbstractPreferenceController} for this fragment.
+ */
+ protected abstract List<AbstractPreferenceController> onCreatePreferenceControllers(
+ Context context);
+
+ protected Lifecycle getLifecycle() {
+ return mLifecycle;
+ }
+
+ protected static boolean keyEquals(String[] key1, String[] key2) {
+ return Arrays.equals(key1, key2);
+ }
+
+ @Override
+ public void onDisplayDialogPreference(String[] key) {
+
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/data/StateManager.java b/SettingsAPI/java/com/android/tv/settings/library/data/StateManager.java
new file mode 100644
index 0000000..f6a133f
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/data/StateManager.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.data;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_ACCESSIBILITY;
+import static com.android.tv.settings.library.ManagerUtil.STATE_ACCESSIBILITY_SERVICE;
+import static com.android.tv.settings.library.ManagerUtil.STATE_ACCESSIBILITY_SHORTCUT;
+import static com.android.tv.settings.library.ManagerUtil.STATE_ACCESSIBILITY_SHORTCUT_SERVICE;
+import static com.android.tv.settings.library.ManagerUtil.STATE_ADVANCED_DISPLAY;
+import static com.android.tv.settings.library.ManagerUtil.STATE_ADVANCED_VOLUME;
+import static com.android.tv.settings.library.ManagerUtil.STATE_ALARMS_AND_REMINDERS;
+import static com.android.tv.settings.library.ManagerUtil.STATE_ALL_APPS;
+import static com.android.tv.settings.library.ManagerUtil.STATE_APPS;
+import static com.android.tv.settings.library.ManagerUtil.STATE_APP_MANAGEMENT;
+import static com.android.tv.settings.library.ManagerUtil.STATE_APP_USAGE_ACCESS;
+import static com.android.tv.settings.library.ManagerUtil.STATE_AVAILABLE_KEYBOARD;
+import static com.android.tv.settings.library.ManagerUtil.STATE_DAYDREAM;
+import static com.android.tv.settings.library.ManagerUtil.STATE_DISPLAY_SOUND;
+import static com.android.tv.settings.library.ManagerUtil.STATE_ENERGY_SAVER;
+import static com.android.tv.settings.library.ManagerUtil.STATE_FONT_SCALE;
+import static com.android.tv.settings.library.ManagerUtil.STATE_HDR_FORMAT_SELECTION;
+import static com.android.tv.settings.library.ManagerUtil.STATE_HIGH_POWER;
+import static com.android.tv.settings.library.ManagerUtil.STATE_KEYBOARD;
+import static com.android.tv.settings.library.ManagerUtil.STATE_LANGUAGE;
+import static com.android.tv.settings.library.ManagerUtil.STATE_LEGAL;
+import static com.android.tv.settings.library.ManagerUtil.STATE_LOCATION;
+import static com.android.tv.settings.library.ManagerUtil.STATE_MATCH_CONTENT_FRAME;
+import static com.android.tv.settings.library.ManagerUtil.STATE_NETWORK;
+import static com.android.tv.settings.library.ManagerUtil.STATE_NOTIFICATION_ACCESS;
+import static com.android.tv.settings.library.ManagerUtil.STATE_PICTURE_IN_PICTURE;
+import static com.android.tv.settings.library.ManagerUtil.STATE_PRIVACY;
+import static com.android.tv.settings.library.ManagerUtil.STATE_RESOLUTION_SELECTION;
+import static com.android.tv.settings.library.ManagerUtil.STATE_SENSOR;
+import static com.android.tv.settings.library.ManagerUtil.STATE_SPECIAL_ACCESS;
+import static com.android.tv.settings.library.ManagerUtil.STATE_STORAGE;
+import static com.android.tv.settings.library.ManagerUtil.STATE_STORAGE_SUMMARY;
+import static com.android.tv.settings.library.ManagerUtil.STATE_SYSTEM_ALERT_WINDOW;
+import static com.android.tv.settings.library.ManagerUtil.STATE_SYSTEM_DATE_TIME;
+import static com.android.tv.settings.library.ManagerUtil.STATE_WIFI_DETAILS;
+import static com.android.tv.settings.library.ManagerUtil.STATE_WRITE_SETTINGS;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.State;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.about.LegalState;
+import com.android.tv.settings.library.accessibility.AccessibilityServiceState;
+import com.android.tv.settings.library.accessibility.AccessibilityShortcutServiceState;
+import com.android.tv.settings.library.accessibility.AccessibilityShortcutState;
+import com.android.tv.settings.library.accessibility.AccessibilityState;
+import com.android.tv.settings.library.device.apps.AllAppsState;
+import com.android.tv.settings.library.device.apps.AppManagementState;
+import com.android.tv.settings.library.device.apps.AppsState;
+import com.android.tv.settings.library.device.apps.specialaccess.AlarmsAndRemindersState;
+import com.android.tv.settings.library.device.apps.specialaccess.AppUsageAccessState;
+import com.android.tv.settings.library.device.apps.specialaccess.HighPowerState;
+import com.android.tv.settings.library.device.apps.specialaccess.NotificationAccessState;
+import com.android.tv.settings.library.device.apps.specialaccess.PictureInPictureState;
+import com.android.tv.settings.library.device.apps.specialaccess.SpecialAppAccessState;
+import com.android.tv.settings.library.device.apps.specialaccess.SystemAlertWindowState;
+import com.android.tv.settings.library.device.apps.specialaccess.WriteSettingsState;
+import com.android.tv.settings.library.device.display.daydream.DaydreamState;
+import com.android.tv.settings.library.device.display.daydream.EnergySaverState;
+import com.android.tv.settings.library.device.display.displaysound.AdvancedDisplayState;
+import com.android.tv.settings.library.device.display.displaysound.AdvancedVolumeState;
+import com.android.tv.settings.library.device.display.displaysound.DisplaySoundState;
+import com.android.tv.settings.library.device.display.displaysound.FontScaleState;
+import com.android.tv.settings.library.device.display.displaysound.HdrFormatSelectionState;
+import com.android.tv.settings.library.device.display.displaysound.MatchContentFrameRateState;
+import com.android.tv.settings.library.device.display.displaysound.ResolutionSelectionState;
+import com.android.tv.settings.library.device.storage.StorageState;
+import com.android.tv.settings.library.device.storage.StorageSummaryState;
+import com.android.tv.settings.library.inputmethod.AvailableVirtualKeyboadState;
+import com.android.tv.settings.library.inputmethod.KeyboardState;
+import com.android.tv.settings.library.network.NetworkState;
+import com.android.tv.settings.library.network.WifiDetailsState;
+import com.android.tv.settings.library.privacy.LocationState;
+import com.android.tv.settings.library.privacy.PrivacyState;
+import com.android.tv.settings.library.privacy.SensorState;
+import com.android.tv.settings.library.system.DateTimeState;
+import com.android.tv.settings.library.system.LanguageState;
+
+/** Manager to handle creation and removal of the {@link State}. */
+public class StateManager {
+ private StateManager() {
+ }
+
+ public static State createState(
+ Context context, int stateIdentifier, UIUpdateCallback uiUpdateCallback) {
+ State state = null;
+ switch (stateIdentifier) {
+ case STATE_NETWORK:
+ state = new NetworkState(context, uiUpdateCallback);
+ break;
+ case STATE_WIFI_DETAILS:
+ state = new WifiDetailsState(context, uiUpdateCallback);
+ break;
+ case STATE_ALL_APPS:
+ state = new AllAppsState(context, uiUpdateCallback);
+ break;
+ case STATE_APPS:
+ state = new AppsState(context, uiUpdateCallback);
+ break;
+ case STATE_APP_MANAGEMENT:
+ state = new AppManagementState(context, uiUpdateCallback);
+ break;
+ case STATE_SPECIAL_ACCESS:
+ state = new SpecialAppAccessState(context, uiUpdateCallback);
+ break;
+ case STATE_HIGH_POWER:
+ state = new HighPowerState(context, uiUpdateCallback);
+ break;
+ case STATE_NOTIFICATION_ACCESS:
+ state = new NotificationAccessState(context, uiUpdateCallback);
+ break;
+ case STATE_APP_USAGE_ACCESS:
+ state = new AppUsageAccessState(context, uiUpdateCallback);
+ break;
+ case STATE_PICTURE_IN_PICTURE:
+ state = new PictureInPictureState(context, uiUpdateCallback);
+ break;
+ case STATE_ALARMS_AND_REMINDERS:
+ state = new AlarmsAndRemindersState(context, uiUpdateCallback);
+ break;
+ case STATE_SYSTEM_ALERT_WINDOW:
+ state = new SystemAlertWindowState(context, uiUpdateCallback);
+ break;
+ case STATE_WRITE_SETTINGS:
+ state = new WriteSettingsState(context, uiUpdateCallback);
+ break;
+ case STATE_SYSTEM_DATE_TIME:
+ state = new DateTimeState(context, uiUpdateCallback);
+ break;
+ case STATE_KEYBOARD:
+ state = new KeyboardState(context, uiUpdateCallback);
+ break;
+ case STATE_AVAILABLE_KEYBOARD:
+ state = new AvailableVirtualKeyboadState(context, uiUpdateCallback);
+ break;
+ case STATE_LANGUAGE:
+ state = new LanguageState(context, uiUpdateCallback);
+ break;
+ case STATE_ACCESSIBILITY:
+ state = new AccessibilityState(context, uiUpdateCallback);
+ break;
+ case STATE_ACCESSIBILITY_SERVICE:
+ state = new AccessibilityServiceState(context, uiUpdateCallback);
+ break;
+ case STATE_ACCESSIBILITY_SHORTCUT:
+ state = new AccessibilityShortcutState(context, uiUpdateCallback);
+ break;
+ case STATE_ACCESSIBILITY_SHORTCUT_SERVICE:
+ state = new AccessibilityShortcutServiceState(context, uiUpdateCallback);
+ case STATE_STORAGE:
+ state = new StorageState(context, uiUpdateCallback);
+ break;
+ case STATE_STORAGE_SUMMARY:
+ state = new StorageSummaryState(context, uiUpdateCallback);
+ break;
+ case STATE_ENERGY_SAVER:
+ state = new EnergySaverState(context, uiUpdateCallback);
+ break;
+ case STATE_DAYDREAM:
+ state = new DaydreamState(context, uiUpdateCallback);
+ break;
+ case STATE_DISPLAY_SOUND:
+ state = new DisplaySoundState(context, uiUpdateCallback);
+ break;
+ case STATE_FONT_SCALE:
+ state = new FontScaleState(context, uiUpdateCallback);
+ break;
+ case STATE_MATCH_CONTENT_FRAME:
+ state = new MatchContentFrameRateState(context, uiUpdateCallback);
+ break;
+ case STATE_ADVANCED_DISPLAY:
+ state = new AdvancedDisplayState(context, uiUpdateCallback);
+ break;
+ case STATE_ADVANCED_VOLUME:
+ state = new AdvancedVolumeState(context, uiUpdateCallback);
+ break;
+ case STATE_HDR_FORMAT_SELECTION:
+ state = new HdrFormatSelectionState(context, uiUpdateCallback);
+ break;
+ case STATE_LOCATION:
+ state = new LocationState(context, uiUpdateCallback);
+ break;
+ case STATE_SENSOR:
+ state = new SensorState(context, uiUpdateCallback);
+ break;
+ case STATE_PRIVACY:
+ state = new PrivacyState(context, uiUpdateCallback);
+ break;
+ case STATE_RESOLUTION_SELECTION:
+ state = new ResolutionSelectionState(context, uiUpdateCallback);
+ break;
+ case STATE_LEGAL:
+ state = new LegalState(context, uiUpdateCallback);
+ break;
+ default:
+ // no-op
+ }
+ return state;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/AllAppsState.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/AllAppsState.java
new file mode 100644
index 0000000..8aac3b0
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/AllAppsState.java
@@ -0,0 +1,371 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.apps;
+
+import static com.android.tv.settings.library.device.apps.AppsState.EXTRA_VOLUME_NAME;
+import static com.android.tv.settings.library.device.apps.AppsState.EXTRA_VOLUME_UUID;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class AllAppsState extends PreferenceControllerState {
+ static final String ARG_PACKAGE_NAME = "packageName";
+ private static final String TAG = "AllAppsState";
+ private static final String KEY_SHOW_OTHER_APPS = "ShowOtherApps";
+ private ApplicationsState mApplicationsState;
+ private ApplicationsState.Session mSessionInstalled;
+ private ApplicationsState.AppFilter mFilterInstalled;
+ private ApplicationsState.Session mSessionDisabled;
+ private ApplicationsState.AppFilter mFilterDisabled;
+ private ApplicationsState.Session mSessionOther;
+ private ApplicationsState.AppFilter mFilterOther;
+ private PreferenceCompat mInstalledPreferenceGroup;
+ private PreferenceCompat mDisabledPreferenceGroup;
+ private PreferenceCompat mOtherPreferenceGroup;
+ private PreferenceCompat mShowOtherApps;
+ private static final @ApplicationsState.SessionFlags
+ int SESSION_FLAGS =
+ ApplicationsState.FLAG_SESSION_REQUEST_HOME_APP
+ | ApplicationsState.FLAG_SESSION_REQUEST_ICONS
+ | ApplicationsState.FLAG_SESSION_REQUEST_SIZES
+ | ApplicationsState.FLAG_SESSION_REQUEST_LEANBACK_LAUNCHER;
+ private final Map<PreferenceCompat,
+ ArrayList<ApplicationsState.AppEntry>> mUpdateMap = new ArrayMap<>(3);
+ private long mRunAt = Long.MIN_VALUE;
+ private final Handler mHandler = new Handler();
+
+ private final Runnable mUpdateRunnable = new Runnable() {
+ @Override
+ public void run() {
+ for (final PreferenceCompat group : mUpdateMap.keySet()) {
+ final ArrayList<ApplicationsState.AppEntry> entries = mUpdateMap.get(group);
+ updateAppListInternal(group, entries);
+ }
+ mUpdateMap.clear();
+ mRunAt = 0;
+ }
+ };
+
+ private static final ApplicationsState.AppFilter
+ FILTER_INSTALLED = new ApplicationsState.AppFilter() {
+
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(ApplicationsState.AppEntry info) {
+ return !FILTER_DISABLED.filterApp(info)
+ && info.info != null
+ && info.info.enabled
+ && info.hasLauncherEntry
+ && info.launcherEntryEnabled;
+ }
+ };
+
+ private static final ApplicationsState.AppFilter
+ FILTER_DISABLED =
+ new ApplicationsState.AppFilter() {
+
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry info) {
+ return info.info != null
+ && (info.info.enabledSetting
+ == PackageManager.COMPONENT_ENABLED_STATE_DISABLED
+ || info.info.enabledSetting
+ == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
+ || (info.info.enabledSetting
+ == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
+ && !info.info.enabled));
+ }
+ };
+
+ private static final ApplicationsState.AppFilter
+ FILTER_OTHER = new ApplicationsState.AppFilter() {
+
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry info) {
+ return !FILTER_INSTALLED.filterApp(info) && !FILTER_DISABLED.filterApp(info);
+ }
+ };
+
+ public AllAppsState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mApplicationsState = ApplicationsState.getInstance(((Activity) mContext).getApplication());
+ final String volumeUuid = extras.getString(EXTRA_VOLUME_UUID);
+ final String volumeName = extras.getString(EXTRA_VOLUME_NAME);
+
+ // The UUID of internal storage is null, so we check if there's a volume name to see if we
+ // should only be showing the apps on the internal storage or all apps.
+ if (!TextUtils.isEmpty(volumeUuid) || !TextUtils.isEmpty(volumeName)) {
+ ApplicationsState.AppFilter volumeFilter = new ApplicationsState.VolumeFilter(
+ volumeUuid);
+
+ mFilterInstalled = new ApplicationsState.CompoundFilter(FILTER_INSTALLED, volumeFilter);
+ mFilterDisabled = new ApplicationsState.CompoundFilter(FILTER_DISABLED, volumeFilter);
+ mFilterOther = new ApplicationsState.CompoundFilter(FILTER_OTHER, volumeFilter);
+ } else {
+ mFilterInstalled = FILTER_INSTALLED;
+ mFilterDisabled = FILTER_DISABLED;
+ mFilterOther = FILTER_OTHER;
+ }
+ mSessionInstalled = mApplicationsState.newSession(new RowUpdateCallbacks() {
+ @Override
+ protected void doRebuild() {
+ rebuildInstalled();
+ }
+
+ @Override
+ public void onRebuildComplete(
+ ArrayList<ApplicationsState.AppEntry> apps) {
+ updateAppList(mInstalledPreferenceGroup, apps);
+ }
+ }, getLifecycle());
+ mSessionInstalled.setSessionFlags(SESSION_FLAGS);
+
+ mSessionDisabled = mApplicationsState.newSession(new RowUpdateCallbacks() {
+ @Override
+ protected void doRebuild() {
+ rebuildDisabled();
+ }
+
+ @Override
+ public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
+ updateAppList(mDisabledPreferenceGroup, apps);
+ }
+ }, getLifecycle());
+ mSessionDisabled.setSessionFlags(SESSION_FLAGS);
+
+ mSessionOther = mApplicationsState.newSession(new RowUpdateCallbacks() {
+ @Override
+ protected void doRebuild() {
+ if (!ManagerUtil.isVisible(mShowOtherApps)) {
+ rebuildOther();
+ }
+ }
+
+ @Override
+ public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
+ updateAppList(mOtherPreferenceGroup, apps);
+ }
+ }, getLifecycle());
+ mSessionOther.setSessionFlags(SESSION_FLAGS);
+
+ rebuildInstalled();
+ rebuildDisabled();
+ mInstalledPreferenceGroup = mPreferenceCompatManager.getOrCreatePrefCompat(
+ "InstalledPreferenceGroup");
+ mDisabledPreferenceGroup = mPreferenceCompatManager.getOrCreatePrefCompat(
+ "DisabledPreferenceGroup");
+ mOtherPreferenceGroup = mPreferenceCompatManager.getOrCreatePrefCompat(
+ "OtherPreferenceGroup");
+ mOtherPreferenceGroup.setVisible(false);
+ mShowOtherApps = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_SHOW_OTHER_APPS);
+ mShowOtherApps.setVisible(TextUtils.isEmpty(volumeUuid));
+ }
+
+ private void rebuildInstalled() {
+ ArrayList<ApplicationsState.AppEntry> apps =
+ mSessionInstalled.rebuild(mFilterInstalled, ApplicationsState.ALPHA_COMPARATOR);
+ if (apps != null) {
+ updateAppList(mInstalledPreferenceGroup, apps);
+ }
+ }
+
+ private void rebuildDisabled() {
+ ArrayList<ApplicationsState.AppEntry> apps =
+ mSessionDisabled.rebuild(mFilterDisabled, ApplicationsState.ALPHA_COMPARATOR);
+ if (apps != null) {
+ updateAppList(mDisabledPreferenceGroup, apps);
+ }
+ }
+
+ private void rebuildOther() {
+ ArrayList<ApplicationsState.AppEntry> apps =
+ mSessionOther.rebuild(mFilterOther, ApplicationsState.ALPHA_COMPARATOR);
+ if (apps != null) {
+ updateAppList(mOtherPreferenceGroup, apps);
+ }
+ }
+
+ private void updateAppList(PreferenceCompat group,
+ ArrayList<ApplicationsState.AppEntry> entries) {
+ if (group == null) {
+ Log.d(TAG, "Not updating list for null group");
+ return;
+ }
+ mUpdateMap.put(group, entries);
+
+ // We can get spammed with updates, so coalesce them to reduce jank and flicker
+ if (mRunAt == Long.MIN_VALUE) {
+ // First run, no delay
+ mHandler.removeCallbacks(mUpdateRunnable);
+ mHandler.post(mUpdateRunnable);
+ } else {
+ if (mRunAt == 0) {
+ mRunAt = SystemClock.uptimeMillis() + 1000;
+ }
+ int delay = (int) (mRunAt - SystemClock.uptimeMillis());
+ delay = delay < 0 ? 0 : delay;
+
+ mHandler.removeCallbacks(mUpdateRunnable);
+ mHandler.postDelayed(mUpdateRunnable, delay);
+ }
+ }
+
+ private void updateAppListInternal(PreferenceCompat group,
+ ArrayList<ApplicationsState.AppEntry> entries) {
+ if (entries != null) {
+ String[] key = group.getKey();
+ group.initChildPreferences();
+ for (final ApplicationsState.AppEntry entry : entries) {
+ String packageName = entry.info.packageName;
+ String[] entryKey = new String[key.length + 1];
+ System.arraycopy(key, 0, entryKey, 0, key.length);
+ entryKey[key.length] = packageName;
+ PreferenceCompat entryPref = new PreferenceCompat(entryKey);
+ group.addChildPrefCompat(entryPref);
+ updatePreferenceParcelable(entryPref, entry);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), group);
+ }
+ mDisabledPreferenceGroup.setVisible(mDisabledPreferenceGroup.getChildPrefsCount() > 0);
+ }
+
+ /**
+ * Update a PreferenceParcelable based upon {@link ApplicationsState.AppEntry}.
+ */
+ private PreferenceCompat updatePreferenceParcelable(
+ PreferenceCompat preference, ApplicationsState.AppEntry entry) {
+ entry.ensureLabel(mContext);
+ preference.setTitle(entry.label);
+ preference.setSummary(entry.sizeStr);
+ preference.setNextState(ManagerUtil.STATE_APP_MANAGEMENT);
+ Bundle nextStateExtras = new Bundle();
+ AppManagementState.prepareArgs(nextStateExtras, entry.info.packageName);
+ preference.setExtras(nextStateExtras);
+ preference.setIcon(entry.icon);
+ return preference;
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ super.onPreferenceTreeClick(key, status);
+ if (KEY_SHOW_OTHER_APPS.equals(key[0])) {
+ showOtherApps();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // no-op
+ }
+
+ private void showOtherApps() {
+ mShowOtherApps.setVisible(false);
+ mOtherPreferenceGroup.setVisible(true);
+ rebuildOther();
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_ALL_APPS;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+
+ private abstract class RowUpdateCallbacks implements ApplicationsState.Callbacks {
+
+ protected abstract void doRebuild();
+
+ @Override
+ public void onRunningStateChanged(boolean running) {
+ doRebuild();
+ }
+
+ @Override
+ public void onPackageListChanged() {
+ doRebuild();
+ }
+
+ @Override
+ public void onPackageIconChanged() {
+ doRebuild();
+ }
+
+ @Override
+ public void onPackageSizeChanged(String packageName) {
+ doRebuild();
+ }
+
+ @Override
+ public void onAllSizesComputed() {
+ doRebuild();
+ }
+
+ @Override
+ public void onLauncherInfoChanged() {
+ doRebuild();
+ }
+
+ @Override
+ public void onLoadEntriesCompleted() {
+ doRebuild();
+ }
+ }
+
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppActionPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppActionPreferenceController.java
new file mode 100644
index 0000000..5e51a32
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppActionPreferenceController.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.apps;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+/**
+ * Base controller class to handle app action preference.
+ */
+public abstract class AppActionPreferenceController extends RestrictedPreferenceController {
+ ApplicationsState.AppEntry mAppEntry;
+ public static final String INTENT_CONFIRMATION = "android.settings.ui.CONFIRM";
+ public static final String ARG_PACKAGE_NAME = "packageName";
+ public static final String EXTRA_GUIDANCE_TITLE = "guidancetitle";
+ public static final String EXTRA_GUIDANCE_SUBTITLE = "guidanceSubtitle";
+ public static final String EXTRA_GUIDANCE_BREADCRUMB = "guidanceBreadcrumb";
+ public static final String EXTRA_GUIDANCE_ICON = "guidanceIcon";
+
+ public AppActionPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier, ApplicationsState.AppEntry appEntry,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mAppEntry = appEntry;
+ }
+
+ /**
+ * Set entry and refresh pref.
+ *
+ * @param entry entry
+ */
+ public void setEntry(@NonNull ApplicationsState.AppEntry entry) {
+ mAppEntry = entry;
+ update();
+ }
+
+ protected String getAppName() {
+ if (mAppEntry == null) {
+ return null;
+ }
+ mAppEntry.ensureLabel(mContext);
+ return mAppEntry.label;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppManagementState.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppManagementState.java
new file mode 100644
index 0000000..d806113
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppManagementState.java
@@ -0,0 +1,536 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.apps;
+
+import static android.content.pm.ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA;
+import static android.content.pm.ApplicationInfo.FLAG_SYSTEM;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_APP_MANAGEMENT;
+import static com.android.tv.settings.library.device.apps.EnableDisablePreferenceController.KEY_ENABLE_DISABLE;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.IPackageDataObserver;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.hardware.usb.IUsbManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** State to handle app management settings screen. */
+public class AppManagementState extends PreferenceControllerState {
+ private static final String TAG = "AppManagementState";
+ // Intent action implemented by apps that have open source licenses to display under settings
+ private static final String VIEW_LICENSES_ACTION = "com.android.tv.settings.VIEW_LICENSES";
+ private static final String ARG_PACKAGE_NAME = "packageName";
+
+ private static final String KEY_VERSION = "version";
+ private static final String KEY_OPEN = "open";
+ private static final String KEY_LICENSES = "licenses";
+ private static final String KEY_PERMISSIONS = "permissions";
+
+ // Result code identifiers
+ static final int REQUEST_UNINSTALL = 1;
+ static final int REQUEST_MANAGE_SPACE = 2;
+ static final int REQUEST_UNINSTALL_UPDATES = 3;
+ static final int REQUEST_CLEAR_DATA = 4;
+ static final int REQUEST_CLEAR_CACHE = 5;
+ static final int REQUEST_CLEAR_DEFAULTS = 6;
+
+ private PackageManager mPackageManager;
+ private String mPackageName;
+ private ApplicationsState mApplicationsState;
+ private ApplicationsState.Session mSession;
+ private ApplicationsState.AppEntry mEntry;
+ private final ApplicationsState.Callbacks mCallbacks = new ApplicationsStateCallbacks();
+
+ private ForceStopPreferenceController mForceStopPreferenceController;
+ private UninstallPreferenceController mUninstallPreferenceController;
+ private EnableDisablePreferenceController mEnableDisablePreferenceController;
+ private AppStoragePreferenceController mAppStoragePreferenceController;
+ private ClearDataPreferenceController mClearDataPreferenceController;
+ private ClearCachePreferenceController mClearCachePreferenceController;
+ private ClearDefaultsPreferenceController mClearDefaultsPreferenceController;
+ private NotificationsPreferenceController mNotificationsPreferenceController;
+ private final Handler mHandler = new Handler();
+
+ public AppManagementState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ public static void prepareArgs(Bundle args, String packageName) {
+ args.putString(ARG_PACKAGE_NAME, packageName);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ mPackageName = extras.getString(ARG_PACKAGE_NAME);
+
+ Activity activity = (Activity) mContext;
+ mPackageManager = activity.getPackageManager();
+ mApplicationsState = ApplicationsState.getInstance(activity.getApplication());
+ mSession = mApplicationsState.newSession(mCallbacks, getLifecycle());
+ mEntry = mApplicationsState.getEntry(mPackageName, UserHandle.myUserId());
+ super.onCreate(extras);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ if (mEntry == null) {
+ Log.w(TAG, "App not found, trying to bail out");
+ mUIUpdateCallback.notifyNavigateBackward(getStateIdentifier());
+ }
+
+ if (mClearDefaultsPreferenceController != null) {
+ mClearDefaultsPreferenceController.updateAndNotify();
+ }
+ if (mEnableDisablePreferenceController != null) {
+ mEnableDisablePreferenceController.updateAndNotify();
+ }
+ updatePrefs();
+ }
+
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_APP_MANAGEMENT;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ mForceStopPreferenceController = new ForceStopPreferenceController(
+ mContext, mUIUpdateCallback, getStateIdentifier(), mEntry,
+ mPreferenceCompatManager);
+ mUninstallPreferenceController = new UninstallPreferenceController(
+ mContext, mUIUpdateCallback, getStateIdentifier(), mEntry,
+ mPreferenceCompatManager);
+ mEnableDisablePreferenceController = new EnableDisablePreferenceController(
+ mContext, mUIUpdateCallback, getStateIdentifier(), mEntry,
+ mPreferenceCompatManager);
+ mAppStoragePreferenceController = new AppStoragePreferenceController(
+ mContext, mUIUpdateCallback, getStateIdentifier(), mEntry,
+ mPreferenceCompatManager);
+ mClearDataPreferenceController = new ClearDataPreferenceController(
+ mContext, mUIUpdateCallback, getStateIdentifier(), mEntry,
+ mPreferenceCompatManager);
+ mClearCachePreferenceController = new ClearCachePreferenceController(
+ mContext, mUIUpdateCallback, getStateIdentifier(), mEntry,
+ mPreferenceCompatManager);
+ mClearDefaultsPreferenceController = new ClearDefaultsPreferenceController(
+ mContext, mUIUpdateCallback, getStateIdentifier(), mEntry,
+ mPreferenceCompatManager);
+ mNotificationsPreferenceController = new NotificationsPreferenceController(
+ mContext, mUIUpdateCallback, getStateIdentifier(), mEntry,
+ mPreferenceCompatManager);
+ List<AbstractPreferenceController> list = new ArrayList<>();
+ list.add(mForceStopPreferenceController);
+ list.add(mUninstallPreferenceController);
+ list.add(mEnableDisablePreferenceController);
+ list.add(mAppStoragePreferenceController);
+ list.add(mClearCachePreferenceController);
+ list.add(mClearDataPreferenceController);
+ list.add(mClearDefaultsPreferenceController);
+ list.add(mNotificationsPreferenceController);
+ return list;
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ if (KEY_ENABLE_DISABLE.equals(key[0])) {
+ // disable the preference to prevent double clicking
+ mEnableDisablePreferenceController.setEnabled(false);
+ }
+ try {
+ return super.onPreferenceTreeClick(key, status);
+ } catch (ActivityNotFoundException e) {
+ Log.e(TAG, "Could not find activity to launch", e);
+ Toast.makeText(mContext,
+ ResourcesUtil.getString(
+ mContext, "device_apps_app_management_not_available"),
+ Toast.LENGTH_SHORT).show();
+ }
+ return false;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (mEntry == null) {
+ return;
+ }
+ switch (requestCode) {
+ case REQUEST_UNINSTALL:
+ final int deleteResult = data != null
+ ? data.getIntExtra(Intent.EXTRA_INSTALL_RESULT, 0) : 0;
+ if (deleteResult == PackageManager.DELETE_SUCCEEDED) {
+ final int userId = UserHandle.getUserId(mEntry.info.uid);
+ mApplicationsState.removePackage(mPackageName, userId);
+ mUIUpdateCallback.notifyNavigateBackward(getStateIdentifier());
+ } else {
+ Log.e(TAG, "Uninstall failed with result " + deleteResult);
+ }
+ break;
+ case REQUEST_MANAGE_SPACE:
+ mClearDataPreferenceController.setClearingData(false);
+ if (resultCode == Activity.RESULT_OK) {
+ final int userId = UserHandle.getUserId(mEntry.info.uid);
+ mApplicationsState.requestSize(mPackageName, userId);
+ } else {
+ Log.w(TAG, "Failed to clear data!");
+ }
+ break;
+ case REQUEST_UNINSTALL_UPDATES:
+ mUninstallPreferenceController.updateAndNotify();
+ break;
+ case REQUEST_CLEAR_DATA:
+ if (resultCode == Activity.RESULT_OK) {
+ clearData();
+ }
+ break;
+ case REQUEST_CLEAR_CACHE:
+ if (resultCode == Activity.RESULT_OK) {
+ clearCache();
+ }
+ break;
+ case REQUEST_CLEAR_DEFAULTS:
+ if (resultCode == Activity.RESULT_OK) {
+ clearDefaults();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ private void clearDefaults() {
+ PackageManager packageManager = mContext.getPackageManager();
+ packageManager.clearPackagePreferredActivities(mPackageName);
+ try {
+ final IBinder usbBinder = ServiceManager.getService(Context.USB_SERVICE);
+ IUsbManager.Stub.asInterface(usbBinder)
+ .clearDefaults(mPackageName, UserHandle.myUserId());
+ } catch (RemoteException e) {
+ // Ignore
+ }
+ }
+
+ private void clearData() {
+ if (!clearDataAllowed()) {
+ Log.e(TAG, "Attempt to clear data failed. Clear data is disabled for " + mPackageName);
+ return;
+ }
+
+ mClearDataPreferenceController.setClearingData(true);
+ String spaceManagementActivityName = mEntry.info.manageSpaceActivityName;
+ if (spaceManagementActivityName != null) {
+ if (!ActivityManager.isUserAMonkey()) {
+ Intent intent = new Intent(Intent.ACTION_DEFAULT);
+ intent.setClassName(mEntry.info.packageName, spaceManagementActivityName);
+ ((Activity) mContext).startActivityForResult(intent,
+ ManagerUtil.calculateCompoundCode(getStateIdentifier(),
+ REQUEST_MANAGE_SPACE));
+ }
+ } else {
+ // Disabling clear cache preference while clearing data is in progress. See b/77815256
+ // for details.
+ mClearCachePreferenceController.setClearingCache(true);
+ ActivityManager am = mContext.getSystemService(ActivityManager.class);
+ boolean success = am.clearApplicationUserData(
+ mEntry.info.packageName, new IPackageDataObserver.Stub() {
+ public void onRemoveCompleted(
+ final String packageName, final boolean succeeded) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mClearDataPreferenceController.setClearingData(false);
+ mClearCachePreferenceController.setClearingCache(false);
+ dataCleared(succeeded);
+ }
+ });
+ }
+ });
+ if (!success) {
+ mClearDataPreferenceController.setClearingData(false);
+ dataCleared(false);
+ }
+ }
+ mClearDataPreferenceController.updateAndNotify();
+ }
+
+ private void dataCleared(boolean succeeded) {
+ if (succeeded) {
+ final int userId = UserHandle.getUserId(mEntry.info.uid);
+ mApplicationsState.requestSize(mPackageName, userId);
+ } else {
+ Log.w(TAG, "Failed to clear data!");
+ mClearDataPreferenceController.update();
+ }
+ }
+
+
+ private void clearCache() {
+ mClearCachePreferenceController.setClearingCache(true);
+ mPackageManager.deleteApplicationCacheFiles(mEntry.info.packageName,
+ new IPackageDataObserver.Stub() {
+ public void onRemoveCompleted(final String packageName,
+ final boolean succeeded) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mClearCachePreferenceController.setClearingCache(false);
+ cacheCleared(succeeded);
+ }
+ });
+ }
+ });
+ mClearCachePreferenceController.update();
+ }
+
+ private void cacheCleared(boolean succeeded) {
+ if (succeeded) {
+ final int userId = UserHandle.getUserId(mEntry.info.uid);
+ mApplicationsState.requestSize(mPackageName, userId);
+ } else {
+ Log.w(TAG, "Failed to clear cache!");
+ mClearCachePreferenceController.update();
+ }
+ }
+
+ private void updatePrefs() {
+ // Version
+ PreferenceCompat versionPreference = mPreferenceCompatManager
+ .getOrCreatePrefCompat(KEY_VERSION);
+ if (versionPreference == null) {
+ versionPreference.setSelectable(false);
+ }
+ versionPreference.setTitle(
+ ResourcesUtil.getString(mContext, "device_apps_app_management_version",
+ mEntry.getVersion(mContext)));
+ versionPreference.setSummary(mPackageName);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), versionPreference);
+
+ // Open
+ PreferenceCompat openPreference = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_OPEN);
+ Intent appLaunchIntent =
+ mPackageManager.getLeanbackLaunchIntentForPackage(mEntry.info.packageName);
+ if (appLaunchIntent == null) {
+ appLaunchIntent = mPackageManager.getLaunchIntentForPackage(mEntry.info.packageName);
+ }
+ if (appLaunchIntent != null) {
+ openPreference.setIntent(appLaunchIntent);
+ openPreference.setTitle(
+ ResourcesUtil.getString(mContext, "device_apps_app_management_open"));
+ openPreference.setVisible(true);
+ } else {
+ openPreference.setVisible(false);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), openPreference);
+
+ // Force stop
+ if (mForceStopPreferenceController != null) {
+ mForceStopPreferenceController.setEntry(mEntry);
+ }
+
+ // Uninstall
+ if (mUninstallPreferenceController != null) {
+ mUninstallPreferenceController.setEntry(mEntry);
+ }
+
+ // Disable/Enable
+ if (mEnableDisablePreferenceController != null) {
+ mEnableDisablePreferenceController.setEntry(mEntry);
+ mEnableDisablePreferenceController.setEnabled(true);
+ }
+
+ // Storage used
+ if (mAppStoragePreferenceController != null) {
+ mAppStoragePreferenceController.setEntry(mEntry);
+ }
+
+ // Clear data
+ if (clearDataAllowed() && mClearDataPreferenceController != null) {
+ mClearDataPreferenceController.setEntry(mEntry);
+ }
+
+ // Clear cache
+ if (mClearCachePreferenceController != null) {
+ mClearCachePreferenceController.setEntry(mEntry);
+ }
+
+ // Clear defaults
+ if (mClearDefaultsPreferenceController != null) {
+ mClearDefaultsPreferenceController.setEntry(mEntry);
+ }
+
+ // Notifications
+ if (mNotificationsPreferenceController == null) {
+ mNotificationsPreferenceController.setEntry(mEntry);
+ }
+
+ // Open Source Licenses
+ PreferenceCompat licensesPreference = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_LICENSES);
+ // Check if app has open source licenses to display
+ Intent licenseIntent = new Intent(VIEW_LICENSES_ACTION);
+ licenseIntent.setPackage(mEntry.info.packageName);
+ ResolveInfo resolveInfo = resolveIntent(licenseIntent);
+ if (resolveInfo == null) {
+ licensesPreference.setVisible(false);
+ } else {
+ Intent intent = new Intent(licenseIntent);
+ intent.setClassName(resolveInfo.activityInfo.packageName,
+ resolveInfo.activityInfo.name);
+ licensesPreference.setIntent(intent);
+ licensesPreference.setTitle(ResourcesUtil.getString(mContext,
+ "device_apps_app_management_licenses"));
+ licensesPreference.setVisible(true);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), licensesPreference);
+
+ // Permissions
+ PreferenceCompat permissionsPreference = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_PERMISSIONS);
+ permissionsPreference.setTitle(ResourcesUtil.getString(mContext,
+ "device_apps_app_management_permissions"));
+ permissionsPreference.setIntent(new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS)
+ .putExtra(Intent.EXTRA_PACKAGE_NAME, mPackageName));
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), permissionsPreference);
+ }
+
+ private class ApplicationsStateCallbacks implements ApplicationsState.Callbacks {
+
+ @Override
+ public void onRunningStateChanged(boolean running) {
+ if (mForceStopPreferenceController != null) {
+ mForceStopPreferenceController.update();
+ }
+ }
+
+ @Override
+ public void onPackageListChanged() {
+ if (mEntry == null || mEntry.info == null) {
+ return;
+ }
+ final int userId = UserHandle.getUserId(mEntry.info.uid);
+ mEntry = mApplicationsState.getEntry(mPackageName, userId);
+ if (mEntry == null) {
+ mUIUpdateCallback.notifyNavigateBackward(getStateIdentifier());
+ }
+ updatePrefs();
+ }
+
+ @Override
+ public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
+ }
+
+ @Override
+ public void onPackageIconChanged() {
+ }
+
+ @Override
+ public void onPackageSizeChanged(String packageName) {
+ if (mAppStoragePreferenceController == null) {
+ // Nothing to do here.
+ return;
+ }
+ mAppStoragePreferenceController.updateAndNotify();
+ if (mClearCachePreferenceController != null) {
+ mClearCachePreferenceController.updateAndNotify();
+ }
+
+ if (mClearDataPreferenceController != null) {
+ mClearDataPreferenceController.updateAndNotify();
+ }
+ }
+
+ @Override
+ public void onAllSizesComputed() {
+ if (mAppStoragePreferenceController == null) {
+ // Nothing to do here.
+ return;
+ }
+ mAppStoragePreferenceController.updateAndNotify();
+ if (mClearCachePreferenceController != null) {
+ mClearCachePreferenceController.updateAndNotify();
+ }
+
+ if (mClearDataPreferenceController != null) {
+ mClearDataPreferenceController.updateAndNotify();
+ }
+ }
+
+ @Override
+ public void onLauncherInfoChanged() {
+ updatePrefs();
+ }
+
+ @Override
+ public void onLoadEntriesCompleted() {
+ mEntry = mApplicationsState.getEntry(mPackageName, UserHandle.myUserId());
+ updatePrefs();
+ if (mAppStoragePreferenceController == null) {
+ // Nothing to do here.
+ return;
+ }
+ mAppStoragePreferenceController.updateAndNotify();
+ if (mClearCachePreferenceController != null) {
+ mClearCachePreferenceController.updateAndNotify();
+ }
+
+ if (mClearDataPreferenceController != null) {
+ mClearDataPreferenceController.updateAndNotify();
+ }
+ }
+ }
+
+ private ResolveInfo resolveIntent(Intent intent) {
+ List<ResolveInfo> resolveInfos = mPackageManager.queryIntentActivities(intent, 0);
+ return (resolveInfos == null || resolveInfos.size() <= 0) ? null : resolveInfos.get(0);
+ }
+
+ /**
+ * Clearing data can only be disabled for system apps. For all non-system apps it is enabled.
+ * System apps disable it explicitly via the android:allowClearUserData tag.
+ **/
+ private boolean clearDataAllowed() {
+ boolean sysApp = (mEntry.info.flags & FLAG_SYSTEM) == FLAG_SYSTEM;
+ boolean allowClearData =
+ (mEntry.info.flags & FLAG_ALLOW_CLEAR_USER_DATA) == FLAG_ALLOW_CLEAR_USER_DATA;
+ return !sysApp || allowClearData;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppStoragePreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppStoragePreferenceController.java
new file mode 100644
index 0000000..33745a1
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppStoragePreferenceController.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.tv.settings.library.device.apps;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+import android.text.TextUtils;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.List;
+
+/** Preference controller to handle app storage preference. */
+public class AppStoragePreferenceController extends AppActionPreferenceController {
+ private static final String KEY_APP_STORAGE = "appStorage";
+ private final PackageManager mPackageManager;
+ private final StorageManager mStorageManager;
+
+ public AppStoragePreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ ApplicationsState.AppEntry appEntry, PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, appEntry, preferenceCompatManager);
+ mPackageManager = context.getPackageManager();
+ mStorageManager = context.getSystemService(StorageManager.class);
+ }
+
+ @Override
+ public void update() {
+ if (mAppEntry == null) {
+ return;
+ }
+ final ApplicationInfo applicationInfo = mAppEntry.info;
+ final VolumeInfo volumeInfo = mPackageManager.getPackageCurrentVolume(applicationInfo);
+ final List<VolumeInfo> candidates =
+ mPackageManager.getPackageCandidateVolumes(applicationInfo);
+
+ mPreferenceCompat.setTitle(ResourcesUtil.getString(mContext,
+ "device_apps_app_management_storage_used"));
+
+ final String volumeDesc = mStorageManager.getBestVolumeDescription(volumeInfo);
+ final String size = mAppEntry.sizeStr;
+ if (TextUtils.isEmpty(size)) {
+ mPreferenceCompat.setSummary(ResourcesUtil.getString(mContext,
+ "storage_calculating_size"));
+ } else {
+ mPreferenceCompat.setSummary(ResourcesUtil.getString(
+ mContext,
+ "device_apps_app_management_storage_used_desc",
+ mAppEntry.sizeStr, volumeDesc));
+ }
+ super.update();
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return null;
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_APP_STORAGE};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppUtils.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppUtils.java
new file mode 100644
index 0000000..c1e5247
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppUtils.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.tv.settings.library.device.apps;
+
+import android.app.Application;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.hardware.usb.IUsbManager;
+import android.net.Uri;
+import android.os.Environment;
+import android.os.RemoteException;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AppUtils {
+ private static final String TAG = "AppUtils";
+
+ /**
+ * This should normally only be set in robolectric tests, to avoid getting a method not found
+ * exception when calling the isInstantApp method of the ApplicationInfo class, because
+ * robolectric does not yet have an implementation of it.
+ */
+ private static final InstantAppDataProvider sInstantAppDataProvider = null;
+
+ private static final Intent sBrowserIntent;
+
+ static {
+ sBrowserIntent = new Intent()
+ .setAction(Intent.ACTION_VIEW)
+ .addCategory(Intent.CATEGORY_BROWSABLE)
+ .setData(Uri.parse("http:"));
+ }
+
+ public static boolean hasUsbDefaults(IUsbManager usbManager, String packageName) {
+ try {
+ if (usbManager != null) {
+ return usbManager.hasDefaults(packageName, UserHandle.myUserId());
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "mUsbManager.hasDefaults", e);
+ }
+ return false;
+ }
+
+ public static CharSequence getLaunchByDefaultSummary(ApplicationsState.AppEntry appEntry,
+ IUsbManager usbManager, PackageManager pm, Context context) {
+ String packageName = appEntry.info.packageName;
+ boolean hasPreferred = hasPreferredActivities(pm, packageName)
+ || hasUsbDefaults(usbManager, packageName);
+ int status = pm.getIntentVerificationStatusAsUser(packageName, UserHandle.myUserId());
+ // consider a visible current link-handling state to be any explicitly designated behavior
+ boolean hasDomainURLsPreference =
+ status != PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
+ return ResourcesUtil.getString(context, hasPreferred || hasDomainURLsPreference
+ ? "launch_defaults_some"
+ : "launch_defaults_none");
+ }
+
+ public static boolean hasPreferredActivities(PackageManager pm, String packageName) {
+ // Get list of preferred activities
+ List<ComponentName> prefActList = new ArrayList<>();
+ // Intent list cannot be null. so pass empty list
+ List<IntentFilter> intentList = new ArrayList<>();
+ pm.getPreferredActivities(intentList, prefActList, packageName);
+ Log.d(TAG, "Have " + prefActList.size() + " number of activities in preferred list");
+ return prefActList.size() > 0;
+ }
+
+ /**
+ * Returns a boolean indicating whether the given package should be considered an instant app
+ */
+ public static boolean isInstant(ApplicationInfo info) {
+ if (sInstantAppDataProvider != null) {
+ if (sInstantAppDataProvider.isInstantApp(info)) {
+ return true;
+ }
+ } else if (info.isInstantApp()) {
+ return true;
+ }
+
+ // For debugging/testing, we support setting the following property to a comma-separated
+ // list of search terms (typically, but not necessarily, full package names) to match
+ // against the package names of the app.
+ String propVal = SystemProperties.get("settingsdebug.instant.packages");
+ if (propVal != null && !propVal.isEmpty() && info.packageName != null) {
+ String[] searchTerms = propVal.split(",");
+ if (searchTerms != null) {
+ for (String term : searchTerms) {
+ if (info.packageName.contains(term)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns a boolean indicating whether the given package is a hidden system module
+ */
+ public static boolean isHiddenSystemModule(Context context, String packageName) {
+ return ApplicationsState.getInstance((Application) context.getApplicationContext())
+ .isHiddenModule(packageName);
+ }
+
+ /**
+ * Returns a boolean indicating whether a given package is a system module.
+ */
+ public static boolean isSystemModule(Context context, String packageName) {
+ return ApplicationsState.getInstance((Application) context.getApplicationContext())
+ .isSystemModule(packageName);
+ }
+
+ /**
+ * Returns a boolean indicating whether a given package is a mainline module.
+ */
+ public static boolean isMainlineModule(PackageManager pm, String packageName) {
+ // Check if the package is listed among the system modules.
+ try {
+ pm.getModuleInfo(packageName, 0 /* flags */);
+ return true;
+ } catch (PackageManager.NameNotFoundException e) {
+ //pass
+ }
+
+ try {
+ final PackageInfo pkg = pm.getPackageInfo(packageName, 0 /* flags */);
+ // Check if the package is contained in an APEX. There is no public API to properly
+ // check whether a given APK package comes from an APEX registered as module.
+ // Therefore we conservatively assume that any package scanned from an /apex path is
+ // a system package.
+ return pkg.applicationInfo.sourceDir.startsWith(
+ Environment.getApexDirectory().getAbsolutePath());
+ } catch (PackageManager.NameNotFoundException e) {
+ return false;
+ }
+ }
+
+ /**
+ * Returns a boolean indicating whether a given package is a browser app.
+ *
+ * An app is a "browser" if it has an activity resolution that wound up
+ * marked with the 'handleAllWebDataURI' flag.
+ */
+ public static boolean isBrowserApp(Context context, String packageName, int userId) {
+ sBrowserIntent.setPackage(packageName);
+ final List<ResolveInfo> list = context.getPackageManager().queryIntentActivitiesAsUser(
+ sBrowserIntent, PackageManager.MATCH_ALL, userId);
+ for (ResolveInfo info : list) {
+ if (info.activityInfo != null && info.handleAllWebDataURI) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns a boolean indicating whether a given package is a default browser.
+ *
+ * @param packageName a given package.
+ * @return true if the given package is default browser.
+ */
+ public static boolean isDefaultBrowser(Context context, String packageName) {
+ final String defaultBrowserPackage =
+ context.getPackageManager().getDefaultBrowserPackageNameAsUser(
+ UserHandle.myUserId());
+ return TextUtils.equals(packageName, defaultBrowserPackage);
+ }
+}
+
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/ApplicationsState.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/ApplicationsState.java
new file mode 100644
index 0000000..762167e
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/ApplicationsState.java
@@ -0,0 +1,2118 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.apps;
+
+import android.annotation.IntDef;
+import android.app.ActivityManager;
+import android.app.AppGlobals;
+import android.app.Application;
+import android.app.usage.StorageStats;
+import android.app.usage.StorageStatsManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
+import android.content.pm.IPackageStatsObserver;
+import android.content.pm.ModuleInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.PackageStats;
+import android.content.pm.ParceledListSlice;
+import android.content.pm.ResolveInfo;
+import android.content.pm.UserInfo;
+import android.graphics.drawable.Drawable;
+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.RemoteException;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.text.format.Formatter;
+import android.util.Log;
+import android.util.SparseArray;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.ArrayUtils;
+import com.android.tv.settings.library.util.LibUtils;
+import com.android.tv.settings.library.util.ThreadUtils;
+import com.android.tv.settings.library.util.lifecycle.Lifecycle;
+import com.android.tv.settings.library.util.lifecycle.LifecycleObserver;
+import com.android.tv.settings.library.util.lifecycle.events.OnDestroy;
+import com.android.tv.settings.library.util.lifecycle.events.OnPause;
+import com.android.tv.settings.library.util.lifecycle.events.OnResume;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.ref.WeakReference;
+import java.text.Collator;
+import java.text.Normalizer;
+import java.text.Normalizer.Form;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+import java.util.regex.Pattern;
+
+/**
+ * Keeps track of information about all installed applications, lazy-loading
+ * as needed.
+ */
+public class ApplicationsState {
+ private static final String TAG = "ApplicationsState";
+
+ public static final int SIZE_UNKNOWN = -1;
+ public static final int SIZE_INVALID = -2;
+
+ // TODO(b/187728742): Migrate to use one flag.
+ private static final boolean DEBUG = false;
+ private static final boolean DEBUG_LOCKING = false;
+ private static final Object sLock = new Object();
+ private static final Pattern REMOVE_DIACRITICALS_PATTERN
+ = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
+
+ @VisibleForTesting
+ static ApplicationsState sInstance;
+
+ public static ApplicationsState getInstance(Application app) {
+ return getInstance(app, AppGlobals.getPackageManager());
+ }
+
+ @VisibleForTesting
+ static ApplicationsState getInstance(Application app, IPackageManager iPackageManager) {
+ synchronized (sLock) {
+ if (sInstance == null) {
+ sInstance = new ApplicationsState(app, iPackageManager);
+ }
+ return sInstance;
+ }
+ }
+
+ final Context mContext;
+ final PackageManager mPm;
+ final IPackageManager mIpm;
+ final UserManager mUm;
+ final StorageStatsManager mStats;
+ final int mAdminRetrieveFlags;
+ final int mRetrieveFlags;
+ ApplicationsState.PackageIntentReceiver
+ mPackageIntentReceiver;
+
+ boolean mResumed;
+ boolean mHaveDisabledApps;
+ boolean mHaveInstantApps;
+
+ // Information about all applications. Synchronize on mEntriesMap
+ // to protect access to these.
+ final ArrayList<ApplicationsState.Session> mSessions = new ArrayList<>();
+ final ArrayList<ApplicationsState.Session> mRebuildingSessions = new ArrayList<>();
+ private InterestingConfigChanges mInterestingConfigChanges = new InterestingConfigChanges();
+ // Map: userid => (Map: package name => AppEntry)
+ final SparseArray<HashMap<String, ApplicationsState.AppEntry>> mEntriesMap =
+ new SparseArray<>();
+ final ArrayList<ApplicationsState.AppEntry> mAppEntries = new ArrayList<>();
+ List<ApplicationInfo> mApplications = new ArrayList<>();
+ long mCurId = 1;
+ UUID mCurComputingSizeUuid;
+ String mCurComputingSizePkg;
+ int mCurComputingSizeUserId;
+ boolean mSessionsChanged;
+ // Maps all installed modules on the system to whether they're hidden or not.
+ final HashMap<String, Boolean> mSystemModules = new HashMap<>();
+
+ // Temporary for dispatching session callbacks. Only touched by main thread.
+ final ArrayList<WeakReference<ApplicationsState.Session>> mActiveSessions = new ArrayList<>();
+
+ final HandlerThread mThread;
+ final ApplicationsState.BackgroundHandler
+ mBackgroundHandler;
+ final ApplicationsState.MainHandler
+ mMainHandler = new ApplicationsState.MainHandler(Looper.getMainLooper());
+
+ /** Requests that the home app is loaded. */
+ public static final int FLAG_SESSION_REQUEST_HOME_APP = 1 << 0;
+
+ /** Requests that icons are loaded. */
+ public static final int FLAG_SESSION_REQUEST_ICONS = 1 << 1;
+
+ /** Requests that sizes are loaded. */
+ public static final int FLAG_SESSION_REQUEST_SIZES = 1 << 2;
+
+ /** Requests that launcher intents are resolved. */
+ public static final int FLAG_SESSION_REQUEST_LAUNCHER = 1 << 3;
+
+ /** Requests that leanback launcher intents are resolved. */
+ public static final int FLAG_SESSION_REQUEST_LEANBACK_LAUNCHER = 1 << 4;
+
+ /**
+ * Flags to configure the session to request various types of info.
+ */
+ @IntDef( value = {
+ FLAG_SESSION_REQUEST_HOME_APP,
+ FLAG_SESSION_REQUEST_ICONS,
+ FLAG_SESSION_REQUEST_SIZES,
+ FLAG_SESSION_REQUEST_LAUNCHER,
+ FLAG_SESSION_REQUEST_LEANBACK_LAUNCHER
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface SessionFlags {
+ }
+
+ @VisibleForTesting
+ void setInterestingConfigChanges(InterestingConfigChanges interestingConfigChanges) {
+ mInterestingConfigChanges = interestingConfigChanges;
+ }
+
+ @ApplicationsState.SessionFlags
+ public static final int DEFAULT_SESSION_FLAGS =
+ FLAG_SESSION_REQUEST_HOME_APP | FLAG_SESSION_REQUEST_ICONS |
+ FLAG_SESSION_REQUEST_SIZES | FLAG_SESSION_REQUEST_LAUNCHER;
+
+ private ApplicationsState(Application app, IPackageManager iPackageManager) {
+ mContext = app;
+ mPm = mContext.getPackageManager();
+ mIpm = iPackageManager;
+ mUm = mContext.getSystemService(UserManager.class);
+ mStats = mContext.getSystemService(StorageStatsManager.class);
+ for (int userId : mUm.getProfileIdsWithDisabled(UserHandle.myUserId())) {
+ mEntriesMap.put(userId, new HashMap<>());
+ }
+
+ mThread = new HandlerThread("ApplicationsState.Loader");
+ mThread.start();
+ mBackgroundHandler = new ApplicationsState.BackgroundHandler(mThread.getLooper());
+
+ // Only the owner can see all apps.
+ mAdminRetrieveFlags = PackageManager.MATCH_ANY_USER |
+ PackageManager.MATCH_DISABLED_COMPONENTS |
+ PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
+ mRetrieveFlags = PackageManager.MATCH_DISABLED_COMPONENTS |
+ PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS;
+
+ final List<ModuleInfo> moduleInfos = mPm.getInstalledModules(0 /* flags */);
+ for (ModuleInfo info : moduleInfos) {
+ mSystemModules.put(info.getPackageName(), info.isHidden());
+ }
+
+ /**
+ * This is a trick to prevent the foreground thread from being delayed.
+ * The problem is that Dalvik monitors are initially spin locks, to keep
+ * them lightweight. This leads to unfair contention -- Even though the
+ * background thread only holds the lock for a short amount of time, if
+ * it keeps running and locking again it can prevent the main thread from
+ * acquiring its lock for a long time... sometimes even > 5 seconds
+ * (leading to an ANR).
+ *
+ * Dalvik will promote a monitor to a "real" lock if it detects enough
+ * contention on it. It doesn't figure this out fast enough for us
+ * here, though, so this little trick will force it to turn into a real
+ * lock immediately.
+ */
+ synchronized (mEntriesMap) {
+ try {
+ mEntriesMap.wait(1);
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+
+ public Looper getBackgroundLooper() {
+ return mThread.getLooper();
+ }
+
+ public ApplicationsState.Session newSession(
+ ApplicationsState.Callbacks callbacks) {
+ return newSession(callbacks, null);
+ }
+
+ public ApplicationsState.Session newSession(
+ ApplicationsState.Callbacks callbacks, Lifecycle lifecycle) {
+ ApplicationsState.Session
+ s = new ApplicationsState.Session(callbacks, lifecycle);
+ synchronized (mEntriesMap) {
+ mSessions.add(s);
+ }
+ return s;
+ }
+
+ void doResumeIfNeededLocked() {
+ if (mResumed) {
+ return;
+ }
+ mResumed = true;
+ if (mPackageIntentReceiver == null) {
+ mPackageIntentReceiver = new ApplicationsState.PackageIntentReceiver();
+ mPackageIntentReceiver.registerReceiver();
+ }
+
+ final List<ApplicationInfo> prevApplications = mApplications;
+ mApplications = new ArrayList<>();
+ for (UserInfo user : mUm.getProfiles(UserHandle.myUserId())) {
+ try {
+ // If this user is new, it needs a map created.
+ if (mEntriesMap.indexOfKey(user.id) < 0) {
+ mEntriesMap.put(user.id, new HashMap<>());
+ }
+ @SuppressWarnings("unchecked")
+ ParceledListSlice<ApplicationInfo> list =
+ mIpm.getInstalledApplications(
+ user.isAdmin() ? mAdminRetrieveFlags : mRetrieveFlags,
+ user.id);
+ mApplications.addAll(list.getList());
+ } catch (Exception e) {
+ Log.e(TAG, "Error during doResumeIfNeededLocked", e);
+ }
+ }
+
+ if (mInterestingConfigChanges.applyNewConfig(mContext.getResources())) {
+ // If an interesting part of the configuration has changed, we
+ // should completely reload the app entries.
+ clearEntries();
+ } else {
+ for (int i = 0; i < mAppEntries.size(); i++) {
+ mAppEntries.get(i).sizeStale = true;
+ }
+ }
+
+ mHaveDisabledApps = false;
+ mHaveInstantApps = false;
+ for (int i = 0; i < mApplications.size(); i++) {
+ final ApplicationInfo info = mApplications.get(i);
+ // Need to trim out any applications that are disabled by
+ // something different than the user.
+ if (!info.enabled) {
+ if (info.enabledSetting != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
+ mApplications.remove(i);
+ i--;
+ continue;
+ }
+ mHaveDisabledApps = true;
+ }
+ if (isHiddenModule(info.packageName)) {
+ mApplications.remove(i--);
+ continue;
+ }
+ if (!mHaveInstantApps && AppUtils.isInstant(info)) {
+ mHaveInstantApps = true;
+ }
+
+ int userId = UserHandle.getUserId(info.uid);
+ final ApplicationsState.AppEntry entry = mEntriesMap.get(userId).get(info.packageName);
+ if (entry != null) {
+ entry.info = info;
+ }
+ }
+
+ if (anyAppIsRemoved(prevApplications, mApplications)) {
+ // some apps have been uninstalled.
+ clearEntries();
+ }
+ mCurComputingSizePkg = null;
+ if (!mBackgroundHandler.hasMessages(
+ ApplicationsState.BackgroundHandler.MSG_LOAD_ENTRIES)) {
+ mBackgroundHandler.sendEmptyMessage(
+ ApplicationsState.BackgroundHandler.MSG_LOAD_ENTRIES);
+ }
+ }
+
+ /* The original design is mAppEntries.size() > mApplications.size().
+ It's correct if there is only the owner user and only one app is removed.
+ Problem 1:
+ If there is a user profile, the size of mAppEntries < mApplications is normal because
+ the number of app entries on UI (mAppEntries) should be equal to the number of apps got
+ from PMS (mApplications).
+
+ owner only case:
+ mApplications: user 0: 191
+ mAppEntries : user 0: 191
+ total mAppEntries: 191, mApplications: 191
+ If an app is removed, cached mAppEntries: 191 , mApplications: 191 -> 190, it is detected
+ as the number of apps becomes less.
+
+ If there is a work profile, mAppEntries removes some apps that are not installed for the
+ owner user.
+
+ For example, in the following case, 6 apps are removed from mAppEntries for the owner.
+ mApplications: user 0: 197, user 10: 189 => total 386
+ mAppEntries : user 0: 191, user 10: 189 => total 380
+ If an app is removed, cached mAppEntries: 380 , mApplications: 386 -> 385, the size of
+ mAppEntries is still not larger than mApplications, then does not clear mAppEntries.
+
+ Problem 2:
+ If remove an app and add another app outside Settings (e.g. Play Store) and back to
+ Settings, the amount of apps are not changed, it causes the entries keep the removed app.
+
+ Another case, if adding more apps than removing apps (e.g. add 2 apps and remove 1 app),
+ the final number of apps (mApplications) is even increased,
+
+ Therefore, should not only count on number of apps to determine any app is removed.
+ Compare the change of applications instead.
+ */
+ private static boolean anyAppIsRemoved(List<ApplicationInfo> prevApplications,
+ List<ApplicationInfo> applications) {
+
+ // No cache
+ if (prevApplications.size() == 0) {
+ return false;
+ }
+
+ if (applications.size() < prevApplications.size()) {
+ return true;
+ }
+
+ // build package sets of all applications <userId, HashSet of packages>
+ final HashMap<String, HashSet<String>> packageMap = new HashMap<>();
+ for (ApplicationInfo application : applications) {
+ final String userId = String.valueOf(UserHandle.getUserId(application.uid));
+
+ HashSet<String> appPackages = packageMap.get(userId);
+ if (appPackages == null) {
+ appPackages = new HashSet<>();
+ packageMap.put(userId, appPackages);
+ }
+ if (hasFlag(application.flags, ApplicationInfo.FLAG_INSTALLED)) {
+ appPackages.add(application.packageName);
+ }
+ }
+
+ // detect any previous app is removed
+ for (ApplicationInfo prevApplication : prevApplications) {
+ if (!hasFlag(prevApplication.flags, ApplicationInfo.FLAG_INSTALLED)) {
+ continue;
+ }
+ final String userId = String.valueOf(UserHandle.getUserId(prevApplication.uid));
+
+ final HashSet<String> packagesSet = packageMap.get(userId);
+ if (packagesSet == null || !packagesSet.remove(prevApplication.packageName)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ @VisibleForTesting
+ void clearEntries() {
+ for (int i = 0; i < mEntriesMap.size(); i++) {
+ mEntriesMap.valueAt(i).clear();
+ }
+ mAppEntries.clear();
+ }
+
+ public boolean haveDisabledApps() {
+ return mHaveDisabledApps;
+ }
+
+ public boolean haveInstantApps() {
+ return mHaveInstantApps;
+ }
+
+ boolean isHiddenModule(String packageName) {
+ Boolean isHidden = mSystemModules.get(packageName);
+ if (isHidden == null) {
+ return false;
+ }
+
+ return isHidden;
+ }
+
+ boolean isSystemModule(String packageName) {
+ return mSystemModules.containsKey(packageName);
+ }
+
+ void doPauseIfNeededLocked() {
+ if (!mResumed) {
+ return;
+ }
+ for (int i = 0; i < mSessions.size(); i++) {
+ if (mSessions.get(i).mResumed) {
+ return;
+ }
+ }
+ doPauseLocked();
+ }
+
+ void doPauseLocked() {
+ mResumed = false;
+ if (mPackageIntentReceiver != null) {
+ mPackageIntentReceiver.unregisterReceiver();
+ mPackageIntentReceiver = null;
+ }
+ }
+
+ public ApplicationsState.AppEntry getEntry(String packageName, int userId) {
+ if (DEBUG_LOCKING) Log.v(TAG, "getEntry about to acquire lock...");
+ synchronized (mEntriesMap) {
+ ApplicationsState.AppEntry entry = mEntriesMap.get(userId).get(packageName);
+ if (entry == null) {
+ ApplicationInfo info = getAppInfoLocked(packageName, userId);
+ if (info == null) {
+ try {
+ info = mIpm.getApplicationInfo(packageName, 0, userId);
+ } catch (RemoteException e) {
+ Log.w(TAG, "getEntry couldn't reach PackageManager", e);
+ return null;
+ }
+ }
+ if (info != null) {
+ entry = getEntryLocked(info);
+ }
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "...getEntry releasing lock");
+ return entry;
+ }
+ }
+
+ private ApplicationInfo getAppInfoLocked(String pkg, int userId) {
+ for (int i = 0; i < mApplications.size(); i++) {
+ ApplicationInfo info = mApplications.get(i);
+ if (pkg.equals(info.packageName)
+ && userId == UserHandle.getUserId(info.uid)) {
+ return info;
+ }
+ }
+ return null;
+ }
+
+ public void ensureIcon(ApplicationsState.AppEntry entry) {
+ if (entry.icon != null) {
+ return;
+ }
+ synchronized (entry) {
+ entry.ensureIconLocked(mContext);
+ }
+ }
+
+ /**
+ * To generate and cache the label description.
+ *
+ * @param entry contain the entries of an app
+ */
+ public void ensureLabelDescription(
+ ApplicationsState.AppEntry entry) {
+ if (entry.labelDescription != null) {
+ return;
+ }
+ synchronized (entry) {
+ entry.ensureLabelDescriptionLocked(mContext);
+ }
+ }
+
+ public void requestSize(String packageName, int userId) {
+ if (DEBUG_LOCKING) Log.v(TAG, "requestSize about to acquire lock...");
+ synchronized (mEntriesMap) {
+ ApplicationsState.AppEntry entry = mEntriesMap.get(userId).get(packageName);
+ if (entry != null && hasFlag(entry.info.flags, ApplicationInfo.FLAG_INSTALLED)) {
+ mBackgroundHandler.post(
+ () -> {
+ try {
+ final StorageStats stats =
+ mStats.queryStatsForPackage(
+ entry.info.storageUuid,
+ packageName,
+ UserHandle.of(userId));
+ final long cacheQuota =
+ mStats.getCacheQuotaBytes(
+ entry.info.storageUuid.toString(), entry.info.uid);
+ final PackageStats legacy = new PackageStats(packageName, userId);
+ legacy.codeSize = stats.getAppBytes();
+ legacy.dataSize = stats.getDataBytes();
+ legacy.cacheSize = Math.min(stats.getCacheBytes(), cacheQuota);
+ try {
+ mBackgroundHandler.mStatsObserver.onGetStatsCompleted(
+ legacy, true);
+ } catch (RemoteException ignored) {
+ }
+ } catch (NameNotFoundException | IOException e) {
+ Log.w(TAG, "Failed to query stats: " + e);
+ try {
+ mBackgroundHandler.mStatsObserver.onGetStatsCompleted(
+ null, false);
+ } catch (RemoteException ignored) {
+ }
+ }
+ });
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "...requestSize releasing lock");
+ }
+ }
+
+ long sumCacheSizes() {
+ long sum = 0;
+ if (DEBUG_LOCKING) Log.v(TAG, "sumCacheSizes about to acquire lock...");
+ synchronized (mEntriesMap) {
+ if (DEBUG_LOCKING) Log.v(TAG, "-> sumCacheSizes now has lock");
+ for (int i = mAppEntries.size() - 1; i >= 0; i--) {
+ sum += mAppEntries.get(i).cacheSize;
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "...sumCacheSizes releasing lock");
+ }
+ return sum;
+ }
+
+ int indexOfApplicationInfoLocked(String pkgName, int userId) {
+ for (int i = mApplications.size() - 1; i >= 0; i--) {
+ ApplicationInfo appInfo = mApplications.get(i);
+ if (appInfo.packageName.equals(pkgName)
+ && UserHandle.getUserId(appInfo.uid) == userId) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ void addPackage(String pkgName, int userId) {
+ try {
+ synchronized (mEntriesMap) {
+ if (DEBUG_LOCKING) Log.v(TAG, "addPackage acquired lock");
+ if (DEBUG) Log.i(TAG, "Adding package " + pkgName);
+ if (!mResumed) {
+ // If we are not resumed, we will do a full query the
+ // next time we resume, so there is no reason to do work
+ // here.
+ if (DEBUG_LOCKING) Log.v(TAG, "addPackage release lock: not resumed");
+ return;
+ }
+ if (indexOfApplicationInfoLocked(pkgName, userId) >= 0) {
+ if (DEBUG) Log.i(TAG, "Package already exists!");
+ if (DEBUG_LOCKING) Log.v(TAG, "addPackage release lock: already exists");
+ return;
+ }
+ ApplicationInfo info = mIpm.getApplicationInfo(pkgName,
+ mUm.isUserAdmin(userId) ? mAdminRetrieveFlags : mRetrieveFlags,
+ userId);
+ if (info == null) {
+ return;
+ }
+ if (!info.enabled) {
+ if (info.enabledSetting
+ != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
+ return;
+ }
+ mHaveDisabledApps = true;
+ }
+ if (AppUtils.isInstant(info)) {
+ mHaveInstantApps = true;
+ }
+ mApplications.add(info);
+ if (!mBackgroundHandler.hasMessages(
+ ApplicationsState.BackgroundHandler.MSG_LOAD_ENTRIES)) {
+ mBackgroundHandler.sendEmptyMessage(
+ ApplicationsState.BackgroundHandler.MSG_LOAD_ENTRIES);
+ }
+ if (!mMainHandler.hasMessages(
+ ApplicationsState.MainHandler.MSG_PACKAGE_LIST_CHANGED)) {
+ mMainHandler.sendEmptyMessage(
+ ApplicationsState.MainHandler.MSG_PACKAGE_LIST_CHANGED);
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "addPackage releasing lock");
+ }
+ } catch (RemoteException e) {
+ }
+ }
+
+ public void removePackage(String pkgName, int userId) {
+ synchronized (mEntriesMap) {
+ if (DEBUG_LOCKING) Log.v(TAG, "removePackage acquired lock");
+ int idx = indexOfApplicationInfoLocked(pkgName, userId);
+ if (DEBUG) Log.i(TAG, "removePackage: " + pkgName + " @ " + idx);
+ if (idx >= 0) {
+ ApplicationsState.AppEntry entry = mEntriesMap.get(userId).get(pkgName);
+ if (DEBUG) Log.i(TAG, "removePackage: " + entry);
+ if (entry != null) {
+ mEntriesMap.get(userId).remove(pkgName);
+ mAppEntries.remove(entry);
+ }
+ ApplicationInfo info = mApplications.get(idx);
+ mApplications.remove(idx);
+ if (!info.enabled) {
+ mHaveDisabledApps = false;
+ for (ApplicationInfo otherInfo : mApplications) {
+ if (!otherInfo.enabled) {
+ mHaveDisabledApps = true;
+ break;
+ }
+ }
+ }
+ if (AppUtils.isInstant(info)) {
+ mHaveInstantApps = false;
+ for (ApplicationInfo otherInfo : mApplications) {
+ if (AppUtils.isInstant(otherInfo)) {
+ mHaveInstantApps = true;
+ break;
+ }
+ }
+ }
+ if (!mMainHandler.hasMessages(
+ ApplicationsState.MainHandler.MSG_PACKAGE_LIST_CHANGED)) {
+ mMainHandler.sendEmptyMessage(
+ ApplicationsState.MainHandler.MSG_PACKAGE_LIST_CHANGED);
+ }
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "removePackage releasing lock");
+ }
+ }
+
+ public void invalidatePackage(String pkgName, int userId) {
+ removePackage(pkgName, userId);
+ addPackage(pkgName, userId);
+ }
+
+ private void addUser(int userId) {
+ final int[] profileIds = mUm.getProfileIdsWithDisabled(UserHandle.myUserId());
+ if (ArrayUtils.contains(profileIds, userId)) {
+ synchronized (mEntriesMap) {
+ mEntriesMap.put(userId, new HashMap<String, ApplicationsState.AppEntry>());
+ if (mResumed) {
+ // If resumed, Manually pause, then cause a resume to repopulate the app list.
+ // This is the simplest way to reload the packages so that the new user
+ // is included. Otherwise the list will be repopulated on next resume.
+ doPauseLocked();
+ doResumeIfNeededLocked();
+ }
+ if (!mMainHandler.hasMessages(
+ ApplicationsState.MainHandler.MSG_PACKAGE_LIST_CHANGED)) {
+ mMainHandler.sendEmptyMessage(
+ ApplicationsState.MainHandler.MSG_PACKAGE_LIST_CHANGED);
+ }
+ }
+ }
+ }
+
+ private void removeUser(int userId) {
+ synchronized (mEntriesMap) {
+ HashMap<String, ApplicationsState.AppEntry> userMap = mEntriesMap.get(userId);
+ if (userMap != null) {
+ for (ApplicationsState.AppEntry appEntry : userMap.values()) {
+ mAppEntries.remove(appEntry);
+ mApplications.remove(appEntry.info);
+ }
+ mEntriesMap.remove(userId);
+ if (!mMainHandler.hasMessages(
+ ApplicationsState.MainHandler.MSG_PACKAGE_LIST_CHANGED)) {
+ mMainHandler.sendEmptyMessage(
+ ApplicationsState.MainHandler.MSG_PACKAGE_LIST_CHANGED);
+ }
+ }
+ }
+ }
+
+ private ApplicationsState.AppEntry getEntryLocked(ApplicationInfo info) {
+ int userId = UserHandle.getUserId(info.uid);
+ ApplicationsState.AppEntry entry = mEntriesMap.get(userId).get(info.packageName);
+ if (DEBUG) {
+ Log.i(TAG, "Looking up entry of pkg " + info.packageName + ": " + entry);
+ }
+ if (entry == null) {
+ if (isHiddenModule(info.packageName)) {
+ if (DEBUG) {
+ Log.i(TAG, "No AppEntry for " + info.packageName + " (hidden module)");
+ }
+ return null;
+ }
+ if (DEBUG) {
+ Log.i(TAG, "Creating AppEntry for " + info.packageName);
+ }
+ entry = new ApplicationsState.AppEntry(mContext, info, mCurId++);
+ mEntriesMap.get(userId).put(info.packageName, entry);
+ mAppEntries.add(entry);
+ } else if (entry.info != info) {
+ entry.info = info;
+ }
+ return entry;
+ }
+
+ // --------------------------------------------------------------
+
+ private long getTotalInternalSize(PackageStats ps) {
+ if (ps != null) {
+ // We subtract the cache size because the system can clear it automatically and
+ // |dataSize| is a superset of |cacheSize|.
+ return ps.codeSize + ps.dataSize - ps.cacheSize;
+ }
+ return SIZE_INVALID;
+ }
+
+ private long getTotalExternalSize(PackageStats ps) {
+ if (ps != null) {
+ // We also include the cache size here because for non-emulated
+ // we don't automatically clean cache files.
+ return ps.externalCodeSize + ps.externalDataSize
+ + ps.externalCacheSize
+ + ps.externalMediaSize + ps.externalObbSize;
+ }
+ return SIZE_INVALID;
+ }
+
+ private String getSizeStr(long size) {
+ if (size >= 0) {
+ return Formatter.formatFileSize(mContext, size);
+ }
+ return null;
+ }
+
+ void rebuildActiveSessions() {
+ synchronized (mEntriesMap) {
+ if (!mSessionsChanged) {
+ return;
+ }
+ mActiveSessions.clear();
+ for (int i = 0; i < mSessions.size(); i++) {
+ ApplicationsState.Session s = mSessions.get(i);
+ if (s.mResumed) {
+ mActiveSessions.add(new WeakReference<>(s));
+ }
+ }
+ }
+ }
+
+ public static String normalize(String str) {
+ String tmp = Normalizer.normalize(str, Form.NFD);
+ return REMOVE_DIACRITICALS_PATTERN.matcher(tmp)
+ .replaceAll("").toLowerCase();
+ }
+
+ public class Session implements LifecycleObserver, OnResume, OnPause, OnDestroy {
+
+ final ApplicationsState.Callbacks mCallbacks;
+ boolean mResumed;
+
+ // Rebuilding of app list. Synchronized on mRebuildSync.
+ final Object mRebuildSync = new Object();
+ boolean mRebuildRequested;
+ boolean mRebuildAsync;
+ ApplicationsState.AppFilter mRebuildFilter;
+ Comparator<ApplicationsState.AppEntry> mRebuildComparator;
+ ArrayList<ApplicationsState.AppEntry> mRebuildResult;
+ ArrayList<ApplicationsState.AppEntry> mLastAppList;
+ boolean mRebuildForeground;
+
+ private final boolean mHasLifecycle;
+ @ApplicationsState.SessionFlags
+ private int mFlags = DEFAULT_SESSION_FLAGS;
+
+ Session(ApplicationsState.Callbacks callbacks, Lifecycle lifecycle) {
+ mCallbacks = callbacks;
+ if (lifecycle != null) {
+ lifecycle.addObserver(this);
+ mHasLifecycle = true;
+ } else {
+ mHasLifecycle = false;
+ }
+ }
+
+ @ApplicationsState.SessionFlags
+ public int getSessionFlags() {
+ return mFlags;
+ }
+
+ public void setSessionFlags(@ApplicationsState.SessionFlags int flags) {
+ mFlags = flags;
+ }
+
+ public void onResume() {
+ if (DEBUG_LOCKING) Log.v(TAG, "resume about to acquire lock...");
+ synchronized (mEntriesMap) {
+ if (!mResumed) {
+ mResumed = true;
+ mSessionsChanged = true;
+ doPauseLocked();
+ doResumeIfNeededLocked();
+ }
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "...resume releasing lock");
+ }
+
+ public void onPause() {
+ if (DEBUG_LOCKING) Log.v(TAG, "pause about to acquire lock...");
+ synchronized (mEntriesMap) {
+ if (mResumed) {
+ mResumed = false;
+ mSessionsChanged = true;
+ mBackgroundHandler.removeMessages(
+ ApplicationsState.BackgroundHandler.MSG_REBUILD_LIST, this);
+ doPauseIfNeededLocked();
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "...pause releasing lock");
+ }
+ }
+
+ public ArrayList<ApplicationsState.AppEntry> getAllApps() {
+ synchronized (mEntriesMap) {
+ return new ArrayList<>(mAppEntries);
+ }
+ }
+
+ // Creates a new list of app entries with the given filter and comparator.
+ public ArrayList<ApplicationsState.AppEntry> rebuild(
+ ApplicationsState.AppFilter filter,
+ Comparator<ApplicationsState.AppEntry> comparator) {
+ return rebuild(filter, comparator, true);
+ }
+
+ public ArrayList<ApplicationsState.AppEntry> rebuild(
+ ApplicationsState.AppFilter filter,
+ Comparator<ApplicationsState.AppEntry> comparator,
+ boolean foreground) {
+ synchronized (mRebuildSync) {
+ synchronized (mRebuildingSessions) {
+ mRebuildingSessions.add(this);
+ mRebuildRequested = true;
+ mRebuildAsync = true;
+ mRebuildFilter = filter;
+ mRebuildComparator = comparator;
+ mRebuildForeground = foreground;
+ mRebuildResult = null;
+ if (!mBackgroundHandler.hasMessages(
+ ApplicationsState.BackgroundHandler.MSG_REBUILD_LIST)) {
+ Message msg = mBackgroundHandler.obtainMessage(
+ ApplicationsState.BackgroundHandler.MSG_REBUILD_LIST);
+ mBackgroundHandler.sendMessage(msg);
+ }
+ }
+
+ return null;
+ }
+ }
+
+ void handleRebuildList() {
+ ApplicationsState.AppFilter filter;
+ Comparator<ApplicationsState.AppEntry> comparator;
+
+ if (!mResumed) {
+ return;
+ }
+ synchronized (mRebuildSync) {
+ if (!mRebuildRequested) {
+ return;
+ }
+
+ filter = mRebuildFilter;
+ comparator = mRebuildComparator;
+ mRebuildRequested = false;
+ mRebuildFilter = null;
+ mRebuildComparator = null;
+ if (mRebuildForeground) {
+ Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
+ mRebuildForeground = false;
+ }
+ }
+
+ if (filter != null) {
+ filter.init(mContext);
+ }
+
+ final List<ApplicationsState.AppEntry> apps;
+ synchronized (mEntriesMap) {
+ apps = new ArrayList<>(mAppEntries);
+ }
+
+ ArrayList<ApplicationsState.AppEntry> filteredApps = new ArrayList<>();
+ if (DEBUG) {
+ Log.i(TAG, "Rebuilding...");
+ }
+ for (ApplicationsState.AppEntry entry : apps) {
+ if (entry != null && (filter == null || filter.filterApp(entry))) {
+ synchronized (mEntriesMap) {
+ if (DEBUG_LOCKING) {
+ Log.v(TAG, "rebuild acquired lock");
+ }
+ if (comparator != null) {
+ // Only need the label if we are going to be sorting.
+ entry.ensureLabel(mContext);
+ }
+ if (DEBUG) {
+ Log.i(TAG, "Using " + entry.info.packageName + ": " + entry);
+ }
+ filteredApps.add(entry);
+ if (DEBUG_LOCKING) {
+ Log.v(TAG, "rebuild releasing lock");
+ }
+ }
+ }
+ }
+
+ if (comparator != null) {
+ synchronized (mEntriesMap) {
+ // Locking to ensure that the background handler does not mutate
+ // the size of AppEntries used for ordering while sorting.
+ Collections.sort(filteredApps, comparator);
+ }
+ }
+
+ synchronized (mRebuildSync) {
+ if (!mRebuildRequested) {
+ mLastAppList = filteredApps;
+ if (!mRebuildAsync) {
+ mRebuildResult = filteredApps;
+ mRebuildSync.notifyAll();
+ } else {
+ if (!mMainHandler.hasMessages(
+ ApplicationsState.MainHandler.MSG_REBUILD_COMPLETE, this)) {
+ Message msg = mMainHandler.obtainMessage(
+ ApplicationsState.MainHandler.MSG_REBUILD_COMPLETE, this);
+ mMainHandler.sendMessage(msg);
+ }
+ }
+ }
+ }
+
+ Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+ }
+
+ public void onDestroy() {
+ if (!mHasLifecycle) {
+ // TODO: Legacy, remove this later once all usages are switched to Lifecycle
+ onPause();
+ }
+ synchronized (mEntriesMap) {
+ mSessions.remove(this);
+ }
+ }
+ }
+
+ class MainHandler extends Handler {
+ static final int MSG_REBUILD_COMPLETE = 1;
+ static final int MSG_PACKAGE_LIST_CHANGED = 2;
+ static final int MSG_PACKAGE_ICON_CHANGED = 3;
+ static final int MSG_PACKAGE_SIZE_CHANGED = 4;
+ static final int MSG_ALL_SIZES_COMPUTED = 5;
+ static final int MSG_RUNNING_STATE_CHANGED = 6;
+ static final int MSG_LAUNCHER_INFO_CHANGED = 7;
+ static final int MSG_LOAD_ENTRIES_COMPLETE = 8;
+
+ public MainHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ rebuildActiveSessions();
+ switch (msg.what) {
+ case MSG_REBUILD_COMPLETE: {
+ ApplicationsState.Session
+ s = (ApplicationsState.Session) msg.obj;
+ for (WeakReference<ApplicationsState.Session> sessionRef : mActiveSessions) {
+ final ApplicationsState.Session session = sessionRef.get();
+ if (session != null && session == s) {
+ s.mCallbacks.onRebuildComplete(s.mLastAppList);
+ }
+ }
+ }
+ break;
+ case MSG_PACKAGE_LIST_CHANGED: {
+ for (WeakReference<ApplicationsState.Session> sessionRef : mActiveSessions) {
+ final ApplicationsState.Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onPackageListChanged();
+ }
+ }
+ }
+ break;
+ case MSG_PACKAGE_ICON_CHANGED: {
+ for (WeakReference<ApplicationsState.Session> sessionRef : mActiveSessions) {
+ final ApplicationsState.Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onPackageIconChanged();
+ }
+ }
+ }
+ break;
+ case MSG_PACKAGE_SIZE_CHANGED: {
+ for (WeakReference<ApplicationsState.Session> sessionRef : mActiveSessions) {
+ final ApplicationsState.Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onPackageSizeChanged(
+ (String) msg.obj);
+ }
+ }
+ }
+ break;
+ case MSG_ALL_SIZES_COMPUTED: {
+ for (WeakReference<ApplicationsState.Session> sessionRef : mActiveSessions) {
+ final ApplicationsState.Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onAllSizesComputed();
+ }
+ }
+ }
+ break;
+ case MSG_RUNNING_STATE_CHANGED: {
+ for (WeakReference<ApplicationsState.Session> sessionRef : mActiveSessions) {
+ final ApplicationsState.Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onRunningStateChanged(
+ msg.arg1 != 0);
+ }
+ }
+ }
+ break;
+ case MSG_LAUNCHER_INFO_CHANGED: {
+ for (WeakReference<ApplicationsState.Session> sessionRef : mActiveSessions) {
+ final ApplicationsState.Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onLauncherInfoChanged();
+ }
+ }
+ }
+ break;
+ case MSG_LOAD_ENTRIES_COMPLETE: {
+ for (WeakReference<ApplicationsState.Session> sessionRef : mActiveSessions) {
+ final ApplicationsState.Session session = sessionRef.get();
+ if (session != null) {
+ session.mCallbacks.onLoadEntriesCompleted();
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ private class BackgroundHandler extends Handler {
+ static final int MSG_REBUILD_LIST = 1;
+ static final int MSG_LOAD_ENTRIES = 2;
+ static final int MSG_LOAD_HOME_APP = 3;
+ static final int MSG_LOAD_LAUNCHER = 4;
+ static final int MSG_LOAD_LEANBACK_LAUNCHER = 5;
+ static final int MSG_LOAD_ICONS = 6;
+ static final int MSG_LOAD_SIZES = 7;
+
+ boolean mRunning;
+
+ BackgroundHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ // Always try rebuilding list first thing, if needed.
+ ArrayList<ApplicationsState.Session> rebuildingSessions = null;
+ synchronized (mRebuildingSessions) {
+ if (mRebuildingSessions.size() > 0) {
+ rebuildingSessions = new ArrayList<ApplicationsState.Session>(
+ mRebuildingSessions);
+ mRebuildingSessions.clear();
+ }
+ }
+ if (rebuildingSessions != null) {
+ for (ApplicationsState.Session session : rebuildingSessions) {
+ session.handleRebuildList();
+ }
+ }
+
+ int flags = getCombinedSessionFlags(mSessions);
+
+ switch (msg.what) {
+ case MSG_REBUILD_LIST: {
+ }
+ break;
+ case MSG_LOAD_ENTRIES: {
+ int numDone = 0;
+ synchronized (mEntriesMap) {
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_ENTRIES acquired lock");
+ for (int i = 0; i < mApplications.size() && numDone < 6; i++) {
+ if (!mRunning) {
+ mRunning = true;
+ Message m = mMainHandler.obtainMessage(
+ ApplicationsState.MainHandler.MSG_RUNNING_STATE_CHANGED, 1);
+ mMainHandler.sendMessage(m);
+ }
+ ApplicationInfo info = mApplications.get(i);
+ int userId = UserHandle.getUserId(info.uid);
+ if (mEntriesMap.get(userId).get(info.packageName) == null) {
+ numDone++;
+ getEntryLocked(info);
+ }
+ if (userId != 0 && mEntriesMap.indexOfKey(0) >= 0) {
+ // If this app is for a profile and we are on the owner, remove
+ // the owner entry if it isn't installed. This will prevent
+ // duplicates of work only apps showing up as 'not installed
+ // for this user'.
+ // Note: This depends on us traversing the users in order, which
+ // happens because of the way we generate the list in
+ // doResumeIfNeededLocked.
+ ApplicationsState.AppEntry
+ entry = mEntriesMap.get(0).get(info.packageName);
+ if (entry != null && !hasFlag(entry.info.flags,
+ ApplicationInfo.FLAG_INSTALLED)) {
+ mEntriesMap.get(0).remove(info.packageName);
+ mAppEntries.remove(entry);
+ }
+ }
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_ENTRIES releasing lock");
+ }
+
+ if (numDone >= 6) {
+ sendEmptyMessage(MSG_LOAD_ENTRIES);
+ } else {
+ if (!mMainHandler.hasMessages(
+ ApplicationsState.MainHandler.MSG_LOAD_ENTRIES_COMPLETE)) {
+ mMainHandler.sendEmptyMessage(
+ ApplicationsState.MainHandler.MSG_LOAD_ENTRIES_COMPLETE);
+ }
+ sendEmptyMessage(MSG_LOAD_HOME_APP);
+ }
+ }
+ break;
+ case MSG_LOAD_HOME_APP: {
+ if (hasFlag(flags, FLAG_SESSION_REQUEST_HOME_APP)) {
+ final List<ResolveInfo> homeActivities = new ArrayList<>();
+ mPm.getHomeActivities(homeActivities);
+ synchronized (mEntriesMap) {
+ final int entryCount = mEntriesMap.size();
+ for (int i = 0; i < entryCount; i++) {
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_HOME_APP acquired lock");
+ final HashMap<String, ApplicationsState.AppEntry> userEntries =
+ mEntriesMap.valueAt(
+ i);
+ for (ResolveInfo activity : homeActivities) {
+ String packageName = activity.activityInfo.packageName;
+ ApplicationsState.AppEntry
+ entry = userEntries.get(packageName);
+ if (entry != null) {
+ entry.isHomeApp = true;
+ }
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_HOME_APP releasing lock");
+ }
+ }
+ }
+ sendEmptyMessage(MSG_LOAD_LAUNCHER);
+ }
+ break;
+ case MSG_LOAD_LAUNCHER:
+ case MSG_LOAD_LEANBACK_LAUNCHER: {
+ if ((msg.what == MSG_LOAD_LAUNCHER &&
+ hasFlag(flags, FLAG_SESSION_REQUEST_LAUNCHER))
+ || (msg.what == MSG_LOAD_LEANBACK_LAUNCHER &&
+ hasFlag(flags, FLAG_SESSION_REQUEST_LEANBACK_LAUNCHER))) {
+
+ Intent launchIntent = new Intent(Intent.ACTION_MAIN, null);
+ launchIntent.addCategory(msg.what == MSG_LOAD_LAUNCHER
+ ? Intent.CATEGORY_LAUNCHER : Intent.CATEGORY_LEANBACK_LAUNCHER);
+ for (int i = 0; i < mEntriesMap.size(); i++) {
+ int userId = mEntriesMap.keyAt(i);
+ // If we do not specify MATCH_DIRECT_BOOT_AWARE or
+ // MATCH_DIRECT_BOOT_UNAWARE, system will derive and update the flags
+ // according to the user's lock state. When the user is locked,
+ // components with ComponentInfo#directBootAware == false will be
+ // filtered. W should explicitly include both direct boot aware and
+ // unaware component here.
+ List<ResolveInfo> intents = mPm.queryIntentActivitiesAsUser(
+ launchIntent,
+ PackageManager.MATCH_DISABLED_COMPONENTS
+ | PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
+ userId
+ );
+ synchronized (mEntriesMap) {
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_LAUNCHER acquired lock");
+ HashMap<String, ApplicationsState.AppEntry> userEntries =
+ mEntriesMap.valueAt(i);
+ final int N = intents.size();
+ for (int j = 0; j < N; j++) {
+ ResolveInfo resolveInfo = intents.get(j);
+ String packageName = resolveInfo.activityInfo.packageName;
+ ApplicationsState.AppEntry
+ entry = userEntries.get(packageName);
+ if (entry != null) {
+ entry.hasLauncherEntry = true;
+ entry.launcherEntryEnabled |=
+ resolveInfo.activityInfo.enabled;
+ } else {
+ Log.w(TAG, "Cannot find pkg: " + packageName
+ + " on user " + userId);
+ }
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_LAUNCHER releasing lock");
+ }
+ }
+
+ if (!mMainHandler.hasMessages(
+ ApplicationsState.MainHandler.MSG_LAUNCHER_INFO_CHANGED)) {
+ mMainHandler.sendEmptyMessage(
+ ApplicationsState.MainHandler.MSG_LAUNCHER_INFO_CHANGED);
+ }
+ }
+ if (msg.what == MSG_LOAD_LAUNCHER) {
+ sendEmptyMessage(MSG_LOAD_LEANBACK_LAUNCHER);
+ } else {
+ sendEmptyMessage(MSG_LOAD_ICONS);
+ }
+ }
+ break;
+ case MSG_LOAD_ICONS: {
+ if (hasFlag(flags, FLAG_SESSION_REQUEST_ICONS)) {
+ int numDone = 0;
+ synchronized (mEntriesMap) {
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_ICONS acquired lock");
+ for (int i = 0; i < mAppEntries.size() && numDone < 2; i++) {
+ ApplicationsState.AppEntry
+ entry = mAppEntries.get(i);
+ if (entry.icon == null || !entry.mounted) {
+ synchronized (entry) {
+ if (entry.ensureIconLocked(mContext)) {
+ if (!mRunning) {
+ mRunning = true;
+ Message m = mMainHandler.obtainMessage(
+ ApplicationsState.MainHandler
+ .MSG_RUNNING_STATE_CHANGED,
+ 1);
+ mMainHandler.sendMessage(m);
+ }
+ numDone++;
+ }
+ }
+ }
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_ICONS releasing lock");
+ }
+ if (numDone > 0) {
+ if (!mMainHandler.hasMessages(
+ ApplicationsState.MainHandler.MSG_PACKAGE_ICON_CHANGED)) {
+ mMainHandler.sendEmptyMessage(
+ ApplicationsState.MainHandler.MSG_PACKAGE_ICON_CHANGED);
+ }
+ }
+ if (numDone >= 2) {
+ sendEmptyMessage(MSG_LOAD_ICONS);
+ break;
+ }
+ }
+ sendEmptyMessage(MSG_LOAD_SIZES);
+ }
+ break;
+ case MSG_LOAD_SIZES: {
+ if (hasFlag(flags, FLAG_SESSION_REQUEST_SIZES)) {
+ synchronized (mEntriesMap) {
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_SIZES acquired lock");
+ if (mCurComputingSizePkg != null) {
+ if (DEBUG_LOCKING) {
+ Log.v(TAG,
+ "MSG_LOAD_SIZES releasing: currently computing");
+ }
+ return;
+ }
+
+ long now = SystemClock.uptimeMillis();
+ for (int i = 0; i < mAppEntries.size(); i++) {
+ ApplicationsState.AppEntry
+ entry = mAppEntries.get(i);
+ if (hasFlag(entry.info.flags, ApplicationInfo.FLAG_INSTALLED)
+ && (entry.size == SIZE_UNKNOWN || entry.sizeStale)) {
+ if (entry.sizeLoadStart == 0 ||
+ (entry.sizeLoadStart < (now - 20 * 1000))) {
+ if (!mRunning) {
+ mRunning = true;
+ Message m = mMainHandler.obtainMessage(
+ ApplicationsState.MainHandler
+ .MSG_RUNNING_STATE_CHANGED,
+ 1);
+ mMainHandler.sendMessage(m);
+ }
+ entry.sizeLoadStart = now;
+ mCurComputingSizeUuid = entry.info.storageUuid;
+ mCurComputingSizePkg = entry.info.packageName;
+ mCurComputingSizeUserId = UserHandle.getUserId(
+ entry.info.uid);
+
+ mBackgroundHandler.post(() -> {
+ try {
+ final StorageStats stats =
+ mStats.queryStatsForPackage(
+ mCurComputingSizeUuid,
+ mCurComputingSizePkg,
+ UserHandle.of(
+ mCurComputingSizeUserId));
+ final PackageStats legacy = new PackageStats(
+ mCurComputingSizePkg,
+ mCurComputingSizeUserId);
+ legacy.codeSize = stats.getAppBytes();
+ legacy.dataSize = stats.getDataBytes();
+ legacy.cacheSize = stats.getCacheBytes();
+ try {
+ mStatsObserver.onGetStatsCompleted(legacy,
+ true);
+ } catch (RemoteException ignored) {
+ }
+ } catch (NameNotFoundException | IOException e) {
+ Log.w(TAG, "Failed to query stats: " + e);
+ try {
+ mStatsObserver.onGetStatsCompleted(null, false);
+ } catch (RemoteException ignored) {
+ }
+ }
+
+ });
+ }
+ if (DEBUG_LOCKING) {
+ Log.v(TAG,
+ "MSG_LOAD_SIZES releasing: now computing");
+ }
+ return;
+ }
+ }
+ if (!mMainHandler.hasMessages(
+ ApplicationsState.MainHandler.MSG_ALL_SIZES_COMPUTED)) {
+ mMainHandler.sendEmptyMessage(
+ ApplicationsState.MainHandler.MSG_ALL_SIZES_COMPUTED);
+ mRunning = false;
+ Message m = mMainHandler.obtainMessage(
+ ApplicationsState.MainHandler.MSG_RUNNING_STATE_CHANGED, 0);
+ mMainHandler.sendMessage(m);
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "MSG_LOAD_SIZES releasing lock");
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ @ApplicationsState.SessionFlags
+ private int getCombinedSessionFlags(List<ApplicationsState.Session> sessions) {
+ synchronized (mEntriesMap) {
+ int flags = 0;
+ for (ApplicationsState.Session session : sessions) {
+ flags |= session.mFlags;
+ }
+ return flags;
+ }
+ }
+
+ final IPackageStatsObserver.Stub mStatsObserver = new IPackageStatsObserver.Stub() {
+ public void onGetStatsCompleted(PackageStats stats, boolean succeeded) {
+ if (!succeeded) {
+ // There is no meaningful information in stats if the call failed.
+ return;
+ }
+
+ boolean sizeChanged = false;
+ synchronized (mEntriesMap) {
+ if (DEBUG_LOCKING) Log.v(TAG, "onGetStatsCompleted acquired lock");
+ HashMap<String, ApplicationsState.AppEntry> userMap = mEntriesMap.get(
+ stats.userHandle);
+ if (userMap == null) {
+ // The user must have been removed.
+ return;
+ }
+ ApplicationsState.AppEntry entry = userMap.get(stats.packageName);
+ if (entry != null) {
+ synchronized (entry) {
+ entry.sizeStale = false;
+ entry.sizeLoadStart = 0;
+ long externalCodeSize = stats.externalCodeSize
+ + stats.externalObbSize;
+ long externalDataSize = stats.externalDataSize
+ + stats.externalMediaSize;
+ long newSize = externalCodeSize + externalDataSize
+ + getTotalInternalSize(stats);
+ if (entry.size != newSize ||
+ entry.cacheSize != stats.cacheSize ||
+ entry.codeSize != stats.codeSize ||
+ entry.dataSize != stats.dataSize ||
+ entry.externalCodeSize != externalCodeSize ||
+ entry.externalDataSize != externalDataSize ||
+ entry.externalCacheSize != stats.externalCacheSize) {
+ entry.size = newSize;
+ entry.cacheSize = stats.cacheSize;
+ entry.codeSize = stats.codeSize;
+ entry.dataSize = stats.dataSize;
+ entry.externalCodeSize = externalCodeSize;
+ entry.externalDataSize = externalDataSize;
+ entry.externalCacheSize = stats.externalCacheSize;
+ entry.sizeStr = getSizeStr(entry.size);
+ entry.internalSize = getTotalInternalSize(stats);
+ entry.internalSizeStr = getSizeStr(entry.internalSize);
+ entry.externalSize = getTotalExternalSize(stats);
+ entry.externalSizeStr = getSizeStr(entry.externalSize);
+ if (DEBUG) {
+ Log.i(TAG, "Set size of " + entry.label + " " + entry
+ + ": " + entry.sizeStr);
+ }
+ sizeChanged = true;
+ }
+ }
+ if (sizeChanged) {
+ Message msg = mMainHandler.obtainMessage(
+ ApplicationsState.MainHandler.MSG_PACKAGE_SIZE_CHANGED,
+ stats.packageName);
+ mMainHandler.sendMessage(msg);
+ }
+ }
+ if (mCurComputingSizePkg != null
+ && (mCurComputingSizePkg.equals(stats.packageName)
+ && mCurComputingSizeUserId == stats.userHandle)) {
+ mCurComputingSizePkg = null;
+ sendEmptyMessage(MSG_LOAD_SIZES);
+ }
+ if (DEBUG_LOCKING) Log.v(TAG, "onGetStatsCompleted releasing lock");
+ }
+ }
+ };
+ }
+
+ /**
+ * Receives notifications when applications are added/removed.
+ */
+ private class PackageIntentReceiver extends BroadcastReceiver {
+ void registerReceiver() {
+ IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
+ filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+ filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
+ filter.addDataScheme("package");
+ mContext.registerReceiver(this, filter);
+ // Register for events related to sdcard installation.
+ IntentFilter sdFilter = new IntentFilter();
+ sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
+ sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
+ mContext.registerReceiver(this, sdFilter);
+ // Register for events related to user creation/deletion.
+ IntentFilter userFilter = new IntentFilter();
+ userFilter.addAction(Intent.ACTION_USER_ADDED);
+ userFilter.addAction(Intent.ACTION_USER_REMOVED);
+ mContext.registerReceiver(this, userFilter);
+ }
+
+ void unregisterReceiver() {
+ mContext.unregisterReceiver(this);
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String actionStr = intent.getAction();
+ if (Intent.ACTION_PACKAGE_ADDED.equals(actionStr)) {
+ Uri data = intent.getData();
+ String pkgName = data.getEncodedSchemeSpecificPart();
+ for (int i = 0; i < mEntriesMap.size(); i++) {
+ addPackage(pkgName, mEntriesMap.keyAt(i));
+ }
+ } else if (Intent.ACTION_PACKAGE_REMOVED.equals(actionStr)) {
+ Uri data = intent.getData();
+ String pkgName = data.getEncodedSchemeSpecificPart();
+ for (int i = 0; i < mEntriesMap.size(); i++) {
+ removePackage(pkgName, mEntriesMap.keyAt(i));
+ }
+ } else if (Intent.ACTION_PACKAGE_CHANGED.equals(actionStr)) {
+ Uri data = intent.getData();
+ String pkgName = data.getEncodedSchemeSpecificPart();
+ for (int i = 0; i < mEntriesMap.size(); i++) {
+ invalidatePackage(pkgName, mEntriesMap.keyAt(i));
+ }
+ } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(actionStr) ||
+ Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(actionStr)) {
+ // When applications become available or unavailable (perhaps because
+ // the SD card was inserted or ejected) we need to refresh the
+ // AppInfo with new label, icon and size information as appropriate
+ // given the newfound (un)availability of the application.
+ // A simple way to do that is to treat the refresh as a package
+ // removal followed by a package addition.
+ String[] pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
+ if (pkgList == null || pkgList.length == 0) {
+ // Ignore
+ return;
+ }
+ boolean avail = Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(actionStr);
+ if (avail) {
+ for (String pkgName : pkgList) {
+ for (int i = 0; i < mEntriesMap.size(); i++) {
+ invalidatePackage(pkgName, mEntriesMap.keyAt(i));
+ }
+ }
+ }
+ } else if (Intent.ACTION_USER_ADDED.equals(actionStr)) {
+ addUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL));
+ } else if (Intent.ACTION_USER_REMOVED.equals(actionStr)) {
+ removeUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL));
+ }
+ }
+ }
+
+ /**
+ * Whether the packages for the user have been initialized.
+ */
+ public boolean isUserAdded(int userId) {
+ return mEntriesMap.contains(userId);
+ }
+
+ public interface Callbacks {
+ void onRunningStateChanged(boolean running);
+
+ void onPackageListChanged();
+
+ void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps);
+
+ void onPackageIconChanged();
+
+ void onPackageSizeChanged(String packageName);
+
+ void onAllSizesComputed();
+
+ void onLauncherInfoChanged();
+
+ void onLoadEntriesCompleted();
+ }
+
+ public static class SizeInfo {
+ public long cacheSize;
+ public long codeSize;
+ public long dataSize;
+ public long externalCodeSize;
+ public long externalDataSize;
+
+ // This is the part of externalDataSize that is in the cache
+ // section of external storage. Note that we don't just combine
+ // this with cacheSize because currently the platform can't
+ // automatically trim this data when needed, so it is something
+ // the user may need to manage. The externalDataSize also includes
+ // this value, since what this is here is really the part of
+ // externalDataSize that we can just consider to be "cache" files
+ // for purposes of cleaning them up in the app details UI.
+ public long externalCacheSize;
+ }
+
+ public static class AppEntry extends
+ ApplicationsState.SizeInfo {
+ public final File apkFile;
+ public final long id;
+ public String label;
+ public long size;
+ public long internalSize;
+ public long externalSize;
+ public String labelDescription;
+
+ public boolean mounted;
+
+ /**
+ * Setting this to {@code true} prevents the entry to be filtered by
+ * {@link #FILTER_DOWNLOADED_AND_LAUNCHER}.
+ */
+ public boolean hasLauncherEntry;
+
+ /**
+ * Whether the component that has a launcher intent filter is enabled.
+ */
+ public boolean launcherEntryEnabled;
+
+ /**
+ * Whether or not it's a Home app.
+ */
+ public boolean isHomeApp;
+
+ public String getNormalizedLabel() {
+ if (normalizedLabel != null) {
+ return normalizedLabel;
+ }
+ normalizedLabel = normalize(label);
+ return normalizedLabel;
+ }
+
+ // Need to synchronize on 'this' for the following.
+ public ApplicationInfo info;
+ public Drawable icon;
+ public String sizeStr;
+ public String internalSizeStr;
+ public String externalSizeStr;
+ public boolean sizeStale;
+ public long sizeLoadStart;
+
+ public String normalizedLabel;
+
+ // A location where extra info can be placed to be used by custom filters.
+ public Object extraInfo;
+
+ public AppEntry(Context context, ApplicationInfo info, long id) {
+ apkFile = new File(info.sourceDir);
+ this.id = id;
+ this.info = info;
+ this.size = SIZE_UNKNOWN;
+ this.sizeStale = true;
+ ensureLabel(context);
+ // Speed up the cache of the icon and label description if they haven't been created.
+ ThreadUtils.postOnBackgroundThread(() -> {
+ if (this.icon == null) {
+ this.ensureIconLocked(context);
+ }
+ if (this.labelDescription == null) {
+ this.ensureLabelDescriptionLocked(context);
+ }
+ });
+ }
+
+ public void ensureLabel(Context context) {
+ if (this.label == null || !this.mounted) {
+ if (!this.apkFile.exists()) {
+ this.mounted = false;
+ this.label = info.packageName;
+ } else {
+ this.mounted = true;
+ CharSequence label = info.loadLabel(context.getPackageManager());
+ this.label = label != null ? label.toString() : info.packageName;
+ }
+ }
+ }
+
+ boolean ensureIconLocked(Context context) {
+ if (this.icon == null) {
+ if (this.apkFile.exists()) {
+ this.icon = LibUtils.getBadgedIcon(context, info);
+ return true;
+ } else {
+ this.mounted = false;
+ this.icon = context.getDrawable(context.getResources().getIdentifier(
+ "sym_app_on_sd_unavailable_icon", "drawable", "android"));
+ }
+ } else if (!this.mounted) {
+ // If the app wasn't mounted but is now mounted, reload
+ // its icon.
+ if (this.apkFile.exists()) {
+ this.mounted = true;
+ this.icon = LibUtils.getBadgedIcon(context, info);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public String getVersion(Context context) {
+ try {
+ return context.getPackageManager().getPackageInfo(info.packageName, 0).versionName;
+ } catch (PackageManager.NameNotFoundException e) {
+ return "";
+ }
+ }
+
+ /**
+ * Get the label description which distinguishes a personal app from a work app for
+ * accessibility purpose. If the app is in a work profile, then add a "work" prefix to the
+ * app label.
+ *
+ * @param context The application context
+ */
+ public void ensureLabelDescriptionLocked(Context context) {
+ final int userId = UserHandle.getUserId(this.info.uid);
+ if (UserManager.get(context).isManagedProfile(userId)) {
+ this.labelDescription = "";
+ } else {
+ this.labelDescription = this.label;
+ }
+ }
+ }
+
+ private static boolean hasFlag(int flags, int flag) {
+ return (flags & flag) != 0;
+ }
+
+ /**
+ * Compare by label, then package name, then uid.
+ */
+ public static final Comparator<ApplicationsState.AppEntry> ALPHA_COMPARATOR =
+ new Comparator<ApplicationsState.AppEntry>() {
+ private final Collator sCollator = Collator.getInstance();
+
+ @Override
+ public int compare(ApplicationsState.AppEntry object1,
+ ApplicationsState.AppEntry object2) {
+ int compareResult = sCollator.compare(object1.label, object2.label);
+ if (compareResult != 0) {
+ return compareResult;
+ }
+ if (object1.info != null && object2.info != null) {
+ compareResult =
+ sCollator.compare(object1.info.packageName,
+ object2.info.packageName);
+ if (compareResult != 0) {
+ return compareResult;
+ }
+ }
+
+ return object1.info.uid - object2.info.uid;
+ }
+ };
+
+ public static final Comparator<ApplicationsState.AppEntry> SIZE_COMPARATOR
+ = new Comparator<ApplicationsState.AppEntry>() {
+ @Override
+ public int compare(ApplicationsState.AppEntry object1, ApplicationsState.AppEntry object2) {
+ if (object1.size < object2.size) return 1;
+ if (object1.size > object2.size) return -1;
+ return ALPHA_COMPARATOR.compare(object1, object2);
+ }
+ };
+
+ public static final Comparator<ApplicationsState.AppEntry> INTERNAL_SIZE_COMPARATOR
+ = new Comparator<ApplicationsState.AppEntry>() {
+ @Override
+ public int compare(ApplicationsState.AppEntry object1, ApplicationsState.AppEntry object2) {
+ if (object1.internalSize < object2.internalSize) return 1;
+ if (object1.internalSize > object2.internalSize) return -1;
+ return ALPHA_COMPARATOR.compare(object1, object2);
+ }
+ };
+
+ public static final Comparator<ApplicationsState.AppEntry> EXTERNAL_SIZE_COMPARATOR
+ = new Comparator<ApplicationsState.AppEntry>() {
+ @Override
+ public int compare(ApplicationsState.AppEntry object1, ApplicationsState.AppEntry object2) {
+ if (object1.externalSize < object2.externalSize) return 1;
+ if (object1.externalSize > object2.externalSize) return -1;
+ return ALPHA_COMPARATOR.compare(object1, object2);
+ }
+ };
+
+ public interface AppFilter {
+ void init();
+
+ default void init(Context context) {
+ init();
+ }
+
+ boolean filterApp(ApplicationsState.AppEntry info);
+ }
+
+ public static final ApplicationsState.AppFilter
+ FILTER_PERSONAL = new ApplicationsState.AppFilter() {
+ private int mCurrentUser;
+
+ @Override
+ public void init() {
+ mCurrentUser = ActivityManager.getCurrentUser();
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ return UserHandle.getUserId(entry.info.uid) == mCurrentUser;
+ }
+ };
+
+ public static final ApplicationsState.AppFilter
+ FILTER_WITHOUT_DISABLED_UNTIL_USED = new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ // do nothing
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ return entry.info.enabledSetting
+ != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
+ }
+ };
+
+
+ /**
+ * Displays a combined list with "downloaded" and "visible in launcher" apps only.
+ */
+ public static final ApplicationsState.AppFilter
+ FILTER_DOWNLOADED_AND_LAUNCHER = new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ if (AppUtils.isInstant(entry.info)) {
+ return false;
+ } else if (hasFlag(entry.info.flags, ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) {
+ return true;
+ } else if (!hasFlag(entry.info.flags, ApplicationInfo.FLAG_SYSTEM)) {
+ return true;
+ } else if (entry.hasLauncherEntry) {
+ return true;
+ } else {
+ return hasFlag(entry.info.flags, ApplicationInfo.FLAG_SYSTEM) && entry.isHomeApp;
+ }
+ }
+ };
+
+ /**
+ * Displays a combined list with "downloaded" and "visible in launcher" apps only.
+ */
+ public static final ApplicationsState.AppFilter
+ FILTER_DOWNLOADED_AND_LAUNCHER_AND_INSTANT = new ApplicationsState.AppFilter() {
+
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ return AppUtils.isInstant(entry.info)
+ || FILTER_DOWNLOADED_AND_LAUNCHER.filterApp(entry);
+ }
+
+ };
+
+ public static final ApplicationsState.AppFilter
+ FILTER_THIRD_PARTY = new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ if (hasFlag(entry.info.flags, ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) {
+ return true;
+ } else {
+ return !hasFlag(entry.info.flags, ApplicationInfo.FLAG_SYSTEM);
+ }
+ }
+ };
+
+ public static final ApplicationsState.AppFilter
+ FILTER_DISABLED = new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ return !entry.info.enabled && !AppUtils.isInstant(entry.info);
+ }
+ };
+
+ public static final ApplicationsState.AppFilter
+ FILTER_INSTANT = new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ return AppUtils.isInstant(entry.info);
+ }
+ };
+
+ public static final ApplicationsState.AppFilter
+ FILTER_ALL_ENABLED = new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ return entry.info.enabled && !AppUtils.isInstant(entry.info);
+ }
+ };
+
+ public static final ApplicationsState.AppFilter
+ FILTER_EVERYTHING = new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ return true;
+ }
+ };
+
+
+ public static final ApplicationsState.AppFilter
+ FILTER_NOT_HIDE = new ApplicationsState.AppFilter() {
+ private String[] mHidePackageNames;
+
+ @Override
+ public void init(Context context) {
+ mHidePackageNames = context.getResources()
+ .getStringArray(context.getResources().getIdentifier(
+ "config_hideWhenDisabled_packageNames", "array", "android"));
+ }
+
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ if (ArrayUtils.contains(mHidePackageNames, entry.info.packageName)) {
+ if (!entry.info.enabled) {
+ return false;
+ } else {
+ return entry.info.enabledSetting
+ != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
+ }
+ }
+
+ return true;
+ }
+ };
+
+ public static final ApplicationsState.AppFilter
+ FILTER_GAMES = new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(ApplicationsState.AppEntry info) {
+ // TODO: Update for the new game category.
+ boolean isGame;
+ synchronized (info.info) {
+ isGame = hasFlag(info.info.flags, ApplicationInfo.FLAG_IS_GAME)
+ || info.info.category == ApplicationInfo.CATEGORY_GAME;
+ }
+ return isGame;
+ }
+ };
+
+ public static class VolumeFilter implements
+ ApplicationsState.AppFilter {
+ private final String mVolumeUuid;
+
+ public VolumeFilter(String volumeUuid) {
+ mVolumeUuid = volumeUuid;
+ }
+
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry info) {
+ return Objects.equals(info.info.volumeUuid, mVolumeUuid);
+ }
+ }
+
+ public static class CompoundFilter implements
+ ApplicationsState.AppFilter {
+ private final ApplicationsState.AppFilter mFirstFilter;
+ private final ApplicationsState.AppFilter mSecondFilter;
+
+ public CompoundFilter(ApplicationsState.AppFilter first,
+ ApplicationsState.AppFilter second) {
+ mFirstFilter = first;
+ mSecondFilter = second;
+ }
+
+ @Override
+ public void init(Context context) {
+ mFirstFilter.init(context);
+ mSecondFilter.init(context);
+ }
+
+ @Override
+ public void init() {
+ mFirstFilter.init();
+ mSecondFilter.init();
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry info) {
+ return mFirstFilter.filterApp(info) && mSecondFilter.filterApp(info);
+ }
+ }
+
+ public static final ApplicationsState.AppFilter
+ FILTER_AUDIO = new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ boolean isMusicApp;
+ synchronized (entry) {
+ isMusicApp = entry.info.category == ApplicationInfo.CATEGORY_AUDIO;
+ }
+ return isMusicApp;
+ }
+ };
+
+ public static final ApplicationsState.AppFilter
+ FILTER_MOVIES = new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ boolean isMovieApp;
+ synchronized (entry) {
+ isMovieApp = entry.info.category == ApplicationInfo.CATEGORY_VIDEO;
+ }
+ return isMovieApp;
+ }
+ };
+
+ public static final ApplicationsState.AppFilter
+ FILTER_PHOTOS =
+ new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ boolean isPhotosApp;
+ synchronized (entry) {
+ isPhotosApp = entry.info.category == ApplicationInfo.CATEGORY_IMAGE;
+ }
+ return isPhotosApp;
+ }
+ };
+
+ public static final ApplicationsState.AppFilter
+ FILTER_OTHER_APPS =
+ new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(
+ ApplicationsState.AppEntry entry) {
+ boolean isCategorized;
+ synchronized (entry) {
+ isCategorized =
+ FILTER_AUDIO.filterApp(entry)
+ || FILTER_GAMES.filterApp(entry)
+ || FILTER_MOVIES.filterApp(entry)
+ || FILTER_PHOTOS.filterApp(entry);
+ }
+ return !isCategorized;
+ }
+ };
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppsState.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppsState.java
new file mode 100644
index 0000000..6861b45
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/AppsState.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.tv.settings.library.device.apps;
+
+import android.app.Activity;
+import android.app.Application;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AppsState extends PreferenceControllerState {
+ public static final String EXTRA_VOLUME_UUID = "volumeUuid";
+ public static final String EXTRA_VOLUME_NAME = "volumeName";
+
+ public AppsState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ public static void prepareArgs(Bundle b, String volumeUuid, String volumeName) {
+ b.putString(EXTRA_VOLUME_UUID, volumeUuid);
+ b.putString(EXTRA_VOLUME_NAME, volumeName);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_APPS;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ final Activity activity = (Activity) mContext;
+ final Application app = activity != null ? activity.getApplication() : null;
+ List<AbstractPreferenceController> controllers = new ArrayList<>();
+ controllers.add(new RecentAppsPreferenceController(mContext, app, mUIUpdateCallback,
+ getStateIdentifier(), mPreferenceCompatManager));
+ return controllers;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // no-op
+ }
+}
\ No newline at end of file
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/ClearCachePreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/ClearCachePreferenceController.java
new file mode 100644
index 0000000..9bdcd73
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/ClearCachePreferenceController.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.tv.settings.library.device.apps;
+
+import static com.android.tv.settings.library.device.apps.AppManagementState.REQUEST_CLEAR_CACHE;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.text.format.Formatter;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+/** Preference controller to handle clear cache preference. */
+public class ClearCachePreferenceController extends AppActionPreferenceController {
+ private static final String KEY_CLEAR_CACHE = "clearCache";
+ private boolean mClearingCache;
+
+ public ClearCachePreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ ApplicationsState.AppEntry appEntry, PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, appEntry, preferenceCompatManager);
+ }
+
+ public void setClearingCache(boolean clearingCache) {
+ mClearingCache = clearingCache;
+ updateAndNotify();
+ }
+
+ @Override
+ public void update() {
+ if (mAppEntry == null) {
+ return;
+ }
+ mPreferenceCompat.setTitle(ResourcesUtil.getString(
+ mContext, "device_apps_app_management_clear_cache"));
+ mPreferenceCompat.setSummary(mClearingCache
+ ? ResourcesUtil.getString(mContext, "computing_size")
+ : Formatter.formatFileSize(mContext,
+ mAppEntry.cacheSize + mAppEntry.externalCacheSize));
+ mPreferenceCompat.setEnabled(!mClearingCache && mAppEntry.cacheSize > 0);
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(boolean status) {
+ if (!mDisabledByAdmin) {
+ Intent i = new Intent(INTENT_CONFIRMATION);
+ i.putExtra(EXTRA_GUIDANCE_TITLE, ResourcesUtil.getString(
+ mContext, "device_apps_app_management_clear_cache"));
+ i.putExtra(EXTRA_GUIDANCE_BREADCRUMB, getAppName());
+ ((Activity) mContext).startActivityForResult(i,
+ ManagerUtil.calculateCompoundCode(
+ mStateIdentifier, REQUEST_CLEAR_CACHE));
+ return true;
+ }
+ return super.handlePreferenceTreeClick(status);
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return null;
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_CLEAR_CACHE};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/ClearDataPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/ClearDataPreferenceController.java
new file mode 100644
index 0000000..96a9422
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/ClearDataPreferenceController.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.tv.settings.library.device.apps;
+
+import static com.android.tv.settings.library.device.apps.AppManagementState.REQUEST_CLEAR_DATA;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.text.format.Formatter;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+/** Preference controller to handle clear data preference. */
+public class ClearDataPreferenceController extends AppActionPreferenceController {
+ static final String KEY_CLEAR_DATA = "clearData";
+ private boolean mClearingData;
+
+ public ClearDataPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ ApplicationsState.AppEntry appEntry, PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, appEntry, preferenceCompatManager);
+ }
+
+ public void setClearingData(boolean clearingData) {
+ mClearingData = clearingData;
+ update();
+ }
+
+ @Override
+ public void update() {
+ if (mAppEntry == null) {
+ return;
+ }
+ mPreferenceCompat.setTitle(
+ ResourcesUtil.getString(mContext, "device_apps_app_management_clear_data"));
+ mPreferenceCompat.setSummary(mClearingData
+ ? ResourcesUtil.getString(mContext, "computing_size")
+ : Formatter.formatFileSize(mContext,
+ mAppEntry.dataSize + mAppEntry.externalDataSize));
+ super.update();
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(boolean status) {
+ if (!mDisabledByAdmin) {
+ Intent i = new Intent(INTENT_CONFIRMATION);
+ i.putExtra(EXTRA_GUIDANCE_TITLE, ResourcesUtil.getString(
+ mContext, "device_apps_app_management_clear_data"));
+ i.putExtra(EXTRA_GUIDANCE_BREADCRUMB, getAppName());
+ ((Activity) mContext).startActivityForResult(i,
+ ManagerUtil.calculateCompoundCode(
+ mStateIdentifier, REQUEST_CLEAR_DATA));
+ return true;
+ }
+ return super.handlePreferenceTreeClick(status);
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return null;
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_CLEAR_DATA};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/ClearDefaultsPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/ClearDefaultsPreferenceController.java
new file mode 100644
index 0000000..5bcbdf9
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/ClearDefaultsPreferenceController.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.tv.settings.library.device.apps;
+
+import static com.android.tv.settings.library.device.apps.AppManagementState.REQUEST_CLEAR_DEFAULTS;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.hardware.usb.IUsbManager;
+import android.os.IBinder;
+import android.os.ServiceManager;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+/** Preference controller class to handle clear defaults preference. */
+public class ClearDefaultsPreferenceController extends AppActionPreferenceController {
+ private static final String KEY_CLEAR_DEFAULTS = "clearDefaults";
+
+ private final IUsbManager mUsbManager;
+ private final PackageManager mPackageManager;
+
+ public ClearDefaultsPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ ApplicationsState.AppEntry appEntry, PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, appEntry, preferenceCompatManager);
+ final IBinder usbBinder = ServiceManager.getService(Context.USB_SERVICE);
+ mUsbManager = IUsbManager.Stub.asInterface(usbBinder);
+ mPackageManager = context.getPackageManager();
+
+ }
+
+ @Override
+ public void update() {
+ if (mAppEntry == null) {
+ return;
+ }
+ mPreferenceCompat.setTitle(ResourcesUtil.getString(
+ mContext, "device_apps_app_management_clear_default"));
+ mPreferenceCompat.setSummary(AppUtils.getLaunchByDefaultSummary(
+ mAppEntry, mUsbManager, mPackageManager, mContext).toString());
+ super.update();
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(boolean status) {
+ if (!mDisabledByAdmin) {
+ Intent i = new Intent(INTENT_CONFIRMATION);
+ i.putExtra(EXTRA_GUIDANCE_TITLE, ResourcesUtil.getString(
+ mContext, "device_apps_app_management_clear_default"));
+ i.putExtra(EXTRA_GUIDANCE_BREADCRUMB, getAppName());
+ ((Activity) mContext).startActivityForResult(i,
+ ManagerUtil.calculateCompoundCode(
+ mStateIdentifier, REQUEST_CLEAR_DEFAULTS));
+ return true;
+ }
+ return super.handlePreferenceTreeClick(status);
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return null;
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_CLEAR_DEFAULTS};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/EnableDisablePreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/EnableDisablePreferenceController.java
new file mode 100644
index 0000000..1f66086
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/EnableDisablePreferenceController.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.apps;
+
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtils;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtilsInternal;
+import com.android.tv.settings.library.util.LibUtils;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+/** Preference controller to enable disable preference. */
+public class EnableDisablePreferenceController extends AppActionPreferenceController {
+ private final PackageManager mPackageManager;
+ static final String KEY_ENABLE_DISABLE = "enableDisable";
+
+ public EnableDisablePreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ ApplicationsState.AppEntry appEntry, PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, appEntry, preferenceCompatManager);
+ mPackageManager = context.getPackageManager();
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return true;
+ }
+
+ @Override
+ public void init() {
+ if (isRestricted()) {
+ final RestrictedLockUtils.EnforcedAdmin admin =
+ RestrictedLockUtilsInternal.checkIfRestrictionEnforced(mContext,
+ UserManager.DISALLOW_APPS_CONTROL, UserHandle.myUserId());
+ if (admin != null) {
+ setDisabledByAdmin(admin);
+ } else {
+ setEnabled(false);
+ }
+ }
+ update();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_ENABLE_DISABLE};
+ }
+
+ private HashSet<String> getHomePackages() {
+ HashSet<String> homePackages = new HashSet<>();
+ // Get list of "home" apps and trace through any meta-data references
+ List<ResolveInfo> homeActivities = new ArrayList<>();
+ mPackageManager.getHomeActivities(homeActivities);
+ for (ResolveInfo ri : homeActivities) {
+ final String activityPkg = ri.activityInfo.packageName;
+ homePackages.add(activityPkg);
+ // Also make sure to include anything proxying for the home app
+ final Bundle metadata = ri.activityInfo.metaData;
+ if (metadata != null) {
+ final String metaPkg = metadata.getString(ActivityManager.META_HOME_ALTERNATE);
+ if (signaturesMatch(mPackageManager, metaPkg, activityPkg)) {
+ homePackages.add(metaPkg);
+ }
+ }
+ }
+ return homePackages;
+ }
+
+ public void setEnabled(boolean enabled) {
+ mPreferenceCompat.setEnabled(enabled);
+ notifyChange();
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return null;
+ }
+
+ private static boolean signaturesMatch(PackageManager pm, String pkg1, String pkg2) {
+ if (pkg1 != null && pkg2 != null) {
+ try {
+ final int match = pm.checkSignatures(pkg1, pkg2);
+ if (match >= PackageManager.SIGNATURE_MATCH) {
+ return true;
+ }
+ } catch (Exception e) {
+ // e.g. named alternate package not found during lookup;
+ // this is an expected case sometimes
+ }
+ }
+ return false;
+ }
+
+ private boolean canDisable() {
+ final HashSet<String> homePackages = getHomePackages();
+ PackageInfo packageInfo;
+ try {
+ packageInfo = mPackageManager.getPackageInfo(mAppEntry.info.packageName,
+ PackageManager.GET_DISABLED_COMPONENTS
+ | PackageManager.GET_UNINSTALLED_PACKAGES
+ | PackageManager.GET_SIGNATURES);
+ } catch (PackageManager.NameNotFoundException e) {
+ return false;
+ }
+ return !(homePackages.contains(mAppEntry.info.packageName)
+ || LibUtils.isSystemPackage(mContext.getResources(), mPackageManager, packageInfo));
+ }
+
+ boolean isRestricted() {
+ UserManager userManager = mContext.getSystemService(UserManager.class);
+ return userManager.hasUserRestriction(UserManager.DISALLOW_APPS_CONTROL);
+ }
+
+ @Override
+ public void update() {
+ if (mAppEntry == null) {
+ return;
+ }
+ if (!UninstallPreferenceController.canUninstall(mAppEntry) && canDisable()) {
+ mPreferenceCompat.setVisible(true);
+ if (mAppEntry.info.enabled) {
+ mPreferenceCompat.setTitle(ResourcesUtil.getString(
+ mContext, "device_apps_app_management_disable"));
+ } else {
+ mPreferenceCompat.setTitle(ResourcesUtil.getString(mContext,
+ "device_apps_app_management_enable"));
+ }
+ } else {
+ mPreferenceCompat.setVisible(false);
+ }
+ if (mPreferenceCompat.isRestricted()) {
+ super.update();
+ } else {
+ mPreferenceCompat.setEnabled(true);
+ }
+ }
+
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/ForceStopPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/ForceStopPreferenceController.java
new file mode 100644
index 0000000..d310a67
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/ForceStopPreferenceController.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.apps;
+
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.net.Uri;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtils;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtilsInternal;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+/** Preference controller to handle force stop preference. */
+public class ForceStopPreferenceController extends AppActionPreferenceController {
+ static final String KEY_FORCE_STOP = "forceStop";
+ private static final String ARG_PACKAGE_NAME = "packageName";
+
+ public ForceStopPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ ApplicationsState.AppEntry appEntry, PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, appEntry, preferenceCompatManager);
+ }
+
+ @Override
+ public void init() {
+ UserManager userManager = mContext.getSystemService(UserManager.class);
+ if (userManager.hasUserRestriction(UserManager.DISALLOW_APPS_CONTROL)) {
+ final RestrictedLockUtils.EnforcedAdmin admin =
+ RestrictedLockUtilsInternal.checkIfRestrictionEnforced(mContext,
+ UserManager.DISALLOW_APPS_CONTROL, UserHandle.myUserId());
+ if (admin != null) {
+ setDisabledByAdmin(admin);
+ } else {
+ setEnabled(false);
+ }
+ }
+ update();
+ }
+
+ @Override
+ public void update() {
+ if (mAppEntry == null) {
+ return;
+ }
+ mPreferenceCompat.setTitle(ResourcesUtil.getString(mContext,
+ "device_apps_app_management_force_stop"));
+ DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
+ Intent i = new Intent(INTENT_CONFIRMATION);
+ i.putExtra(EXTRA_GUIDANCE_TITLE, ResourcesUtil.getString(
+ mContext, "device_apps_app_management_force_stop"));
+ i.putExtra(EXTRA_GUIDANCE_SUBTITLE, ResourcesUtil.getString(
+ mContext, "device_apps_app_management_force_stop_desc"));
+ i.putExtra(EXTRA_GUIDANCE_BREADCRUMB, getAppName());
+ mPreferenceCompat.setIntent(i);
+
+ if (dpm.packageHasActiveAdmins(mAppEntry.info.packageName)) {
+ // User can't force stop device admin.
+ mPreferenceCompat.setVisible(false);
+ } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_STOPPED) == 0) {
+ // If the app isn't explicitly stopped, then always show the
+ // force stop action.
+ mPreferenceCompat.setVisible(true);
+ } else {
+ Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
+ Uri.fromParts("package", mAppEntry.info.packageName, null));
+ intent.putExtra(Intent.EXTRA_PACKAGES, new String[]{
+ mAppEntry.info.packageName});
+ intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid));
+ mContext.sendOrderedBroadcast(intent, null, new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ mPreferenceCompat.setVisible(getResultCode() != Activity.RESULT_CANCELED);
+ }
+ }, null, Activity.RESULT_CANCELED, null, null);
+ }
+ super.update();
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return null;
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_FORCE_STOP};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/InstantAppDataProvider.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/InstantAppDataProvider.java
new file mode 100644
index 0000000..775d48e
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/InstantAppDataProvider.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.tv.settings.library.device.apps;
+
+import android.content.pm.ApplicationInfo;
+
+/**
+ * This helps deal with the fact that robolectric does not yet have an implementation of the
+ * isInstantApp method of ApplicationInfo, so we get a method not found exception when running tests
+ * if we try to call it directly.
+ */
+public interface InstantAppDataProvider {
+ boolean isInstantApp(ApplicationInfo info);
+}
+
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/InterestingConfigChanges.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/InterestingConfigChanges.java
new file mode 100644
index 0000000..73d35ee
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/InterestingConfigChanges.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.tv.settings.library.device.apps;
+
+import android.annotation.SuppressLint;
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+
+/**
+ * A class for applying config changes and determing if doing so resulting in any "interesting"
+ * changes.
+ */
+public class InterestingConfigChanges {
+ private final Configuration mLastConfiguration = new Configuration();
+ private final int mFlags;
+ private int mLastDensity;
+
+ public InterestingConfigChanges() {
+ this(ActivityInfo.CONFIG_LOCALE
+ | ActivityInfo.CONFIG_UI_MODE | ActivityInfo.CONFIG_SCREEN_LAYOUT
+ | ActivityInfo.CONFIG_ASSETS_PATHS);
+ }
+
+ public InterestingConfigChanges(int flags) {
+ mFlags = flags;
+ }
+
+ /**
+ * Applies the given config change and returns whether an "interesting" change happened.
+ *
+ * @param res The source of the new config to apply
+ *
+ * @return Whether interesting changes occurred
+ */
+ @SuppressLint("NewApi")
+ public boolean applyNewConfig(Resources res) {
+ int configChanges = mLastConfiguration.updateFrom(
+ Configuration.generateDelta(mLastConfiguration, res.getConfiguration()));
+ boolean densityChanged = mLastDensity != res.getDisplayMetrics().densityDpi;
+ if (densityChanged || (configChanges & (mFlags)) != 0) {
+ mLastDensity = res.getDisplayMetrics().densityDpi;
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/NotificationsPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/NotificationsPreferenceController.java
new file mode 100644
index 0000000..777e9d2
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/NotificationsPreferenceController.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.apps;
+
+import static com.android.tv.settings.library.PreferenceCompat.STATUS_OFF;
+import static com.android.tv.settings.library.PreferenceCompat.STATUS_ON;
+
+import android.app.INotificationManager;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.os.RemoteException;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.LibUtils;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+/** Preference controller to handle notifications preference. */
+public class NotificationsPreferenceController extends AbstractPreferenceController {
+ private static final String TAG = "NotificationsPreference";
+ private static final String KEY_NOTIFICATIONS = "notifications";
+ private final INotificationManager mNotificationManager;
+ private ApplicationsState.AppEntry mAppEntry;
+
+ public NotificationsPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ ApplicationsState.AppEntry appEntry, PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mNotificationManager = NotificationManager.getService();
+ mAppEntry = appEntry;
+ }
+
+ /**
+ * Set entry and refresh pref.
+ *
+ * @param entry entry
+ */
+ public void setEntry(@NonNull ApplicationsState.AppEntry entry) {
+ mAppEntry = entry;
+ updateAndNotify();
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return true;
+ }
+
+ @Override
+ protected void init() {
+ mPreferenceCompat.setTitle(ResourcesUtil.getString(mContext,
+ "device_apps_app_management_notifications"));
+ update();
+ }
+
+ @Override
+ public void update() {
+ mPreferenceCompat.setEnabled(isBlockable(mContext, mAppEntry.info));
+ try {
+ mPreferenceCompat.setChecked(
+ mNotificationManager.areNotificationsEnabledForPackage(
+ mAppEntry.info.packageName, mAppEntry.info.uid));
+ } catch (RemoteException e) {
+ Log.d(TAG, "Remote exception while checking notifications for package "
+ + mAppEntry.info.packageName, e);
+ }
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_NOTIFICATIONS};
+ }
+
+ /**
+ * Returns if changes to notifications for an app should be allowed in TV settings. If the app
+ * is NOT blockable disabling notifications for the app should be disallowed.
+ */
+ private boolean isBlockable(Context context, ApplicationInfo info) {
+ final boolean blocked = getNotificationsBanned(info.packageName, info.uid);
+ final boolean systemApp = isSystemApp(context, info);
+ // allow Notifications setting change if not a system app
+ // or if a system app, but somehow notifications are turned off atm
+ return !systemApp || (systemApp && blocked);
+ }
+
+ private boolean getNotificationsBanned(String pkg, int uid) {
+ try {
+ final boolean enabled = mNotificationManager.areNotificationsEnabledForPackage(pkg,
+ uid);
+ return !enabled;
+ } catch (RemoteException e) {
+ Log.w(TAG, "Error calling NotificationManager ", e);
+ return false;
+ }
+ }
+
+ /**
+ * In this context a system app is either an actual system app or on the
+ * config_nonBlockableNotificationPackages list of packages
+ */
+ private boolean isSystemApp(Context context, ApplicationInfo app) {
+ try {
+ PackageInfo info = context.getPackageManager().getPackageInfo(
+ app.packageName, PackageManager.GET_SIGNATURES);
+ return LibUtils.isSystemPackage(
+ context.getResources(), context.getPackageManager(), info)
+ || isNonBlockablePackage(context.getResources(), app.packageName);
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ private boolean isNonBlockablePackage(Resources resources, String packageName) {
+ final String[] nonBlockablePkgs = resources.getStringArray(
+ resources.getIdentifier("config_nonBlockableNotificationPackages",
+ "array", "android"));
+ for (String pkg : nonBlockablePkgs) {
+ // The non blockable package list can contain channels in the `package:channelId`
+ // format. Since TV settings don't support notifications channels, we'll consider
+ // the package non blockable if one of its channels is blocked
+ if (pkg != null && packageName.equals(pkg.split(":", 2)[0])) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean handlePreferenceTreeClick(PreferenceCompat preferenceCompat, boolean status) {
+ if (!(preferenceCompat.getEnabled() == STATUS_ON)) {
+ return false;
+ }
+ return setNotificationsEnabled(status);
+
+ }
+
+ private boolean setNotificationsEnabled(boolean checked) {
+ boolean result = true;
+ byte status = checked ? STATUS_ON : STATUS_OFF;
+ if (mPreferenceCompat.getChecked() != status) {
+ try {
+ mNotificationManager.setNotificationsEnabledForPackage(
+ mAppEntry.info.packageName, mAppEntry.info.uid, checked);
+ mPreferenceCompat.setChecked(checked);
+ mUIUpdateCallback.notifyUpdate(mStateIdentifier, mPreferenceCompat);
+ } catch (RemoteException ex) {
+ result = false;
+ }
+ }
+ return result;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/RecentAppsPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/RecentAppsPreferenceController.java
new file mode 100644
index 0000000..3c0e576
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/RecentAppsPreferenceController.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.apps;
+
+import android.app.Application;
+import android.app.usage.UsageStats;
+import android.app.usage.UsageStatsManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.IconDrawableFactory;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.StringUtil;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * This controller displays a list of recently used apps and a "See all" button.
+ */
+public class RecentAppsPreferenceController extends AbstractPreferenceController
+ implements Comparator<UsageStats> {
+
+ private static final String TAG = "RecentAppsPreferenceController";
+ private static final String KEY_PREF_CATEGORY = "recently_used_apps_category";
+ @VisibleForTesting
+ static final String KEY_SEE_ALL = "see_all_apps";
+ private static final int SHOW_RECENT_APP_COUNT = 5;
+ private static final Set<String> SKIP_SYSTEM_PACKAGES = new ArraySet<>();
+
+ private final PackageManager mPm;
+ private final UsageStatsManager mUsageStatsManager;
+ private final ApplicationsState mApplicationsState;
+ private final int mUserId;
+ private final IconDrawableFactory mIconDrawableFactory;
+
+ private Calendar mCal;
+ private List<UsageStats> mStats;
+
+ static {
+ SKIP_SYSTEM_PACKAGES.addAll(Arrays.asList(
+ "android",
+ "com.android.tv.settings",
+ "com.android.systemui",
+ "com.android.providers.calendar",
+ "com.android.providers.media"
+ ));
+ }
+
+ public RecentAppsPreferenceController(Context context, Application app,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ this(context, app == null ? null : ApplicationsState.getInstance(app), callback,
+ stateIdentifier, preferenceCompatManager);
+ }
+
+ @VisibleForTesting
+ RecentAppsPreferenceController(Context context, ApplicationsState appState,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mIconDrawableFactory = IconDrawableFactory.newInstance(context);
+ mUserId = UserHandle.myUserId();
+ mPm = context.getPackageManager();
+ mUsageStatsManager = context.getSystemService(UsageStatsManager.class);
+ mApplicationsState = appState;
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_PREF_CATEGORY};
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return true;
+ }
+
+ @Override
+ public void init() {
+ update();
+ }
+
+ public void update() {
+ reloadData();
+ final List<UsageStats> recentApps = getDisplayableRecentAppList();
+ if (recentApps != null && !recentApps.isEmpty()) {
+ displayRecentApps(recentApps);
+ } else {
+ displayOnlyAllApps();
+ }
+ }
+
+ private void displayOnlyAllApps() {
+ mPreferenceCompat.setVisible(false);
+ }
+
+ private void displayRecentApps(List<UsageStats> recentApps) {
+ mPreferenceCompat.setVisible(true);
+ final int recentAppsCount = recentApps.size();
+ for (int i = 0; i < recentAppsCount; i++) {
+ final UsageStats stat = recentApps.get(i);
+ // Bind recent apps to existing prefs if possible, or create a new pref.
+ final String pkgName = stat.getPackageName();
+ final ApplicationsState.AppEntry appEntry =
+ mApplicationsState.getEntry(pkgName, mUserId);
+ if (appEntry == null) {
+ continue;
+ }
+
+ String[] prefKey = new String[]{KEY_PREF_CATEGORY, pkgName};
+ PreferenceCompat pref = new PreferenceCompat(prefKey);
+ pref.setTitle(appEntry.label);
+ pref.setIcon(mIconDrawableFactory.getBadgedIcon(appEntry.info));
+ pref.setSummary(StringUtil.formatRelativeTime(mContext,
+ System.currentTimeMillis() - stat.getLastTimeUsed(), false).toString());
+ pref.setNextState(ManagerUtil.STATE_APP_MANAGEMENT);
+ Bundle nextStateExtras = new Bundle();
+ AppManagementState.prepareArgs(nextStateExtras, pkgName);
+ pref.setExtras(nextStateExtras);
+ mPreferenceCompat.addChildPrefCompat(pref);
+ }
+ }
+
+ @Override
+ public final int compare(UsageStats a, UsageStats b) {
+ // return by descending order
+ return Long.compare(b.getLastTimeUsed(), a.getLastTimeUsed());
+ }
+
+ @VisibleForTesting
+ void reloadData() {
+ mCal = Calendar.getInstance();
+ mCal.add(Calendar.DAY_OF_YEAR, -1);
+ mStats = mUsageStatsManager.queryUsageStats(
+ UsageStatsManager.INTERVAL_BEST, mCal.getTimeInMillis(),
+ System.currentTimeMillis());
+ }
+
+ private List<UsageStats> getDisplayableRecentAppList() {
+ final List<UsageStats> recentApps = new ArrayList<>();
+ final Map<String, UsageStats> map = new ArrayMap<>();
+ final int statCount = mStats.size();
+ for (int i = 0; i < statCount; i++) {
+ final UsageStats pkgStats = mStats.get(i);
+ if (!shouldIncludePkgInRecents(pkgStats)) {
+ continue;
+ }
+ final String pkgName = pkgStats.getPackageName();
+ final UsageStats existingStats = map.get(pkgName);
+ if (existingStats == null) {
+ map.put(pkgName, pkgStats);
+ } else {
+ existingStats.add(pkgStats);
+ }
+ }
+ final List<UsageStats> packageStats = new ArrayList<>();
+ packageStats.addAll(map.values());
+ Collections.sort(packageStats, this /* comparator */);
+ int count = 0;
+ for (UsageStats stat : packageStats) {
+ final ApplicationsState.AppEntry appEntry = mApplicationsState.getEntry(
+ stat.getPackageName(), mUserId);
+ if (appEntry == null) {
+ continue;
+ }
+ recentApps.add(stat);
+ count++;
+ if (count >= SHOW_RECENT_APP_COUNT) {
+ break;
+ }
+ }
+ return recentApps;
+ }
+
+ /**
+ * Whether or not the app should be included in recent list.
+ */
+ private boolean shouldIncludePkgInRecents(UsageStats stat) {
+ final String pkgName = stat.getPackageName();
+ if (stat.getLastTimeUsed() < mCal.getTimeInMillis()) {
+ Log.d(TAG, "Invalid timestamp, skipping " + pkgName);
+ return false;
+ }
+
+ if (SKIP_SYSTEM_PACKAGES.contains(pkgName)) {
+ Log.d(TAG, "System package, skipping " + pkgName);
+ return false;
+ }
+ final Intent launchIntent = new Intent().addCategory(Intent.CATEGORY_LEANBACK_LAUNCHER)
+ .setPackage(pkgName);
+
+ if (mPm.resolveActivity(launchIntent, 0) == null) {
+ // Not visible on launcher -> likely not a user visible app, skip if non-instant.
+ final ApplicationsState.AppEntry appEntry =
+ mApplicationsState.getEntry(pkgName, mUserId);
+ if (appEntry == null || appEntry.info == null || !AppUtils.isInstant(appEntry.info)) {
+ Log.d(TAG, "Not a user visible or instant app, skipping " + pkgName);
+ return false;
+ }
+ }
+ return true;
+ }
+}
+
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/UninstallPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/UninstallPreferenceController.java
new file mode 100644
index 0000000..337b52a
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/UninstallPreferenceController.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.tv.settings.library.device.apps;
+
+import static com.android.tv.settings.library.device.apps.AppManagementState.REQUEST_UNINSTALL;
+import static com.android.tv.settings.library.device.apps.AppManagementState.REQUEST_UNINSTALL_UPDATES;
+
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.net.Uri;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+/** Preference controller to handle uninstall preference. */
+public class UninstallPreferenceController extends AppActionPreferenceController {
+ static final String KEY_UNINSTALL = "uninstall";
+ private final DevicePolicyManager mDpm;
+ private final Context mAppContext;
+
+ public UninstallPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ ApplicationsState.AppEntry appEntry, PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, appEntry, preferenceCompatManager);
+ mAppContext = context;
+ mDpm = context.getSystemService(DevicePolicyManager.class);
+ }
+
+ @Override
+ public void update() {
+ if (mAppEntry == null) {
+ return;
+ }
+ if (canUninstall()) {
+ mPreferenceCompat.setVisible(true);
+ mPreferenceCompat.setTitle(ResourcesUtil.getString(
+ mContext, "device_apps_app_management_uninstall"));
+ } else if (canUninstallUpdates()) {
+ mPreferenceCompat.setVisible(true);
+ mPreferenceCompat.setTitle(ResourcesUtil.getString(
+ mContext, "device_apps_app_management_uninstall_updates"));
+ } else {
+ mPreferenceCompat.setVisible(false);
+ }
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(boolean status) {
+ if (!mDisabledByAdmin) {
+ ((Activity) mContext).startActivityForResult(getIntent(),
+ canUninstall()
+ ? ManagerUtil.calculateCompoundCode(mStateIdentifier, REQUEST_UNINSTALL)
+ : ManagerUtil.calculateCompoundCode(mStateIdentifier,
+ REQUEST_UNINSTALL_UPDATES));
+ return true;
+ }
+ return super.handlePreferenceTreeClick(status);
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return null;
+ }
+
+ private Intent getIntent() {
+ if (isActiveDeviceAdmin()) {
+ return getUninstallDeviceAdminIntent();
+ } else {
+ // regular package uninstall
+ return getUninstallIntent();
+ }
+ }
+
+ private boolean isActiveDeviceAdmin() {
+ return (mDpm != null && mDpm.packageHasActiveAdmins(mAppEntry.info.packageName));
+ }
+
+ private Intent getUninstallIntent() {
+ final Uri packageURI = Uri.parse("package:" + mAppEntry.info.packageName);
+ final Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI);
+ uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, true);
+ uninstallIntent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
+ return uninstallIntent;
+ }
+
+ private Intent getUninstallDeviceAdminIntent() {
+ return null;
+ }
+
+
+ public boolean canUninstall() {
+ return canUninstall(mAppEntry);
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_UNINSTALL};
+ }
+
+ public static boolean canUninstall(ApplicationsState.AppEntry entry) {
+ return (entry.info.flags &
+ (ApplicationInfo.FLAG_UPDATED_SYSTEM_APP | ApplicationInfo.FLAG_SYSTEM)) == 0;
+ }
+
+ public boolean canUninstallUpdates() {
+ return (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/AlarmsAndRemindersState.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/AlarmsAndRemindersState.java
new file mode 100644
index 0000000..99a3aca
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/AlarmsAndRemindersState.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.tv.settings.library.device.apps.specialaccess;
+
+import android.Manifest;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.os.Bundle;
+import android.util.ArrayMap;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.device.apps.ApplicationsState;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+/**
+ * Settings state for managing "Alarms & Reminders" permission
+ */
+public class AlarmsAndRemindersState extends ManageAppOpState {
+ private AppOpsManager mAppOpsManager;
+ private final ArrayMap<String, ApplicationsState.AppEntry> mAppEntryByKey = new ArrayMap<>();
+
+ public AlarmsAndRemindersState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
+ }
+
+ @Override
+ public int getAppOpsOpCode() {
+ return AppOpsManager.OP_SCHEDULE_EXACT_ALARM;
+ }
+
+ @Override
+ public String getPermission() {
+ return Manifest.permission.SCHEDULE_EXACT_ALARM;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_ALARMS_AND_REMINDERS;
+ }
+
+ @Override
+ public PreferenceCompat createAppPreference(ApplicationsState.AppEntry entry) {
+ final PreferenceCompat appPref = mPreferenceCompatManager
+ .getOrCreatePrefCompat(entry.info.packageName);
+ appPref.setTitle(entry.label);
+ appPref.setIcon(entry.icon);
+
+ appPref.setSummary(getPreferenceSummary(entry).toString());
+ appPref.setChecked(((ManageAppOpState.PermissionState) entry.extraInfo).isAllowed());
+ appPref.setHasOnPreferenceChangeListener(true);
+ appPref.setType(PreferenceCompat.TYPE_SWITCH);
+ mAppEntryByKey.put(appPref.getKey()[0], entry);
+ return appPref;
+ }
+
+ private void setAlarmsAndRemindersAccess(ApplicationsState.AppEntry entry, boolean grant) {
+ mAppOpsManager.setMode(getAppOpsOpCode(),
+ entry.info.uid, entry.info.packageName,
+ grant ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_ERRORED);
+ updateAppList();
+ }
+
+ private CharSequence getPreferenceSummary(ApplicationsState.AppEntry entry) {
+ if (entry.extraInfo instanceof ManageAppOpState.PermissionState) {
+ return ((ManageAppOpState.PermissionState) entry.extraInfo).isAllowed()
+ ? ResourcesUtil.getString(mContext, "app_permission_summary_allowed")
+ : ResourcesUtil.getString(mContext, "app_permission_summary_not_allowed");
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ ApplicationsState.AppEntry appEntry = mAppEntryByKey.get(key[0]);
+ if (appEntry != null) {
+ setAlarmsAndRemindersAccess(appEntry, (Boolean) newValue);
+ }
+ return true;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/AppUsageAccessState.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/AppUsageAccessState.java
new file mode 100644
index 0000000..3933a1b
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/AppUsageAccessState.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.tv.settings.library.device.apps.specialaccess;
+
+import android.Manifest;
+import android.annotation.NonNull;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.os.Bundle;
+import android.util.ArrayMap;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.device.apps.ApplicationsState;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+/**
+ * State for controlling if apps can monitor app usage
+ */
+public class AppUsageAccessState extends ManageAppOpState {
+ private AppOpsManager mAppOpsManager;
+ private final ArrayMap<String, ApplicationsState.AppEntry> mAppEntryByKey = new ArrayMap<>();
+
+ public AppUsageAccessState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
+ }
+
+ @Override
+ public int getAppOpsOpCode() {
+ return AppOpsManager.OP_GET_USAGE_STATS;
+ }
+
+ @Override
+ public String getPermission() {
+ return Manifest.permission.PACKAGE_USAGE_STATS;
+ }
+
+ @NonNull
+ @Override
+ public PreferenceCompat createAppPreference(
+ com.android.tv.settings.library.device.apps.ApplicationsState.AppEntry entry) {
+ final PreferenceCompat appPref = mPreferenceCompatManager
+ .getOrCreatePrefCompat(entry.info.packageName);
+ appPref.setTitle(entry.label);
+ appPref.setIcon(entry.icon);
+
+ appPref.setSummary(getPreferenceSummary(entry).toString());
+ appPref.setChecked(((ManageAppOpState.PermissionState) entry.extraInfo).isAllowed());
+ appPref.setHasOnPreferenceChangeListener(true);
+ appPref.setType(PreferenceCompat.TYPE_SWITCH);
+ mAppEntryByKey.put(appPref.getKey()[0], entry);
+ return appPref;
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ ApplicationsState.AppEntry appEntry = mAppEntryByKey.get(key[0]);
+ if (appEntry != null) {
+ setAppUsageAccess(appEntry, (Boolean) newValue);
+ }
+ return true;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_APP_USAGE_ACCESS;
+ }
+
+ private void setAppUsageAccess(ApplicationsState.AppEntry entry, boolean grant) {
+ mAppOpsManager.setMode(AppOpsManager.OP_GET_USAGE_STATS,
+ entry.info.uid, entry.info.packageName,
+ grant ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED);
+ updateAppList();
+ }
+
+ private CharSequence getPreferenceSummary(ApplicationsState.AppEntry entry) {
+ if (entry.extraInfo instanceof ManageAppOpState.PermissionState) {
+ return ((ManageAppOpState.PermissionState) entry.extraInfo).isAllowed()
+ ? ResourcesUtil.getString(mContext, "app_permission_summary_allowed")
+ : ResourcesUtil.getString(mContext, "app_permission_summary_not_allowed");
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/HighPowerState.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/HighPowerState.java
new file mode 100644
index 0000000..28ab69a
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/HighPowerState.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.tv.settings.library.device.apps.specialaccess;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.content.Intent;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.device.apps.ApplicationsState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.List;
+
+/** {@link State} to handle high power screen. */
+public class HighPowerState extends PreferenceControllerState
+ implements ManageApplicationsController.Callback {
+ private PowerAllowlistBackend mPowerAllowlistBackend;
+ private ManageApplicationsController mManageApplicationsController;
+ private final ApplicationsState.AppFilter mFilter =
+ new ApplicationsState.CompoundFilter(
+ new ApplicationsState.CompoundFilter(
+ ApplicationsState.FILTER_WITHOUT_DISABLED_UNTIL_USED,
+ ApplicationsState.FILTER_ALL_ENABLED),
+ new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(ApplicationsState.AppEntry info) {
+ info.extraInfo =
+ mPowerAllowlistBackend.isAllowlisted(info.info.packageName);
+ return !ManageAppOpState.shouldIgnorePackage(mContext,
+ info.info.packageName, 0);
+ }
+ });
+
+ @Override
+ public void onAttach() {
+ super.onAttach();
+ mPowerAllowlistBackend = PowerAllowlistBackend.getInstance(mContext);
+ mManageApplicationsController = new ManageApplicationsController(mContext,
+ getStateIdentifier(),
+ getLifecycle(), mFilter, ApplicationsState.ALPHA_COMPARATOR, this,
+ mUIUpdateCallback);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mManageApplicationsController.updateAppList();
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object value) {
+ if (!(value instanceof Boolean)) {
+ return false;
+ }
+ if ((Boolean) value) {
+ mPowerAllowlistBackend.removeApp(key[0]);
+ } else {
+ mPowerAllowlistBackend.addApp(key[0]);
+ }
+ return true;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // no-op
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_HIGH_POWER;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+
+ public HighPowerState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @NonNull
+ @Override
+ public PreferenceCompat createAppPreference(ApplicationsState.AppEntry entry) {
+ final PreferenceCompat pref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ entry.info.packageName);
+ pref.setTitle(entry.label);
+ pref.setIcon(entry.icon);
+ if (mPowerAllowlistBackend.isSysAllowlisted(entry.info.packageName)) {
+ pref.setChecked(false);
+ pref.setEnabled(false);
+ } else {
+ pref.setEnabled(true);
+ pref.setChecked(!(Boolean) entry.extraInfo);
+ }
+ pref.setType(PreferenceCompat.TYPE_SWITCH);
+ pref.setHasOnPreferenceChangeListener(true);
+ updateSummary(pref);
+ return pref;
+ }
+
+ private void updateSummary(PreferenceCompat preference) {
+ if (preference.getKey().length != 1) {
+ return;
+ }
+ final String pkg = preference.getKey()[0];
+ if (mPowerAllowlistBackend.isSysAllowlisted(pkg)) {
+ preference.setSummary(ResourcesUtil.getString(mContext, "high_power_system"));
+ } else if (mPowerAllowlistBackend.isAllowlisted(pkg)) {
+ preference.setSummary(ResourcesUtil.getString(mContext, "string.high_power_on"));
+ } else {
+ preference.setSummary(ResourcesUtil.getString(mContext, "high_power_off"));
+ }
+ }
+
+ @NonNull
+ @Override
+ public PreferenceCompat getEmptyPreference() {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/ManageAppOpState.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/ManageAppOpState.java
new file mode 100644
index 0000000..422706d
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/ManageAppOpState.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.apps.specialaccess;
+
+import android.app.ActivityThread;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.internal.util.ArrayUtils;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.device.apps.ApplicationsState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/** Base {@link State} for special app access settings. */
+public abstract class ManageAppOpState extends PreferenceControllerState implements
+ ManageApplicationsController.Callback {
+ private static final String TAG = "ManageAppOps";
+
+ private IPackageManager mIPackageManager;
+ private AppOpsManager mAppOpsManager;
+
+ private ManageApplicationsController mManageApplicationsController;
+
+ public ManageAppOpState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onAttach() {
+ super.onAttach();
+ mManageApplicationsController = new ManageApplicationsController(mContext,
+ getStateIdentifier(), getLifecycle(), getAppFilter(), getAppComparator(), this,
+ mUIUpdateCallback);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mIPackageManager = ActivityThread.getPackageManager();
+ mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+
+ /**
+ * Subclasses may override this to provide an alternate app filter. The default filter inserts
+ * {@link PermissionState} objects into the {@link ApplicationsState.AppEntry#extraInfo} field.
+ *
+ * @return {@link ApplicationsState.AppFilter}
+ */
+ @NonNull
+ public ApplicationsState.AppFilter getAppFilter() {
+ return new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(ApplicationsState.AppEntry entry) {
+ entry.extraInfo = createPermissionStateFor(entry.info.packageName, entry.info.uid);
+ return !shouldIgnorePackage(
+ mContext, entry.info.packageName, customizedIgnoredPackagesArray())
+ && ((PermissionState) entry.extraInfo).isPermissible();
+ }
+ };
+ }
+
+ /** Provide array resource id for customized ignored packages */
+ public int customizedIgnoredPackagesArray() {
+ return 0;
+ }
+
+ /**
+ * @return AppOps code
+ */
+ public abstract int getAppOpsOpCode();
+
+ /**
+ * @return Manifest permission string
+ */
+ public abstract String getPermission();
+
+ private PermissionState createPermissionStateFor(String packageName, int uid) {
+ return new PermissionState(
+ hasRequestedAppOpPermission(getPermission(), packageName),
+ hasPermission(uid),
+ getAppOpMode(uid, packageName));
+ }
+
+ private boolean hasRequestedAppOpPermission(String permission, String packageName) {
+ try {
+ String[] packages = mIPackageManager.getAppOpPermissionPackages(permission);
+ return ArrayUtils.contains(packages, packageName);
+ } catch (RemoteException exc) {
+ Log.e(TAG, "PackageManager dead. Cannot get permission info");
+ return false;
+ }
+ }
+
+ private boolean hasPermission(int uid) {
+ try {
+ int result = mIPackageManager.checkUidPermission(getPermission(), uid);
+ return result == PackageManager.PERMISSION_GRANTED;
+ } catch (RemoteException e) {
+ Log.e(TAG, "PackageManager dead. Cannot get permission info");
+ return false;
+ }
+ }
+
+ private int getAppOpMode(int uid, String packageName) {
+ return mAppOpsManager.checkOpNoThrow(getAppOpsOpCode(), uid, packageName);
+ }
+
+ /**
+ * Checks for packages that should be ignored for further processing
+ */
+ static boolean shouldIgnorePackage(Context context, String packageName,
+ int customizedIgnoredPackagesArray) {
+ if (context == null) {
+ return true;
+ }
+ Set<String> ignoredPackageNames = null;
+ if (customizedIgnoredPackagesArray != 0) {
+ ignoredPackageNames = Arrays.stream(context.getResources()
+ .getStringArray(customizedIgnoredPackagesArray)).collect(Collectors.toSet());
+
+ }
+ return packageName.equals("android")
+ || packageName.equals("com.android.systemui")
+ || packageName.equals(context.getPackageName())
+ || (ignoredPackageNames != null && ignoredPackageNames.contains(packageName));
+ }
+
+ /**
+ * Subclasses may override this to provide an alternate comparator for sorting apps
+ *
+ * @return {@link Comparator} for {@link ApplicationsState.AppEntry} objects.
+ */
+ @Nullable
+ public Comparator<ApplicationsState.AppEntry> getAppComparator() {
+ return ApplicationsState.ALPHA_COMPARATOR;
+ }
+
+ /**
+ * Collection of information to be used as {@link ApplicationsState.AppEntry#extraInfo} objects
+ */
+ public static class PermissionState {
+ public final boolean permissionRequested;
+ public final boolean permissionGranted;
+ public final int appOpMode;
+
+ private PermissionState(boolean permissionRequested, boolean permissionGranted,
+ int appOpMode) {
+ this.permissionRequested = permissionRequested;
+ this.permissionGranted = permissionGranted;
+ this.appOpMode = appOpMode;
+ }
+
+ /**
+ * @return True if the permission is granted
+ */
+ public boolean isAllowed() {
+ if (appOpMode == AppOpsManager.MODE_DEFAULT) {
+ return permissionGranted;
+ } else {
+ return appOpMode == AppOpsManager.MODE_ALLOWED;
+ }
+ }
+
+ /**
+ * @return True if the permission is relevant
+ */
+ public boolean isPermissible() {
+ return appOpMode != AppOpsManager.MODE_DEFAULT || permissionRequested;
+ }
+
+ @Override
+ public String toString() {
+ return "[permissionGranted: " + permissionGranted
+ + ", permissionRequested: " + permissionRequested
+ + ", appOpMode: " + appOpMode
+ + "]";
+ }
+ }
+
+ /**
+ * Call to trigger the app list to update
+ */
+ public void updateAppList() {
+ mManageApplicationsController.updateAppList();
+ }
+
+ @NonNull
+ @Override
+ public PreferenceCompat createAppPreference(
+ com.android.tv.settings.library.device.apps.ApplicationsState.AppEntry entry) {
+ return null;
+ }
+
+ @NonNull
+ @Override
+ public PreferenceCompat getEmptyPreference() {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/ManageApplicationsController.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/ManageApplicationsController.java
new file mode 100644
index 0000000..e28f762
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/ManageApplicationsController.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.tv.settings.library.device.apps.specialaccess;
+
+import android.annotation.NonNull;
+import android.app.Application;
+import android.content.Context;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.device.apps.ApplicationsState;
+import com.android.tv.settings.library.util.lifecycle.Lifecycle;
+import com.android.tv.settings.library.util.lifecycle.LifecycleObserver;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * Create the list of {@link PreferenceCompat} based upon {@link ApplicationsState.AppEntry}
+ */
+public class ManageApplicationsController implements LifecycleObserver {
+ /**
+ * Use this preference key for a header pref not removed during refresh
+ */
+ public static final String HEADER_KEY = "header";
+
+ private final Lifecycle mLifecycle;
+ private final ApplicationsState.AppFilter mFilter;
+ private final Comparator<ApplicationsState.AppEntry> mComparator;
+ private final Callback mCallback;
+ private final ApplicationsState.Session mAppSession;
+ private final ApplicationsState mApplicationsState;
+ private final int mStateIdentifier;
+ private final UIUpdateCallback mUIUpdateCallback;
+
+ private final ApplicationsState.Callbacks mAppSessionCallbacks =
+ new ApplicationsState.Callbacks() {
+
+ @Override
+ public void onRunningStateChanged(boolean running) {
+ updateAppList();
+ }
+
+ @Override
+ public void onPackageListChanged() {
+ updateAppList();
+ }
+
+ @Override
+ public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) {
+ updateAppList(apps);
+ }
+
+ @Override
+ public void onPackageIconChanged() {
+ updateAppList();
+ }
+
+ @Override
+ public void onPackageSizeChanged(String packageName) {
+ updateAppList();
+ }
+
+ @Override
+ public void onAllSizesComputed() {
+ updateAppList();
+ }
+
+ @Override
+ public void onLauncherInfoChanged() {
+ updateAppList();
+ }
+
+ @Override
+ public void onLoadEntriesCompleted() {
+ updateAppList();
+ }
+ };
+
+ public ManageApplicationsController(@NonNull Context context, int stateIdentifier,
+ @NonNull Lifecycle lifecycle, ApplicationsState.AppFilter filter,
+ Comparator<ApplicationsState.AppEntry> comparator, Callback callback,
+ UIUpdateCallback uiUpdateCallback) {
+ mStateIdentifier = stateIdentifier;
+ lifecycle.addObserver(this);
+ mLifecycle = lifecycle;
+ mFilter = filter;
+ mComparator = comparator;
+ mApplicationsState = ApplicationsState.getInstance(
+ (Application) context.getApplicationContext());
+ mAppSession = mApplicationsState.newSession(mAppSessionCallbacks, mLifecycle);
+ mCallback = callback;
+ mUIUpdateCallback = uiUpdateCallback;
+ updateAppList();
+ }
+
+ /**
+ * Call this method to trigger the app list to refresh.
+ */
+ public void updateAppList() {
+ ApplicationsState.AppFilter filter = new ApplicationsState.CompoundFilter(
+ mFilter, ApplicationsState.FILTER_NOT_HIDE);
+ ArrayList<ApplicationsState.AppEntry> apps = mAppSession.rebuild(filter, mComparator);
+ if (apps != null) {
+ updateAppList(apps);
+ }
+ }
+
+ private void updateAppList(ArrayList<ApplicationsState.AppEntry> apps) {
+ final List<PreferenceCompat> newList = new ArrayList<>(apps.size() + 1);
+ for (final ApplicationsState.AppEntry entry : apps) {
+ mApplicationsState.ensureIcon(entry);
+ newList.add(mCallback.createAppPreference(entry));
+ }
+ newList.add(new PreferenceCompat(HEADER_KEY));
+ if (newList.size() == 1) {
+ newList.add(mCallback.getEmptyPreference());
+ }
+ mUIUpdateCallback.notifyUpdateAll(mStateIdentifier, newList);
+ }
+
+ /**
+ * Callback interface for this class to manipulate the list of app preferences.
+ */
+ public interface Callback {
+ /**
+ * Create a new instance of a {@link PreferenceCompat} subclass to be used to display an
+ * {@link ApplicationsState.AppEntry}
+ *
+ * @return New Preference object
+ */
+ @NonNull
+ PreferenceCompat createAppPreference(ApplicationsState.AppEntry entry);
+
+ /**
+ * @return {@link PreferenceCompat} object to be used as an empty state placeholder
+ */
+ @NonNull
+ PreferenceCompat getEmptyPreference();
+ }
+}
+
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/NotificationAccessState.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/NotificationAccessState.java
new file mode 100644
index 0000000..8168a6e
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/NotificationAccessState.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.apps.specialaccess;
+
+import android.app.NotificationManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageItemInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.service.notification.NotificationListenerService;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.IconDrawableFactory;
+import android.util.Log;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * State for managing notification listener permission
+ */
+public class NotificationAccessState extends PreferenceControllerState {
+ private static final String TAG = "NotificationAccess";
+
+ private static final String HEADER_KEY = "header";
+ private static final String KEY_NO_SERVICES = "no_services";
+ private static final String DEFAULT_PACKAGES_SEPARATOR = ":";
+ private ArraySet<String> mDefaultPackages;
+
+ private NotificationManager mNotificationManager;
+ private PackageManager mPackageManager;
+ private ServiceListing mServiceListing;
+ private IconDrawableFactory mIconDrawableFactory;
+ private final ArrayMap<String, ComponentName> mComponentNameByKey = new ArrayMap<>();
+
+ public NotificationAccessState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onAttach() {
+ super.onAttach();
+ mPackageManager = mContext.getPackageManager();
+ mNotificationManager = mContext.getSystemService(NotificationManager.class);
+ mIconDrawableFactory = IconDrawableFactory.newInstance(mContext);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mServiceListing = new ServiceListing.Builder(mContext)
+ .setTag(TAG)
+ .setSetting(Settings.Secure.ENABLED_NOTIFICATION_LISTENERS)
+ .setIntentAction(NotificationListenerService.SERVICE_INTERFACE)
+ .setPermission(android.Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE)
+ .setNoun("notification listener")
+ .build();
+ String packages = ResourcesUtil.getString(mContext, "config_defaultListenerAccessPackages");
+ if (!TextUtils.isEmpty(packages)) {
+ mDefaultPackages = new ArraySet<String>(packages.split(DEFAULT_PACKAGES_SEPARATOR));
+ } else {
+ mDefaultPackages = new ArraySet<>();
+ }
+ mServiceListing.addCallback(this::updateList);
+ }
+
+ private void updateList(List<ServiceInfo> services) {
+ List<PreferenceCompat> prefCompats = new ArrayList<>();
+ final PreferenceCompat header =
+ mPreferenceCompatManager.getOrCreatePrefCompat(HEADER_KEY);
+ services.sort(new PackageItemInfo.DisplayNameComparator(mPackageManager));
+
+ for (ServiceInfo service : services) {
+ final ComponentName cn = new ComponentName(service.packageName, service.name);
+ CharSequence title = null;
+ try {
+ title = mPackageManager.getApplicationInfo(
+ service.packageName, 0).loadLabel(mPackageManager);
+ } catch (PackageManager.NameNotFoundException e) {
+ // unlikely, as we are iterating over live services.
+ Log.w(TAG, "can't find package name", e);
+ }
+ final String summary = service.loadLabel(mPackageManager).toString();
+ final PreferenceCompat pref = new PreferenceCompat(cn.flattenToString());
+ pref.setIcon(mIconDrawableFactory.getBadgedIcon(service, service.applicationInfo,
+ UserHandle.getUserId(service.applicationInfo.uid)));
+ if (title != null && !title.equals(summary)) {
+ pref.setTitle(title.toString());
+ pref.setSummary(summary);
+ } else {
+ pref.setTitle(summary);
+ }
+ pref.setChecked(mNotificationManager.isNotificationListenerAccessGranted(cn));
+ // Prevent the user from removing access from a default notification listener.
+ if (mDefaultPackages.contains(cn.getPackageName()) && ManagerUtil.isChecked(pref)) {
+ pref.setEnabled(false);
+ pref.setSummary(
+ ResourcesUtil.getString(mContext,
+ "default_notification_access_package_summary"));
+ }
+ pref.setType(PreferenceCompat.TYPE_SWITCH);
+ prefCompats.add(pref);
+ mComponentNameByKey.put(pref.getKey()[0], cn);
+ }
+ if (services.isEmpty()) {
+ final PreferenceCompat preference = new PreferenceCompat(KEY_NO_SERVICES);
+ preference.setTitle(
+ ResourcesUtil.getString(mContext, "no_notification_listeners"));
+ }
+ mUIUpdateCallback.notifyUpdateAll(getStateIdentifier(), prefCompats);
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ final ComponentName cn = mComponentNameByKey.get(key[0]);
+ if (cn != null) {
+ mNotificationManager.setNotificationListenerAccessGranted(cn, (boolean) newValue);
+ }
+ return true;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mServiceListing.reload();
+ mServiceListing.setListening(true);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mServiceListing.setListening(false);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // no-op
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_NOTIFICATION_ACCESS;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/PictureInPictureState.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/PictureInPictureState.java
new file mode 100644
index 0000000..fe26023
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/PictureInPictureState.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.tv.settings.library.device.apps.specialaccess;
+
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.device.apps.ApplicationsState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+
+import java.util.List;
+
+/**
+ * State for managing which apps are granted PIP access
+ */
+public class PictureInPictureState extends PreferenceControllerState implements
+ ManageApplicationsController.Callback {
+ private static final String TAG = "PictureInPicture";
+
+ private ManageApplicationsController mManageApplicationsController;
+ private AppOpsManager mAppOpsManager;
+ private final ArrayMap<String, ApplicationsState.AppEntry> mAppEntryByKey = new ArrayMap<>();
+
+ private final ApplicationsState.AppFilter mFilter =
+ new ApplicationsState.CompoundFilter(
+ new ApplicationsState.CompoundFilter(
+ ApplicationsState.FILTER_WITHOUT_DISABLED_UNTIL_USED,
+ ApplicationsState.FILTER_ALL_ENABLED),
+
+ new ApplicationsState.AppFilter() {
+ @Override
+ public void init() {
+ }
+
+ @Override
+ public boolean filterApp(ApplicationsState.AppEntry info) {
+ info.extraInfo = mAppOpsManager.checkOpNoThrow(
+ AppOpsManager.OP_PICTURE_IN_PICTURE,
+ info.info.uid,
+ info.info.packageName) == AppOpsManager.MODE_ALLOWED;
+ return !ManageAppOpState.shouldIgnorePackage(
+ mContext, info.info.packageName, 0)
+ && checkPackageHasPipActivities(info.info.packageName);
+ }
+ });
+
+ public PictureInPictureState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ private boolean checkPackageHasPipActivities(String packageName) {
+ try {
+ final PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(
+ packageName, PackageManager.GET_ACTIVITIES);
+ if (packageInfo.activities == null) {
+ return false;
+ }
+ for (ActivityInfo info : packageInfo.activities) {
+ if (info.supportsPictureInPicture()) {
+ return true;
+ }
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "Exception while fetching package info for " + packageName, e);
+ return false;
+ }
+ return false;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
+ mManageApplicationsController = new ManageApplicationsController(mContext,
+ getStateIdentifier(),
+ getLifecycle(), mFilter, ApplicationsState.ALPHA_COMPARATOR, this,
+ mUIUpdateCallback);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mManageApplicationsController.updateAppList();
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_PICTURE_IN_PICTURE;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+
+ @Override
+ public PreferenceCompat createAppPreference(ApplicationsState.AppEntry entry) {
+ final PreferenceCompat appPref = mPreferenceCompatManager
+ .getOrCreatePrefCompat(entry.info.packageName);
+ appPref.setTitle(entry.label);
+ appPref.setIcon(entry.icon);
+ appPref.setChecked((Boolean) entry.extraInfo);
+ mAppEntryByKey.put(appPref.getKey()[0], entry);
+ appPref.setType(PreferenceCompat.TYPE_SWITCH);
+ appPref.setHasOnPreferenceChangeListener(true);
+ return appPref;
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ ApplicationsState.AppEntry appEntry = mAppEntryByKey.get(key);
+ if (appEntry != null) {
+ mAppOpsManager.setMode(AppOpsManager.OP_PICTURE_IN_PICTURE,
+ appEntry.info.uid,
+ appEntry.info.packageName,
+ (Boolean) newValue ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_ERRORED);
+ }
+ return true;
+ }
+
+
+ @Override
+ public PreferenceCompat getEmptyPreference() {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/PowerAllowlistBackend.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/PowerAllowlistBackend.java
new file mode 100644
index 0000000..2a42cc2
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/PowerAllowlistBackend.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.apps.specialaccess;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.IDeviceIdleController;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.telecom.DefaultDialerManager;
+import android.text.TextUtils;
+import android.util.ArraySet;
+import android.util.Log;
+
+import com.android.internal.telephony.SmsApplication;
+import com.android.internal.util.ArrayUtils;
+
+/**
+ * Handles getting/changing the allowlist for the exceptions to battery saving features.
+ */
+public class PowerAllowlistBackend {
+
+ private static final String TAG = "PowerAllowlistBackend";
+
+ private static final String DEVICE_IDLE_SERVICE = "deviceidle";
+
+ private static PowerAllowlistBackend sInstance;
+
+ private final Context mAppContext;
+ private final IDeviceIdleController mDeviceIdleService;
+ private final ArraySet<String> mAllowlistedApps = new ArraySet<>();
+ private final ArraySet<String> mSysAllowlistedApps = new ArraySet<>();
+ private final ArraySet<String> mDefaultActiveApps = new ArraySet<>();
+
+ public PowerAllowlistBackend(Context context) {
+ this(context, IDeviceIdleController.Stub.asInterface(
+ ServiceManager.getService(DEVICE_IDLE_SERVICE)));
+ }
+
+ PowerAllowlistBackend(Context context, IDeviceIdleController deviceIdleService) {
+ mAppContext = context.getApplicationContext();
+ mDeviceIdleService = deviceIdleService;
+ refreshList();
+ }
+
+ public int getAllowlistSize() {
+ return mAllowlistedApps.size();
+ }
+
+ /**
+ * Check if target package is in System allow list
+ */
+ public boolean isSysAllowlisted(String pkg) {
+ return mSysAllowlistedApps.contains(pkg);
+ }
+
+ /**
+ * Check if target package is in allow list
+ */
+ public boolean isAllowlisted(String pkg) {
+ if (mAllowlistedApps.contains(pkg)) {
+ return true;
+ }
+
+ return isDefaultActiveApp(pkg);
+ }
+
+ /**
+ * Check if it is default active app in multiple area(i.e. SMS, Dialer, Device admin..)
+ */
+ public boolean isDefaultActiveApp(String pkg) {
+ // Additionally, check if pkg is default dialer/sms. They are considered essential apps and
+ // should be automatically allowlisted (otherwise user may be able to set restriction on
+ // them, leading to bad device behavior.)
+
+ if (mDefaultActiveApps.contains(pkg)) {
+ return true;
+ }
+
+ final DevicePolicyManager devicePolicyManager = mAppContext.getSystemService(
+ DevicePolicyManager.class);
+ return devicePolicyManager.packageHasActiveAdmins(pkg);
+ }
+
+ /**
+ * @param pkgs a list of packageName
+ * @return true when one of package is in allow list
+ */
+ public boolean isAllowlisted(String[] pkgs) {
+ if (ArrayUtils.isEmpty(pkgs)) {
+ return false;
+ }
+ for (String pkg : pkgs) {
+ if (isAllowlisted(pkg)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Add app into power save allow list.
+ *
+ * @param pkg packageName
+ */
+ public void addApp(String pkg) {
+ try {
+ mDeviceIdleService.addPowerSaveWhitelistApp(pkg);
+ mAllowlistedApps.add(pkg);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Unable to reach IDeviceIdleController", e);
+ }
+ }
+
+ /**
+ * Remove package from power save allow list.
+ */
+ public void removeApp(String pkg) {
+ try {
+ mDeviceIdleService.removePowerSaveWhitelistApp(pkg);
+ mAllowlistedApps.remove(pkg);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Unable to reach IDeviceIdleController", e);
+ }
+ }
+
+ /**
+ * Refresh all of lists
+ */
+ public void refreshList() {
+ mSysAllowlistedApps.clear();
+ mAllowlistedApps.clear();
+ mDefaultActiveApps.clear();
+ if (mDeviceIdleService == null) {
+ return;
+ }
+ try {
+ final String[] allowlistedApps = mDeviceIdleService.getFullPowerWhitelist();
+ for (String app : allowlistedApps) {
+ mAllowlistedApps.add(app);
+ }
+ final String[] sysAllowlistedApps = mDeviceIdleService.getSystemPowerWhitelist();
+ for (String app : sysAllowlistedApps) {
+ mSysAllowlistedApps.add(app);
+ }
+ final boolean hasTelephony = mAppContext.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_TELEPHONY);
+ final ComponentName defaultSms = SmsApplication.getDefaultSmsApplication(mAppContext,
+ true /* updateIfNeeded */);
+ final String defaultDialer = DefaultDialerManager.getDefaultDialerApplication(
+ mAppContext);
+
+ if (hasTelephony) {
+ if (defaultSms != null) {
+ mDefaultActiveApps.add(defaultSms.getPackageName());
+ }
+ if (!TextUtils.isEmpty(defaultDialer)) {
+ mDefaultActiveApps.add(defaultDialer);
+ }
+ }
+ } catch (RemoteException e) {
+ Log.w(TAG, "Unable to reach IDeviceIdleController", e);
+ }
+ }
+
+ /**
+ * @return a PowerAllowlistBackend object
+ */
+ public static PowerAllowlistBackend getInstance(Context context) {
+ if (sInstance == null) {
+ sInstance = new PowerAllowlistBackend(context);
+ }
+ return sInstance;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/ServiceListing.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/ServiceListing.java
new file mode 100644
index 0000000..dc26636
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/ServiceListing.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.tv.settings.library.device.apps.specialaccess;
+
+import android.app.ActivityManager;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.provider.Settings;
+import android.util.Slog;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+/**
+ * Class for managing services matching a given intent and requesting a given permission.
+ */
+public class ServiceListing {
+ private final ContentResolver mContentResolver;
+ private final Context mContext;
+ private final String mTag;
+ private final String mSetting;
+ private final String mIntentAction;
+ private final String mPermission;
+ private final String mNoun;
+ private final boolean mAddDeviceLockedFlags;
+ private final HashSet<ComponentName> mEnabledServices = new HashSet<>();
+ private final List<ServiceInfo> mServices = new ArrayList<>();
+ private final List<Callback> mCallbacks = new ArrayList<>();
+
+ private boolean mListening;
+
+ private ServiceListing(Context context, String tag,
+ String setting, String intentAction, String permission, String noun,
+ boolean addDeviceLockedFlags) {
+ mContentResolver = context.getContentResolver();
+ mContext = context;
+ mTag = tag;
+ mSetting = setting;
+ mIntentAction = intentAction;
+ mPermission = permission;
+ mNoun = noun;
+ mAddDeviceLockedFlags = addDeviceLockedFlags;
+ }
+
+ public void addCallback(Callback callback) {
+ mCallbacks.add(callback);
+ }
+
+ public void removeCallback(Callback callback) {
+ mCallbacks.remove(callback);
+ }
+
+ public void setListening(boolean listening) {
+ if (mListening == listening) return;
+ mListening = listening;
+ if (mListening) {
+ // listen for package changes
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_PACKAGE_ADDED);
+ filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
+ filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+ filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
+ filter.addDataScheme("package");
+ mContext.registerReceiver(mPackageReceiver, filter);
+ mContentResolver.registerContentObserver(Settings.Secure.getUriFor(mSetting),
+ false, mSettingsObserver);
+ } else {
+ mContext.unregisterReceiver(mPackageReceiver);
+ mContentResolver.unregisterContentObserver(mSettingsObserver);
+ }
+ }
+
+ private void saveEnabledServices() {
+ StringBuilder sb = null;
+ for (ComponentName cn : mEnabledServices) {
+ if (sb == null) {
+ sb = new StringBuilder();
+ } else {
+ sb.append(':');
+ }
+ sb.append(cn.flattenToString());
+ }
+ Settings.Secure.putString(mContentResolver, mSetting,
+ sb != null ? sb.toString() : "");
+ }
+
+ private void loadEnabledServices() {
+ mEnabledServices.clear();
+ final String flat = Settings.Secure.getString(mContentResolver, mSetting);
+ if (flat != null && !"".equals(flat)) {
+ final String[] names = flat.split(":");
+ for (String name : names) {
+ final ComponentName cn = ComponentName.unflattenFromString(name);
+ if (cn != null) {
+ mEnabledServices.add(cn);
+ }
+ }
+ }
+ }
+
+ public void reload() {
+ loadEnabledServices();
+ mServices.clear();
+ final int user = ActivityManager.getCurrentUser();
+
+ int flags = PackageManager.GET_SERVICES | PackageManager.GET_META_DATA;
+ if (mAddDeviceLockedFlags) {
+ flags |= PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
+ }
+
+ final PackageManager pmWrapper = mContext.getPackageManager();
+ List<ResolveInfo> installedServices = pmWrapper.queryIntentServicesAsUser(
+ new Intent(mIntentAction), flags, user);
+
+ for (ResolveInfo resolveInfo : installedServices) {
+ ServiceInfo info = resolveInfo.serviceInfo;
+
+ if (!mPermission.equals(info.permission)) {
+ Slog.w(mTag, "Skipping " + mNoun + " service "
+ + info.packageName + "/" + info.name
+ + ": it does not require the permission "
+ + mPermission);
+ continue;
+ }
+ mServices.add(info);
+ }
+ for (Callback callback : mCallbacks) {
+ callback.onServicesReloaded(mServices);
+ }
+ }
+
+ public boolean isEnabled(ComponentName cn) {
+ return mEnabledServices.contains(cn);
+ }
+
+ public void setEnabled(ComponentName cn, boolean enabled) {
+ if (enabled) {
+ mEnabledServices.add(cn);
+ } else {
+ mEnabledServices.remove(cn);
+ }
+ saveEnabledServices();
+ }
+
+ private final ContentObserver mSettingsObserver = new ContentObserver(new Handler()) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ reload();
+ }
+ };
+
+ private final BroadcastReceiver mPackageReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ reload();
+ }
+ };
+
+ public interface Callback {
+ void onServicesReloaded(List<ServiceInfo> services);
+ }
+
+ public static class Builder {
+ private final Context mContext;
+ private String mTag;
+ private String mSetting;
+ private String mIntentAction;
+ private String mPermission;
+ private String mNoun;
+ private boolean mAddDeviceLockedFlags = false;
+
+ public Builder(Context context) {
+ mContext = context;
+ }
+
+ public Builder setTag(String tag) {
+ mTag = tag;
+ return this;
+ }
+
+ public Builder setSetting(String setting) {
+ mSetting = setting;
+ return this;
+ }
+
+ public Builder setIntentAction(String intentAction) {
+ mIntentAction = intentAction;
+ return this;
+ }
+
+ public Builder setPermission(String permission) {
+ mPermission = permission;
+ return this;
+ }
+
+ public Builder setNoun(String noun) {
+ mNoun = noun;
+ return this;
+ }
+
+ /**
+ * Set to true to add support for both MATCH_DIRECT_BOOT_AWARE and
+ * MATCH_DIRECT_BOOT_UNAWARE flags when querying PackageManager. Required to get results
+ * prior to the user unlocking the device for the first time.
+ */
+ public Builder setAddDeviceLockedFlags(boolean addDeviceLockedFlags) {
+ mAddDeviceLockedFlags = addDeviceLockedFlags;
+ return this;
+ }
+
+ public ServiceListing build() {
+ return new ServiceListing(mContext, mTag, mSetting, mIntentAction, mPermission, mNoun,
+ mAddDeviceLockedFlags);
+ }
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/SpecialAppAccessState.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/SpecialAppAccessState.java
new file mode 100644
index 0000000..2558a77
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/SpecialAppAccessState.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.tv.settings.library.device.apps.specialaccess;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+
+import java.util.List;
+
+/** {@link State} to handle special access screen. */
+public class SpecialAppAccessState extends PreferenceControllerState {
+ private static final String KEY_FEATURE_PIP = "picture_in_picture";
+ static final String KEY_FEATURE_NOTIFICATION_ACCESS = "notification_access";
+ private static final String[] DISABLED_FEATURES_LOW_RAM_TV =
+ new String[]{KEY_FEATURE_PIP, KEY_FEATURE_NOTIFICATION_ACCESS};
+
+ public SpecialAppAccessState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onResume() {
+ updatePreferenceStates();
+ }
+
+ protected void updatePreferenceStates() {
+ ActivityManager activityManager = (ActivityManager) mContext
+ .getSystemService(Context.ACTIVITY_SERVICE);
+ if (activityManager.isLowRamDevice()) {
+ for (String disabledFeature : DISABLED_FEATURES_LOW_RAM_TV) {
+ PreferenceCompat preferenceCompat =
+ mPreferenceCompatManager.getOrCreatePrefCompat(disabledFeature);
+ preferenceCompat.setShouldRemove(true);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), preferenceCompat);
+ }
+ }
+ PackageManager packageManager = mContext.getPackageManager();
+ if (!packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)) {
+ PreferenceCompat preferenceCompat =
+ mPreferenceCompatManager.getOrCreatePrefCompat(KEY_FEATURE_PIP);
+ preferenceCompat.setShouldRemove(true);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), preferenceCompat);
+ }
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_SPECIAL_ACCESS;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/SystemAlertWindowState.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/SystemAlertWindowState.java
new file mode 100644
index 0000000..eb9e511
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/SystemAlertWindowState.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.tv.settings.library.device.apps.specialaccess;
+
+import android.Manifest;
+import android.annotation.NonNull;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.os.Bundle;
+import android.util.ArrayMap;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.device.apps.ApplicationsState;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+/**
+ * Settings state for managing "Display over other apps" permission
+ */
+public class SystemAlertWindowState extends ManageAppOpState {
+ private AppOpsManager mAppOpsManager;
+ private final ArrayMap<String, ApplicationsState.AppEntry> mAppEntryByKey = new ArrayMap<>();
+
+ public SystemAlertWindowState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
+ }
+
+ @Override
+ public int getAppOpsOpCode() {
+ return AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
+ }
+
+ @Override
+ public String getPermission() {
+ return Manifest.permission.SYSTEM_ALERT_WINDOW;
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object value) {
+ ApplicationsState.AppEntry appEntry = mAppEntryByKey.get(key);
+ if (appEntry != null) {
+ setSystemAlertWindowAccess(appEntry, (Boolean) value);
+ }
+ return true;
+ }
+
+ @NonNull
+ @Override
+ public PreferenceCompat createAppPreference(ApplicationsState.AppEntry entry) {
+ final PreferenceCompat appPref = mPreferenceCompatManager
+ .getOrCreatePrefCompat(entry.info.packageName);
+ appPref.setTitle(entry.label);
+ appPref.setIcon(entry.icon);
+ appPref.setSummary(getPreferenceSummary(entry));
+ appPref.setChecked(((ManageAppOpState.PermissionState) entry.extraInfo).isAllowed());
+ appPref.setType(PreferenceCompat.TYPE_SWITCH);
+ appPref.setHasOnPreferenceChangeListener(true);
+ mAppEntryByKey.put(appPref.getKey()[0], entry);
+ return appPref;
+ }
+
+ private void setSystemAlertWindowAccess(ApplicationsState.AppEntry entry, boolean grant) {
+ mAppOpsManager.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
+ entry.info.uid, entry.info.packageName,
+ grant ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_ERRORED);
+ updateAppList();
+ }
+
+ private String getPreferenceSummary(ApplicationsState.AppEntry entry) {
+ if (entry.extraInfo instanceof ManageAppOpState.PermissionState) {
+ return ((ManageAppOpState.PermissionState) entry.extraInfo).isAllowed()
+ ? ResourcesUtil.getString(mContext, "app_permission_summary_allowed")
+ : ResourcesUtil.getString(mContext, "app_permission_summary_not_allowed");
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_SYSTEM_ALERT_WINDOW;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/WriteSettingsState.java b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/WriteSettingsState.java
new file mode 100644
index 0000000..8118497
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/apps/specialaccess/WriteSettingsState.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.tv.settings.library.device.apps.specialaccess;
+
+import android.Manifest;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.os.Bundle;
+import android.util.ArrayMap;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.device.apps.ApplicationsState;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+/**
+ * Settings state for managing apps which can write system settings
+ */
+public class WriteSettingsState extends ManageAppOpState {
+ private AppOpsManager mAppOpsManager;
+ private final ArrayMap<String, ApplicationsState.AppEntry> mAppEntryByKey = new ArrayMap<>();
+
+ public WriteSettingsState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public int getAppOpsOpCode() {
+ return AppOpsManager.OP_WRITE_SETTINGS;
+ }
+
+ @Override
+ public String getPermission() {
+ return Manifest.permission.WRITE_SETTINGS;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_WRITE_SETTINGS;
+ }
+
+ @Override
+ public PreferenceCompat createAppPreference(ApplicationsState.AppEntry entry) {
+ final PreferenceCompat appPref = mPreferenceCompatManager
+ .getOrCreatePrefCompat(entry.info.packageName);
+ appPref.setTitle(entry.label);
+ appPref.setIcon(entry.icon);
+
+ appPref.setSummary(getPreferenceSummary(entry).toString());
+ appPref.setChecked(((ManageAppOpState.PermissionState) entry.extraInfo).isAllowed());
+ appPref.setType(PreferenceCompat.TYPE_SWITCH);
+ appPref.setHasOnPreferenceChangeListener(true);
+ mAppEntryByKey.put(appPref.getKey()[0], entry);
+ return appPref;
+ }
+
+ private CharSequence getPreferenceSummary(ApplicationsState.AppEntry entry) {
+ if (entry.extraInfo instanceof ManageAppOpState.PermissionState) {
+ return ((ManageAppOpState.PermissionState) entry.extraInfo).isAllowed()
+ ? ResourcesUtil.getString(mContext, "write_settings_on")
+ : ResourcesUtil.getString(mContext, "write_settings_off");
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ ApplicationsState.AppEntry appEntry = mAppEntryByKey.get(key);
+ if (appEntry != null) {
+ setWriteSettingsAccess(appEntry, (Boolean) newValue);
+ }
+ return true;
+ }
+
+
+ private void setWriteSettingsAccess(ApplicationsState.AppEntry entry, Boolean grant) {
+ mAppOpsManager.setMode(AppOpsManager.OP_WRITE_SETTINGS,
+ entry.info.uid, entry.info.packageName,
+ grant ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_ERRORED);
+ updateAppList();
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/ActiveDreamPC.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/ActiveDreamPC.java
new file mode 100644
index 0000000..8ff5c4a
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/ActiveDreamPC.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.display.daydream;
+
+import static com.android.tv.settings.library.device.display.daydream.DaydreamState.KEY_ACTIVE_DREAM;
+
+import android.content.Context;
+import android.os.UserManager;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+public class ActiveDreamPC extends RestrictedPreferenceController {
+ public ActiveDreamPC(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_ACTIVE_DREAM};
+ }
+
+ @Override
+ public void update() {
+ mPreferenceCompat.setHasOnPreferenceChangeListener(true);
+ mPreferenceCompat.setType(PreferenceCompat.TYPE_LIST);
+ UserManager userManager = UserManager.get(mContext);
+ if (userManager.hasUserRestriction(getAttrUserRestriction())) {
+ mPreferenceCompat.setEnabled(false);
+ }
+ super.update();
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ void setEntries(CharSequence[] dreamEntries) {
+ mPreferenceCompat.setEntries(dreamEntries);
+ }
+
+ void setEntryValues(CharSequence[] dreamEntryValues) {
+ mPreferenceCompat.setEntryValues(dreamEntryValues);
+ }
+
+ void setValue(String value) {
+ mPreferenceCompat.setValue(value);
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/AllowTurnScreenOffWithWakeLockPC.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/AllowTurnScreenOffWithWakeLockPC.java
new file mode 100644
index 0000000..2abe3c7
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/AllowTurnScreenOffWithWakeLockPC.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.tv.settings.library.device.display.daydream;
+
+import static android.provider.Settings.Secure.ATTENTIVE_TIMEOUT;
+import static android.provider.Settings.Secure.SLEEP_TIMEOUT;
+
+import static com.android.tv.settings.library.PreferenceCompat.STATUS_ON;
+import static com.android.tv.settings.library.device.display.daydream.EnergySaverState.KEY_ALLOW_TURN_SCREEN_OFF;
+
+import android.content.Context;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.text.format.DateUtils;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+public class AllowTurnScreenOffWithWakeLockPC extends RestrictedPreferenceController {
+ private static final int DEFAULT_SLEEP_TIME_MS = (int) (24 * DateUtils.HOUR_IN_MILLIS);
+
+ public AllowTurnScreenOffWithWakeLockPC(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public void update() {
+ updateAllowTurnScreenOffWithWakeLockPref();
+ }
+
+ private void updateAllowTurnScreenOffWithWakeLockPref() {
+ UserManager userManager = UserManager.get(mContext);
+ if (userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT)
+ && !mPreferenceCompat.isDisabledByAdmin()) {
+ mPreferenceCompat.setEnabled(false);
+ }
+ mPreferenceCompat.setType(PreferenceCompat.TYPE_SWITCH);
+ boolean canChangeEnabled = !userManager
+ .hasUserRestriction(UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT);
+ if (getSleepTime() == -1) {
+ mPreferenceCompat.setChecked(false);
+ if (canChangeEnabled) {
+ mPreferenceCompat.setEnabled(false);
+ }
+ } else if (getAttentiveSleepTime() == -1) {
+ mPreferenceCompat.setChecked(false);
+ if (canChangeEnabled) {
+ mPreferenceCompat.setEnabled(true);
+ }
+ } else {
+ mPreferenceCompat.setChecked(true);
+ if (canChangeEnabled) {
+ mPreferenceCompat.setEnabled(true);
+ }
+ }
+ }
+
+ boolean isChecked() {
+ return mPreferenceCompat.getChecked() == STATUS_ON;
+ }
+
+ private int getSleepTime() {
+ return Settings.Secure.getInt(mContext.getContentResolver(), SLEEP_TIMEOUT,
+ DEFAULT_SLEEP_TIME_MS);
+ }
+
+ private int getAttentiveSleepTime() {
+ return Settings.Secure.getInt(mContext.getContentResolver(), ATTENTIVE_TIMEOUT,
+ DEFAULT_SLEEP_TIME_MS);
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT;
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_ALLOW_TURN_SCREEN_OFF};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/DaydreamState.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/DaydreamState.java
new file mode 100644
index 0000000..999cb34
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/DaydreamState.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.display.daydream;
+
+import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
+
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.text.format.DateUtils;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.settingslib.DreamBackend;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * State to provide data for rendering daydream settings screen.
+ */
+public class DaydreamState extends PreferenceControllerState {
+ private static final String TAG = "DaydreamState";
+
+ static final String KEY_ACTIVE_DREAM = "activeDream";
+ static final String KEY_DREAM_TIME = "dreamTime";
+ static final String KEY_DREAM_NOW = "dreamNow";
+
+ private static final String DREAM_COMPONENT_NONE = "NONE";
+ private static final String PACKAGE_SCHEME = "package";
+
+ private static final int DEFAULT_DREAM_TIME_MS = (int) (30 * DateUtils.MINUTE_IN_MILLIS);
+
+ private final PackageReceiver mPackageReceiver = new PackageReceiver();
+ private DreamTimePC mDreamTimePC;
+ private ActiveDreamPC mActiveDreamPC;
+ private PreferenceCompat mDreamNowPref;
+
+ private DreamBackend mBackend;
+ private final Map<String, DreamBackend.DreamInfo> mDreamInfos = new ArrayMap<>();
+
+ public DaydreamState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mBackend = new DreamBackend(mContext);
+ refreshActiveDreamPref();
+ if (mDreamTimePC != null) {
+ mDreamTimePC.setValue(Integer.toString(getDreamTime()));
+ }
+
+ mDreamNowPref = mPreferenceCompatManager.getOrCreatePrefCompat(new String[]{KEY_DREAM_NOW});
+ mDreamNowPref.setEnabled(mBackend.isEnabled());
+ }
+
+
+ private int getDreamTime() {
+ return Settings.System.getInt(mContext.getContentResolver(), SCREEN_OFF_TIMEOUT,
+ DEFAULT_DREAM_TIME_MS);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ refreshFromBackend();
+
+ // listen for package changes
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_PACKAGE_ADDED);
+ filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
+ filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+ filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
+ filter.addDataScheme(PACKAGE_SCHEME);
+ mContext.registerReceiver(mPackageReceiver, filter);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mContext.unregisterReceiver(mPackageReceiver);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_DAYDREAM;
+ }
+
+ private void refreshActiveDreamPref() {
+ if (mActiveDreamPC == null) {
+ return;
+ }
+
+ final List<DreamBackend.DreamInfo> infos = mBackend.getDreamInfos();
+ final CharSequence[] dreamEntries = new CharSequence[infos.size() + 1];
+ final CharSequence[] dreamEntryValues = new CharSequence[infos.size() + 1];
+ refreshDreamInfoMap(infos, dreamEntries, dreamEntryValues);
+ final ComponentName currentDreamComponent = mBackend.getActiveDream();
+
+ mActiveDreamPC.setEntries(dreamEntries);
+ mActiveDreamPC.setEntryValues(dreamEntryValues);
+ mActiveDreamPC.setValue(mBackend.isEnabled() && currentDreamComponent != null
+ ? currentDreamComponent.toShortString() : DREAM_COMPONENT_NONE);
+ mActiveDreamPC.updateAndNotify();
+ }
+
+ private void refreshDreamInfoMap(List<DreamBackend.DreamInfo> infos,
+ CharSequence[] listEntries, CharSequence[] listEntryValues) {
+ mDreamInfos.clear();
+ listEntries[0] = ResourcesUtil.getString(mContext, "device_daydreams_none");
+ listEntryValues[0] = DREAM_COMPONENT_NONE;
+ int index = 1;
+ for (final DreamBackend.DreamInfo info : infos) {
+ final String componentNameString = info.componentName.toShortString();
+ mDreamInfos.put(componentNameString, info);
+ listEntries[index] = info.caption;
+ listEntryValues[index] = componentNameString;
+ index++;
+ }
+ }
+
+ private void refreshFromBackend() {
+ if (mContext == null) {
+ Log.d(TAG, "No activity, not refreshing");
+ return;
+ }
+
+ refreshActiveDreamPref();
+ if (mDreamTimePC != null) {
+ mDreamTimePC.setValue(Integer.toString(getDreamTime()));
+ }
+
+ if (mDreamNowPref != null) {
+ mDreamNowPref.setEnabled(mBackend.isEnabled());
+ }
+ }
+
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ switch (key[0]) {
+ case KEY_ACTIVE_DREAM:
+ setActiveDream((String) newValue);
+ return true;
+ case KEY_DREAM_TIME:
+ final int sleepTimeout = Integer.parseInt((String) newValue);
+ setDreamTime(sleepTimeout);
+ return true;
+ }
+ return super.onPreferenceChange(key, newValue);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ switch (key[0]) {
+ case KEY_DREAM_NOW:
+ mBackend.startDreaming();
+ return true;
+ default:
+ return super.onPreferenceTreeClick(key, status);
+ }
+ }
+
+ private void setActiveDream(String componentNameString) {
+ final DreamBackend.DreamInfo dreamInfo = mDreamInfos.get(componentNameString);
+ if (dreamInfo != null) {
+ if (dreamInfo.settingsComponentName != null) {
+ mContext.startActivity(new Intent().setComponent(dreamInfo.settingsComponentName));
+ }
+ if (!mBackend.isEnabled()) {
+ mBackend.setEnabled(true);
+ }
+ if (!Objects.equals(mBackend.getActiveDream(), dreamInfo.componentName)) {
+ mBackend.setActiveDream(dreamInfo.componentName);
+ }
+ } else {
+ if (mBackend.isEnabled()) {
+ mBackend.setActiveDream(null);
+ mBackend.setEnabled(false);
+ }
+ }
+ }
+
+ private void setDreamTime(int ms) {
+ Settings.System.putInt(mContext.getContentResolver(), SCREEN_OFF_TIMEOUT, ms);
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ List<AbstractPreferenceController> preferenceControllers = new ArrayList<>();
+ mDreamTimePC = new DreamTimePC(mContext, mUIUpdateCallback, getStateIdentifier(),
+ mPreferenceCompatManager);
+ mActiveDreamPC = new ActiveDreamPC(mContext, mUIUpdateCallback, getStateIdentifier(),
+ mPreferenceCompatManager);
+ preferenceControllers.add(mActiveDreamPC);
+ preferenceControllers.add(mDreamTimePC);
+ return preferenceControllers;
+ }
+
+ private class PackageReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ refreshFromBackend();
+ }
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/DreamTimePC.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/DreamTimePC.java
new file mode 100644
index 0000000..c0cf093
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/DreamTimePC.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.tv.settings.library.device.display.daydream;
+
+import static com.android.tv.settings.library.device.display.daydream.DaydreamState.KEY_DREAM_TIME;
+
+import android.content.Context;
+import android.os.UserManager;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+public class DreamTimePC extends RestrictedPreferenceController {
+ public DreamTimePC(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_DREAM_TIME};
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT;
+ }
+
+ public void setValue(String value) {
+ mPreferenceCompat.setValue(value);
+ notifyChange();
+ }
+
+ public String getValue() {
+ return mPreferenceCompat.getValue();
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/EnergySaverState.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/EnergySaverState.java
new file mode 100644
index 0000000..9a24fbe
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/EnergySaverState.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.display.daydream;
+
+import static android.provider.Settings.Secure.ATTENTIVE_TIMEOUT;
+import static android.provider.Settings.Secure.SLEEP_TIMEOUT;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_ENERGY_SAVER;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.text.format.DateUtils;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * State to provide data for rendering energy saver settings screen.
+ */
+public class EnergySaverState extends PreferenceControllerState {
+ public static final String KEY_SLEEP_TIME = "sleepTime";
+ public static final String KEY_ALLOW_TURN_SCREEN_OFF = "allowTurnScreenOff";
+ private static final int DEFAULT_SLEEP_TIME_MS = (int) (24 * DateUtils.HOUR_IN_MILLIS);
+ private static final int WARNING_THRESHOLD_SLEEP_TIME_MS = (int) (4 * DateUtils.HOUR_IN_MILLIS);
+ private AllowTurnScreenOffWithWakeLockPC mAllowTurnScreenOffWithWakeLockPC;
+ private SleepTimePC mSleepTimePC;
+
+ public EnergySaverState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ if (allowTurnOffWithWakeLock()) {
+ int validatedAttentiveSleepTime = getValidatedTimeout(getAttentiveSleepTime());
+ mSleepTimePC.setValue(String.valueOf(validatedAttentiveSleepTime));
+ if (getAttentiveSleepTime() != validatedAttentiveSleepTime) {
+ setAttentiveSleepTime(validatedAttentiveSleepTime);
+ }
+ } else {
+ int validatedSleepTime = getValidatedTimeout(getSleepTime());
+ mSleepTimePC.setValue(String.valueOf(validatedSleepTime));
+ if (getSleepTime() != validatedSleepTime) {
+ setSleepTime(validatedSleepTime);
+ }
+ }
+ mSleepTimePC.updateAndNotify();
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ switch (key[0]) {
+ case KEY_SLEEP_TIME:
+ final int newSleepTime = Integer.parseInt((String) newValue);
+ if (EnergySaverState.showStandbyTimeout(mContext)
+ && (newSleepTime > WARNING_THRESHOLD_SLEEP_TIME_MS || newSleepTime == -1)) {
+ // Some regions require a warning to be presented.
+ new AlertDialog.Builder(mContext)
+ .setTitle(ResourcesUtil.getString(mContext,
+ "device_energy_saver_confirmation_title"))
+ .setMessage(getConfirmationDialogDescription(newSleepTime))
+ .setPositiveButton(
+ ResourcesUtil.getString(mContext, "settings_confirm"),
+ (dialog, which) -> confirmNewSleepTime(newSleepTime))
+ .setNegativeButton(ResourcesUtil.getString(mContext, "settings_cancel"),
+ (dialog, which) -> dialog.dismiss())
+ .create()
+ .show();
+ return false;
+ } else {
+ updateTimeOut(allowTurnOffWithWakeLock(), newSleepTime);
+ return true;
+ }
+ case KEY_ALLOW_TURN_SCREEN_OFF:
+ updateTimeOut((boolean) newValue, Integer.parseInt(mSleepTimePC.getValue()));
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ private void confirmNewSleepTime(int newSleepTime) {
+ if (mSleepTimePC != null) {
+ updateTimeOut(allowTurnOffWithWakeLock(), newSleepTime);
+ mSleepTimePC.setValue(String.valueOf(newSleepTime));
+ }
+ }
+
+ private void updateTimeOut(boolean allowTurnScreenOffWithWakeLock, int value) {
+ if (allowTurnScreenOffWithWakeLock) {
+ setSleepTime(value);
+ if (showStandbyTimeout(mContext)) {
+ setAttentiveSleepTime(value);
+ }
+ } else {
+ setSleepTime(value);
+ if (showStandbyTimeout(mContext)) {
+ setAttentiveSleepTime(-1);
+ }
+ }
+ mSleepTimePC.setValue(String.valueOf(value));
+ mAllowTurnScreenOffWithWakeLockPC.updateAndNotify();
+ }
+
+ private String getConfirmationDialogDescription(int newSleepTime) {
+ String sleepTimeText = null;
+ String[] optionsValues = ResourcesUtil.getStringArray(mContext,
+ "screen_off_timeout_values");
+ String[] optionsStrings = ResourcesUtil.getStringArray(mContext,
+ "screen_off_timeout_entries");
+ for (int i = 0; i < optionsValues.length; i++) {
+ if (newSleepTime == Integer.parseInt(optionsValues[i])) {
+ sleepTimeText = optionsStrings[i];
+ }
+ }
+ return ResourcesUtil.getString(
+ mContext, "device_energy_saver_confirmation_text", sleepTimeText);
+ }
+
+ private int getSleepTime() {
+ return Settings.Secure.getInt(mContext.getContentResolver(), SLEEP_TIMEOUT,
+ DEFAULT_SLEEP_TIME_MS);
+ }
+
+ private int getAttentiveSleepTime() {
+ return Settings.Secure.getInt(mContext.getContentResolver(), ATTENTIVE_TIMEOUT,
+ DEFAULT_SLEEP_TIME_MS);
+ }
+
+ private void setSleepTime(int ms) {
+ Settings.Secure.putInt(mContext.getContentResolver(), SLEEP_TIMEOUT, ms);
+ }
+
+ private void setAttentiveSleepTime(int ms) {
+ Settings.Secure.putInt(mContext.getContentResolver(), ATTENTIVE_TIMEOUT, ms);
+ }
+
+ static boolean showStandbyTimeout(Context context) {
+ return ResourcesUtil.getBoolean(context, "config_show_standby_timeout");
+ }
+
+ private boolean allowTurnOffWithWakeLock() {
+ return showStandbyTimeout(mContext) && mAllowTurnScreenOffWithWakeLockPC.isChecked();
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+
+ }
+
+ // The SLEEP_TIMEOUT and ATTENTIVE_TIMEOUT could be defined in overlay by OEMs. We validate the
+ // value to make sure that we select from the predefined options. If the value from overlay is
+ // not one of the predefined options, we round it to the closest predefined value, except -1.
+ private int getValidatedTimeout(int purposedTimeout) {
+ int validatedTimeout = DEFAULT_SLEEP_TIME_MS;
+ if (purposedTimeout < 0) {
+ return -1;
+ }
+ String[] optionsString = ResourcesUtil.getStringArray(mContext,
+ "screen_off_timeout_values");
+ // Find the value from the predefined values that is closest to the proposed value except -1
+ int diff = Integer.MAX_VALUE;
+ for (String option : optionsString) {
+ if (Integer.parseInt(option) != -1) {
+ int currentDiff = Math.abs(purposedTimeout - Integer.parseInt(option));
+ if (currentDiff < diff) {
+ diff = currentDiff;
+ validatedTimeout = Integer.parseInt(option);
+ }
+ }
+ }
+ return validatedTimeout;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_ENERGY_SAVER;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ List<AbstractPreferenceController> preferenceControllers = new ArrayList<>();
+ mAllowTurnScreenOffWithWakeLockPC = new AllowTurnScreenOffWithWakeLockPC(
+ mContext, mUIUpdateCallback, getStateIdentifier(), mPreferenceCompatManager);
+ mSleepTimePC = new SleepTimePC(
+ mContext, mUIUpdateCallback, getStateIdentifier(), mPreferenceCompatManager);
+ preferenceControllers.add(mAllowTurnScreenOffWithWakeLockPC);
+ preferenceControllers.add(mSleepTimePC);
+ return preferenceControllers;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/SleepTimePC.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/SleepTimePC.java
new file mode 100644
index 0000000..bd24f8f
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/daydream/SleepTimePC.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.tv.settings.library.device.display.daydream;
+
+import static com.android.tv.settings.library.device.display.daydream.EnergySaverState.KEY_SLEEP_TIME;
+
+import android.content.Context;
+import android.os.UserManager;
+import android.text.format.DateUtils;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.ResourcesUtil;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+public class SleepTimePC extends RestrictedPreferenceController {
+ private static final int WARNING_THRESHOLD_SLEEP_TIME_MS = (int) (4 * DateUtils.HOUR_IN_MILLIS);
+
+ public SleepTimePC(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public void update() {
+ mPreferenceCompat.setHasOnPreferenceChangeListener(true);
+ mPreferenceCompat.setType(PreferenceCompat.TYPE_LIST);
+ UserManager userManager = UserManager.get(mContext);
+ if (userManager.hasUserRestriction(getAttrUserRestriction())) {
+ mPreferenceCompat.setEnabled(false);
+ }
+ mPreferenceCompat.setEntries(
+ ResourcesUtil.getStringArray(mContext, "screen_off_timeout_entries"));
+ mPreferenceCompat.setEntryValues(
+ ResourcesUtil.getStringArray(mContext, "screen_off_timeout_values"));
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT;
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_SLEEP_TIME};
+ }
+
+ public void setValue(String value) {
+ mPreferenceCompat.setValue(value);
+ }
+
+ public String getValue() {
+ return mPreferenceCompat.getValue();
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/AdvancedDisplayState.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/AdvancedDisplayState.java
new file mode 100644
index 0000000..ce17450
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/AdvancedDisplayState.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.tv.settings.library.device.display.displaysound;
+
+import static android.provider.Settings.Secure.MINIMAL_POST_PROCESSING_ALLOWED;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+
+import java.util.List;
+
+/**
+ * State to provide data for rendering advanced display screen.
+ */
+public class AdvancedDisplayState extends PreferenceControllerState {
+ private static final String KEY_GAME_MODE = "game_mode";
+ private PreferenceCompat mAllowGameMode;
+
+ public AdvancedDisplayState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mAllowGameMode = mPreferenceCompatManager
+ .getOrCreatePrefCompat(new String[]{KEY_GAME_MODE});
+ mAllowGameMode.setType(PreferenceCompat.TYPE_SWITCH);
+ mAllowGameMode.setChecked(getGameModeStatus() == 1);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mAllowGameMode);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_ADVANCED_DISPLAY;
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ if (TextUtils.equals(key[0], KEY_GAME_MODE)) {
+ setGameModeStatus(status ? 1 : 0);
+ }
+ return super.onPreferenceTreeClick(key, status);
+ }
+
+ private void setGameModeStatus(int state) {
+ Settings.Secure.putInt(mContext.getContentResolver(), MINIMAL_POST_PROCESSING_ALLOWED,
+ state);
+ }
+
+ private int getGameModeStatus() {
+ return Settings.Secure.getInt(mContext.getContentResolver(),
+ MINIMAL_POST_PROCESSING_ALLOWED,
+ 1);
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/AdvancedVolumeState.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/AdvancedVolumeState.java
new file mode 100644
index 0000000..26ef592
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/AdvancedVolumeState.java
@@ -0,0 +1,454 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.display.displaysound;
+
+import static com.android.tv.settings.library.overlay.FlavorUtils.FLAVOR_CLASSIC;
+
+import android.content.Context;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.LibUtils;
+import com.android.tv.settings.library.util.PreferenceCompatUtils;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * State to provide data for rendering advanced volume screen.
+ */
+public class AdvancedVolumeState extends PreferenceControllerState {
+ static final String KEY_ADVANCED_SOUND_OPTION = "advanced_sound_settings_option";
+ static final String KEY_SURROUND_SOUND_AUTO = "surround_sound_auto";
+ static final String KEY_SURROUND_SOUND_NONE = "surround_sound_none";
+ static final String KEY_SURROUND_SOUND_MANUAL = "surround_sound_manual";
+ static final String KEY_SURROUND_SOUND_FORMAT_PREFIX = "surround_sound_format_";
+ static final String KEY_SURROUND_SOUND_FORMAT_INFO_PREFIX = "surround_sound_format_info_";
+ static final String KEY_SUPPORTED_SURROUND_SOUND = "supported_formats";
+ static final String KEY_UNSUPPORTED_SURROUND_SOUND = "unsupported_formats";
+ static final String KEY_FORMAT_INFO = "surround_sound_format_info";
+ static final String KEY_SHOW_HIDE_FORMAT_INFO = "surround_sound_show_hide_format_info";
+ static final String KEY_ENABLED_FORMATS = "enabled_formats";
+ static final String KEY_DISABLED_FORMATS = "disabled_formats";
+ static final String KEY_FORMAT_INFO_ON_MANUAL = "surround_sound_format_info_on_manual";
+
+ static final int[] SURROUND_SOUND_DISPLAY_ORDER = {
+ AudioFormat.ENCODING_AC3, AudioFormat.ENCODING_E_AC3, AudioFormat.ENCODING_DOLBY_TRUEHD,
+ AudioFormat.ENCODING_E_AC3_JOC, AudioFormat.ENCODING_DOLBY_MAT,
+ AudioFormat.ENCODING_DTS, AudioFormat.ENCODING_DTS_HD, AudioFormat.ENCODING_DTS_UHD,
+ AudioFormat.ENCODING_DRA
+ };
+
+ private Map<Integer, Boolean> mFormats;
+ private List<Integer> mReportedFormats;
+ private AudioManager mAudioManager;
+ private PreferenceCompat mSupportedFormatsPreferenceCategory;
+ private PreferenceCompat mUnsupportedFormatsPreferenceCategory;
+ private PreferenceCompat mFormatsInfoPreferenceCategory;
+ private PreferenceCompat mFormatsInfoOnManualPreferenceCategory;
+ private PreferenceCompat mEnabledFormatsPreferenceCategory;
+ private PreferenceCompat mDisabledFormatsPreferenceCategory;
+ private PreferenceCompat mSurroundSoundCategory;
+ private PreferenceCompat mSurroundSoundAuto;
+ private PreferenceCompat mSurroundSoundNone;
+ private PreferenceCompat mSurroundSoundManual;
+ private PreferenceCompat mShowHideFormatInfo;
+
+ public AdvancedVolumeState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_ADVANCED_VOLUME;
+ }
+
+
+ @Override
+ public void onAttach() {
+ super.onAttach();
+ mAudioManager = getAudioManager();
+ mFormats = mAudioManager.getSurroundFormats();
+ mReportedFormats = mAudioManager.getReportedSurroundFormats();
+
+ // For the first time, when the user has never changed the surround sound setting, enable
+ // all the surround sound formats supported by android and audio device, and disable the
+ // formats supported by Android device, but not by audio device.
+ String formatString = Settings.Global.getString(mContext.getContentResolver(),
+ Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS);
+ if (formatString == null) {
+ for (int format : mFormats.keySet()) {
+ mAudioManager.setSurroundFormatEnabled(format, mReportedFormats.contains(format));
+ }
+ }
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+
+ mSurroundSoundCategory = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_ADVANCED_SOUND_OPTION);
+ mSurroundSoundCategory.setType(PreferenceCompat.TYPE_PREFERENCE_CATEGORY);
+
+ mSurroundSoundAuto = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_ADVANCED_SOUND_OPTION, KEY_SURROUND_SOUND_AUTO});
+ mSurroundSoundAuto.setTitle(ResourcesUtil.getString(mContext, "surround_sound_auto_title"));
+ mSurroundSoundAuto.setType(PreferenceCompat.TYPE_RADIO);
+ mSurroundSoundAuto.setRadioGroup(KEY_ADVANCED_SOUND_OPTION);
+
+ mSurroundSoundNone = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_ADVANCED_SOUND_OPTION, KEY_SURROUND_SOUND_NONE});
+ mSurroundSoundNone.setTitle(ResourcesUtil.getString(mContext, "surround_sound_none_title"));
+ mSurroundSoundNone.setType(PreferenceCompat.TYPE_RADIO);
+ mSurroundSoundNone.setRadioGroup(KEY_ADVANCED_SOUND_OPTION);
+
+ mSurroundSoundManual = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_ADVANCED_SOUND_OPTION, KEY_SURROUND_SOUND_MANUAL});
+ mSurroundSoundManual.setTitle(
+ ResourcesUtil.getString(mContext, "surround_sound_manual_title"));
+ mSurroundSoundManual.setType(PreferenceCompat.TYPE_RADIO);
+ mSurroundSoundManual.setRadioGroup(KEY_ADVANCED_SOUND_OPTION);
+
+ mSurroundSoundCategory.addChildPrefCompat(mSurroundSoundAuto);
+ mSurroundSoundCategory.addChildPrefCompat(mSurroundSoundNone);
+ mSurroundSoundCategory.addChildPrefCompat(mSurroundSoundManual);
+
+ PreferenceCompat surroundSoundSettingsCompat = getSurroundPassthroughSetting(mContext);
+ selectSurroundSoundRadioPreference(surroundSoundSettingsCompat);
+
+ // Do not show sidebar info texts in case of 1 panel settings.
+ if (FlavorUtils.getFlavor(mContext) != FLAVOR_CLASSIC) {
+ createInfoFragments();
+ }
+
+ createFormatInfoPreferences();
+ createFormatInfoPreferencesOnManual();
+ if (mSurroundSoundManual.getChecked() == PreferenceCompat.STATUS_ON) {
+ showFormatInfoOnManual();
+ } else {
+ hideFormatInfoOnManual();
+ }
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ PreferenceCompat pref = mPreferenceCompatManager.getPrefCompat(key);
+ if (pref == null) {
+ return false;
+ }
+ if (pref.getType() == PreferenceCompat.TYPE_RADIO) {
+ selectSurroundSoundRadioPreference(pref);
+
+ if (pref.getKey().length != 2) {
+ return false;
+ }
+ switch (key[1]) {
+ case KEY_SURROUND_SOUND_AUTO: {
+ mAudioManager.setEncodedSurroundMode(
+ Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO);
+ hideFormatInfoOnManual();
+ break;
+ }
+ case KEY_SURROUND_SOUND_NONE: {
+ mAudioManager.setEncodedSurroundMode(
+ Settings.Global.ENCODED_SURROUND_OUTPUT_NEVER);
+ hideFormatInfoOnManual();
+ break;
+ }
+ case KEY_SURROUND_SOUND_MANUAL: {
+ mAudioManager.setEncodedSurroundMode(
+ Settings.Global.ENCODED_SURROUND_OUTPUT_MANUAL);
+ showFormatInfoOnManual();
+ break;
+ }
+ default:
+ throw new IllegalArgumentException("Unknown surround sound pref value: "
+ + key);
+ }
+ updateFormatPreferencesStates();
+ return true;
+ }
+
+ if (key.length == 2 && key[0].equals(KEY_FORMAT_INFO) && key[1].equals(
+ KEY_SHOW_HIDE_FORMAT_INFO)) {
+ if (pref.getTitle().equals(
+ ResourcesUtil.getString(mContext, "surround_sound_hide_formats"))) {
+ pref.setTitle(ResourcesUtil.getString(mContext, "surround_sound_show_formats"));
+ hideFormatInfo();
+ } else {
+ pref.setTitle(ResourcesUtil.getString(mContext, "surround_sound_hide_formats"));
+ showFormatInfo();
+ }
+ return true;
+ }
+
+ if (key.length == 3 && key[0].equals(KEY_FORMAT_INFO) && key[2].contains(
+ KEY_SURROUND_SOUND_FORMAT_INFO_PREFIX)) {
+ if (PreferenceCompatUtils.isParent(pref, mEnabledFormatsPreferenceCategory)) {
+ LibUtils.showToast(mContext, "surround_sound_enabled_format_info_clicked");
+ } else {
+ LibUtils.showToast(mContext, "surround_sound_disabled_format_info_clicked");
+ }
+ return true;
+ }
+
+ return super.onPreferenceTreeClick(key, status);
+ }
+
+
+ AudioManager getAudioManager() {
+ return mContext.getSystemService(AudioManager.class);
+ }
+
+ private void selectSurroundSoundRadioPreference(PreferenceCompat preferenceCompat) {
+ preferenceCompat.setChecked(true);
+ mSurroundSoundCategory.getChildPrefCompats().stream()
+ .filter(radioPref -> radioPref != preferenceCompat)
+ .forEach(radioPref -> radioPref.setChecked(false));
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mSurroundSoundCategory);
+ }
+
+ /** Creates titles and switches for each surround sound format. */
+ private void createFormatInfoPreferencesOnManual() {
+ mFormatsInfoOnManualPreferenceCategory = createPreferenceCategory(
+ "", new String[]{KEY_FORMAT_INFO_ON_MANUAL}
+ );
+ mSupportedFormatsPreferenceCategory = createPreferenceCategory(
+ "surround_sound_supported_title",
+ new String[]{KEY_FORMAT_INFO_ON_MANUAL, KEY_SUPPORTED_SURROUND_SOUND});
+ mUnsupportedFormatsPreferenceCategory = createPreferenceCategory(
+ "surround_sound_unsupported_title",
+ new String[]{KEY_FORMAT_INFO_ON_MANUAL, KEY_UNSUPPORTED_SURROUND_SOUND});
+
+ mFormatsInfoOnManualPreferenceCategory.addChildPrefCompat(
+ mSupportedFormatsPreferenceCategory);
+ mFormatsInfoOnManualPreferenceCategory.addChildPrefCompat(
+ mUnsupportedFormatsPreferenceCategory);
+ List<AbstractPreferenceController> preferenceControllers = new ArrayList<>();
+ for (int formatId : SURROUND_SOUND_DISPLAY_ORDER) {
+ if (mFormats.containsKey(formatId)) {
+ SoundFormatPreferenceController soundFormatPC = new SoundFormatPreferenceController(
+ mContext,
+ mUIUpdateCallback,
+ getStateIdentifier(),
+ mPreferenceCompatManager,
+ formatId /*formatId*/, mAudioManager, mFormats, mReportedFormats);
+ preferenceControllers.add(soundFormatPC);
+ soundFormatPC.initAndNotify();
+ if (soundFormatPC.isAvailable()) {
+ if (mReportedFormats.contains(formatId)) {
+ mSupportedFormatsPreferenceCategory.addChildPrefCompat(
+ soundFormatPC.getPreferenceCompat());
+ } else {
+ mUnsupportedFormatsPreferenceCategory.addChildPrefCompat(
+ soundFormatPC.getPreferenceCompat());
+ }
+ }
+ }
+ }
+ mPreferenceControllers.addAll(preferenceControllers);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(),
+ mFormatsInfoOnManualPreferenceCategory);
+ }
+
+ /** Creates titles and preferences for each surround sound format. */
+ private void createFormatInfoPreferences() {
+ mFormatsInfoPreferenceCategory = createPreferenceCategory(
+ "surround_sound_format_info", new String[]{KEY_FORMAT_INFO});
+
+ mShowHideFormatInfo = createPreference("surround_sound_show_formats",
+ new String[]{KEY_FORMAT_INFO, KEY_SHOW_HIDE_FORMAT_INFO});
+ mFormatsInfoPreferenceCategory.addChildPrefCompat(mShowHideFormatInfo);
+
+ mEnabledFormatsPreferenceCategory = createPreferenceCategory(
+ "surround_sound_enabled_formats",
+ new String[]{KEY_FORMAT_INFO, KEY_ENABLED_FORMATS});
+ mFormatsInfoPreferenceCategory.addChildPrefCompat(mEnabledFormatsPreferenceCategory);
+
+ mDisabledFormatsPreferenceCategory = createPreferenceCategory(
+ "surround_sound_disabled_formats",
+ new String[]{KEY_FORMAT_INFO, KEY_DISABLED_FORMATS});
+ mFormatsInfoPreferenceCategory.addChildPrefCompat(mDisabledFormatsPreferenceCategory);
+
+ for (int formatId : SURROUND_SOUND_DISPLAY_ORDER) {
+ if (mFormats.containsKey(formatId)) {
+ String title = getFormatDisplayResource(mContext, formatId);
+ if (TextUtils.isEmpty(title)) {
+ continue;
+ }
+ String key = KEY_SURROUND_SOUND_FORMAT_INFO_PREFIX + formatId;
+ String[] compoundKey = mReportedFormats.contains(formatId)
+ ? new String[]{KEY_FORMAT_INFO, KEY_ENABLED_FORMATS, key}
+ : new String[]{KEY_FORMAT_INFO, KEY_DISABLED_FORMATS, key};
+ PreferenceCompat pref = createPreference(title, compoundKey);
+ pref.setTitle(title);
+ if (mReportedFormats.contains(formatId)) {
+ mEnabledFormatsPreferenceCategory.addChildPrefCompat(pref);
+ } else {
+ mDisabledFormatsPreferenceCategory.addChildPrefCompat(pref);
+ }
+ }
+ }
+ hideFormatInfo();
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mFormatsInfoPreferenceCategory);
+ }
+
+ private void notifyUpdateFormatInfo() {
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(),
+ mFormatsInfoOnManualPreferenceCategory);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mFormatsInfoPreferenceCategory);
+ }
+
+ private void showFormatInfoOnManual() {
+ mSupportedFormatsPreferenceCategory.setVisible(true);
+ mUnsupportedFormatsPreferenceCategory.setVisible(true);
+ updateFormatPreferencesStates();
+ // hide the formats info section.
+ mFormatsInfoPreferenceCategory.setVisible(false);
+ notifyUpdateFormatInfo();
+ }
+
+ private void hideFormatInfoOnManual() {
+ mSupportedFormatsPreferenceCategory.setVisible(false);
+ mUnsupportedFormatsPreferenceCategory.setVisible(false);
+ updateFormatPreferencesStates();
+ // show the formats info section.
+ mFormatsInfoPreferenceCategory.setVisible(true);
+ notifyUpdateFormatInfo();
+ }
+
+ private void showFormatInfo() {
+ mEnabledFormatsPreferenceCategory.setVisible(true);
+ mDisabledFormatsPreferenceCategory.setVisible(true);
+ notifyUpdateFormatInfo();
+ }
+
+ private void hideFormatInfo() {
+ mEnabledFormatsPreferenceCategory.setVisible(false);
+ mDisabledFormatsPreferenceCategory.setVisible(false);
+ notifyUpdateFormatInfo();
+ }
+
+
+ /**
+ * @return the display id for each surround sound format.
+ */
+ static String getFormatDisplayResource(Context context, int formatId) {
+ switch (formatId) {
+ case AudioFormat.ENCODING_AC3:
+ return ResourcesUtil.getString(context, "surround_sound_format_ac3");
+ case AudioFormat.ENCODING_E_AC3:
+ return ResourcesUtil.getString(context, "surround_sound_format_e_ac3");
+ case AudioFormat.ENCODING_DTS:
+ return ResourcesUtil.getString(context, "surround_sound_format_dts");
+ case AudioFormat.ENCODING_DTS_HD:
+ return ResourcesUtil.getString(context, "surround_sound_format_dts_hd");
+ case AudioFormat.ENCODING_DTS_UHD:
+ return ResourcesUtil.getString(context, "surround_sound_format_dts_uhd");
+ case AudioFormat.ENCODING_DOLBY_TRUEHD:
+ return ResourcesUtil.getString(context, "surround_sound_format_dolby_truehd");
+ case AudioFormat.ENCODING_E_AC3_JOC:
+ return ResourcesUtil.getString(context, "surround_sound_format_e_ac3_joc");
+ case AudioFormat.ENCODING_DOLBY_MAT:
+ return ResourcesUtil.getString(context, "surround_sound_format_dolby_mat");
+ case AudioFormat.ENCODING_DRA:
+ return ResourcesUtil.getString(context, "surround_sound_format_dra");
+ default:
+ return "";
+ }
+ }
+
+ private PreferenceCompat createPreferenceCategory(String valueName, String[] key) {
+ PreferenceCompat preferenceCategory = mPreferenceCompatManager.getOrCreatePrefCompat(key);
+ preferenceCategory.setType(PreferenceCompat.TYPE_PREFERENCE_CATEGORY);
+ preferenceCategory.setTitle(ResourcesUtil.getString(mContext, valueName));
+ return preferenceCategory;
+ }
+
+ private PreferenceCompat createPreference(String titleResourceId, String[] key) {
+ PreferenceCompat preference = mPreferenceCompatManager.getOrCreatePrefCompat(key);
+ preference.setTitle(ResourcesUtil.getString(mContext, titleResourceId));
+ return preference;
+ }
+
+ static String getSurroundPassthroughSettingKey(Context context) {
+ final int value = Settings.Global.getInt(context.getContentResolver(),
+ Settings.Global.ENCODED_SURROUND_OUTPUT,
+ Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO);
+
+ switch (value) {
+ case Settings.Global.ENCODED_SURROUND_OUTPUT_MANUAL:
+ return KEY_SURROUND_SOUND_MANUAL;
+ case Settings.Global.ENCODED_SURROUND_OUTPUT_NEVER:
+ return KEY_SURROUND_SOUND_NONE;
+ case Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO:
+ default:
+ return KEY_SURROUND_SOUND_AUTO;
+ }
+ }
+
+ private void updateFormatPreferencesStates() {
+ for (AbstractPreferenceController controller : mPreferenceControllers) {
+ if (controller instanceof SoundFormatPreferenceController) {
+ ((SoundFormatPreferenceController) controller).update();
+ }
+ }
+ }
+
+
+ private void createInfoFragments() {
+ PreferenceCompat autoPreference = mPreferenceCompatManager
+ .getOrCreatePrefCompat(KEY_SURROUND_SOUND_AUTO);
+
+ PreferenceCompat manualPreference = mPreferenceCompatManager
+ .getOrCreatePrefCompat(KEY_SURROUND_SOUND_MANUAL);
+ }
+
+ private PreferenceCompat getSurroundPassthroughSetting(Context context) {
+ final int value = Settings.Global.getInt(context.getContentResolver(),
+ Settings.Global.ENCODED_SURROUND_OUTPUT,
+ Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO);
+
+ switch (value) {
+ case Settings.Global.ENCODED_SURROUND_OUTPUT_MANUAL:
+ return mSurroundSoundManual;
+ case Settings.Global.ENCODED_SURROUND_OUTPUT_NEVER:
+ return mSurroundSoundNone;
+ case Settings.Global.ENCODED_SURROUND_OUTPUT_AUTO:
+ default:
+ return mSurroundSoundAuto;
+ }
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/DisplaySoundState.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/DisplaySoundState.java
new file mode 100644
index 0000000..2d86254
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/DisplaySoundState.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.display.displaysound;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.hardware.hdmi.HdmiControlManager;
+import android.media.AudioManager;
+import android.os.Bundle;
+import android.provider.Settings;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.List;
+
+/**
+ * State to provide data for rendering display sound settings screen.
+ */
+public class DisplaySoundState extends PreferenceControllerState {
+ static final String KEY_SOUND_EFFECTS = "sound_effects";
+ private static final String KEY_CEC = "cec";
+
+ private AudioManager mAudioManager;
+ private HdmiControlManager mHdmiControlManager;
+ private PreferenceCompat mSoundPref;
+ private PreferenceCompat mCecPref;
+
+ public DisplaySoundState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ private static boolean getSoundEffectsEnabled(ContentResolver contentResolver) {
+ return Settings.System.getInt(contentResolver, Settings.System.SOUND_EFFECTS_ENABLED, 1)
+ != 0;
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mSoundPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_SOUND_EFFECTS});
+ mCecPref = mPreferenceCompatManager.getOrCreatePrefCompat(new String[]{KEY_CEC});
+ mSoundPref.setChecked(getSoundEffectsEnabled());
+ updateCecPreference();
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mSoundPref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mCecPref);
+ }
+
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateCecPreference();
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ if (KEY_SOUND_EFFECTS.equals(key[0])) {
+ setSoundEffectsEnabled(status);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onAttach() {
+ mAudioManager = mContext.getSystemService(AudioManager.class);
+ mHdmiControlManager = mContext.getSystemService(HdmiControlManager.class);
+ super.onAttach();
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_DISPLAY_SOUND;
+ }
+
+ private boolean getSoundEffectsEnabled() {
+ return getSoundEffectsEnabled(mContext.getContentResolver());
+ }
+
+ private void setSoundEffectsEnabled(boolean enabled) {
+ if (enabled) {
+ mAudioManager.loadSoundEffects();
+ } else {
+ mAudioManager.unloadSoundEffects();
+ }
+ Settings.System.putInt(mContext.getContentResolver(),
+ Settings.System.SOUND_EFFECTS_ENABLED, enabled ? 1 : 0);
+ }
+
+ private void updateCecPreference() {
+ // Rendering layer should determine whether to show cec toggle as this is a slice
+ // preference.
+ boolean cecEnabled = mHdmiControlManager.getHdmiCecEnabled()
+ == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED;
+ mCecPref.setSummary(cecEnabled
+ ? ResourcesUtil.getString(mContext, "enabled")
+ : ResourcesUtil.getString(mContext, "disabled"));
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mCecPref);
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/FontScaleState.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/FontScaleState.java
new file mode 100644
index 0000000..91e2303
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/FontScaleState.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.display.displaysound;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.os.Bundle;
+import android.provider.Settings;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.List;
+
+/**
+ * State to provide data for rendering font scale settings screen.
+ */
+public class FontScaleState extends PreferenceControllerState {
+ private static final String FONT_SCALE_GROUP = "font_scale_radio_group";
+ private PreferenceCompat mFontScaleGroup;
+
+ /** Value of FONT_SCALE. */
+ private float mCurrentFontScaleValue;
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mFontScaleGroup = mPreferenceCompatManager.getOrCreatePrefCompat(FONT_SCALE_GROUP);
+ mFontScaleGroup.setType(PreferenceCompat.TYPE_PREFERENCE_CATEGORY);
+ mFontScaleGroup.setTitle(FONT_SCALE_GROUP);
+ final String[] entryValues = ResourcesUtil.getStringArray(mContext,
+ "font_scale_entry_values");
+ final String[] entries = ResourcesUtil.getStringArray(mContext, "font_scale_entries");
+ initFontScaleValue();
+
+ for (int i = 0; i < entryValues.length; i++) {
+ final PreferenceCompat preference = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{FONT_SCALE_GROUP, entryValues[i]});
+ preference.setPersistent(false);
+ preference.setType(PreferenceCompat.TYPE_RADIO);
+ preference.setRadioGroup(FONT_SCALE_GROUP);
+ int scaleValue = (int) (Float.valueOf(entryValues[i]) * 100);
+ String summary = ResourcesUtil.getString(
+ mContext, "font_scale_item_detail", scaleValue);
+ preference.setSummary(summary);
+ preference.setTitle(entries[i]);
+ Bundle b = new Bundle();
+ b.putString(ManagerUtil.INFO_PREVIEW_FONT_SCALE_VALUE, entryValues[i]);
+ extras.putFloat(
+ ManagerUtil.INFO_CURRENT_FONT_SCALE_VALUE, mCurrentFontScaleValue);
+
+ if (Float.compare(mCurrentFontScaleValue, Float.parseFloat(entryValues[i])) == 0) {
+ preference.setChecked(true);
+ }
+ mFontScaleGroup.addChildPrefCompat(preference);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mFontScaleGroup);
+ }
+
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ if (key.length != 2) {
+ return false;
+ }
+ mCurrentFontScaleValue = Float.parseFloat(key[1]);
+ commit();
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mFontScaleGroup);
+ return true;
+ }
+
+ protected void commit() {
+ if (mContext == null) return;
+ final ContentResolver resolver = mContext.getContentResolver();
+ Settings.System.putFloat(resolver, Settings.System.FONT_SCALE, mCurrentFontScaleValue);
+ }
+
+ private void initFontScaleValue() {
+ final ContentResolver resolver = mContext.getContentResolver();
+ mCurrentFontScaleValue =
+ Settings.System.getFloat(resolver, Settings.System.FONT_SCALE, 1.0f);
+ }
+
+ public FontScaleState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_FONT_SCALE;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/HdrFormatPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/HdrFormatPreferenceController.java
new file mode 100644
index 0000000..5e5b0f7
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/HdrFormatPreferenceController.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.tv.settings.library.device.display.displaysound;
+
+import static com.android.tv.settings.library.device.display.displaysound.HdrFormatSelectionState.KEY_FORMAT_INFO_ON_MANUAL;
+import static com.android.tv.settings.library.device.display.displaysound.HdrFormatSelectionState.KEY_HDR_FORMAT_PREFIX;
+import static com.android.tv.settings.library.device.display.displaysound.HdrFormatSelectionState.KEY_SUPPORTED_HDR_FORMATS;
+import static com.android.tv.settings.library.device.display.displaysound.HdrFormatSelectionState.KEY_UNSUPPORTED_HDR_FORMATS;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.hardware.display.DisplayManager;
+import android.text.TextUtils;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+
+import java.util.Set;
+
+/**
+ * Controller for the hdr formats switch preferences.
+ */
+public class HdrFormatPreferenceController extends AbstractPreferenceController {
+ private static final String TAG = "HdrFormatController";
+ private final int mHdrType;
+ private final DisplayManager mDisplayManager;
+ private final Set<Integer> mDisplayReportedHdrTypes;
+ private final Set<Integer> mUserDisabledHdrTypes;
+
+ private boolean mAvailable;
+
+ public HdrFormatPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager,
+ int hdrType,
+ DisplayManager displayManager,
+ @NonNull Set<Integer> displayReportedHdrTypes,
+ @NonNull Set<Integer> userDisabledHdrTypes) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mHdrType = hdrType;
+ mDisplayManager = displayManager;
+ mDisplayReportedHdrTypes = displayReportedHdrTypes;
+ mUserDisabledHdrTypes = userDisabledHdrTypes;
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mAvailable;
+ }
+
+ @Override
+ public void init() {
+ String title = HdrFormatSelectionState.getFormatPreferenceTitle(mContext, mHdrType);
+ mAvailable = !TextUtils.isEmpty(title);
+ mPreferenceCompat.setTitle(title);
+ update();
+ }
+
+ @Override
+ public void update() {
+ if (mDisplayReportedHdrTypes.contains(mHdrType)) {
+ mPreferenceCompat.setType(PreferenceCompat.TYPE_SWITCH);
+ mPreferenceCompat.setChecked(!mUserDisabledHdrTypes.contains(mHdrType));
+ mPreferenceCompat.setEnabled(true);
+ } else {
+ mPreferenceCompat.setType(PreferenceCompat.TYPE_PREFERENCE);
+ }
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(boolean status) {
+ final boolean enabled = mPreferenceCompat.getChecked() == PreferenceCompat.STATUS_ON;
+
+ if (enabled) {
+ mUserDisabledHdrTypes.remove(mHdrType);
+ } else {
+ mUserDisabledHdrTypes.add(mHdrType);
+ }
+ mDisplayManager.setUserDisabledHdrTypes(toArray(mUserDisabledHdrTypes));
+ return true;
+ }
+
+ private int[] toArray(Set<Integer> set) {
+ return set.stream().mapToInt(Integer::intValue).toArray();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ String key = KEY_HDR_FORMAT_PREFIX + mHdrType;
+ String[] compoundKey = mDisplayReportedHdrTypes.contains(mHdrType)
+ ? new String[]{KEY_FORMAT_INFO_ON_MANUAL, KEY_SUPPORTED_HDR_FORMATS, key}
+ : new String[]{KEY_FORMAT_INFO_ON_MANUAL, KEY_UNSUPPORTED_HDR_FORMATS, key};
+ return compoundKey;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/HdrFormatSelectionState.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/HdrFormatSelectionState.java
new file mode 100644
index 0000000..d16ffa9
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/HdrFormatSelectionState.java
@@ -0,0 +1,380 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.display.displaysound;
+
+import static android.view.Display.HdrCapabilities.HDR_TYPE_DOLBY_VISION;
+import static android.view.Display.HdrCapabilities.HDR_TYPE_HDR10;
+import static android.view.Display.HdrCapabilities.HDR_TYPE_HDR10_PLUS;
+import static android.view.Display.HdrCapabilities.HDR_TYPE_HLG;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_HDR_FORMAT_SELECTION;
+
+import android.content.Context;
+import android.hardware.display.DisplayManager;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.Display;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.LibUtils;
+import com.android.tv.settings.library.util.PreferenceCompatUtils;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * State to provide data for hdr format selection screen.
+ */
+public class HdrFormatSelectionState extends PreferenceControllerState {
+ static final String KEY_HDR_FORMAT_SELECTION = "hdr_format_selection_option";
+ static final String KEY_SUPPORTED_HDR_FORMATS = "supported_formats";
+ static final String KEY_UNSUPPORTED_HDR_FORMATS = "unsupported_formats";
+ static final String KEY_HDR_FORMAT_SELECTION_AUTO = "hdr_format_selection_auto";
+ static final String KEY_HDR_FORMAT_SELECTION_MANUAL = "hdr_format_selection_manual";
+ static final String KEY_HDR_FORMAT_PREFIX = "hdr_format_";
+ static final String KEY_HDR_FORMAT_INFO_PREFIX = "hdr_format_info_";
+ static final String KEY_FORMAT_INFO = "hdr_format_info";
+ static final String KEY_FORMAT_INFO_ON_MANUAL = "hdr_format_info_on_manual";
+ static final String KEY_SHOW_HIDE_FORMAT_INFO = "hdr_show_hide_format_info";
+ static final String KEY_ENABLED_FORMATS = "enabled_formats";
+ static final String KEY_DISABLED_FORMATS = "disabled_formats";
+
+ static final int[] HDR_FORMATS_DISPLAY_ORDER = {
+ HDR_TYPE_DOLBY_VISION, HDR_TYPE_HDR10, HDR_TYPE_HDR10_PLUS, HDR_TYPE_HLG
+ };
+
+ private PreferenceCompat mHdrFormatSelectionCategory;
+ private PreferenceCompat mHdrFormatSelectionAuto;
+ private PreferenceCompat mHdrFormatSelectionManual;
+ private PreferenceCompat mFormatsInfoOnManualCategory;
+ private PreferenceCompat mSupportedFormatsCategory;
+ private PreferenceCompat mUnsupportedFormatsCategory;
+ private PreferenceCompat mFormatsInfoCategory;
+ private PreferenceCompat mShowHideFormatInfo;
+ private PreferenceCompat mEnabledFormatsCategory;
+ private PreferenceCompat mDisabledFormatsCategory;
+ private Set<Integer> mDeviceHdrTypes;
+ private Set<Integer> mDisplayReportedHdrTypes;
+ private Set<Integer> mUserDisabledHdrTypes;
+ private DisplayManager mDisplayManager;
+
+ public HdrFormatSelectionState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onAttach() {
+ super.onAttach();
+ mDisplayManager = getDisplayManager();
+ mDeviceHdrTypes = toSet(getDeviceSupportedHdrTypes());
+ mUserDisabledHdrTypes = toSet(mDisplayManager.getUserDisabledHdrTypes());
+
+ Display display = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
+ mDisplayReportedHdrTypes = toSet(display.getReportedHdrTypes());
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ mHdrFormatSelectionCategory = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_HDR_FORMAT_SELECTION);
+ mHdrFormatSelectionCategory.setType(PreferenceCompat.TYPE_PREFERENCE_CATEGORY);
+
+ mHdrFormatSelectionAuto = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_HDR_FORMAT_SELECTION, KEY_HDR_FORMAT_SELECTION_AUTO}
+ );
+ mHdrFormatSelectionAuto.setTitle(
+ ResourcesUtil.getString(mContext, "hdr_format_selection_auto_title"));
+ mHdrFormatSelectionAuto.setSummary(
+ ResourcesUtil.getString(mContext, "hdr_format_selection_auto_desc"));
+ mHdrFormatSelectionAuto.setType(PreferenceCompat.TYPE_RADIO);
+ mHdrFormatSelectionAuto.setRadioGroup(KEY_HDR_FORMAT_SELECTION);
+
+ mHdrFormatSelectionManual = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_HDR_FORMAT_SELECTION, KEY_HDR_FORMAT_SELECTION_MANUAL}
+ );
+ mHdrFormatSelectionManual.setTitle(
+ ResourcesUtil.getString(mContext, "hdr_format_selection_manual_title"));
+ mHdrFormatSelectionManual.setSummary(
+ ResourcesUtil.getString(mContext, "hdr_format_selection_manual_desc"));
+ mHdrFormatSelectionManual.setType(PreferenceCompat.TYPE_RADIO);
+ mHdrFormatSelectionManual.setRadioGroup(KEY_HDR_FORMAT_SELECTION);
+ mHdrFormatSelectionCategory.addChildPrefCompat(mHdrFormatSelectionAuto);
+ mHdrFormatSelectionCategory.addChildPrefCompat(mHdrFormatSelectionManual);
+
+ createFormatInfo();
+ createFormatInfoOnManual();
+
+ PreferenceCompat currentSelection;
+ if (mDisplayManager.areUserDisabledHdrTypesAllowed()) {
+ currentSelection = mHdrFormatSelectionAuto;
+ hideFormatInfoOnManual();
+ } else {
+ currentSelection = mHdrFormatSelectionManual;
+ showFormatInfoOnManual();
+ }
+ selectRadioPreference(currentSelection);
+ }
+
+ /** Creates titles and preferences for each hdr format. */
+ private void createFormatInfo() {
+ mFormatsInfoCategory = createPreferenceCategory(
+ ResourcesUtil.getString(mContext, "hdr_format_info"),
+ new String[]{KEY_FORMAT_INFO});
+
+ mShowHideFormatInfo = createPreference("hdr_show_formats",
+ new String[]{KEY_FORMAT_INFO, KEY_SHOW_HIDE_FORMAT_INFO});
+ mFormatsInfoCategory.addChildPrefCompat(mShowHideFormatInfo);
+
+ mEnabledFormatsCategory = createPreferenceCategory(
+ "hdr_enabled_formats",
+ new String[]{KEY_FORMAT_INFO, KEY_ENABLED_FORMATS});
+ mFormatsInfoCategory.addChildPrefCompat(mEnabledFormatsCategory);
+
+ mDisabledFormatsCategory = createPreferenceCategory(
+ "hdr_disabled_formats",
+ new String[]{KEY_FORMAT_INFO, KEY_DISABLED_FORMATS});
+ mFormatsInfoCategory.addChildPrefCompat(mDisabledFormatsCategory);
+
+ for (int hdrType : HDR_FORMATS_DISPLAY_ORDER) {
+ if (mDeviceHdrTypes.contains(hdrType)) {
+ String title = getFormatPreferenceTitle(mContext, hdrType);
+ if (TextUtils.isEmpty(title)) {
+ continue;
+ }
+
+ String key = KEY_HDR_FORMAT_INFO_PREFIX + hdrType;
+ String[] compoundKey = mDisplayReportedHdrTypes.contains(hdrType)
+ ? new String[]{KEY_FORMAT_INFO, KEY_ENABLED_FORMATS, key}
+ : new String[]{KEY_FORMAT_INFO, KEY_DISABLED_FORMATS, key};
+ PreferenceCompat pref = createPreference(title, compoundKey);
+ pref.setTitle(title);
+ if (mDisplayReportedHdrTypes.contains(hdrType)) {
+ mEnabledFormatsCategory.addChildPrefCompat(pref);
+ } else {
+ mDisabledFormatsCategory.addChildPrefCompat(pref);
+ }
+ }
+ }
+ hideFormatInfo();
+ }
+
+ private void createFormatInfoOnManual() {
+ mFormatsInfoOnManualCategory = createPreferenceCategory(
+ "", new String[]{KEY_FORMAT_INFO_ON_MANUAL}
+ );
+ mSupportedFormatsCategory = createPreferenceCategory(
+ "hdr_format_supported_title",
+ new String[]{KEY_FORMAT_INFO_ON_MANUAL, KEY_SUPPORTED_HDR_FORMATS});
+ mUnsupportedFormatsCategory = createPreferenceCategory(
+ "hdr_format_unsupported_title",
+ new String[]{KEY_FORMAT_INFO_ON_MANUAL, KEY_UNSUPPORTED_HDR_FORMATS});
+
+ mFormatsInfoOnManualCategory.addChildPrefCompat(mSupportedFormatsCategory);
+ mFormatsInfoOnManualCategory.addChildPrefCompat(mUnsupportedFormatsCategory);
+ List<AbstractPreferenceController> preferenceControllers = new ArrayList<>();
+ for (int hdrType : HDR_FORMATS_DISPLAY_ORDER) {
+ if (mDeviceHdrTypes.contains(hdrType)) {
+ HdrFormatPreferenceController hdrFormatPC = new HdrFormatPreferenceController(
+ mContext, mUIUpdateCallback, getStateIdentifier(),
+ mPreferenceCompatManager, hdrType, mDisplayManager,
+ mDisplayReportedHdrTypes, mUserDisabledHdrTypes
+ );
+ preferenceControllers.add(hdrFormatPC);
+ hdrFormatPC.init();
+ if (hdrFormatPC.isAvailable()) {
+ if (mDisplayReportedHdrTypes.contains(hdrType)) {
+ mSupportedFormatsCategory.addChildPrefCompat(
+ hdrFormatPC.getPrefCompat());
+ } else {
+ mUnsupportedFormatsCategory.addChildPrefCompat(
+ hdrFormatPC.getPrefCompat());
+ }
+ }
+ }
+ }
+ mPreferenceControllers.addAll(preferenceControllers);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ PreferenceCompat pref = mPreferenceCompatManager.getPrefCompat(key);
+ if (pref == null) {
+ return false;
+ }
+ if (pref.getType() == PreferenceCompat.TYPE_RADIO) {
+ selectRadioPreference(pref);
+
+ if (pref.getKey().length != 2) {
+ return false;
+ }
+ switch (key[1]) {
+ case KEY_HDR_FORMAT_SELECTION_AUTO: {
+ mDisplayManager.setAreUserDisabledHdrTypesAllowed(true);
+ hideFormatInfoOnManual();
+ break;
+ }
+ case KEY_HDR_FORMAT_SELECTION_MANUAL: {
+ mDisplayManager.setAreUserDisabledHdrTypesAllowed(false);
+ showFormatInfoOnManual();
+ break;
+ }
+ default:
+ throw new IllegalArgumentException("Unknown surround sound pref value: "
+ + key);
+ }
+ updateFormatStates();
+ return true;
+ }
+
+ if (key.length == 2 && key[0].equals(KEY_FORMAT_INFO) && key[1].equals(
+ KEY_SHOW_HIDE_FORMAT_INFO)) {
+ if (pref.getTitle().equals(
+ ResourcesUtil.getString(mContext, "hdr_hide_formats"))) {
+ pref.setTitle(ResourcesUtil.getString(mContext, "hdr_show_formats"));
+ hideFormatInfo();
+ } else {
+ pref.setTitle(ResourcesUtil.getString(mContext, "hdr_hide_formats"));
+ showFormatInfo();
+ }
+ return true;
+ }
+
+ if (key.length == 3 && key[0].equals(KEY_FORMAT_INFO) && key[2].contains(
+ KEY_HDR_FORMAT_INFO_PREFIX)) {
+ if (PreferenceCompatUtils.isParent(pref, mEnabledFormatsCategory)) {
+ LibUtils.showToast(mContext, "surround_sound_enabled_format_info_clicked");
+ }
+ return true;
+ }
+
+ return super.onPreferenceTreeClick(key, status);
+ }
+
+ private void showFormatInfoOnManual() {
+ mSupportedFormatsCategory.setVisible(true);
+ mUnsupportedFormatsCategory.setVisible(true);
+ updateFormatStates();
+ // hide the formats info section.
+ mFormatsInfoCategory.setVisible(false);
+ notifyUpdateFormatInfo();
+ }
+
+ private void hideFormatInfoOnManual() {
+ mSupportedFormatsCategory.setVisible(false);
+ mUnsupportedFormatsCategory.setVisible(false);
+ updateFormatStates();
+ // show the formats info section.
+ mFormatsInfoCategory.setVisible(true);
+ notifyUpdateFormatInfo();
+ }
+
+ private void showFormatInfo() {
+ mEnabledFormatsCategory.setVisible(true);
+ mDisabledFormatsCategory.setVisible(true);
+ notifyUpdateFormatInfo();
+ }
+
+ private void hideFormatInfo() {
+ mEnabledFormatsCategory.setVisible(false);
+ mDisabledFormatsCategory.setVisible(false);
+ notifyUpdateFormatInfo();
+ }
+
+ private void updateFormatStates() {
+ for (AbstractPreferenceController controller : mPreferenceControllers) {
+ if (controller instanceof HdrFormatPreferenceController) {
+ ((HdrFormatPreferenceController) controller).update();
+ }
+ }
+ }
+
+ private void notifyUpdateFormatInfo() {
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(),
+ mFormatsInfoOnManualCategory);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mFormatsInfoCategory);
+ }
+
+ /**
+ * @return the display id for each hdr type.
+ */
+ static String getFormatPreferenceTitle(Context context, int hdrType) {
+ switch (hdrType) {
+ case HDR_TYPE_DOLBY_VISION:
+ return ResourcesUtil.getString(context, "hdr_format_dolby_vision");
+ case HDR_TYPE_HDR10:
+ return ResourcesUtil.getString(context, "hdr_format_hdr10");
+ case HDR_TYPE_HLG:
+ return ResourcesUtil.getString(context, "hdr_format_hlg");
+ case HDR_TYPE_HDR10_PLUS:
+ return ResourcesUtil.getString(context, "hdr_format_hdr10plus");
+ default:
+ return "";
+ }
+ }
+
+ private PreferenceCompat createPreferenceCategory(String valueName, String[] key) {
+ PreferenceCompat preferenceCategory = mPreferenceCompatManager.getOrCreatePrefCompat(key);
+ preferenceCategory.setType(PreferenceCompat.TYPE_PREFERENCE_CATEGORY);
+ preferenceCategory.setTitle(ResourcesUtil.getString(mContext, valueName));
+ return preferenceCategory;
+ }
+
+
+ private PreferenceCompat createPreference(String titleResourceId, String[] key) {
+ PreferenceCompat preference = mPreferenceCompatManager.getOrCreatePrefCompat(key);
+ preference.setTitle(ResourcesUtil.getString(mContext, titleResourceId));
+ return preference;
+ }
+
+ private void selectRadioPreference(PreferenceCompat preferenceCompat) {
+ preferenceCompat.setChecked(true);
+ mHdrFormatSelectionCategory.getChildPrefCompats().stream()
+ .filter(radioPref -> radioPref != preferenceCompat)
+ .forEach(radioPref -> radioPref.setChecked(false));
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mHdrFormatSelectionCategory);
+ }
+
+ private DisplayManager getDisplayManager() {
+ return mContext.getSystemService(DisplayManager.class);
+ }
+
+ private int[] getDeviceSupportedHdrTypes() {
+ return ResourcesUtil.getIntArray(mContext, "config_deviceSupportedHdrFormats");
+ }
+
+ private Set<Integer> toSet(int[] array) {
+ return Arrays.stream(array).boxed().collect(Collectors.toSet());
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_HDR_FORMAT_SELECTION;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/MatchContentFrameRateState.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/MatchContentFrameRateState.java
new file mode 100644
index 0000000..6fe3b7a
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/MatchContentFrameRateState.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.display.displaysound;
+
+
+import android.content.Context;
+import android.os.Bundle;
+import android.provider.Settings;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.List;
+
+/**
+ * State to provide data for rendering match content frame rate screen.
+ */
+public class MatchContentFrameRateState extends PreferenceControllerState {
+ private static final String KEY_MATCH_CONTENT_FRAME_RATE = "match_content_frame_rate_option";
+
+ private static final String KEY_MATCH_CONTENT_FRAME_RATE_SEAMLESS =
+ "match_content_frame_rate_seamless";
+ private static final String KEY_MATCH_CONTENT_FRAME_RATE_NON_SEAMLESS =
+ "match_content_frame_rate_non_seamless";
+ private static final String KEY_MATCH_CONTENT_FRAME_RATE_NEVER =
+ "match_content_frame_rate_never";
+ private PreferenceCompat mPrefGroup;
+ private PreferenceCompat mCurrentPreference;
+ private PreferenceCompat mNeverPref;
+ private PreferenceCompat mSeamlessPref;
+ private PreferenceCompat mNonSeamlessPref;
+
+ public MatchContentFrameRateState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_MATCH_CONTENT_FRAME;
+ }
+
+ private PreferenceCompat getCurrentPreference() {
+ int matchContentSetting = getCurrentSettingValue();
+ switch (matchContentSetting) {
+ case (Settings.Secure.MATCH_CONTENT_FRAMERATE_NEVER): {
+ return mNeverPref;
+ }
+ case (Settings.Secure.MATCH_CONTENT_FRAMERATE_SEAMLESSS_ONLY): {
+ return mSeamlessPref;
+ }
+ case (Settings.Secure.MATCH_CONTENT_FRAMERATE_ALWAYS): {
+ return mNonSeamlessPref;
+ }
+ default:
+ throw new IllegalArgumentException("Unknown match content frame rate pref "
+ + "value in stored settings");
+ }
+ }
+
+ private int getCurrentSettingValue() {
+ return Settings.Secure.getInt(
+ mContext.getContentResolver(),
+ Settings.Secure.MATCH_CONTENT_FRAME_RATE,
+ Settings.Secure.MATCH_CONTENT_FRAMERATE_SEAMLESSS_ONLY);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ int newValue;
+ switch (key[1]) {
+ case KEY_MATCH_CONTENT_FRAME_RATE_SEAMLESS: {
+ newValue = Settings.Secure.MATCH_CONTENT_FRAMERATE_SEAMLESSS_ONLY;
+ break;
+ }
+ case KEY_MATCH_CONTENT_FRAME_RATE_NON_SEAMLESS: {
+ newValue = Settings.Secure.MATCH_CONTENT_FRAMERATE_ALWAYS;
+ break;
+ }
+ case KEY_MATCH_CONTENT_FRAME_RATE_NEVER: {
+ newValue = Settings.Secure.MATCH_CONTENT_FRAMERATE_NEVER;
+ break;
+ }
+ default:
+ return false;
+ }
+ int oldValue = getCurrentSettingValue();
+ if (newValue != oldValue) {
+ Settings.Secure.putInt(
+ mContext.getContentResolver(),
+ Settings.Secure.MATCH_CONTENT_FRAME_RATE,
+ newValue);
+ }
+ return true;
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mPrefGroup = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_MATCH_CONTENT_FRAME_RATE);
+ mPrefGroup.setType(PreferenceCompat.TYPE_PREFERENCE_CATEGORY);
+ mSeamlessPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_MATCH_CONTENT_FRAME_RATE, KEY_MATCH_CONTENT_FRAME_RATE_SEAMLESS});
+ mSeamlessPref.setType(PreferenceCompat.TYPE_RADIO);
+ mSeamlessPref.setTitle(
+ ResourcesUtil.getString(mContext, "match_content_frame_rate_seamless"));
+ mSeamlessPref.setRadioGroup(KEY_MATCH_CONTENT_FRAME_RATE);
+
+ mNonSeamlessPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_MATCH_CONTENT_FRAME_RATE,
+ KEY_MATCH_CONTENT_FRAME_RATE_NON_SEAMLESS});
+ mNonSeamlessPref.setType(PreferenceCompat.TYPE_RADIO);
+ mNonSeamlessPref.setTitle(ResourcesUtil.getString(mContext,
+ "match_content_frame_rate_non_seamless"));
+ mNonSeamlessPref.setRadioGroup(KEY_MATCH_CONTENT_FRAME_RATE);
+
+ mNeverPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_MATCH_CONTENT_FRAME_RATE, KEY_MATCH_CONTENT_FRAME_RATE_NEVER});
+ mNeverPref.setType(PreferenceCompat.TYPE_RADIO);
+ mNeverPref.setTitle(ResourcesUtil.getString(mContext, "match_content_frame_rate_never"));
+ mNeverPref.setRadioGroup(KEY_MATCH_CONTENT_FRAME_RATE);
+
+ mPrefGroup.addChildPrefCompat(mSeamlessPref);
+ mPrefGroup.addChildPrefCompat(mNonSeamlessPref);
+ mPrefGroup.addChildPrefCompat(mNeverPref);
+
+ mCurrentPreference = getCurrentPreference();
+ mCurrentPreference.setChecked(true);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mPrefGroup);
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/ResolutionSelectionState.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/ResolutionSelectionState.java
new file mode 100644
index 0000000..546c65e
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/ResolutionSelectionState.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.display.displaysound;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_RESOLUTION_SELECTION;
+
+import android.content.Context;
+import android.hardware.display.DisplayManager;
+import android.os.Bundle;
+import android.view.Display;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Provide data for resolution selection settings screen.
+ */
+public class ResolutionSelectionState extends PreferenceControllerState {
+ private static final String KEY_MODE_SELECTION = "resolution_selection_option";
+ private static final String KEY_RESOLUTION_PREFIX = "resolution_selection_";
+ private static final String KEY_RESOLUTION_SELECTION_AUTO = "resolution_selection_auto";
+
+ private DisplayManager mDisplayManager;
+ private Display.Mode[] mModes;
+ private int mUserPreferredModeIndex;
+ private PreferenceCompat mResolutionCategory;
+
+ static final Set<Integer> STANDARD_RESOLUTIONS_IN_ORDER = Set.of(2160, 1080, 720, 576, 480);
+
+ public ResolutionSelectionState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onAttach() {
+ super.onAttach();
+ mDisplayManager = getDisplayManager();
+ }
+
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mResolutionCategory = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_MODE_SELECTION);
+
+ Display display = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
+ mModes = display.getSupportedModes();
+ Arrays.sort(mModes, new Comparator<Display.Mode>() {
+ // Sort in descending order of refresh rate.
+ @Override
+ public int compare(Display.Mode o1, Display.Mode o2) {
+ int resolution1 = Math.min(o1.getPhysicalHeight(), o1.getPhysicalWidth());
+ int resolution2 = Math.min(o2.getPhysicalHeight(), o2.getPhysicalWidth());
+
+ // The resolution which is in list of standard resolutions appears before the one
+ // which is not.
+ if (STANDARD_RESOLUTIONS_IN_ORDER.contains(resolution2)
+ && !STANDARD_RESOLUTIONS_IN_ORDER.contains(resolution1)) {
+ return 1;
+ }
+ if (STANDARD_RESOLUTIONS_IN_ORDER.contains(resolution1)
+ && !STANDARD_RESOLUTIONS_IN_ORDER.contains(resolution2)) {
+ return -1;
+ }
+ if (resolution2 == resolution1) {
+ return (int) o2.getRefreshRate() - (int) o1.getRefreshRate();
+ }
+ return resolution2 - resolution1;
+ }
+ });
+
+ createPreferences();
+
+ mUserPreferredModeIndex = lookupModeIndex(
+ mDisplayManager.getGlobalUserPreferredDisplayMode());
+ if (mUserPreferredModeIndex != -1) {
+ selectRadioPreference(new String[]{KEY_MODE_SELECTION,
+ KEY_RESOLUTION_PREFIX + mUserPreferredModeIndex});
+ } else {
+ selectRadioPreference(new String[]{KEY_MODE_SELECTION, KEY_RESOLUTION_SELECTION_AUTO});
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mResolutionCategory);
+ }
+
+ DisplayManager getDisplayManager() {
+ return mContext.getSystemService(DisplayManager.class);
+ }
+
+ private void selectRadioPreference(String[] key) {
+ final PreferenceCompat radioPreference = mPreferenceCompatManager.getPrefCompat(key);
+ if (radioPreference != null) {
+ radioPreference.setChecked(true);
+ }
+ }
+
+ /** Returns the index of Display mode that matches UserPreferredMode */
+ public int lookupModeIndex(Display.Mode userPreferredMode) {
+ if (userPreferredMode != null) {
+ for (int i = 0; i < mModes.length; i++) {
+ if (mModes[i].matches(userPreferredMode.getPhysicalWidth(),
+ userPreferredMode.getPhysicalHeight(),
+ userPreferredMode.getRefreshRate())) {
+ return i;
+ }
+ }
+ }
+ return -1;
+ }
+
+ private void createPreferences() {
+ PreferenceCompat pref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_MODE_SELECTION, KEY_RESOLUTION_SELECTION_AUTO});
+ pref.setTitle(ResourcesUtil.getString(mContext, "resolution_selection_auto_title"));
+ pref.setRadioGroup(KEY_MODE_SELECTION);
+ pref.setType(PreferenceCompat.TYPE_RADIO);
+ mResolutionCategory.addChildPrefCompat(pref);
+
+ for (int i = 0; i < mModes.length; i++) {
+ int resolution = Math.min(mModes[i].getPhysicalHeight(), mModes[i].getPhysicalWidth());
+ String title = resolution + "p";
+ if (resolution == 2160) {
+ title = "4k";
+ }
+ mResolutionCategory.addChildPrefCompat(createResolutionPreferenceCompat(
+ title,
+ getRefreshRateString(mModes[i].getRefreshRate()) + " Hz",
+ i));
+ }
+ }
+
+ private String getRefreshRateString(float refreshRate) {
+ float roundedRefreshRate = Math.round(refreshRate * 100.0f) / 100.0f;
+ if (roundedRefreshRate % 1 == 0) {
+ return Integer.toString((int) roundedRefreshRate);
+ } else {
+ return Float.toString(roundedRefreshRate);
+ }
+ }
+
+ /** Returns a radio preference for each display mode. */
+ private PreferenceCompat createResolutionPreferenceCompat(
+ String title, String summary, int resolution) {
+ PreferenceCompat pref = mPreferenceCompatManager.getOrCreatePrefCompat(new String[]{
+ KEY_MODE_SELECTION,
+ KEY_RESOLUTION_PREFIX + resolution});
+ pref.setTitle(title);
+ pref.setSummary(summary);
+ pref.setType(PreferenceCompat.TYPE_RADIO);
+ pref.setRadioGroup(KEY_MODE_SELECTION);
+ return pref;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_RESOLUTION_SELECTION;
+ }
+
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ if (key.length != 2) {
+ return false;
+ }
+
+ if (key[1].equals(KEY_RESOLUTION_SELECTION_AUTO)) {
+ mDisplayManager.clearGlobalUserPreferredDisplayMode();
+ return true;
+ } else if (key[1].contains(KEY_RESOLUTION_PREFIX)) {
+ int modeIndex = Integer.valueOf(key[1].substring(KEY_RESOLUTION_PREFIX.length()));
+ Display.Mode mode = mModes[modeIndex];
+ mDisplayManager.setGlobalUserPreferredDisplayMode(mode);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/SoundFormatPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/SoundFormatPreferenceController.java
new file mode 100644
index 0000000..15d8637
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/display/displaysound/SoundFormatPreferenceController.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.display.displaysound;
+
+import static com.android.tv.settings.library.device.display.displaysound.AdvancedVolumeState.KEY_FORMAT_INFO_ON_MANUAL;
+import static com.android.tv.settings.library.device.display.displaysound.AdvancedVolumeState.KEY_SUPPORTED_SURROUND_SOUND;
+import static com.android.tv.settings.library.device.display.displaysound.AdvancedVolumeState.KEY_SURROUND_SOUND_FORMAT_PREFIX;
+import static com.android.tv.settings.library.device.display.displaysound.AdvancedVolumeState.KEY_UNSUPPORTED_SURROUND_SOUND;
+
+import android.annotation.NonNull;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.media.AudioManager;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Controller for the surround sound switch preference compats.
+ */
+public class SoundFormatPreferenceController extends AbstractPreferenceController {
+ private static final String TAG = "SoundFormatController";
+
+ private final int mFormatId;
+ private final Map<Integer, Boolean> mFormats;
+ private final List<Integer> mReportedFormats;
+ private final AudioManager mAudioManager;
+
+ public SoundFormatPreferenceController(
+ Context context,
+ UIUpdateCallback uiUpdateCallback,
+ int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager,
+ int formatId,
+ AudioManager audioManager,
+ @NonNull Map<Integer, Boolean> formats,
+ @NonNull List<Integer> reportedFormats) {
+ super(context, uiUpdateCallback, stateIdentifier, preferenceCompatManager);
+ mFormatId = formatId;
+ mAudioManager = audioManager;
+ mFormats = formats;
+ mReportedFormats = reportedFormats;
+ }
+
+ @Override
+ protected void init() {
+ // If the format is not a known surround sound format, do not create a preference
+ // for it.
+ String title = AdvancedVolumeState.getFormatDisplayResource(mContext, mFormatId);
+ mPreferenceCompat.setVisible(!TextUtils.isEmpty(title));
+ mPreferenceCompat.setTitle(title);
+ mPreferenceCompat.setType(PreferenceCompat.TYPE_SWITCH);
+ update();
+ }
+
+ @Override
+ protected void update() {
+ mPreferenceCompat.setEnabled(getFormatPreferencesEnabledState());
+ mPreferenceCompat.setChecked(getFormatPreferenceCheckedState());
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(boolean status) {
+ // In case of enabling unsupported format, show a warning dialog
+ if (!isReportedFormat() && status) {
+ showWarningDialogOnEnableUnsupportedFormat();
+ } else {
+ mAudioManager.setSurroundFormatEnabled(mFormatId, status);
+ }
+ return true;
+ }
+
+
+ /**
+ * @return checked state of a surround sound format switch based on passthrough setting and
+ * audio manager state for the format.
+ */
+ private boolean getFormatPreferenceCheckedState() {
+ switch (AdvancedVolumeState.getSurroundPassthroughSettingKey(mContext)) {
+ case AdvancedVolumeState.KEY_SURROUND_SOUND_AUTO:
+ return isReportedFormat();
+ case AdvancedVolumeState.KEY_SURROUND_SOUND_MANUAL:
+ return getEnabledFormats().contains(mFormatId);
+ default:
+ return false;
+ }
+ }
+
+ private void showWarningDialogOnEnableUnsupportedFormat() {
+ new AlertDialog.Builder(mContext)
+ .setTitle(ResourcesUtil.getString(mContext,
+ "surround_sound_enable_unsupported_dialog_title"))
+ .setMessage(ResourcesUtil.getString(mContext,
+ "surround_sound_enable_unsupported_dialog_desc"))
+ .setPositiveButton(
+ ResourcesUtil.getString(mContext,
+ "surround_sound_enable_unsupported_dialog_ok"),
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ mAudioManager.setSurroundFormatEnabled(mFormatId, true);
+ dialog.dismiss();
+ }
+ })
+ .setNegativeButton(
+ ResourcesUtil.getString(mContext,
+ "surround_sound_enable_unsupported_dialog_cancel"),
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ mPreferenceCompat.setChecked(false);
+ mUIUpdateCallback.notifyUpdate(mStateIdentifier, mPreferenceCompat);
+ dialog.dismiss();
+ }
+ })
+ .show();
+ }
+
+ /** @return true if the given format is reported by the device. */
+ private boolean isReportedFormat() {
+ return mReportedFormats.contains(mFormatId);
+ }
+
+ /** @return the formats that are enabled in global settings */
+ HashSet<Integer> getEnabledFormats() {
+ HashSet<Integer> formats = new HashSet<>();
+ String enabledFormats = Settings.Global.getString(mContext.getContentResolver(),
+ Settings.Global.ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS);
+ if (enabledFormats == null) {
+ // , PreferenceCompatManager preferenceCompatManagerStarting with Android P
+ // passthrough setting ALWAYS has been replaced with MANUAL.
+ // In that case all formats will be enabled when in MANUAL mode.
+ formats.addAll(mFormats.keySet());
+ } else {
+ try {
+ Arrays.stream(TextUtils.split(enabledFormats, ",")).mapToInt(Integer::parseInt)
+ .forEach(formats::add);
+ } catch (NumberFormatException e) {
+ Log.w(TAG, "ENCODED_SURROUND_OUTPUT_ENABLED_FORMATS misformatted.", e);
+ }
+ }
+ return formats;
+ }
+
+ /** @return true if the format checkboxes should be enabled, i.e. in manual mode. */
+ private boolean getFormatPreferencesEnabledState() {
+ return AdvancedVolumeState.getSurroundPassthroughSettingKey(mContext)
+ .equals(AdvancedVolumeState.KEY_SURROUND_SOUND_MANUAL);
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ String key = KEY_SURROUND_SOUND_FORMAT_PREFIX + mFormatId;
+ String[] compoundKey = mReportedFormats.contains(mFormatId)
+ ? new String[]{KEY_FORMAT_INFO_ON_MANUAL, KEY_SUPPORTED_SURROUND_SOUND, key}
+ : new String[]{KEY_FORMAT_INFO_ON_MANUAL, KEY_UNSUPPORTED_SURROUND_SOUND, key};
+ return compoundKey;
+ }
+
+ public boolean isAvailable() {
+ return mPreferenceCompat.getVisible() == PreferenceCompat.STATUS_ON;
+ }
+
+ public PreferenceCompat getPreferenceCompat() {
+ return mPreferenceCompat;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/storage/MissingStorageState.java b/SettingsAPI/java/com/android/tv/settings/library/device/storage/MissingStorageState.java
new file mode 100644
index 0000000..b33bef3
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/storage/MissingStorageState.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.storage;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeRecord;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.List;
+
+/** State to handle missing storage screen. */
+public class MissingStorageState extends PreferenceControllerState {
+ private static final String TAG = "MissingStorageState";
+
+ private static final String KEY_FORGET = "forget";
+ private static final String INTENT_CONFIRMATION = "android.settings.ui.CONFIRM";
+ private static final String EXTRA_GUIDANCE_TITLE = "guidancetitle";
+ private static final String EXTRA_GUIDANCE_SUBTITLE = "guidanceSubtitle";
+
+ private static final int REQUEST_FORGET_PRIVATE = 1;
+
+ private String mFsUuid;
+ private StorageManager mStorageManager;
+ PreferenceCompat mForgetPreferenceCompat;
+
+ public static void prepareArgs(Bundle b, String fsUuid) {
+ b.putString(VolumeRecord.EXTRA_FS_UUID, fsUuid);
+ }
+
+ public MissingStorageState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mFsUuid = extras.getString(VolumeRecord.EXTRA_FS_UUID);
+ mStorageManager = mContext.getSystemService(StorageManager.class);
+ mStorageManager.registerListener(new StorageEventListener());
+ mForgetPreferenceCompat = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_FORGET);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ if (KEY_FORGET.equals(key[0])) {
+ Intent i = new Intent(INTENT_CONFIRMATION);
+ i.putExtra(EXTRA_GUIDANCE_TITLE, ResourcesUtil.getString(
+ mContext, "storage_wizard_forget_confirm_title"));
+ i.putExtra(EXTRA_GUIDANCE_SUBTITLE, ResourcesUtil.getString(
+ mContext, "storage_wizard_forget_confirm_description"));
+ ((Activity) mContext).startActivityForResult(i,
+ ManagerUtil.calculateCompoundCode(
+ getStateIdentifier(), REQUEST_FORGET_PRIVATE
+ ));
+ return true;
+ }
+ return super.onPreferenceTreeClick(key, status);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ switch (requestCode) {
+ case REQUEST_FORGET_PRIVATE:
+ if (resultCode == Activity.RESULT_OK) {
+ mContext.getSystemService(StorageManager.class).forgetVolume(mFsUuid);
+ }
+ break;
+ default:
+ // no-op
+ }
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_MISSING_STORAGE;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+
+ private class StorageEventListener extends android.os.storage.StorageEventListener {
+
+ @Override
+ public void onVolumeForgotten(String fsUuid) {
+ if (!TextUtils.equals(fsUuid, mFsUuid)) {
+ return;
+ }
+ if (mStorageManager.findRecordByUuid(fsUuid) == null) {
+ mUIUpdateCallback.notifyNavigateBackward(getStateIdentifier());
+ Log.i(TAG, "FsUuid " + mFsUuid + " vanished while resumed");
+ }
+ }
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/storage/StorageState.java b/SettingsAPI/java/com/android/tv/settings/library/device/storage/StorageState.java
new file mode 100644
index 0000000..7eda655
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/storage/StorageState.java
@@ -0,0 +1,374 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.storage;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.storage.DiskInfo;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+import android.text.TextUtils;
+import android.text.format.Formatter;
+import android.util.Log;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.device.apps.AppsState;
+import com.android.tv.settings.library.settingslib.StorageMeasurement;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+
+/** State to handle storage screen. */
+public class StorageState extends PreferenceControllerState {
+ private static final String TAG = "StorageFragment";
+ private static final String EXTRA_MIGRATE_HERE =
+ "com.android.tv.settings.device.storage.MigrateStorageActivity.MIGRATE_HERE";
+ private static final String INTENT_ACTION_FORMAT_AS_PRIVATE =
+ "com.android.tv.settings.device.storage.FormatActivity.formatAsPrivate";
+ private static final String INTENT_ACTION_FORMAT_AS_PUBLIC =
+ "com.android.tv.settings.device.storage.FormatActivity.formatAsPublic";
+ private static final String EXTRA_VOLUME_DESC = "UnmountActivity.volumeDesc";
+ private static final String INTENT_NEW_STORAGE = "com.android.tv.settings.action.NEW_STORAGE";
+ private static final String INTENT_UNMOUNT = "com.android.tv.settings.action.UNMOUNT_STORAGE";
+ private static final String INTENT_CONFIRMATION = "android.settings.ui.CONFIRM";
+ private static final String EXTRA_GUIDANCE_TITLE = "guidancetitle";
+ private static final String EXTRA_GUIDANCE_SUBTITLE = "guidanceSubtitle";
+ private static final String KEY_MIGRATE = "migrate";
+ private static final String KEY_EJECT = "eject";
+ private static final String KEY_ERASE = "erase";
+ private static final String KEY_APPS_USAGE = "apps_usage";
+ private static final String KEY_DCIM_USAGE = "dcim_usage";
+ private static final String KEY_MUSIC_USAGE = "music_usage";
+ private static final String KEY_DOWNLOADS_USAGE = "downloads_usage";
+ private static final String KEY_CACHE_USAGE = "cache_usage";
+ private static final String KEY_MISC_USAGE = "misc_usage";
+ private static final String KEY_AVAILABLE = "available";
+
+ private static final int REQUEST_CLEAR_CACHE = 1;
+ private static final long SIZE_CALCULATING = -1;
+
+ private StorageManager mStorageManager;
+ private PackageManager mPackageManager;
+
+ private VolumeInfo mVolumeInfo;
+
+ private StorageMeasurement mMeasure;
+ private final StorageMeasurement.MeasurementReceiver mMeasurementReceiver =
+ new MeasurementReceiver();
+ private final StorageEventListener mStorageEventListener = new StorageEventListener();
+
+ private PreferenceCompat mMigratePref;
+ private PreferenceCompat mEjectPref;
+ private PreferenceCompat mErasePref;
+ private PreferenceCompat mAppsUsagePref;
+ private PreferenceCompat mDcimUsagePref;
+ private PreferenceCompat mMusicUsagePref;
+ private PreferenceCompat mDownloadsUsagePref;
+ private PreferenceCompat mCacheUsagePref;
+ private PreferenceCompat mMiscUsagePref;
+ private PreferenceCompat mAvailablePref;
+ private Bundle mExtras;
+
+ public StorageState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ public static void prepareArgs(Bundle bundle, VolumeInfo volumeInfo) {
+ bundle.putString(VolumeInfo.EXTRA_VOLUME_ID, volumeInfo.getId());
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ mStorageManager = mContext.getSystemService(StorageManager.class);
+ mPackageManager = mContext.getPackageManager();
+
+ mVolumeInfo = mStorageManager.findVolumeById(
+ extras.getString(VolumeInfo.EXTRA_VOLUME_ID));
+ mExtras = extras;
+ super.onCreate(extras);
+ mUIUpdateCallback.notifyUpdateScreenTitle(
+ getStateIdentifier(), mStorageManager.getBestVolumeDescription(mVolumeInfo));
+ mMigratePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_MIGRATE);
+ mEjectPref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_EJECT);
+ mErasePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_ERASE);
+ mAppsUsagePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_APPS_USAGE);
+ mDcimUsagePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_DCIM_USAGE);
+ mMusicUsagePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_MUSIC_USAGE);
+ mDownloadsUsagePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_DOWNLOADS_USAGE);
+ mCacheUsagePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_CACHE_USAGE);
+ mMiscUsagePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_MISC_USAGE);
+ mAvailablePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_AVAILABLE);
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ mStorageManager.registerListener(mStorageEventListener);
+ startMeasurement();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mVolumeInfo = mStorageManager.findVolumeById(mExtras.getString(VolumeInfo.EXTRA_VOLUME_ID));
+ if (mVolumeInfo == null || !mVolumeInfo.isMountedReadable()) {
+ mUIUpdateCallback.notifyNavigateBackward(getStateIdentifier());
+ } else {
+ refresh();
+ }
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ mStorageManager.unregisterListener(mStorageEventListener);
+ stopMeasurement();
+ }
+
+ private static Intent getFormatAsPublicIntent(Context context, String diskId) {
+ final Intent i = new Intent(INTENT_ACTION_FORMAT_AS_PUBLIC);
+ i.putExtra(DiskInfo.EXTRA_DISK_ID, diskId);
+ return i;
+ }
+
+ private static Intent getFormatAsPrivateIntent(Context context, String diskId) {
+ final Intent i = new Intent(INTENT_ACTION_FORMAT_AS_PRIVATE);
+ i.putExtra(DiskInfo.EXTRA_DISK_ID, diskId);
+ return i;
+ }
+
+ private static Intent getUnmountIntent(Context context, String volumeId, String volumeDesc) {
+ final Intent i = new Intent(INTENT_UNMOUNT);
+ i.putExtra(VolumeInfo.EXTRA_VOLUME_ID, volumeId);
+ i.putExtra(EXTRA_VOLUME_DESC, volumeDesc);
+ return i;
+ }
+
+ private void refresh() {
+ boolean showMigrate = false;
+ final VolumeInfo currentExternal = mPackageManager.getPrimaryStorageCurrentVolume();
+ // currentExternal will be null if the drive is not mounted. Don't offer the option to
+ // migrate if so.
+ if (currentExternal != null
+ && !TextUtils.equals(currentExternal.getId(), mVolumeInfo.getId())) {
+ final List<VolumeInfo> candidates =
+ mPackageManager.getPrimaryStorageCandidateVolumes();
+ for (final VolumeInfo candidate : candidates) {
+ if (TextUtils.equals(candidate.getId(), mVolumeInfo.getId())) {
+ showMigrate = true;
+ break;
+ }
+ }
+ }
+
+ mMigratePref.setVisible(showMigrate);
+ Intent intent = new Intent(INTENT_NEW_STORAGE)
+ .putExtra(VolumeInfo.EXTRA_VOLUME_ID, mVolumeInfo.getId())
+ .putExtra(EXTRA_MIGRATE_HERE, true);
+ mMigratePref.setIntent(intent);
+
+ final String description = mStorageManager.getBestVolumeDescription(mVolumeInfo);
+
+ final boolean privateInternal = VolumeInfo.ID_PRIVATE_INTERNAL.equals(mVolumeInfo.getId());
+ final boolean isPrivate = mVolumeInfo.getType() == VolumeInfo.TYPE_PRIVATE;
+
+ mEjectPref.setVisible(!privateInternal);
+ mEjectPref.setIntent(getUnmountIntent(mContext, mVolumeInfo.getId(), description));
+ mErasePref.setVisible(!privateInternal);
+ if (isPrivate) {
+ mErasePref.setIntent(getFormatAsPublicIntent(mContext, mVolumeInfo.getDiskId()));
+ mErasePref.setTitle(ResourcesUtil.getString(mContext, "storage_format_as_public"));
+ } else {
+ mErasePref.setIntent(getFormatAsPrivateIntent(mContext, mVolumeInfo.getDiskId()));
+ mErasePref.setTitle(ResourcesUtil.getString(mContext, "storage_format_as_private"));
+ }
+
+ mAppsUsagePref.setVisible(isPrivate);
+ mAppsUsagePref.setNextState(ManagerUtil.STATE_APPS);
+ Bundle appUsageExtras = new Bundle();
+ AppsState.prepareArgs(appUsageExtras, mVolumeInfo.fsUuid, description);
+ mAppsUsagePref.setExtras(appUsageExtras);
+ mDcimUsagePref.setVisible(isPrivate);
+ mMusicUsagePref.setVisible(isPrivate);
+ mDownloadsUsagePref.setVisible(isPrivate);
+ mCacheUsagePref.setVisible(isPrivate);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mMigratePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mEjectPref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mErasePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mAppsUsagePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mDcimUsagePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mMusicUsagePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mDownloadsUsagePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mCacheUsagePref);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ if (KEY_CACHE_USAGE.equals(key[0])) {
+ Intent i = new Intent(INTENT_CONFIRMATION);
+ i.putExtra(EXTRA_GUIDANCE_TITLE, ResourcesUtil.getString(
+ mContext, "device_storage_clear_cache_title"));
+ i.putExtra(EXTRA_GUIDANCE_SUBTITLE, ResourcesUtil.getString(
+ mContext, "device_storage_clear_cache_message"));
+ ((Activity) mContext).startActivityForResult(i,
+ ManagerUtil.calculateCompoundCode(
+ getStateIdentifier(), REQUEST_CLEAR_CACHE
+ ));
+ return true;
+ }
+ return super.onPreferenceTreeClick(key, status);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ switch (requestCode) {
+ case REQUEST_CLEAR_CACHE:
+ if (resultCode == Activity.RESULT_OK) {
+ final PackageManager pm = mContext.getPackageManager();
+ final List<PackageInfo> infos = pm.getInstalledPackages(0);
+ for (PackageInfo info : infos) {
+ pm.deleteApplicationCacheFiles(info.packageName, null);
+ }
+ }
+ break;
+ default:
+ // no-op
+ }
+ }
+
+ private void startMeasurement() {
+ if (mVolumeInfo != null && mVolumeInfo.isMountedReadable()) {
+ final VolumeInfo sharedVolume = mStorageManager.findEmulatedForPrivate(mVolumeInfo);
+ mMeasure = new StorageMeasurement(mContext, mVolumeInfo, sharedVolume);
+ mMeasure.setReceiver(mMeasurementReceiver);
+ mMeasure.forceMeasure();
+ }
+ }
+
+ private void updateDetails(StorageMeasurement.MeasurementDetails details) {
+ final int currentUser = ActivityManager.getCurrentUser();
+ final long dcimSize = totalValues(details.mediaSize.get(currentUser),
+ Environment.DIRECTORY_DCIM,
+ Environment.DIRECTORY_MOVIES, Environment.DIRECTORY_PICTURES);
+
+ final long musicSize = totalValues(details.mediaSize.get(currentUser),
+ Environment.DIRECTORY_MUSIC,
+ Environment.DIRECTORY_ALARMS, Environment.DIRECTORY_NOTIFICATIONS,
+ Environment.DIRECTORY_RINGTONES, Environment.DIRECTORY_PODCASTS);
+
+ final long downloadsSize = totalValues(details.mediaSize.get(currentUser),
+ Environment.DIRECTORY_DOWNLOADS);
+
+ mAvailablePref.setSummary(formatSize(mContext,
+ Math.max(0L, details.availSize - cachePartitionSize())));
+ mAppsUsagePref.setSummary(formatSize(mContext,
+ details.appsSize.get(currentUser)));
+ mDcimUsagePref.setSummary(formatSize(mContext, dcimSize));
+ mMusicUsagePref.setSummary(formatSize(mContext, musicSize));
+ mDownloadsUsagePref.setSummary(formatSize(mContext, downloadsSize));
+ mCacheUsagePref.setSummary(formatSize(mContext, details.cacheSize));
+ mMiscUsagePref.setSummary(formatSize(mContext, details.miscSize.get(currentUser)));
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mAvailablePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mAppsUsagePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mDcimUsagePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mMusicUsagePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mDownloadsUsagePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mCacheUsagePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mMiscUsagePref);
+ }
+
+ public static String formatSize(Context context, long size) {
+ return (size == SIZE_CALCULATING)
+ ? ResourcesUtil.getString(context, "storage_calculating_size")
+ : Formatter.formatShortFileSize(context, size);
+ }
+
+ private static long cachePartitionSize() {
+ File cache = new File("/cache");
+ try {
+ return cache.getUsableSpace();
+ } catch (SecurityException e) {
+ Log.w(TAG, "Cannot determine cache partition size.", e);
+ return 0;
+ }
+ }
+
+ private static long totalValues(HashMap<String, Long> map, String... keys) {
+ long total = 0;
+ if (map != null) {
+ for (String key : keys) {
+ if (map.containsKey(key)) {
+ total += map.get(key);
+ }
+ }
+ } else {
+ Log.w(TAG,
+ "MeasurementDetails mediaSize array does not have key for current user " +
+ ActivityManager.getCurrentUser());
+ }
+ return total;
+ }
+
+ private void stopMeasurement() {
+ if (mMeasure != null) {
+ mMeasure.onDestroy();
+ }
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_STORAGE;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+
+ private class MeasurementReceiver implements StorageMeasurement.MeasurementReceiver {
+
+ @Override
+ public void onDetailsChanged(StorageMeasurement.MeasurementDetails details) {
+ updateDetails(details);
+ }
+ }
+
+ private class StorageEventListener extends android.os.storage.StorageEventListener {
+ @Override
+ public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) {
+ mVolumeInfo = vol;
+ if (mVolumeInfo.isMountedReadable()) {
+ refresh();
+ } else {
+ mUIUpdateCallback.notifyNavigateBackward(getStateIdentifier());
+ }
+ }
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/device/storage/StorageSummaryState.java b/SettingsAPI/java/com/android/tv/settings/library/device/storage/StorageSummaryState.java
new file mode 100644
index 0000000..1c1a014
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/device/storage/StorageSummaryState.java
@@ -0,0 +1,293 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.device.storage;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.storage.DiskInfo;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
+import android.os.storage.VolumeRecord;
+import android.util.ArraySet;
+import android.util.Log;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/** State to handle storage summary screen. */
+public class StorageSummaryState extends PreferenceControllerState {
+ private static final String TAG = "StorageSummaryState";
+ private static final String KEY_DEVICE_CATEGORY = "device_storage";
+ private static final String KEY_REMOVABLE_CATEGORY = "removable_storage";
+
+ private static final int REFRESH_DELAY_MILLIS = 500;
+
+ private StorageManager mStorageManager;
+ private PreferenceCompat mRemovableCategory;
+ private PreferenceCompat mDeviceCategory;
+ private final StorageSummaryState.StorageEventListener
+ mStorageEventListener = new StorageSummaryState.StorageEventListener();
+
+ private final Handler mHandler = new Handler();
+ private final Runnable mRefreshRunnable = new Runnable() {
+ @Override
+ public void run() {
+ refresh();
+ }
+ };
+
+ public StorageSummaryState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mStorageManager = mContext.getSystemService(StorageManager.class);
+ mRemovableCategory = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_REMOVABLE_CATEGORY);
+ mDeviceCategory = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_DEVICE_CATEGORY);
+ mRemovableCategory.setVisible(false);
+ }
+
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ mStorageManager.registerListener(mStorageEventListener);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mHandler.removeCallbacks(mRefreshRunnable);
+ // Delay to allow entrance animations to complete
+ mHandler.postDelayed(mRefreshRunnable, REFRESH_DELAY_MILLIS);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mHandler.removeCallbacks(mRefreshRunnable);
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ mStorageManager.unregisterListener(mStorageEventListener);
+ }
+
+ private void refresh() {
+ final List<VolumeInfo> volumes = mStorageManager.getVolumes();
+ volumes.sort(VolumeInfo.getDescriptionComparator());
+
+ final List<VolumeInfo> privateVolumes = new ArrayList<>(volumes.size());
+ final List<VolumeInfo> publicVolumes = new ArrayList<>(volumes.size());
+
+ // Find mounted volumes
+ for (final VolumeInfo vol : volumes) {
+ if (vol.getType() == VolumeInfo.TYPE_PRIVATE) {
+ privateVolumes.add(vol);
+ } else if (vol.getType() == VolumeInfo.TYPE_PUBLIC) {
+ publicVolumes.add(vol);
+ } else {
+ Log.d(TAG, "Skipping volume " + vol.toString());
+ }
+ }
+
+ // Find missing private filesystems
+ final List<VolumeRecord> volumeRecords = mStorageManager.getVolumeRecords();
+ final List<VolumeRecord> privateMissingVolumes = new ArrayList<>(volumeRecords.size());
+
+ for (final VolumeRecord record : volumeRecords) {
+ if (record.getType() == VolumeInfo.TYPE_PRIVATE
+ && mStorageManager.findVolumeByUuid(record.getFsUuid()) == null) {
+ privateMissingVolumes.add(record);
+ }
+ }
+
+ // Find unreadable disks
+ final List<DiskInfo> disks = mStorageManager.getDisks();
+ final List<DiskInfo> unsupportedDisks = new ArrayList<>(disks.size());
+ for (final DiskInfo disk : disks) {
+ if (disk.volumeCount == 0 && disk.size > 0) {
+ unsupportedDisks.add(disk);
+ }
+ }
+
+ final Set<String> touchedDeviceKeys =
+ new ArraySet<>(privateVolumes.size() + privateMissingVolumes.size());
+
+ mDeviceCategory.clearChildPrefCompats();
+ mRemovableCategory.clearChildPrefCompats();
+ for (final VolumeInfo volumeInfo : privateVolumes) {
+ final String key = makeKeyForVolPref(volumeInfo);
+ touchedDeviceKeys.add(key);
+ PreferenceCompat preferenceCompat = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_DEVICE_CATEGORY, key});
+ refreshForVolPref(mContext, mStorageManager, volumeInfo, preferenceCompat);
+ mDeviceCategory.addChildPrefCompat(preferenceCompat);
+ }
+
+ for (final VolumeRecord volumeRecord : privateMissingVolumes) {
+ final String key = makeKeyForMissingPref(volumeRecord);
+ touchedDeviceKeys.add(key);
+ PreferenceCompat preferenceCompat = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_DEVICE_CATEGORY, key});
+ refreshForMissingPref(mContext, volumeRecord, preferenceCompat);
+ mDeviceCategory.addChildPrefCompat(preferenceCompat);
+ }
+
+
+ final int publicCount = publicVolumes.size() + unsupportedDisks.size();
+ final Set<String> touchedRemovableKeys = new ArraySet<>(publicCount);
+ // Only show section if there are public/unknown volumes present
+ mRemovableCategory.setVisible(publicCount > 0);
+
+ for (final VolumeInfo volumeInfo : publicVolumes) {
+ final String key = makeKeyForVolPref(volumeInfo);
+ touchedRemovableKeys.add(key);
+ PreferenceCompat preferenceCompat = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_REMOVABLE_CATEGORY, key});
+ refreshForVolPref(mContext, mStorageManager, volumeInfo, preferenceCompat);
+ mRemovableCategory.addChildPrefCompat(preferenceCompat);
+ }
+ for (final DiskInfo diskInfo : unsupportedDisks) {
+ final String key = makeKeyForUnsupportedDiskPref(diskInfo);
+ touchedRemovableKeys.add(key);
+ PreferenceCompat preferenceCompat = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_REMOVABLE_CATEGORY, key});
+ refreshForUnsupportedDiskPref(mContext, diskInfo, preferenceCompat);
+ mRemovableCategory.addChildPrefCompat(preferenceCompat);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mDeviceCategory);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mRemovableCategory);
+ }
+
+ private void refreshForVolPref(Context context, StorageManager storageManager,
+ VolumeInfo volumeInfo, PreferenceCompat preferenceCompat) {
+ final String description = storageManager
+ .getBestVolumeDescription(volumeInfo);
+ preferenceCompat.setTitle(description);
+ if (volumeInfo.isMountedReadable()) {
+ preferenceCompat.setSummary(getSizeString(context, volumeInfo));
+ } else {
+ preferenceCompat.setSummary(ResourcesUtil.getString(
+ context, "storage_unmount_success, description"));
+ }
+ Bundle b = new Bundle();
+ StorageState.prepareArgs(b, volumeInfo);
+ preferenceCompat.setExtras(b);
+ preferenceCompat.setNextState(ManagerUtil.STATE_STORAGE);
+ }
+
+ private void refreshForUnsupportedDiskPref(Context context, DiskInfo info,
+ PreferenceCompat preferenceCompat) {
+ preferenceCompat.setTitle(info.getDescription());
+ }
+
+ private void refreshForMissingPref(Context context, VolumeRecord volumeRecord,
+ PreferenceCompat preferenceCompat) {
+ preferenceCompat.setTitle(volumeRecord.getNickname());
+ preferenceCompat.setSummary(ResourcesUtil.getString(mContext, "storage_not_connected"));
+ Bundle b = new Bundle();
+ MissingStorageState.prepareArgs(b, volumeRecord.getFsUuid());
+ preferenceCompat.setExtras(b);
+ preferenceCompat.setNextState(ManagerUtil.STATE_MISSING_STORAGE);
+ }
+
+ private static String getSizeString(Context context, VolumeInfo vol) {
+ final File path = vol.getPath();
+ if (vol.isMountedReadable() && path != null) {
+ return String.format(ResourcesUtil.getString(context, "storage_size"),
+ StorageState.formatSize(context, path.getTotalSpace()));
+ } else {
+ return null;
+ }
+ }
+
+ private static String makeKeyForVolPref(VolumeInfo volumeInfo) {
+ return "VolPref:" + volumeInfo.getId();
+ }
+
+ private static String makeKeyForUnsupportedDiskPref(DiskInfo info) {
+ return "UnsupportedPref:" + info.getId();
+ }
+
+ private static String makeKeyForMissingPref(VolumeRecord volumeRecord) {
+ return "MissingPref:" + volumeRecord.getFsUuid();
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_STORAGE_SUMMARY;
+ }
+
+ private class StorageEventListener extends android.os.storage.StorageEventListener {
+ @Override
+ public void onStorageStateChanged(String path, String oldState, String newState) {
+ refresh();
+ }
+
+ @Override
+ public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) {
+ refresh();
+ }
+
+ @Override
+ public void onVolumeRecordChanged(VolumeRecord rec) {
+ refresh();
+ }
+
+ @Override
+ public void onVolumeForgotten(String fsUuid) {
+ refresh();
+ }
+
+ @Override
+ public void onDiskScanned(DiskInfo disk, int volumeCount) {
+ refresh();
+ }
+
+ @Override
+ public void onDiskDestroyed(DiskInfo disk) {
+ refresh();
+ }
+
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminActionPreferenceControllerBase.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminActionPreferenceControllerBase.java
new file mode 100644
index 0000000..06ee2d3
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminActionPreferenceControllerBase.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.enterprise;
+
+import android.content.Context;
+import android.text.format.DateUtils;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.Date;
+
+/**
+ * Forked from:
+ * Settings/src/com/android/settings/enterprise/AdminActionPreferenceControllerBase.java
+ */
+public abstract class AdminActionPreferenceControllerBase extends AbstractPreferenceController {
+ protected final EnterprisePrivacyFeatureProvider mFeatureProvider;
+
+ public AdminActionPreferenceControllerBase(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mFeatureProvider =
+ FlavorUtils.getFeatureFactory(context).getEnterprisePrivacyFeatureProvider(context);
+ }
+
+ protected abstract Date getAdminActionTimestamp();
+
+ @Override
+ public void update() {
+ final Date timestamp = getAdminActionTimestamp();
+ mPreferenceCompat.setSummary(timestamp == null
+ ? ResourcesUtil.getString(mContext, "enterprise_privacy_none")
+ : DateUtils.formatDateTime(mContext, timestamp.getTime(),
+ DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE));
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return true;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminGrantedCameraPermissionPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminGrantedCameraPermissionPreferenceController.java
new file mode 100644
index 0000000..1577cb9
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminGrantedCameraPermissionPreferenceController.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.tv.settings.library.enterprise;
+
+import android.Manifest;
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+
+/**
+ * Forked from:
+ * Settings/src/com/android/settings/enterprise/AdminGrantedCameraPermissionPreferenceController
+ * .java
+ */
+public class AdminGrantedCameraPermissionPreferenceController
+ extends AdminGrantedPermissionsPreferenceControllerBase {
+ private static final String KEY_ENTERPRISE_PRIVACY_NUMBER_CAMERA_ACCESS_PACKAGES =
+ "enterprise_privacy_number_camera_access_packages";
+
+ public AdminGrantedCameraPermissionPreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager, boolean async) {
+ super(context, callback, stateIdentifier, preferenceCompatManager, async,
+ new String[]{Manifest.permission.CAMERA});
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_ENTERPRISE_PRIVACY_NUMBER_CAMERA_ACCESS_PACKAGES};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminGrantedLocationPermissionsPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminGrantedLocationPermissionsPreferenceController.java
new file mode 100644
index 0000000..40db7d1
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminGrantedLocationPermissionsPreferenceController.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.tv.settings.library.enterprise;
+
+import android.Manifest;
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+
+/**
+ * Forked from:
+ * Settings/src/com/android/settings/enterprise
+ * /AdminGrantedLocationPermissionsPreferenceController.java
+ */
+public class AdminGrantedLocationPermissionsPreferenceController
+ extends AdminGrantedPermissionsPreferenceControllerBase {
+ private static final String KEY_ENTERPRISE_PRIVACY_NUMBER_LOCATION_ACCESS_PACKAGES =
+ "enterprise_privacy_number_location_access_packages";
+
+ public AdminGrantedLocationPermissionsPreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager, boolean async) {
+ super(context, callback, stateIdentifier, preferenceCompatManager, async,
+ new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION});
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_ENTERPRISE_PRIVACY_NUMBER_LOCATION_ACCESS_PACKAGES};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminGrantedMicrophonePermissionPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminGrantedMicrophonePermissionPreferenceController.java
new file mode 100644
index 0000000..e78ee18
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminGrantedMicrophonePermissionPreferenceController.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.tv.settings.library.enterprise;
+
+import android.Manifest;
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+
+/**
+ * Forked from:
+ * Settings/src/com/android/settings/enterprise
+ * /AdminGrantedMicrophonePermissionPreferenceController.java
+ */
+public class AdminGrantedMicrophonePermissionPreferenceController
+ extends AdminGrantedPermissionsPreferenceControllerBase {
+ private static final String KEY_ENTERPRISE_PRIVACY_NUMBER_MICROPHONE_ACCESS_PACKAGES =
+ "enterprise_privacy_number_microphone_access_packages";
+
+ public AdminGrantedMicrophonePermissionPreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager, boolean async) {
+ super(context, callback, stateIdentifier, preferenceCompatManager, async,
+ new String[]{Manifest.permission.RECORD_AUDIO});
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_ENTERPRISE_PRIVACY_NUMBER_MICROPHONE_ACCESS_PACKAGES};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminGrantedPermissionsPreferenceControllerBase.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminGrantedPermissionsPreferenceControllerBase.java
new file mode 100644
index 0000000..95a816b
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AdminGrantedPermissionsPreferenceControllerBase.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+public abstract class AdminGrantedPermissionsPreferenceControllerBase
+ extends AbstractPreferenceController {
+ private final String[] mPermissions;
+ private final ApplicationFeatureProvider mFeatureProvider;
+ private final boolean mAsync;
+ private boolean mHasApps;
+
+ public AdminGrantedPermissionsPreferenceControllerBase(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager, boolean async, String[] permissions) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mPermissions = permissions;
+ mFeatureProvider =
+ FlavorUtils.getFeatureFactory(context).getApplicationFeatureProvider(context);
+ mAsync = async;
+ mHasApps = false;
+ }
+
+ @Override
+ public void init() {
+ update();
+ }
+
+ @Override
+ public void update() {
+ mFeatureProvider.calculateNumberOfAppsWithAdminGrantedPermissions(
+ mPermissions, true /* async */, (num) -> {
+ if (num == 0) {
+ mHasApps = false;
+ } else {
+ mPreferenceCompat.setSummary(ResourcesUtil.getQuantityString(mContext,
+ "enterprise_privacy_number_packages_lower_bound", num, num));
+ mHasApps = true;
+ }
+ mPreferenceCompat.setVisible(mHasApps);
+ });
+ }
+
+ @Override
+ public boolean isAvailable() {
+ if (mAsync) {
+ // When called on the main UI thread, we must not block. Since calculating the number of
+ // apps that the admin has granted a given permissions takes a bit of time, we always
+ // return true here and determine the pref's actual visibility asynchronously in
+ // updateState().
+ return true;
+ }
+
+ // When called by the search indexer, we are on a background thread that we can block. Also,
+ // changes to the pref's visibility made in updateState() would not be seen by the indexer.
+ // We block and return synchronously whether the admin has granted the given permissions to
+ // any apps or not.
+ final Boolean[] haveAppsWithAdminGrantedPermissions = {null};
+ mFeatureProvider.calculateNumberOfAppsWithAdminGrantedPermissions(mPermissions,
+ false /* async */, (num) -> haveAppsWithAdminGrantedPermissions[0] = num > 0);
+ mHasApps = haveAppsWithAdminGrantedPermissions[0];
+ return mHasApps;
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(boolean status) {
+ if (!mHasApps) {
+ return false;
+ }
+ return super.handlePreferenceTreeClick(status);
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java
new file mode 100644
index 0000000..215d74f
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AlwaysOnVpnCurrentUserPreferenceController.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.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+public class AlwaysOnVpnCurrentUserPreferenceController extends AbstractPreferenceController {
+ private static final String KEY_ALWAYS_ON_VPN_PRIMARY_USER = "always_on_vpn_primary_user";
+ private final EnterprisePrivacyFeatureProvider mFeatureProvider;
+
+ public AlwaysOnVpnCurrentUserPreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mFeatureProvider =
+ FlavorUtils.getFeatureFactory(context).getEnterprisePrivacyFeatureProvider(context);
+ }
+
+ @Override
+ public void update() {
+ mPreferenceCompat.setTitle(mFeatureProvider.isInCompMode()
+ ? ResourcesUtil.getString(
+ mContext, "enterprise_privacy_always_on_vpn_personal")
+ : ResourcesUtil.getString(
+ mContext, "enterprise_privacy_always_on_vpn_device"));
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mFeatureProvider.isAlwaysOnVpnSetInCurrentUser();
+ }
+
+ @Override
+ protected void init() {
+ update();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_ALWAYS_ON_VPN_PRIMARY_USER};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/AlwaysOnVpnManagedProfilePreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AlwaysOnVpnManagedProfilePreferenceController.java
new file mode 100644
index 0000000..d88c28b
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/AlwaysOnVpnManagedProfilePreferenceController.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.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+
+public class AlwaysOnVpnManagedProfilePreferenceController extends AbstractPreferenceController {
+ private static final String KEY_ALWAYS_ON_VPN_MANAGED_PROFILE = "always_on_vpn_managed_profile";
+ private final EnterprisePrivacyFeatureProvider mFeatureProvider;
+
+ public AlwaysOnVpnManagedProfilePreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mFeatureProvider =
+ FlavorUtils.getFeatureFactory(context).getEnterprisePrivacyFeatureProvider(context);
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mFeatureProvider.isAlwaysOnVpnSetInManagedProfile();
+ }
+
+ @Override
+ protected void init() {
+ update();
+ }
+
+ @Override
+ protected void update() {
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_ALWAYS_ON_VPN_MANAGED_PROFILE};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/BugReportsPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/BugReportsPreferenceController.java
new file mode 100644
index 0000000..792e335
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/BugReportsPreferenceController.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.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+
+import java.util.Date;
+
+public class BugReportsPreferenceController extends AdminActionPreferenceControllerBase {
+ private static final String KEY_BUG_REPORTS = "bug_reports";
+
+ public BugReportsPreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ protected void init() {
+ update();
+ }
+
+ @Override
+ protected Date getAdminActionTimestamp() {
+ return mFeatureProvider.getLastBugReportRequestTime();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_BUG_REPORTS};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/CaCertsCurrentUserPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/CaCertsCurrentUserPreferenceController.java
new file mode 100644
index 0000000..01ccfb9
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/CaCertsCurrentUserPreferenceController.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.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+public class CaCertsCurrentUserPreferenceController extends CaCertsPreferenceControllerBase {
+ @VisibleForTesting
+ static final String CA_CERTS_CURRENT_USER = "ca_certs_current_user";
+
+ public CaCertsCurrentUserPreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{CA_CERTS_CURRENT_USER};
+ }
+
+ @Override
+ public void update() {
+ super.update();
+ mPreferenceCompat.setTitle(mFeatureProvider.isInCompMode()
+ ? ResourcesUtil.getString(mContext, "enterprise_privacy_ca_certs_personal")
+ : ResourcesUtil.getString(mContext, "enterprise_privacy_ca_certs_device"));
+ }
+
+ @Override
+ protected int getNumberOfCaCerts() {
+ return mFeatureProvider.getNumberOfOwnerInstalledCaCertsForCurrentUser();
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/CaCertsManagedProfilePreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/CaCertsManagedProfilePreferenceController.java
new file mode 100644
index 0000000..5648b6a
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/CaCertsManagedProfilePreferenceController.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.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+
+public class CaCertsManagedProfilePreferenceController extends CaCertsPreferenceControllerBase {
+ @VisibleForTesting
+ static final String CA_CERTS_MANAGED_PROFILE = "ca_certs_managed_profile";
+
+ public CaCertsManagedProfilePreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{CA_CERTS_MANAGED_PROFILE};
+ }
+
+ @Override
+ protected int getNumberOfCaCerts() {
+ return mFeatureProvider.getNumberOfOwnerInstalledCaCertsForManagedProfile();
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/CaCertsPreferenceControllerBase.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/CaCertsPreferenceControllerBase.java
new file mode 100644
index 0000000..b847bc6
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/CaCertsPreferenceControllerBase.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.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+public abstract class CaCertsPreferenceControllerBase extends AbstractPreferenceController {
+ protected final EnterprisePrivacyFeatureProvider mFeatureProvider;
+
+ public CaCertsPreferenceControllerBase(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mFeatureProvider =
+ FlavorUtils.getFeatureFactory(context).getEnterprisePrivacyFeatureProvider(context);
+ }
+
+ @Override
+ public void init() {
+ update();
+ }
+
+ @Override
+ public void update() {
+ final int certs = getNumberOfCaCerts();
+ mPreferenceCompat.setSummary(ResourcesUtil.getQuantityString(
+ mContext, "enterprise_privacy_number_ca_certs", certs, certs));
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return getNumberOfCaCerts() > 0;
+ }
+
+ protected abstract int getNumberOfCaCerts();
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/EnterpriseInstalledPackagesPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/EnterpriseInstalledPackagesPreferenceController.java
new file mode 100644
index 0000000..27b0a2e
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/EnterpriseInstalledPackagesPreferenceController.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.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+/**
+ * Forked from:
+ * Settings/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java
+ */
+public class EnterpriseInstalledPackagesPreferenceController extends AbstractPreferenceController {
+ private static final String KEY_NUMBER_ENTERPRISE_INSTALLED_PACKAGES =
+ "number_enterprise_installed_packages";
+ private final ApplicationFeatureProvider mFeatureProvider;
+ private final boolean mAsync;
+
+ public EnterpriseInstalledPackagesPreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager, boolean async) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mFeatureProvider =
+ FlavorUtils.getFeatureFactory(context).getApplicationFeatureProvider(context);
+ mAsync = async;
+ }
+
+ @Override
+ public void update() {
+ mFeatureProvider.calculateNumberOfPolicyInstalledApps(true /* async */, (num) -> {
+ final boolean available;
+ if (num == 0) {
+ available = false;
+ } else {
+ available = true;
+ mPreferenceCompat.setSummary(ResourcesUtil.getQuantityString(
+ mContext, "enterprise_privacy_number_packages_lower_bound", num, num));
+ }
+ mPreferenceCompat.setVisible(available);
+ });
+ }
+
+ @Override
+ public boolean isAvailable() {
+ if (mAsync) {
+ // When called on the main UI thread, we must not block. Since calculating the number of
+ // enterprise-installed apps takes a bit of time, we always return true here and
+ // determine the pref's actual visibility asynchronously in updateState().
+ return true;
+ }
+
+ // When called by the search indexer, we are on a background thread that we can block. Also,
+ // changes to the pref's visibility made in updateState() would not be seen by the indexer.
+ // We block and return synchronously whether there are enterprise-installed apps or not.
+ final Boolean[] haveEnterpriseInstalledPackages = {null};
+ mFeatureProvider.calculateNumberOfPolicyInstalledApps(
+ false /* async */, (num) -> haveEnterpriseInstalledPackages[0] = num > 0);
+ return haveEnterpriseInstalledPackages[0];
+ }
+
+ @Override
+ protected void init() {
+ update();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_NUMBER_ENTERPRISE_INSTALLED_PACKAGES};
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacyFeatureProvider.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/EnterprisePrivacyFeatureProvider.java
similarity index 98%
rename from Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacyFeatureProvider.java
rename to SettingsAPI/java/com/android/tv/settings/library/enterprise/EnterprisePrivacyFeatureProvider.java
index 7d555b2..2a04447 100644
--- a/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacyFeatureProvider.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/EnterprisePrivacyFeatureProvider.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.enterprise;
+package com.android.tv.settings.library.enterprise;
import java.util.Date;
diff --git a/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/EnterprisePrivacyFeatureProviderImpl.java
similarity index 95%
rename from Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
rename to SettingsAPI/java/com/android/tv/settings/library/enterprise/EnterprisePrivacyFeatureProviderImpl.java
index 27e3ea6..3e11400 100644
--- a/Settings/src/com/android/tv/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/EnterprisePrivacyFeatureProviderImpl.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.enterprise;
+package com.android.tv.settings.library.enterprise;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
@@ -33,7 +33,7 @@
import android.text.style.ClickableSpan;
import android.view.View;
-import com.android.tv.settings.R;
+import com.android.tv.settings.library.util.ResourcesUtil;
import java.util.Date;
import java.util.List;
@@ -93,13 +93,13 @@
final SpannableStringBuilder disclosure = new SpannableStringBuilder();
final CharSequence organizationName = mDpm.getDeviceOwnerOrganizationName();
if (organizationName != null) {
- disclosure.append(mResources.getString(R.string.do_disclosure_with_name,
+ disclosure.append(ResourcesUtil.getString(mContext, "do_disclosure_with_name",
organizationName));
} else {
- disclosure.append(mResources.getString(R.string.do_disclosure_generic));
+ disclosure.append(ResourcesUtil.getString(mContext, "do_disclosure_generic"));
}
- disclosure.append(mResources.getString(R.string.do_disclosure_learn_more_separator));
- disclosure.append(mResources.getString(R.string.learn_more),
+ disclosure.append(ResourcesUtil.getString(mContext, "do_disclosure_learn_more_separator"));
+ disclosure.append(ResourcesUtil.getString(mContext, "learn_more"),
new EnterprisePrivacySpan(mContext), 0);
return disclosure;
}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/EnterpriseSetDefaultAppsPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/EnterpriseSetDefaultAppsPreferenceController.java
new file mode 100644
index 0000000..acfba99
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/EnterpriseSetDefaultAppsPreferenceController.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.tv.settings.library.enterprise;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.enterprise.apps.EnterpriseDefaultApps;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+/**
+ * Forked from:
+ * Settings/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsPreferenceController.java
+ */
+public class EnterpriseSetDefaultAppsPreferenceController extends AbstractPreferenceController {
+ private static final String KEY_DEFAULT_APPS = "number_enterprise_set_default_apps";
+ private final ApplicationFeatureProvider mApplicationFeatureProvider;
+ private final UserManager mUserManager;
+
+ public EnterpriseSetDefaultAppsPreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mApplicationFeatureProvider =
+ FlavorUtils.getFeatureFactory(context).getApplicationFeatureProvider(context);
+ mUserManager = context.getSystemService(UserManager.class);
+ }
+
+ @Override
+ public void update() {
+ final int num = getNumberOfEnterpriseSetDefaultApps();
+ mPreferenceCompat.setSummary(ResourcesUtil.getQuantityString(
+ mContext, "enterprise_privacy_number_packages", num, num));
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return getNumberOfEnterpriseSetDefaultApps() > 0;
+ }
+
+ @Override
+ protected void init() {
+ update();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_DEFAULT_APPS};
+ }
+
+ private int getNumberOfEnterpriseSetDefaultApps() {
+ int num = 0;
+
+ for (UserHandle user : mUserManager.getUserProfiles()) {
+ for (EnterpriseDefaultApps app : EnterpriseDefaultApps.values()) {
+ num += mApplicationFeatureProvider
+ .findPersistentPreferredActivities(
+ user.getIdentifier(), app.getIntents())
+ .size();
+ }
+ }
+ return num;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/FailedPasswordWipeCurrentUserPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/FailedPasswordWipeCurrentUserPreferenceController.java
new file mode 100644
index 0000000..0b2c63e
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/FailedPasswordWipeCurrentUserPreferenceController.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+
+public class FailedPasswordWipeCurrentUserPreferenceController
+ extends FailedPasswordWipePreferenceControllerBase {
+ private static final String KEY_FAILED_PASSWORD_WIPE_CURRENT_USER =
+ "failed_password_wipe_current_user";
+
+ public FailedPasswordWipeCurrentUserPreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ protected int getMaximumFailedPasswordsBeforeWipe() {
+ return mFeatureProvider.getMaximumFailedPasswordsBeforeWipeInCurrentUser();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_FAILED_PASSWORD_WIPE_CURRENT_USER};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/FailedPasswordWipeManagedProfilePreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/FailedPasswordWipeManagedProfilePreferenceController.java
new file mode 100644
index 0000000..2a2746a
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/FailedPasswordWipeManagedProfilePreferenceController.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+
+public class FailedPasswordWipeManagedProfilePreferenceController
+ extends FailedPasswordWipePreferenceControllerBase {
+ private static final String KEY_FAILED_PASSWORD_WIPE_MANAGED_PROFILE =
+ "failed_password_wipe_managed_profile";
+
+ public FailedPasswordWipeManagedProfilePreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ protected int getMaximumFailedPasswordsBeforeWipe() {
+ return mFeatureProvider.getMaximumFailedPasswordsBeforeWipeInManagedProfile();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_FAILED_PASSWORD_WIPE_MANAGED_PROFILE};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/FailedPasswordWipePreferenceControllerBase.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/FailedPasswordWipePreferenceControllerBase.java
new file mode 100644
index 0000000..cf7dcbe
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/FailedPasswordWipePreferenceControllerBase.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.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+public abstract class FailedPasswordWipePreferenceControllerBase
+ extends AbstractPreferenceController {
+ protected final EnterprisePrivacyFeatureProvider mFeatureProvider;
+
+ public FailedPasswordWipePreferenceControllerBase(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mFeatureProvider =
+ FlavorUtils.getFeatureFactory(context).getEnterprisePrivacyFeatureProvider(context);
+ }
+
+ protected abstract int getMaximumFailedPasswordsBeforeWipe();
+
+ @Override
+ public void init() {
+ update();
+ }
+
+ @Override
+ public void update() {
+ final int failedPasswordsBeforeWipe = getMaximumFailedPasswordsBeforeWipe();
+ mPreferenceCompat.setSummary(ResourcesUtil.getQuantityString(mContext,
+ "enterprise_privacy_number_failed_password_wipe", failedPasswordsBeforeWipe,
+ failedPasswordsBeforeWipe));
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return getMaximumFailedPasswordsBeforeWipe() > 0;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/GlobalHttpProxyPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/GlobalHttpProxyPreferenceController.java
new file mode 100644
index 0000000..58cede3
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/GlobalHttpProxyPreferenceController.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.tv.settings.library.enterprise;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+
+public class GlobalHttpProxyPreferenceController extends AbstractPreferenceController {
+ private static final String KEY_GLOBAL_HTTP_PROXY = "global_http_proxy";
+ private final ConnectivityManager mCm;
+
+ public GlobalHttpProxyPreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mCm = context.getSystemService(ConnectivityManager.class);
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mCm.getGlobalProxy() != null;
+ }
+
+ @Override
+ protected void init() {
+ update();
+ }
+
+ @Override
+ protected void update() {
+
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_GLOBAL_HTTP_PROXY};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/ImePreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/ImePreferenceController.java
new file mode 100644
index 0000000..71f5a86
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/ImePreferenceController.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.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+public class ImePreferenceController extends AbstractPreferenceController {
+ private static final String KEY_INPUT_METHOD = "input_method";
+ private final EnterprisePrivacyFeatureProvider mFeatureProvider;
+
+ public ImePreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mFeatureProvider =
+ FlavorUtils.getFeatureFactory(context).getEnterprisePrivacyFeatureProvider(context);
+ }
+
+ @Override
+ public void update() {
+ mPreferenceCompat.setSummary(ResourcesUtil.getString(mContext,
+ "enterprise_privacy_input_method_name", mFeatureProvider.getImeLabelIfOwnerSet()));
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mFeatureProvider.getImeLabelIfOwnerSet() != null;
+ }
+
+ @Override
+ protected void init() {
+ update();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_INPUT_METHOD};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/NetworkLogsPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/NetworkLogsPreferenceController.java
new file mode 100644
index 0000000..4843be7
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/NetworkLogsPreferenceController.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+
+import java.util.Date;
+
+public class NetworkLogsPreferenceController extends AdminActionPreferenceControllerBase {
+ private static final String KEY_NETWORK_LOGS = "network_logs";
+
+ public NetworkLogsPreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ protected Date getAdminActionTimestamp() {
+ return mFeatureProvider.getLastNetworkLogRetrievalTime();
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mFeatureProvider.isNetworkLoggingEnabled()
+ || mFeatureProvider.getLastNetworkLogRetrievalTime() != null;
+ }
+
+ @Override
+ protected void init() {
+ update();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_NETWORK_LOGS};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/PreferenceCategoryController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/PreferenceCategoryController.java
new file mode 100644
index 0000000..18fbce6
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/PreferenceCategoryController.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.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PreferenceCategoryController extends AbstractPreferenceController {
+
+ private final List<AbstractPreferenceController> mChildren;
+
+ public PreferenceCategoryController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager, String[] key) {
+ super(context, callback, stateIdentifier, preferenceCompatManager, key);
+ mChildren = new ArrayList<>();
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return true;
+ }
+
+ @Override
+ protected void init() {
+ // no-op
+ }
+
+ @Override
+ protected void update() {
+ // no-op
+ }
+
+ public PreferenceCategoryController setChildren(
+ List<AbstractPreferenceController> childrenController) {
+ mChildren.clear();
+ if (childrenController != null) {
+ mChildren.addAll(childrenController);
+ }
+ return this;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/SecurityLogsPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/SecurityLogsPreferenceController.java
new file mode 100644
index 0000000..d829593
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/SecurityLogsPreferenceController.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.enterprise;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+
+import java.util.Date;
+
+public class SecurityLogsPreferenceController extends AdminActionPreferenceControllerBase {
+ private static final String KEY_SECURITY_LOGS = "security_logs";
+
+ public SecurityLogsPreferenceController(
+ Context context, UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ protected Date getAdminActionTimestamp() {
+ return mFeatureProvider.getLastSecurityLogRetrievalTime();
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mFeatureProvider.isSecurityLoggingEnabled()
+ || mFeatureProvider.getLastSecurityLogRetrievalTime() != null;
+ }
+
+ @Override
+ protected void init() {
+ update();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_SECURITY_LOGS};
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/enterprise/apps/AppCounter.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/AppCounter.java
similarity index 89%
rename from Settings/src/com/android/tv/settings/enterprise/apps/AppCounter.java
rename to SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/AppCounter.java
index b97d550..2719789 100644
--- a/Settings/src/com/android/tv/settings/enterprise/apps/AppCounter.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/AppCounter.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.enterprise.apps;
+package com.android.tv.settings.library.enterprise.apps;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -46,8 +46,8 @@
for (UserInfo user : mUm.getProfiles(UserHandle.myUserId())) {
final List<ApplicationInfo> list =
mPm.getInstalledApplicationsAsUser(PackageManager.GET_DISABLED_COMPONENTS
- | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS
- | (user.isAdmin() ? PackageManager.MATCH_ANY_USER : 0),
+ | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS
+ | (user.isAdmin() ? PackageManager.MATCH_ANY_USER : 0),
user.id);
for (ApplicationInfo info : list) {
if (includeInCount(info)) {
@@ -68,5 +68,6 @@
}
protected abstract void onCountComplete(int num);
+
protected abstract boolean includeInCount(ApplicationInfo info);
}
diff --git a/Settings/src/com/android/tv/settings/enterprise/apps/AppLister.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/AppLister.java
similarity index 90%
rename from Settings/src/com/android/tv/settings/enterprise/apps/AppLister.java
rename to SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/AppLister.java
index 2abf493..526b2cd 100644
--- a/Settings/src/com/android/tv/settings/enterprise/apps/AppLister.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/AppLister.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.enterprise.apps;
+package com.android.tv.settings.library.enterprise.apps;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -50,8 +50,8 @@
for (UserInfo user : mUm.getProfiles(UserHandle.myUserId())) {
final List<ApplicationInfo> list =
mPm.getInstalledApplicationsAsUser(PackageManager.GET_DISABLED_COMPONENTS
- | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS
- | (user.isAdmin() ? PackageManager.MATCH_ANY_USER : 0),
+ | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS
+ | (user.isAdmin() ? PackageManager.MATCH_ANY_USER : 0),
user.id);
for (ApplicationInfo info : list) {
if (includeInCount(info)) {
@@ -68,5 +68,6 @@
}
protected abstract void onAppListBuilt(List<UserAppInfo> list);
+
protected abstract boolean includeInCount(ApplicationInfo info);
}
diff --git a/Settings/src/com/android/tv/settings/enterprise/apps/AppWithAdminGrantedPermissionsCounter.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/AppWithAdminGrantedPermissionsCounter.java
similarity index 98%
rename from Settings/src/com/android/tv/settings/enterprise/apps/AppWithAdminGrantedPermissionsCounter.java
rename to SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/AppWithAdminGrantedPermissionsCounter.java
index 011de7e..24e1b07 100644
--- a/Settings/src/com/android/tv/settings/enterprise/apps/AppWithAdminGrantedPermissionsCounter.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/AppWithAdminGrantedPermissionsCounter.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.enterprise.apps;
+package com.android.tv.settings.library.enterprise.apps;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
diff --git a/Settings/src/com/android/tv/settings/enterprise/apps/AppWithAdminGrantedPermissionsLister.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/AppWithAdminGrantedPermissionsLister.java
similarity index 96%
rename from Settings/src/com/android/tv/settings/enterprise/apps/AppWithAdminGrantedPermissionsLister.java
rename to SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/AppWithAdminGrantedPermissionsLister.java
index 1bc0a58..4b2b912 100644
--- a/Settings/src/com/android/tv/settings/enterprise/apps/AppWithAdminGrantedPermissionsLister.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/AppWithAdminGrantedPermissionsLister.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.enterprise.apps;
+package com.android.tv.settings.library.enterprise.apps;
import android.app.admin.DevicePolicyManager;
import android.content.pm.ApplicationInfo;
diff --git a/Settings/src/com/android/tv/settings/enterprise/apps/ApplicationFeatureProvider.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/ApplicationFeatureProvider.java
similarity index 95%
rename from Settings/src/com/android/tv/settings/enterprise/apps/ApplicationFeatureProvider.java
rename to SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/ApplicationFeatureProvider.java
index bb0e15f..11927de 100644
--- a/Settings/src/com/android/tv/settings/enterprise/apps/ApplicationFeatureProvider.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/ApplicationFeatureProvider.java
@@ -14,13 +14,12 @@
* limitations under the License.
*/
-package com.android.tv.settings.enterprise.apps;
+package com.android.tv.settings.library.enterprise.apps;
import android.annotation.UserIdInt;
import android.content.Intent;
import java.util.List;
-import java.util.Set;
/**
* Forked from:
@@ -81,11 +80,6 @@
List<UserAppInfo> findPersistentPreferredActivities(@UserIdInt int userId, Intent[] intents);
/**
- * Returns a list of package names that should be kept enabled.
- */
- Set<String> getKeepEnabledPackages();
-
- /**
* Returns a user readable text explaining how much time user has spent in an app at a
* pre-specified duration.
*/
diff --git a/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/ApplicationFeatureProviderImpl.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/ApplicationFeatureProviderImpl.java
new file mode 100644
index 0000000..02d565e
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/ApplicationFeatureProviderImpl.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.tv.settings.library.enterprise.apps;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ComponentInfo;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.UserInfo;
+import android.os.RemoteException;
+import android.os.UserManager;
+import android.util.ArraySet;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Forked from:
+ * Settings/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java
+ */
+public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvider {
+ private static final String TAG = "AppFeatureProviderImpl";
+
+ protected final Context mContext;
+ private final PackageManager mPm;
+ private final IPackageManager mPms;
+ private final DevicePolicyManager mDpm;
+ private final UserManager mUm;
+
+ public ApplicationFeatureProviderImpl(Context context, PackageManager pm,
+ IPackageManager pms, DevicePolicyManager dpm) {
+ mContext = context.getApplicationContext();
+ mPm = pm;
+ mPms = pms;
+ mDpm = dpm;
+ mUm = UserManager.get(mContext);
+ }
+
+ @Override
+ public void calculateNumberOfPolicyInstalledApps(boolean async, NumberOfAppsCallback callback) {
+ final CurrentUserAndManagedProfilePolicyInstalledAppCounter counter =
+ new CurrentUserAndManagedProfilePolicyInstalledAppCounter(mContext, mPm, callback);
+ if (async) {
+ counter.execute();
+ } else {
+ counter.executeInForeground();
+ }
+ }
+
+ @Override
+ public void listPolicyInstalledApps(ListOfAppsCallback callback) {
+ final CurrentUserPolicyInstalledAppLister lister =
+ new CurrentUserPolicyInstalledAppLister(mPm, mUm, callback);
+ lister.execute();
+ }
+
+ @Override
+ public void calculateNumberOfAppsWithAdminGrantedPermissions(String[] permissions,
+ boolean async, NumberOfAppsCallback callback) {
+ final CurrentUserAndManagedProfileAppWithAdminGrantedPermissionsCounter counter =
+ new CurrentUserAndManagedProfileAppWithAdminGrantedPermissionsCounter(mContext,
+ permissions, mPm, mPms, mDpm, callback);
+ if (async) {
+ counter.execute();
+ } else {
+ counter.executeInForeground();
+ }
+ }
+
+ @Override
+ public void listAppsWithAdminGrantedPermissions(String[] permissions,
+ ListOfAppsCallback callback) {
+ final CurrentUserAppWithAdminGrantedPermissionsLister lister =
+ new CurrentUserAppWithAdminGrantedPermissionsLister(permissions, mPm, mPms, mDpm,
+ mUm, callback);
+ lister.execute();
+ }
+
+ @Override
+ public List<UserAppInfo> findPersistentPreferredActivities(int userId, Intent[] intents) {
+ final List<UserAppInfo> preferredActivities = new ArrayList<>();
+ final Set<UserAppInfo> uniqueApps = new ArraySet<>();
+ final UserInfo userInfo = mUm.getUserInfo(userId);
+ for (final Intent intent : intents) {
+ try {
+ final ResolveInfo resolveInfo =
+ mPms.findPersistentPreferredActivity(intent, userId);
+ if (resolveInfo != null) {
+ ComponentInfo componentInfo = null;
+ if (resolveInfo.activityInfo != null) {
+ componentInfo = resolveInfo.activityInfo;
+ } else if (resolveInfo.serviceInfo != null) {
+ componentInfo = resolveInfo.serviceInfo;
+ } else if (resolveInfo.providerInfo != null) {
+ componentInfo = resolveInfo.providerInfo;
+ }
+ if (componentInfo != null) {
+ UserAppInfo info = new UserAppInfo(userInfo, componentInfo.applicationInfo);
+ if (uniqueApps.add(info)) {
+ preferredActivities.add(info);
+ }
+ }
+ }
+ } catch (RemoteException exception) {
+ }
+ }
+ return preferredActivities;
+ }
+
+
+ private static class CurrentUserAndManagedProfilePolicyInstalledAppCounter
+ extends InstalledAppCounter {
+ private final NumberOfAppsCallback mCallback;
+
+ CurrentUserAndManagedProfilePolicyInstalledAppCounter(Context context,
+ PackageManager packageManager, NumberOfAppsCallback callback) {
+ super(context, PackageManager.INSTALL_REASON_POLICY, packageManager);
+ mCallback = callback;
+ }
+
+ @Override
+ protected void onCountComplete(int num) {
+ mCallback.onNumberOfAppsResult(num);
+ }
+ }
+
+ private static class CurrentUserAndManagedProfileAppWithAdminGrantedPermissionsCounter
+ extends AppWithAdminGrantedPermissionsCounter {
+ private final NumberOfAppsCallback mCallback;
+
+ CurrentUserAndManagedProfileAppWithAdminGrantedPermissionsCounter(Context context,
+ String[] permissions, PackageManager packageManager,
+ IPackageManager packageManagerService,
+ DevicePolicyManager devicePolicyManager, NumberOfAppsCallback callback) {
+ super(context, permissions, packageManager, packageManagerService, devicePolicyManager);
+ mCallback = callback;
+ }
+
+ @Override
+ protected void onCountComplete(int num) {
+ mCallback.onNumberOfAppsResult(num);
+ }
+ }
+
+ private static class CurrentUserPolicyInstalledAppLister extends InstalledAppLister {
+ private final ListOfAppsCallback mCallback;
+
+ CurrentUserPolicyInstalledAppLister(PackageManager packageManager,
+ UserManager userManager, ListOfAppsCallback callback) {
+ super(packageManager, userManager);
+ mCallback = callback;
+ }
+
+ @Override
+ protected void onAppListBuilt(List<UserAppInfo> list) {
+ mCallback.onListOfAppsResult(list);
+ }
+ }
+
+ private static class CurrentUserAppWithAdminGrantedPermissionsLister extends
+ AppWithAdminGrantedPermissionsLister {
+ private final ListOfAppsCallback mCallback;
+
+ CurrentUserAppWithAdminGrantedPermissionsLister(String[] permissions,
+ PackageManager packageManager, IPackageManager packageManagerService,
+ DevicePolicyManager devicePolicyManager, UserManager userManager,
+ ListOfAppsCallback callback) {
+ super(permissions, packageManager, packageManagerService, devicePolicyManager,
+ userManager);
+ mCallback = callback;
+ }
+
+ @Override
+ protected void onAppListBuilt(List<UserAppInfo> list) {
+ mCallback.onListOfAppsResult(list);
+ }
+ }
+
+ private ComponentInfo getComponentInfo(ResolveInfo resolveInfo) {
+ if (resolveInfo.activityInfo != null) {
+ return resolveInfo.activityInfo;
+ }
+ if (resolveInfo.serviceInfo != null) {
+ return resolveInfo.serviceInfo;
+ }
+ if (resolveInfo.providerInfo != null) {
+ return resolveInfo.providerInfo;
+ }
+ throw new IllegalStateException("Missing ComponentInfo!");
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/enterprise/apps/EnterpriseDefaultApps.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/EnterpriseDefaultApps.java
similarity index 85%
rename from Settings/src/com/android/tv/settings/enterprise/apps/EnterpriseDefaultApps.java
rename to SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/EnterpriseDefaultApps.java
index 950dc3c..0cf6800 100644
--- a/Settings/src/com/android/tv/settings/enterprise/apps/EnterpriseDefaultApps.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/EnterpriseDefaultApps.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.enterprise.apps;
+package com.android.tv.settings.library.enterprise.apps;
import android.content.Intent;
import android.net.Uri;
@@ -27,20 +27,20 @@
* Settings/src/com/android/settings/applications/EnterpriseDefaultApps.java
*/
public enum EnterpriseDefaultApps {
- BROWSER(new Intent[] {
+ BROWSER(new Intent[]{
buildIntent(Intent.ACTION_VIEW, Intent.CATEGORY_BROWSABLE, "http:", null)}),
- CALENDAR(new Intent[] {
+ CALENDAR(new Intent[]{
buildIntent(Intent.ACTION_INSERT, null, null, "vnd.android.cursor.dir/event")}),
- CAMERA(new Intent[] {
+ CAMERA(new Intent[]{
new Intent(MediaStore.ACTION_IMAGE_CAPTURE),
new Intent(MediaStore.ACTION_VIDEO_CAPTURE)}),
- CONTACTS(new Intent[] {
+ CONTACTS(new Intent[]{
buildIntent(Intent.ACTION_PICK, null, null, ContactsContract.Contacts.CONTENT_TYPE)}),
- EMAIL(new Intent[] {
+ EMAIL(new Intent[]{
new Intent(Intent.ACTION_SENDTO), new Intent(Intent.ACTION_SEND),
new Intent(Intent.ACTION_SEND_MULTIPLE)}),
- MAP(new Intent[] {buildIntent(Intent.ACTION_VIEW, null, "geo:", null)}),
- PHONE(new Intent[] {new Intent(Intent.ACTION_DIAL), new Intent(Intent.ACTION_CALL)});
+ MAP(new Intent[]{buildIntent(Intent.ACTION_VIEW, null, "geo:", null)}),
+ PHONE(new Intent[]{new Intent(Intent.ACTION_DIAL), new Intent(Intent.ACTION_CALL)});
private final Intent[] mIntents;
EnterpriseDefaultApps(Intent[] intents) {
diff --git a/Settings/src/com/android/tv/settings/enterprise/apps/InstalledAppCounter.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/InstalledAppCounter.java
similarity index 95%
rename from Settings/src/com/android/tv/settings/enterprise/apps/InstalledAppCounter.java
rename to SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/InstalledAppCounter.java
index 2f9f216..540b594 100644
--- a/Settings/src/com/android/tv/settings/enterprise/apps/InstalledAppCounter.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/InstalledAppCounter.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.enterprise.apps;
+package com.android.tv.settings.library.enterprise.apps;
import android.content.Context;
import android.content.Intent;
@@ -54,7 +54,7 @@
final int userId = UserHandle.getUserId(info.uid);
if (installReason != IGNORE_INSTALL_REASON
&& pm.getInstallReason(info.packageName,
- new UserHandle(userId)) != installReason) {
+ new UserHandle(userId)) != installReason) {
return false;
}
if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
diff --git a/Settings/src/com/android/tv/settings/enterprise/apps/InstalledAppLister.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/InstalledAppLister.java
similarity index 95%
rename from Settings/src/com/android/tv/settings/enterprise/apps/InstalledAppLister.java
rename to SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/InstalledAppLister.java
index 926f4fb..2ac41cf 100644
--- a/Settings/src/com/android/tv/settings/enterprise/apps/InstalledAppLister.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/InstalledAppLister.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.enterprise.apps;
+package com.android.tv.settings.library.enterprise.apps;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
diff --git a/Settings/src/com/android/tv/settings/enterprise/apps/UserAppInfo.java b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/UserAppInfo.java
similarity index 96%
rename from Settings/src/com/android/tv/settings/enterprise/apps/UserAppInfo.java
rename to SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/UserAppInfo.java
index b2a357e..3580b2e 100644
--- a/Settings/src/com/android/tv/settings/enterprise/apps/UserAppInfo.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/enterprise/apps/UserAppInfo.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.enterprise.apps;
+package com.android.tv.settings.library.enterprise.apps;
import android.content.pm.ApplicationInfo;
import android.content.pm.UserInfo;
diff --git a/Settings/src/com/android/tv/settings/help/SupportFeatureProvider.java b/SettingsAPI/java/com/android/tv/settings/library/help/SupportFeatureProvider.java
similarity index 86%
rename from Settings/src/com/android/tv/settings/help/SupportFeatureProvider.java
rename to SettingsAPI/java/com/android/tv/settings/library/help/SupportFeatureProvider.java
index a065aec..e3f39c6 100644
--- a/Settings/src/com/android/tv/settings/help/SupportFeatureProvider.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/help/SupportFeatureProvider.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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.help;
+package com.android.tv.settings.library.help;
import android.app.Activity;
@@ -25,7 +25,6 @@
/**
* Launches the support activity.
- * @param activity
*/
void startSupport(Activity activity);
}
diff --git a/Settings/src/com/android/tv/settings/help/SupportFeatureProviderImpl.java b/SettingsAPI/java/com/android/tv/settings/library/help/SupportFeatureProviderImpl.java
similarity index 91%
rename from Settings/src/com/android/tv/settings/help/SupportFeatureProviderImpl.java
rename to SettingsAPI/java/com/android/tv/settings/library/help/SupportFeatureProviderImpl.java
index fc08f9f..79d1729 100644
--- a/Settings/src/com/android/tv/settings/help/SupportFeatureProviderImpl.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/help/SupportFeatureProviderImpl.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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.help;
+package com.android.tv.settings.library.help;
import android.app.Activity;
import android.content.Intent;
diff --git a/SettingsAPI/java/com/android/tv/settings/library/inputmethod/AvailableVirtualKeyboadState.java b/SettingsAPI/java/com/android/tv/settings/library/inputmethod/AvailableVirtualKeyboadState.java
new file mode 100644
index 0000000..ec9bc62
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/inputmethod/AvailableVirtualKeyboadState.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.tv.settings.library.inputmethod;
+
+import android.annotation.DrawableRes;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.content.res.Configuration;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.settingslib.InputMethodAndSubtypeUtilCompat;
+import com.android.tv.settings.library.settingslib.InputMethodSettingValuesWrapper;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * State to handle the business logic for AvailableVirtualKeyboardFragment.
+ */
+public class AvailableVirtualKeyboadState extends PreferenceControllerState
+ implements InputMethodPreferenceController.OnSavePreferenceListener {
+ private InputMethodSettingValuesWrapper mInputMethodSettingValues;
+ private InputMethodManager mImm;
+ private DevicePolicyManager mDpm;
+
+ public AvailableVirtualKeyboadState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mInputMethodSettingValues.refreshAllInputMethodAndSubtypes();
+ updateInputMethodPreferenceViews();
+ }
+
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mUIUpdateCallback.notifyUpdateScreenTitle(getStateIdentifier(),
+ ResourcesUtil.getString(mContext, "available_virtual_keyboard_category"));
+ mInputMethodSettingValues = InputMethodSettingValuesWrapper.getInstance(mContext);
+ mImm = mContext.getSystemService(InputMethodManager.class);
+ mDpm = mContext.getSystemService(DevicePolicyManager.class);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // no-op
+ }
+
+ private void updateInputMethodPreferenceViews() {
+ mInputMethodSettingValues.refreshAllInputMethodAndSubtypes();
+ // Clear existing "InputMethodPreference"s
+ List<String> permittedList = mDpm.getPermittedInputMethodsForCurrentUser();
+ final PackageManager packageManager = mContext.getPackageManager();
+ final List<InputMethodInfo> imis = mInputMethodSettingValues.getInputMethodList();
+ final int numImis = (imis == null ? 0 : imis.size());
+ List<PreferenceCompat> prefCompats = new ArrayList<>();
+ mPreferenceControllers.clear();
+ for (int i = 0; i < numImis; ++i) {
+ final InputMethodInfo imi = imis.get(i);
+ final boolean isAllowedByOrganization = permittedList == null
+ || permittedList.contains(imi.getPackageName());
+ final InputMethodPreferenceController prefController =
+ new InputMethodPreferenceController(
+ mContext, mUIUpdateCallback, getStateIdentifier(),
+ mPreferenceCompatManager, imi, true,
+ isAllowedByOrganization, this);
+ mPreferenceControllers.add(prefController);
+ prefController.init();
+ prefController.getPrefCompat().setIcon(getInputMethodIcon(packageManager, imi));
+ prefController.notifyChange();
+ prefCompats.add(prefController.getPrefCompat());
+ }
+ mUIUpdateCallback.notifyUpdateAll(getStateIdentifier(), prefCompats);
+ }
+
+ @Nullable
+ private static Drawable loadDrawable(@NonNull final PackageManager packageManager,
+ @NonNull final String packageName, @DrawableRes final int resId,
+ @NonNull final ApplicationInfo applicationInfo) {
+ if (resId == 0) {
+ return null;
+ }
+ try {
+ return packageManager.getDrawable(packageName, resId, applicationInfo);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ @NonNull
+ private static Drawable getInputMethodIcon(@NonNull final PackageManager packageManager,
+ @NonNull final InputMethodInfo imi) {
+ final ServiceInfo si = imi.getServiceInfo();
+ final ApplicationInfo ai = si != null ? si.applicationInfo : null;
+ final String packageName = imi.getPackageName();
+ if (si == null || ai == null || packageName == null) {
+ return new ColorDrawable(Color.TRANSPARENT);
+ }
+ // We do not use ServiceInfo#loadLogo() and ServiceInfo#loadIcon here since those methods
+ // internally have some fallback rules, which we want to do manually.
+ Drawable drawable = loadDrawable(packageManager, packageName, si.logo, ai);
+ if (drawable != null) {
+ return drawable;
+ }
+ drawable = loadDrawable(packageManager, packageName, si.icon, ai);
+ if (drawable != null) {
+ return drawable;
+ }
+ // We do not use ApplicationInfo#loadLogo() and ApplicationInfo#loadIcon here since those
+ // methods internally have some fallback rules, which we want to do manually.
+ drawable = loadDrawable(packageManager, packageName, ai.logo, ai);
+ if (drawable != null) {
+ return drawable;
+ }
+ drawable = loadDrawable(packageManager, packageName, ai.icon, ai);
+ if (drawable != null) {
+ return drawable;
+ }
+ return new ColorDrawable(Color.TRANSPARENT);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_AVAILABLE_KEYBOARD;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+
+ @Override
+ public void onSaveInputMethodPreference(InputMethodPreferenceController pref) {
+ final boolean hasHardwareKeyboard = mContext.getResources().getConfiguration().keyboard
+ == Configuration.KEYBOARD_QWERTY;
+ InputMethodAndSubtypeUtilCompat.saveInputMethodSubtypeList(mContext,
+ mPreferenceCompatManager,
+ mContext.getContentResolver(), mImm.getInputMethodList(), hasHardwareKeyboard);
+ // Update input method settings and preference list.
+ mInputMethodSettingValues.refreshAllInputMethodAndSubtypes();
+ updateInputMethodPreferenceViews();
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/inputmethod/InputMethodPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/inputmethod/InputMethodPreferenceController.java
new file mode 100644
index 0000000..31b8a76
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/inputmethod/InputMethodPreferenceController.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.inputmethod;
+
+import android.app.AlertDialog;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.view.inputmethod.InputMethodSubtype;
+import android.widget.Toast;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.settingslib.InputMethodAndSubtypeUtil;
+import com.android.tv.settings.library.settingslib.InputMethodSettingValuesWrapper;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtils;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtilsInternal;
+import com.android.tv.settings.library.util.ResourcesUtil;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+import java.util.List;
+
+/**
+ * Use InputMethodPreferenceController to handle the logic of InputMethodPreference from
+ * SettingsLib.
+ */
+public class InputMethodPreferenceController extends RestrictedPreferenceController {
+ private static final String TAG = InputMethodPreferenceController.class.getSimpleName();
+ private static final String EMPTY_TEXT = "";
+ private static final int NO_WIDGET = 0;
+
+ public interface OnSavePreferenceListener {
+ /**
+ * Called when this preference needs to be saved its state.
+ *
+ * Note that this preference is non-persistent and needs explicitly to be saved its state.
+ * Because changing one IME state may change other IMEs' state, this is a place to update
+ * other IMEs' state as well.
+ *
+ * @param pref This preference.
+ */
+ void onSaveInputMethodPreference(InputMethodPreferenceController pref);
+ }
+
+ private final InputMethodInfo mImi;
+ private final String mTitle;
+ private final boolean mHasPriorityInSorting;
+ private final OnSavePreferenceListener mOnSaveListener;
+ private final InputMethodSettingValuesWrapper mInputMethodSettingValues;
+ private final boolean mIsAllowedByOrganization;
+ private AlertDialog mDialog = null;
+ private boolean mHasSwitch;
+
+ public InputMethodPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager, InputMethodInfo imi,
+ CharSequence title,
+ boolean isAllowedByOrganization, OnSavePreferenceListener onSaveListener) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mImi = imi;
+ mTitle = title.toString();
+ mIsAllowedByOrganization = isAllowedByOrganization;
+ mOnSaveListener = onSaveListener;
+ mInputMethodSettingValues = InputMethodSettingValuesWrapper.getInstance(context);
+ mHasPriorityInSorting = imi.isSystem()
+ && InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(imi);
+ mHasSwitch = true;
+ }
+
+ public InputMethodPreferenceController(final Context context, UIUpdateCallback callback,
+ int stateIdentifier, PreferenceCompatManager preferenceCompatManager,
+ final InputMethodInfo imi,
+ final boolean isImeEnabler, final boolean isAllowedByOrganization,
+ final InputMethodPreferenceController.OnSavePreferenceListener onSaveListener) {
+ this(context, callback, stateIdentifier, preferenceCompatManager, imi,
+ imi.loadLabel(context.getPackageManager()),
+ isAllowedByOrganization,
+ onSaveListener);
+ mHasSwitch = isImeEnabler;
+
+ }
+
+
+ @Override
+ public boolean handlePreferenceChange(Object newValue) {
+ if (!mHasSwitch) {
+ // Prevent disabling an IME because this preference is for invoking a settings activity.
+ return true;
+ }
+ if (mPreferenceCompat.getChecked() == PreferenceCompat.STATUS_ON) {
+ // Disable this IME.
+ setCheckedInternal(false);
+ return true;
+ }
+ if (mImi.isSystem()) {
+ setCheckedInternal(true);
+ } else {
+ // Once security is confirmed, we might prompt if the IME isn't
+ // Direct Boot aware.
+ showSecurityWarnDialog();
+ }
+ return false;
+ }
+
+ private void setCheckedInternal(boolean checked) {
+ mOnSaveListener.onSaveInputMethodPreference(this);
+ mUIUpdateCallback.notifyUpdate(mStateIdentifier, mPreferenceCompat);
+ }
+
+ private void showSecurityWarnDialog() {
+ if (mDialog != null && mDialog.isShowing()) {
+ mDialog.dismiss();
+ }
+ final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+ builder.setCancelable(true /* cancelable */);
+ builder.setTitle(android.R.string.dialog_alert_title);
+ final CharSequence label = mImi.getServiceInfo().applicationInfo.loadLabel(
+ mContext.getPackageManager());
+ builder.setMessage(ResourcesUtil.getString(mContext, "ime_security_warning", label));
+ builder.setPositiveButton(ResourcesUtil.getString(mContext, "ok"),
+ (dialog, which) -> setCheckedInternal(true));
+ builder.setNegativeButton(ResourcesUtil.getString(mContext, "cancel"), (dialog, which) -> {
+ // The user canceled to enable a 3rd party IME.
+ setCheckedInternal(false);
+ });
+ builder.setOnCancelListener((dialog) -> {
+ // The user canceled to enable a 3rd party IME.
+ setCheckedInternal(false);
+ });
+ mDialog = builder.create();
+ mDialog.show();
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(boolean status) {
+ if (!mDisabledByAdmin) {
+ // Always returns true to prevent invoking an intent without catching exceptions.
+ if (mHasSwitch) {
+ // Prevent invoking a settings activity because this preference is for enabling and
+ // disabling an input method.
+ return true;
+ }
+ try {
+ final Intent intent = mPreferenceCompat.getIntent();
+ if (intent != null) {
+ // Invoke a settings activity of an input method.
+ mContext.startActivity(intent);
+ }
+ } catch (final ActivityNotFoundException e) {
+ Log.d(TAG, "IME's Settings Activity Not Found", e);
+ final String message = ResourcesUtil.getString(
+ mContext, "failed_to_open_app_settings_toast",
+ mImi.loadLabel(mContext.getPackageManager()));
+ Toast.makeText(mContext, message, Toast.LENGTH_LONG).show();
+ }
+ return true;
+ }
+ return super.handlePreferenceTreeClick(status);
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return true;
+ }
+
+ @Override
+ public void update() {
+ mPreferenceCompat.setTitle(mTitle);
+ mPreferenceCompat.setType(PreferenceCompat.TYPE_SWITCH);
+ final String settingsActivity = mImi.getSettingsActivity();
+ if (TextUtils.isEmpty(settingsActivity)) {
+ mPreferenceCompat.setIntent(null);
+ } else {
+ // Set an intent to invoke settings activity of an input method.
+ final Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setClassName(mImi.getPackageName(), settingsActivity);
+ mPreferenceCompat.setIntent(intent);
+ }
+ }
+
+ @Override
+ public void init() {
+ super.init();
+ }
+
+ private boolean isImeEnabler() {
+ return mHasSwitch;
+ }
+
+ public void updatePreferenceViews() {
+ final boolean isAlwaysChecked = mInputMethodSettingValues.isAlwaysCheckedIme(mImi);
+ // When this preference has a switch and an input method should be always enabled,
+ // this preference should be disabled to prevent accidentally disabling an input method.
+ // This preference should also be disabled in case the admin does not allow this input
+ // method.
+ if (isAlwaysChecked && isImeEnabler()) {
+ setDisabledByAdmin(null);
+ setEnabled(false);
+ } else if (!mIsAllowedByOrganization) {
+ RestrictedLockUtils.EnforcedAdmin admin =
+ RestrictedLockUtilsInternal.checkIfInputMethodDisallowed(mContext,
+ mImi.getPackageName(), UserHandle.myUserId());
+ setDisabledByAdmin(admin);
+ } else {
+ setEnabled(true);
+ }
+
+ mPreferenceCompat.setChecked(mInputMethodSettingValues.isEnabledImi(mImi));
+ if (!isDisabledByAdmin()) {
+ mPreferenceCompat.setSummary(getSummaryString());
+ }
+ }
+
+ private String getSummaryString() {
+ final InputMethodManager imm = getInputMethodManager();
+ final List<InputMethodSubtype> subtypes = imm.getEnabledInputMethodSubtypeList(mImi, true);
+ return InputMethodAndSubtypeUtil.getSubtypeLocaleNameListAsSentence(
+ subtypes, mContext, mImi);
+ }
+
+ private InputMethodManager getInputMethodManager() {
+ return (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return null;
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{mImi.getId()};
+ }
+
+ public PreferenceCompat getPrefCompat() {
+ return mPreferenceCompat;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/inputmethod/KeyboardState.java b/SettingsAPI/java/com/android/tv/settings/library/inputmethod/KeyboardState.java
new file mode 100644
index 0000000..db8842f
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/inputmethod/KeyboardState.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.inputmethod;
+
+import static com.android.tv.settings.library.ManagerUtil.KEY_KEYBOARD_SETTINGS;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.ArraySet;
+import android.view.inputmethod.InputMethodInfo;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.settingslib.AutofillHelper;
+import com.android.tv.settings.library.settingslib.DefaultAppInfo;
+import com.android.tv.settings.library.settingslib.InputMethodHelper;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * State to handle the business logic for KeyboardFragment.
+ */
+public class KeyboardState extends PreferenceControllerState {
+ private static final String KEY_KEYBOARD_CATEGORY = "keyboardCategory";
+
+ private static final String KEY_CURRENT_KEYBOARD = "currentKeyboard";
+
+ private static final String KEY_AUTOFILL_CATEGORY = "autofillCategory";
+
+ static final String KEY_CURRENT_AUTOFILL = "currentAutofill";
+
+ private PreferenceCompat mKeyboardCategory;
+ private PreferenceCompat mCurrentKeyboard;
+ private PreferenceCompat mAutofillCategory;
+ private PreferenceCompat mCurrentAutofill;
+ private PreferenceCompat mKeyboardSettings;
+ private PackageManager mPm;
+
+ public KeyboardState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+
+ @Override
+ public void onAttach() {
+ super.onAttach();
+ mPm = mContext.getPackageManager();
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ mKeyboardCategory = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_KEYBOARD_CATEGORY);
+ mCurrentKeyboard = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_CURRENT_KEYBOARD);
+ mAutofillCategory = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_AUTOFILL_CATEGORY);
+ mCurrentAutofill = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_CURRENT_AUTOFILL);
+ mKeyboardSettings = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_KEYBOARD_SETTINGS);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // no-op
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateUi();
+ }
+
+ void updateUi() {
+ updateAutofill();
+ updateKeyboards();
+ }
+
+ private void updateKeyboards() {
+ updateCurrentKeyboardPreference();
+ updateKeyboardsSettings();
+ }
+
+ /**
+ * Update autofill related preferences.
+ */
+ private void updateAutofill() {
+ List<DefaultAppInfo> candidates = getAutofillCandidates();
+ if (candidates.isEmpty()) {
+ // No need to show keyboard category and autofill category.
+ // Keyboard only preference screen:
+ mKeyboardCategory.setVisible(false);
+ mAutofillCategory.setVisible(false);
+ mUIUpdateCallback.notifyUpdateScreenTitle(
+ getStateIdentifier(),
+ ResourcesUtil.getString(mContext, "system_keyboard"));
+ } else {
+ // Show both keyboard category and autofill category in keyboard & autofill screen.
+ mKeyboardCategory.setVisible(true);
+ mAutofillCategory.setVisible(true);
+ updateCurrentAutofillPreference(candidates);
+ updateAutofillSettings(candidates);
+ mUIUpdateCallback.notifyUpdateScreenTitle(
+ getStateIdentifier(),
+ ResourcesUtil.getString(mContext, "system_keyboard_autofill"));
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mKeyboardCategory);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mAutofillCategory);
+ }
+
+ private List<DefaultAppInfo> getAutofillCandidates() {
+ return AutofillHelper.getAutofillCandidates(mContext,
+ mPm, UserHandle.myUserId());
+ }
+
+ private void updateCurrentAutofillPreference(List<DefaultAppInfo> candidates) {
+
+ DefaultAppInfo app = AutofillHelper.getCurrentAutofill(mContext, candidates);
+
+ CharSequence summary = app == null ? ResourcesUtil.getString(mContext, "autofill_none")
+ : app.loadLabel();
+ mCurrentAutofill.setSummary(summary.toString());
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mCurrentAutofill);
+ }
+
+ private void updateAutofillSettings(List<DefaultAppInfo> candidates) {
+ for (final DefaultAppInfo info : candidates) {
+ final Intent settingsIntent = AutofillHelper.getAutofillSettingsIntent(mContext,
+ mPm, info);
+ if (settingsIntent == null) {
+ continue;
+ }
+
+ PreferenceCompat preferenceCompat = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_AUTOFILL_CATEGORY, info.getKey()});
+ preferenceCompat.setTitle(ResourcesUtil.getString(mContext,
+ "title_settings", info.loadLabel()));
+ preferenceCompat.setIntent(settingsIntent);
+ mCurrentAutofill.addChildPrefCompat(preferenceCompat);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mCurrentAutofill);
+ }
+
+ private void updateKeyboardsSettings() {
+ final PackageManager packageManager = mContext.getPackageManager();
+ List<InputMethodInfo> enabledInputMethodInfos = InputMethodHelper
+ .getEnabledSystemInputMethodList(mContext);
+
+ final Set<String> enabledInputMethodKeys = new ArraySet<>(enabledInputMethodInfos.size());
+ // Add per-IME settings
+ for (final InputMethodInfo info : enabledInputMethodInfos) {
+ final String uri = InputMethodHelper.getInputMethodsSettingsUri(mContext, info);
+ final Intent settingsIntent = InputMethodHelper.getInputMethodSettingsIntent(info);
+ if (uri == null && settingsIntent == null) {
+ continue;
+ }
+
+ boolean useSlice = FlavorUtils.isTwoPanel(mContext) && uri != null;
+ PreferenceCompat prefCompat = new PreferenceCompat(new String[]{
+ KEY_KEYBOARD_SETTINGS, info.getId()});
+ prefCompat.setTitle(ResourcesUtil.getString(mContext, "title_settings",
+ info.loadLabel(packageManager)));
+ if (useSlice) {
+ prefCompat.setHasSlice(true);
+ prefCompat.setSliceUri(uri);
+ prefCompat.setIntent(null);
+ } else {
+ prefCompat.setHasSlice(false);
+ prefCompat.setSliceUri(null);
+ prefCompat.setIntent(settingsIntent);
+ }
+ mKeyboardSettings.addChildPrefCompat(prefCompat);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mKeyboardSettings);
+ }
+
+ private void updateCurrentKeyboardPreference() {
+ final PackageManager packageManager = mContext.getPackageManager();
+ List<InputMethodInfo> enabledInputMethodInfos = InputMethodHelper
+ .getEnabledSystemInputMethodList(mContext);
+ final List<CharSequence> entries = new ArrayList<>(enabledInputMethodInfos.size());
+ final List<CharSequence> values = new ArrayList<>(enabledInputMethodInfos.size());
+
+ int defaultIndex = 0;
+ final String defaultId = InputMethodHelper.getDefaultInputMethodId(mContext);
+
+ for (final InputMethodInfo info : enabledInputMethodInfos) {
+ entries.add(info.loadLabel(packageManager));
+ final String id = info.getId();
+ values.add(id);
+ if (TextUtils.equals(id, defaultId)) {
+ defaultIndex = values.size() - 1;
+ }
+ }
+
+ mCurrentKeyboard.setEntries(entries.toArray(new CharSequence[entries.size()]));
+ mCurrentKeyboard.setEntryValues(values.toArray(new CharSequence[values.size()]));
+ if (entries.size() > 0) {
+ mCurrentKeyboard.setValueIndex(defaultIndex);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mCurrentKeyboard);
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ if (keyEquals(key, mCurrentKeyboard.getKey())) {
+ InputMethodHelper.setDefaultInputMethodId(mContext, (String) newValue);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_KEYBOARD;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/AccessPoint.java b/SettingsAPI/java/com/android/tv/settings/library/network/AccessPoint.java
new file mode 100644
index 0000000..b4fe0fd
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/AccessPoint.java
@@ -0,0 +1,1989 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.network;
+
+import android.annotation.IntDef;
+import android.annotation.MainThread;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.net.NetworkInfo;
+import android.net.NetworkKey;
+import android.net.ScoredNetwork;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.net.wifi.WifiNetworkScoreCache;
+import android.net.wifi.hotspot2.OsuProvider;
+import android.net.wifi.hotspot2.PasspointConfiguration;
+import android.net.wifi.hotspot2.ProvisioningCallback;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.ArraySet;
+import android.util.Log;
+import android.util.Pair;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.CollectionUtils;
+import com.android.tv.settings.library.util.ThreadUtils;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class AccessPoint implements Comparable<AccessPoint> {
+ static final String TAG = "SettingsLib.AccessPoint";
+
+ /**
+ * Lower bound on the 2.4 GHz (802.11b/g/n) WLAN channels
+ */
+ public static final int LOWER_FREQ_24GHZ = 2400;
+
+ /**
+ * Upper bound on the 2.4 GHz (802.11b/g/n) WLAN channels
+ */
+ public static final int HIGHER_FREQ_24GHZ = 2500;
+
+ /**
+ * Lower bound on the 5.0 GHz (802.11a/h/j/n/ac) WLAN channels
+ */
+ public static final int LOWER_FREQ_5GHZ = 4900;
+
+ /**
+ * Upper bound on the 5.0 GHz (802.11a/h/j/n/ac) WLAN channels
+ */
+ public static final int HIGHER_FREQ_5GHZ = 5900;
+
+ /**
+ * Lower bound on the 60 GHz (802.11ad) WIGIG channels
+ */
+ public static final int LOWER_FREQ_60GHZ = 58320;
+
+ /**
+ * Upper bound on the 60 GHz (802.11ad) WIGIG channels
+ */
+ public static final int HIGHER_FREQ_60GHZ = 70200;
+
+ /** The key which identifies this AccessPoint grouping. */
+ private String mKey;
+
+ /**
+ * Synchronization lock for managing concurrency between main and worker threads.
+ *
+ * <p>This lock should be held for all modifications to {@link #mScanResults} and
+ * {@link #mExtraScanResults}.
+ */
+ private final Object mLock = new Object();
+
+ @IntDef({
+ AccessPoint.Speed.NONE, AccessPoint.Speed.SLOW, AccessPoint.Speed.MODERATE,
+ AccessPoint.Speed.FAST, AccessPoint.Speed.VERY_FAST})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Speed {
+ /**
+ * Constant value representing an unlabeled / unscored network.
+ */
+ int NONE = 0;
+ /**
+ * Constant value representing a slow speed network connection.
+ */
+ int SLOW = 5;
+ /**
+ * Constant value representing a medium speed network connection.
+ */
+ int MODERATE = 10;
+ /**
+ * Constant value representing a fast speed network connection.
+ */
+ int FAST = 20;
+ /**
+ * Constant value representing a very fast speed network connection.
+ */
+ int VERY_FAST = 30;
+ }
+
+ @IntDef({AccessPoint.PasspointConfigurationVersion.INVALID,
+ AccessPoint.PasspointConfigurationVersion.NO_OSU_PROVISIONED,
+ AccessPoint.PasspointConfigurationVersion.OSU_PROVISIONED})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface PasspointConfigurationVersion {
+ int INVALID = 0;
+ int NO_OSU_PROVISIONED = 1; // R1.
+ int OSU_PROVISIONED = 2; // R2 or R3.
+ }
+
+ /** The underlying set of scan results comprising this AccessPoint. */
+ @GuardedBy("mLock")
+ private final ArraySet<ScanResult> mScanResults = new ArraySet<>();
+
+ /**
+ * Extra set of unused scan results corresponding to this AccessPoint for verbose logging
+ * purposes, such as a set of Passpoint roaming scan results when home scans are available.
+ */
+ @GuardedBy("mLock")
+ private final ArraySet<ScanResult> mExtraScanResults = new ArraySet<>();
+
+ /**
+ * Map of BSSIDs to scored networks for individual bssids.
+ *
+ * <p>This cache should not be evicted with scan results, as the values here are used to
+ * generate a fallback in the absence of scores for the visible APs.
+ */
+ private final Map<String, TimestampedScoredNetwork> mScoredNetworkCache = new HashMap<>();
+
+ static final String KEY_NETWORKINFO = "key_networkinfo";
+ static final String KEY_WIFIINFO = "key_wifiinfo";
+ static final String KEY_SSID = "key_ssid";
+ static final String KEY_SECURITY = "key_security";
+ static final String KEY_SPEED = "key_speed";
+ static final String KEY_PSKTYPE = "key_psktype";
+ static final String KEY_SCANRESULTS = "key_scanresults";
+ static final String KEY_SCOREDNETWORKCACHE = "key_scorednetworkcache";
+ static final String KEY_CONFIG = "key_config";
+ static final String KEY_PASSPOINT_UNIQUE_ID = "key_passpoint_unique_id";
+ static final String KEY_FQDN = "key_fqdn";
+ static final String KEY_PROVIDER_FRIENDLY_NAME = "key_provider_friendly_name";
+ static final String KEY_EAPTYPE = "eap_psktype";
+ static final String KEY_SUBSCRIPTION_EXPIRATION_TIME_IN_MILLIS =
+ "key_subscription_expiration_time_in_millis";
+ static final String KEY_PASSPOINT_CONFIGURATION_VERSION = "key_passpoint_configuration_version";
+ static final String KEY_IS_PSK_SAE_TRANSITION_MODE = "key_is_psk_sae_transition_mode";
+ static final String KEY_IS_OWE_TRANSITION_MODE = "key_is_owe_transition_mode";
+ static final AtomicInteger sLastId = new AtomicInteger(0);
+
+ /*
+ * NOTE: These constants for security and PSK types are saved to the bundle in saveWifiState,
+ * and sent across IPC. The numeric values should remain stable, otherwise the changes will need
+ * to be synced with other unbundled users of this library.
+ */
+ public static final int SECURITY_NONE = 0;
+ public static final int SECURITY_WEP = 1;
+ public static final int SECURITY_PSK = 2;
+ public static final int SECURITY_EAP = 3;
+ public static final int SECURITY_OWE = 4;
+ public static final int SECURITY_SAE = 5;
+ public static final int SECURITY_EAP_SUITE_B = 6;
+ public static final int SECURITY_EAP_WPA3_ENTERPRISE = 7;
+ public static final int SECURITY_MAX_VAL = 8; // Has to be the last
+
+ private static final int PSK_UNKNOWN = 0;
+ private static final int PSK_WPA = 1;
+ private static final int PSK_WPA2 = 2;
+ private static final int PSK_WPA_WPA2 = 3;
+
+ private static final int EAP_UNKNOWN = 0;
+ private static final int EAP_WPA = 1; // WPA-EAP
+ private static final int EAP_WPA2_WPA3 = 2; // RSN-EAP
+
+ public static final int UNREACHABLE_RSSI = Integer.MIN_VALUE;
+
+ public static final String KEY_PREFIX_AP = "AP:";
+ public static final String KEY_PREFIX_PASSPOINT_UNIQUE_ID = "PASSPOINT:";
+ public static final String KEY_PREFIX_OSU = "OSU:";
+
+ private final Context mContext;
+
+ private WifiManager mWifiManager;
+ private WifiManager.ActionListener mConnectListener;
+
+ private String ssid;
+ private String bssid;
+ private int security;
+ private int networkId = WifiConfiguration.INVALID_NETWORK_ID;
+
+ private int pskType = PSK_UNKNOWN;
+ private int mEapType = EAP_UNKNOWN;
+
+ private WifiConfiguration mConfig;
+
+ private int mRssi = UNREACHABLE_RSSI;
+
+ private WifiInfo mInfo;
+ private NetworkInfo mNetworkInfo;
+ AccessPoint.AccessPointListener mAccessPointListener;
+
+ private Object mTag;
+
+ @AccessPoint.Speed
+ private int mSpeed = AccessPoint.Speed.NONE;
+ private boolean mIsScoredNetworkMetered = false;
+
+ /**
+ * Information associated with the {@link PasspointConfiguration}. Only maintaining
+ * the relevant info to preserve spaces.
+ */
+ private String mPasspointUniqueId;
+ private String mFqdn;
+ private String mProviderFriendlyName;
+ private boolean mIsRoaming = false;
+ private long mSubscriptionExpirationTimeInMillis;
+ @AccessPoint.PasspointConfigurationVersion
+ private int mPasspointConfigurationVersion =
+ AccessPoint.PasspointConfigurationVersion.INVALID;
+
+ private OsuProvider mOsuProvider;
+
+ private String mOsuStatus;
+ private String mOsuFailure;
+ private boolean mOsuProvisioningComplete = false;
+
+ private boolean mIsPskSaeTransitionMode = false;
+ private boolean mIsOweTransitionMode = false;
+
+ public AccessPoint(Context context, Bundle savedState) {
+ mContext = context;
+
+ if (savedState.containsKey(KEY_CONFIG)) {
+ mConfig = savedState.getParcelable(KEY_CONFIG);
+ }
+ if (mConfig != null) {
+ loadConfig(mConfig);
+ }
+ if (savedState.containsKey(KEY_SSID)) {
+ ssid = savedState.getString(KEY_SSID);
+ }
+ if (savedState.containsKey(KEY_SECURITY)) {
+ security = savedState.getInt(KEY_SECURITY);
+ }
+ if (savedState.containsKey(KEY_SPEED)) {
+ mSpeed = savedState.getInt(KEY_SPEED);
+ }
+ if (savedState.containsKey(KEY_PSKTYPE)) {
+ pskType = savedState.getInt(KEY_PSKTYPE);
+ }
+ if (savedState.containsKey(KEY_EAPTYPE)) {
+ mEapType = savedState.getInt(KEY_EAPTYPE);
+ }
+ mInfo = savedState.getParcelable(KEY_WIFIINFO);
+ if (savedState.containsKey(KEY_NETWORKINFO)) {
+ mNetworkInfo = savedState.getParcelable(KEY_NETWORKINFO);
+ }
+ if (savedState.containsKey(KEY_SCANRESULTS)) {
+ Parcelable[] scanResults = savedState.getParcelableArray(KEY_SCANRESULTS);
+ mScanResults.clear();
+ for (Parcelable result : scanResults) {
+ mScanResults.add((ScanResult) result);
+ }
+ }
+ if (savedState.containsKey(KEY_SCOREDNETWORKCACHE)) {
+ ArrayList<TimestampedScoredNetwork> scoredNetworkArrayList =
+ savedState.getParcelableArrayList(KEY_SCOREDNETWORKCACHE);
+ for (TimestampedScoredNetwork timedScore : scoredNetworkArrayList) {
+ mScoredNetworkCache.put(timedScore.getScore().networkKey.wifiKey.bssid, timedScore);
+ }
+ }
+ if (savedState.containsKey(KEY_PASSPOINT_UNIQUE_ID)) {
+ mPasspointUniqueId = savedState.getString(KEY_PASSPOINT_UNIQUE_ID);
+ }
+ if (savedState.containsKey(KEY_FQDN)) {
+ mFqdn = savedState.getString(KEY_FQDN);
+ }
+ if (savedState.containsKey(KEY_PROVIDER_FRIENDLY_NAME)) {
+ mProviderFriendlyName = savedState.getString(KEY_PROVIDER_FRIENDLY_NAME);
+ }
+ if (savedState.containsKey(KEY_SUBSCRIPTION_EXPIRATION_TIME_IN_MILLIS)) {
+ mSubscriptionExpirationTimeInMillis =
+ savedState.getLong(KEY_SUBSCRIPTION_EXPIRATION_TIME_IN_MILLIS);
+ }
+ if (savedState.containsKey(KEY_PASSPOINT_CONFIGURATION_VERSION)) {
+ mPasspointConfigurationVersion = savedState.getInt(KEY_PASSPOINT_CONFIGURATION_VERSION);
+ }
+ if (savedState.containsKey(KEY_IS_PSK_SAE_TRANSITION_MODE)) {
+ mIsPskSaeTransitionMode = savedState.getBoolean(KEY_IS_PSK_SAE_TRANSITION_MODE);
+ }
+ if (savedState.containsKey(KEY_IS_OWE_TRANSITION_MODE)) {
+ mIsOweTransitionMode = savedState.getBoolean(KEY_IS_OWE_TRANSITION_MODE);
+ }
+
+ update(mConfig, mInfo, mNetworkInfo);
+
+ // Calculate required fields
+ updateKey();
+ updateBestRssiInfo();
+ }
+
+ /**
+ * Creates an AccessPoint with only a WifiConfiguration. This is used for the saved networks
+ * page.
+ */
+ public AccessPoint(Context context, WifiConfiguration config) {
+ mContext = context;
+ loadConfig(config);
+ updateKey();
+ }
+
+ /**
+ * Initialize an AccessPoint object for a {@link PasspointConfiguration}. This is mainly
+ * used by "Saved Networks" page for managing the saved {@link PasspointConfiguration}.
+ */
+ public AccessPoint(Context context, PasspointConfiguration config) {
+ mContext = context;
+ mPasspointUniqueId = config.getUniqueId();
+ mFqdn = config.getHomeSp().getFqdn();
+ mProviderFriendlyName = config.getHomeSp().getFriendlyName();
+ mSubscriptionExpirationTimeInMillis = config.getSubscriptionExpirationTimeMillis();
+ if (config.isOsuProvisioned()) {
+ mPasspointConfigurationVersion =
+ AccessPoint.PasspointConfigurationVersion.OSU_PROVISIONED;
+ } else {
+ mPasspointConfigurationVersion =
+ AccessPoint.PasspointConfigurationVersion.NO_OSU_PROVISIONED;
+ }
+ updateKey();
+ }
+
+ /**
+ * Initialize an AccessPoint object for a Passpoint network.
+ */
+ public AccessPoint(@NonNull Context context, @NonNull WifiConfiguration config,
+ @Nullable Collection<ScanResult> homeScans,
+ @Nullable Collection<ScanResult> roamingScans) {
+ mContext = context;
+ networkId = config.networkId;
+ mConfig = config;
+ mPasspointUniqueId = config.getKey();
+ mFqdn = config.FQDN;
+ setScanResultsPasspoint(homeScans, roamingScans);
+ updateKey();
+ }
+
+ /**
+ * Initialize an AccessPoint object for a Passpoint OSU Provider.
+ */
+ public AccessPoint(@NonNull Context context, @NonNull OsuProvider provider,
+ @NonNull Collection<ScanResult> results) {
+ mContext = context;
+ mOsuProvider = provider;
+ setScanResults(results);
+ updateKey();
+ }
+
+ AccessPoint(Context context, Collection<ScanResult> results) {
+ mContext = context;
+ setScanResults(results);
+ updateKey();
+ }
+
+ @VisibleForTesting
+ void loadConfig(WifiConfiguration config) {
+ ssid = (config.SSID == null ? "" : removeDoubleQuotes(config.SSID));
+ bssid = config.BSSID;
+ security = getSecurity(config);
+ networkId = config.networkId;
+ mConfig = config;
+ }
+
+ /** Updates {@link #mKey} and should only called upon object creation/initialization. */
+ private void updateKey() {
+ if (isPasspoint()) {
+ mKey = getKey(mConfig);
+ } else if (isPasspointConfig()) {
+ mKey = getKey(mPasspointUniqueId);
+ } else if (isOsuProvider()) {
+ mKey = getKey(mOsuProvider);
+ } else { // Non-Passpoint AP
+ mKey = getKey(getSsidStr(), getBssid(), getSecurity());
+ }
+ }
+
+ /**
+ * Returns a negative integer, zero, or a positive integer if this AccessPoint is less than,
+ * equal to, or greater than the other AccessPoint.
+ *
+ * Sort order rules for AccessPoints:
+ * 1. Active before inactive
+ * 2. Reachable before unreachable
+ * 3. Saved before unsaved
+ * 4. Network speed value
+ * 5. Stronger signal before weaker signal
+ * 6. SSID alphabetically
+ *
+ * Note that AccessPoints with a signal are usually also Reachable,
+ * and will thus appear before unreachable saved AccessPoints.
+ */
+ @Override
+ public int compareTo(@NonNull AccessPoint other) {
+ // Active one goes first.
+ if (isActive() && !other.isActive()) return -1;
+ if (!isActive() && other.isActive()) return 1;
+
+ // Reachable one goes before unreachable one.
+ if (isReachable() && !other.isReachable()) return -1;
+ if (!isReachable() && other.isReachable()) return 1;
+
+ // Configured (saved) one goes before unconfigured one.
+ if (isSaved() && !other.isSaved()) return -1;
+ if (!isSaved() && other.isSaved()) return 1;
+
+ // Faster speeds go before slower speeds - but only if visible change in speed label
+ if (getSpeed() != other.getSpeed()) {
+ return other.getSpeed() - getSpeed();
+ }
+
+ WifiManager wifiManager = getWifiManager();
+ // Sort by signal strength, bucketed by level
+ int difference = wifiManager.calculateSignalLevel(other.mRssi)
+ - wifiManager.calculateSignalLevel(mRssi);
+ if (difference != 0) {
+ return difference;
+ }
+
+ // Sort by title.
+ difference = getTitle().compareToIgnoreCase(other.getTitle());
+ if (difference != 0) {
+ return difference;
+ }
+
+ // Do a case sensitive comparison to distinguish SSIDs that differ in case only
+ return getSsidStr().compareTo(other.getSsidStr());
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof AccessPoint)) return false;
+ return (this.compareTo((AccessPoint) other) == 0);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 0;
+ if (mInfo != null) result += 13 * mInfo.hashCode();
+ result += 19 * mRssi;
+ result += 23 * networkId;
+ result += 29 * ssid.hashCode();
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder().append("AccessPoint(")
+ .append(ssid);
+ if (bssid != null) {
+ builder.append(":").append(bssid);
+ }
+ if (isSaved()) {
+ builder.append(',').append("saved");
+ }
+ if (isActive()) {
+ builder.append(',').append("active");
+ }
+ if (isEphemeral()) {
+ builder.append(',').append("ephemeral");
+ }
+ if (isConnectable()) {
+ builder.append(',').append("connectable");
+ }
+ if ((security != SECURITY_NONE) && (security != SECURITY_OWE)) {
+ builder.append(',').append(securityToString(security, pskType));
+ }
+ builder.append(",level=").append(getLevel());
+ if (mSpeed != AccessPoint.Speed.NONE) {
+ builder.append(",speed=").append(mSpeed);
+ }
+ builder.append(",metered=").append(isMetered());
+
+ if (isVerboseLoggingEnabled()) {
+ builder.append(",rssi=").append(mRssi);
+ synchronized (mLock) {
+ builder.append(",scan cache size=").append(mScanResults.size()
+ + mExtraScanResults.size());
+ }
+ }
+
+ return builder.append(')').toString();
+ }
+
+ /**
+ * Updates the AccessPoint rankingScore, metering, and speed, returning true if the data has
+ * changed.
+ *
+ * @param scoreCache The score cache to use to retrieve scores
+ * @param scoringUiEnabled Whether to show scoring and badging UI
+ * @param maxScoreCacheAgeMillis the maximum age in milliseconds of scores to consider when
+ * generating speed labels
+ */
+ boolean update(
+ WifiNetworkScoreCache scoreCache,
+ boolean scoringUiEnabled,
+ long maxScoreCacheAgeMillis) {
+ boolean scoreChanged = false;
+ if (scoringUiEnabled) {
+ scoreChanged = updateScores(scoreCache, maxScoreCacheAgeMillis);
+ }
+ return updateMetered(scoreCache) || scoreChanged;
+ }
+
+ /**
+ * Updates the AccessPoint rankingScore and speed, returning true if the data has changed.
+ *
+ * <p>Any cached {@link TimestampedScoredNetwork} objects older than the given max age in millis
+ * will be removed when this method is invoked.
+ *
+ * <p>Precondition: {@link #mRssi} is up to date before invoking this method.
+ *
+ * @param scoreCache The score cache to use to retrieve scores
+ * @param maxScoreCacheAgeMillis the maximum age in milliseconds of scores to consider when
+ * generating speed labels
+ * @return true if the set speed has changed
+ */
+ private boolean updateScores(WifiNetworkScoreCache scoreCache, long maxScoreCacheAgeMillis) {
+ long nowMillis = SystemClock.elapsedRealtime();
+ synchronized (mLock) {
+ for (ScanResult result : mScanResults) {
+ ScoredNetwork score = scoreCache.getScoredNetwork(result);
+ if (score == null) {
+ continue;
+ }
+ TimestampedScoredNetwork timedScore = mScoredNetworkCache.get(result.BSSID);
+ if (timedScore == null) {
+ mScoredNetworkCache.put(
+ result.BSSID, new TimestampedScoredNetwork(score, nowMillis));
+ } else {
+ // Update data since the has been seen in the score cache
+ timedScore.update(score, nowMillis);
+ }
+ }
+ }
+
+ // Remove old cached networks
+ long evictionCutoff = nowMillis - maxScoreCacheAgeMillis;
+ Iterator<TimestampedScoredNetwork> iterator = mScoredNetworkCache.values().iterator();
+ iterator.forEachRemaining(timestampedScoredNetwork -> {
+ if (timestampedScoredNetwork.getUpdatedTimestampMillis() < evictionCutoff) {
+ iterator.remove();
+ }
+ });
+
+ return updateSpeed();
+ }
+
+ /**
+ * Updates the internal speed, returning true if the update resulted in a speed label change.
+ */
+ private boolean updateSpeed() {
+ int oldSpeed = mSpeed;
+ mSpeed = generateAverageSpeedForSsid();
+
+ boolean changed = oldSpeed != mSpeed;
+ if (isVerboseLoggingEnabled() && changed) {
+ Log.i(TAG, String.format("%s: Set speed to %d", ssid, mSpeed));
+ }
+ return changed;
+ }
+
+ /** Creates a speed value for the current {@link #mRssi} by averaging all non zero badges. */
+ @AccessPoint.Speed
+ private int generateAverageSpeedForSsid() {
+ if (mScoredNetworkCache.isEmpty()) {
+ return AccessPoint.Speed.NONE;
+ }
+
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, String.format("Generating fallbackspeed for %s using cache: %s",
+ getSsidStr(), mScoredNetworkCache));
+ }
+
+ // TODO(b/63073866): If flickering issues persist, consider mapping using getLevel rather
+ // than specific rssi value so score doesn't change without a visible wifi bar change. This
+ // issue is likely to be more evident for the active AP whose RSSI value is not half-lifed.
+
+ int count = 0;
+ int totalSpeed = 0;
+ for (TimestampedScoredNetwork timedScore : mScoredNetworkCache.values()) {
+ int speed = timedScore.getScore().calculateBadge(mRssi);
+ if (speed != AccessPoint.Speed.NONE) {
+ count++;
+ totalSpeed += speed;
+ }
+ }
+ int speed = count == 0 ? AccessPoint.Speed.NONE : totalSpeed / count;
+ if (isVerboseLoggingEnabled()) {
+ Log.i(TAG, String.format("%s generated fallback speed is: %d", getSsidStr(), speed));
+ }
+ return roundToClosestSpeedEnum(speed);
+ }
+
+ /**
+ * Updates the AccessPoint's metering based on {@link ScoredNetwork#meteredHint}, returning
+ * true if the metering changed.
+ */
+ private boolean updateMetered(WifiNetworkScoreCache scoreCache) {
+ boolean oldMetering = mIsScoredNetworkMetered;
+ mIsScoredNetworkMetered = false;
+
+ if (isActive() && mInfo != null) {
+ NetworkKey key = NetworkKey.createFromWifiInfo(mInfo);
+ ScoredNetwork score = scoreCache.getScoredNetwork(key);
+ if (score != null) {
+ mIsScoredNetworkMetered |= score.meteredHint;
+ }
+ } else {
+ synchronized (mLock) {
+ for (ScanResult result : mScanResults) {
+ ScoredNetwork score = scoreCache.getScoredNetwork(result);
+ if (score == null) {
+ continue;
+ }
+ mIsScoredNetworkMetered |= score.meteredHint;
+ }
+ }
+ }
+ return oldMetering != mIsScoredNetworkMetered;
+ }
+
+ /**
+ * Generates an AccessPoint key for a given scan result
+ *
+ * @param result Scan result
+ * @return AccessPoint key
+ */
+ public static String getKey(Context context, ScanResult result) {
+ return getKey(result.SSID, result.BSSID, getSecurity(context, result));
+ }
+
+ /**
+ * Returns the AccessPoint key for a WifiConfiguration.
+ * This will return a special Passpoint key if the config is for Passpoint.
+ */
+ public static String getKey(WifiConfiguration config) {
+ if (config.isPasspoint()) {
+ return getKey(config.getKey());
+ } else {
+ return getKey(removeDoubleQuotes(config.SSID), config.BSSID, getSecurity(config));
+ }
+ }
+
+ /**
+ * Returns the AccessPoint key corresponding to a Passpoint network by its unique identifier.
+ */
+ public static String getKey(String passpointUniqueId) {
+ return new StringBuilder()
+ .append(KEY_PREFIX_PASSPOINT_UNIQUE_ID)
+ .append(passpointUniqueId).toString();
+ }
+
+ /**
+ * Returns the AccessPoint key corresponding to the OsuProvider.
+ */
+ public static String getKey(OsuProvider provider) {
+ return new StringBuilder()
+ .append(KEY_PREFIX_OSU)
+ .append(provider.getFriendlyName())
+ .append(',')
+ .append(provider.getServerUri()).toString();
+ }
+
+ /**
+ * Returns the AccessPoint key for a normal non-Passpoint network by ssid/bssid and security.
+ */
+ private static String getKey(String ssid, String bssid, int security) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(KEY_PREFIX_AP);
+ if (TextUtils.isEmpty(ssid)) {
+ builder.append(bssid);
+ } else {
+ builder.append(ssid);
+ }
+ builder.append(',').append(security);
+ return builder.toString();
+ }
+
+ public String getKey() {
+ return mKey;
+ }
+
+ /**
+ * Determines if the other AccessPoint represents the same network as this AccessPoint
+ */
+ public boolean matches(AccessPoint other) {
+ if (isPasspoint() || isPasspointConfig() || isOsuProvider()) {
+ return getKey().equals(other.getKey());
+ }
+
+ if (!isSameSsidOrBssid(other)) {
+ return false;
+ }
+
+ final int otherApSecurity = other.getSecurity();
+ if (mIsPskSaeTransitionMode) {
+ if (otherApSecurity == SECURITY_SAE && getWifiManager().isWpa3SaeSupported()) {
+ return true;
+ } else if (otherApSecurity == SECURITY_PSK) {
+ return true;
+ }
+ } else {
+ if ((security == SECURITY_SAE || security == SECURITY_PSK)
+ && other.isPskSaeTransitionMode()) {
+ return true;
+ }
+ }
+
+ if (mIsOweTransitionMode) {
+ if (otherApSecurity == SECURITY_OWE && getWifiManager().isEnhancedOpenSupported()) {
+ return true;
+ } else if (otherApSecurity == SECURITY_NONE) {
+ return true;
+ }
+ } else {
+ if ((security == SECURITY_OWE || security == SECURITY_NONE)
+ && other.isOweTransitionMode()) {
+ return true;
+ }
+ }
+
+ return security == other.getSecurity();
+ }
+
+ public boolean matches(WifiConfiguration config) {
+ if (config.isPasspoint()) {
+ return (isPasspoint() && config.getKey().equals(mConfig.getKey()));
+ }
+
+ if (!ssid.equals(removeDoubleQuotes(config.SSID))
+ || (mConfig != null && mConfig.shared != config.shared)) {
+ return false;
+ }
+
+ final int configSecurity = getSecurity(config);
+ if (mIsPskSaeTransitionMode) {
+ if (configSecurity == SECURITY_SAE && getWifiManager().isWpa3SaeSupported()) {
+ return true;
+ } else if (configSecurity == SECURITY_PSK) {
+ return true;
+ }
+ }
+
+ if (mIsOweTransitionMode) {
+ if (configSecurity == SECURITY_OWE && getWifiManager().isEnhancedOpenSupported()) {
+ return true;
+ } else if (configSecurity == SECURITY_NONE) {
+ return true;
+ }
+ }
+
+ return security == getSecurity(config);
+ }
+
+ private boolean matches(WifiConfiguration config, WifiInfo wifiInfo) {
+ if (config == null || wifiInfo == null) {
+ return false;
+ }
+ if (!config.isPasspoint() && !isSameSsidOrBssid(wifiInfo)) {
+ return false;
+ }
+ return matches(config);
+ }
+
+ @VisibleForTesting
+ boolean matches(ScanResult scanResult) {
+ if (scanResult == null) {
+ return false;
+ }
+ if (isPasspoint() || isOsuProvider()) {
+ throw new IllegalStateException("Should not matches a Passpoint by ScanResult");
+ }
+
+ if (!isSameSsidOrBssid(scanResult)) {
+ return false;
+ }
+
+ if (mIsPskSaeTransitionMode) {
+ if (scanResult.capabilities.contains("SAE")
+ && getWifiManager().isWpa3SaeSupported()) {
+ return true;
+ } else if (scanResult.capabilities.contains("PSK")) {
+ return true;
+ }
+ } else {
+ if ((security == SECURITY_SAE || security == SECURITY_PSK)
+ && AccessPoint.isPskSaeTransitionMode(scanResult)) {
+ return true;
+ }
+ }
+
+ if (mIsOweTransitionMode) {
+ final int scanResultSccurity = getSecurity(mContext, scanResult);
+ if (scanResultSccurity == SECURITY_OWE && getWifiManager().isEnhancedOpenSupported()) {
+ return true;
+ } else if (scanResultSccurity == SECURITY_NONE) {
+ return true;
+ }
+ } else {
+ if ((security == SECURITY_OWE || security == SECURITY_NONE)
+ && AccessPoint.isOweTransitionMode(scanResult)) {
+ return true;
+ }
+ }
+
+ return security == getSecurity(mContext, scanResult);
+ }
+
+ public WifiConfiguration getConfig() {
+ return mConfig;
+ }
+
+ public String getPasspointFqdn() {
+ return mFqdn;
+ }
+
+ public void clearConfig() {
+ mConfig = null;
+ networkId = WifiConfiguration.INVALID_NETWORK_ID;
+ }
+
+ public WifiInfo getInfo() {
+ return mInfo;
+ }
+
+ /**
+ * Returns the number of levels to show for a Wifi icon, from 0 to
+ * {@link WifiManager#getMaxSignalLevel()}.
+ *
+ * <p>Use {@link #isReachable()} to determine if an AccessPoint is in range, as this method will
+ * always return at least 0.
+ */
+ public int getLevel() {
+ return getWifiManager().calculateSignalLevel(mRssi);
+ }
+
+ public int getRssi() {
+ return mRssi;
+ }
+
+ /**
+ * Returns the underlying scan result set.
+ *
+ * <p>Callers should not modify this set.
+ */
+ public Set<ScanResult> getScanResults() {
+ Set<ScanResult> allScans = new ArraySet<>();
+ synchronized (mLock) {
+ allScans.addAll(mScanResults);
+ allScans.addAll(mExtraScanResults);
+ }
+ return allScans;
+ }
+
+ public Map<String, TimestampedScoredNetwork> getScoredNetworkCache() {
+ return mScoredNetworkCache;
+ }
+
+ /**
+ * Updates {@link #mRssi} and sets scan result information to that of the best RSSI scan result.
+ *
+ * <p>If the given connection is active, the existing value of {@link #mRssi} will be returned.
+ * If the given AccessPoint is not active, a value will be calculated from previous scan
+ * results, returning the best RSSI for all matching AccessPoints averaged with the previous
+ * value. If the access point is not connected and there are no scan results, the rssi will be
+ * set to {@link #UNREACHABLE_RSSI}.
+ */
+ private void updateBestRssiInfo() {
+ if (this.isActive()) {
+ return;
+ }
+
+ ScanResult bestResult = null;
+ int bestRssi = UNREACHABLE_RSSI;
+ synchronized (mLock) {
+ for (ScanResult result : mScanResults) {
+ if (result.level > bestRssi) {
+ bestRssi = result.level;
+ bestResult = result;
+ }
+ }
+ }
+
+ // Set the rssi to the average of the current rssi and the previous rssi.
+ if (bestRssi != UNREACHABLE_RSSI && mRssi != UNREACHABLE_RSSI) {
+ mRssi = (mRssi + bestRssi) / 2;
+ } else {
+ mRssi = bestRssi;
+ }
+
+ if (bestResult != null) {
+ ssid = bestResult.SSID;
+ bssid = bestResult.BSSID;
+ security = getSecurity(mContext, bestResult);
+ if (security == SECURITY_PSK || security == SECURITY_SAE) {
+ pskType = getPskType(bestResult);
+ }
+ if (security == SECURITY_EAP) {
+ mEapType = getEapType(bestResult);
+ }
+
+ mIsPskSaeTransitionMode = AccessPoint.isPskSaeTransitionMode(bestResult);
+ mIsOweTransitionMode = AccessPoint.isOweTransitionMode(bestResult);
+ }
+ // Update the config SSID of a Passpoint network to that of the best RSSI
+ if (isPasspoint()) {
+ mConfig.SSID = convertToQuotedString(ssid);
+ }
+ }
+
+ /**
+ * Returns if the network should be considered metered.
+ */
+ public boolean isMetered() {
+ return mIsScoredNetworkMetered
+ || WifiConfiguration.isMetered(mConfig, mInfo);
+ }
+
+ public NetworkInfo getNetworkInfo() {
+ return mNetworkInfo;
+ }
+
+ public int getSecurity() {
+ return security;
+ }
+
+ public String getSsidStr() {
+ return ssid;
+ }
+
+ public String getBssid() {
+ return bssid;
+ }
+
+ public CharSequence getSsid() {
+ return ssid;
+ }
+
+ /**
+ * Returns the name associated with the stored config.
+ *
+ * @deprecated Please use {@link #getTitle()} instead to get the display name of an AccessPoint.
+ */
+ @Deprecated
+ public String getConfigName() {
+ if (mConfig != null && mConfig.isPasspoint()) {
+ return mConfig.providerFriendlyName;
+ } else if (mPasspointUniqueId != null) {
+ return mProviderFriendlyName;
+ } else {
+ return ssid;
+ }
+ }
+
+ public NetworkInfo.DetailedState getDetailedState() {
+ if (mNetworkInfo != null) {
+ return mNetworkInfo.getDetailedState();
+ }
+ Log.w(TAG, "NetworkInfo is null, cannot return detailed state");
+ return null;
+ }
+
+// public String getSavedNetworkSummary() {
+// WifiConfiguration config = mConfig;
+// if (config != null) {
+// PackageManager pm = mContext.getPackageManager();
+// String systemName = pm.getNameForUid(android.os.Process.SYSTEM_UID);
+// int userId = UserHandle.getUserId(config.creatorUid);
+// ApplicationInfo appInfo = null;
+// if (config.creatorName != null && config.creatorName.equals(systemName)) {
+// appInfo = mContext.getApplicationInfo();
+// } else {
+// try {
+// IPackageManager ipm = AppGlobals.getPackageManager();
+// appInfo = ipm.getApplicationInfo(config.creatorName, 0 /* flags */, userId);
+// } catch (RemoteException rex) {
+// }
+// }
+// if (appInfo != null &&
+// !appInfo.packageName.equals(mContext.getString(R.string.settings_package)) &&
+// !appInfo.packageName.equals(
+// mContext.getString(R.string.certinstaller_package))) {
+// return mContext.getString(R.string.saved_network, appInfo.loadLabel(pm));
+// }
+// }
+//
+// if (isPasspointConfigurationR1() && isExpired()) {
+// return mContext.getString(R.string.wifi_passpoint_expired);
+// }
+// return "";
+// }
+
+ /**
+ * Returns the display title for the AccessPoint, such as for an AccessPointPreference's title.
+ */
+ public String getTitle() {
+ if (isPasspoint() && !TextUtils.isEmpty(mConfig.providerFriendlyName)) {
+ return mConfig.providerFriendlyName;
+ } else if (isPasspointConfig() && !TextUtils.isEmpty(mProviderFriendlyName)) {
+ return mProviderFriendlyName;
+ } else if (isOsuProvider() && !TextUtils.isEmpty(mOsuProvider.getFriendlyName())) {
+ return mOsuProvider.getFriendlyName();
+ } else if (!TextUtils.isEmpty(getSsidStr())) {
+ return getSsidStr();
+ } else {
+ return "";
+ }
+ }
+
+ public String getSummary() {
+ return getSettingsSummary();
+ }
+
+ public String getSettingsSummary() {
+ return getSettingsSummary(false /*convertSavedAsDisconnected*/);
+ }
+
+ /**
+ * Returns the summary for the AccessPoint.
+ */
+ public String getSettingsSummary(boolean convertSavedAsDisconnected) {
+// if (isPasspointConfigurationR1() && isExpired()) {
+// return mContext.getString(R.string.wifi_passpoint_expired);
+// }
+//
+// // Update to new summary
+// StringBuilder summary = new StringBuilder();
+//
+// if (isOsuProvider()) {
+// if (mOsuProvisioningComplete) {
+// summary.append(mContext.getString(R.string.osu_sign_up_complete));
+// } else if (mOsuFailure != null) {
+// summary.append(mOsuFailure);
+// } else if (mOsuStatus != null) {
+// summary.append(mOsuStatus);
+// } else {
+// summary.append(mContext.getString(R.string.tap_to_sign_up));
+// }
+// } else if (isActive()) {
+// summary.append(getSummary(mContext, /* ssid */ null, getDetailedState(),
+// mInfo != null && mInfo.isEphemeral(),
+// mInfo != null ? mInfo.getRequestingPackageName() : null));
+// } else { // not active
+// if (mConfig != null && mConfig.hasNoInternetAccess()) {
+// int messageID =
+// mConfig.getNetworkSelectionStatus().getNetworkSelectionStatus()
+// == NETWORK_SELECTION_PERMANENTLY_DISABLED
+// ? R.string.wifi_no_internet_no_reconnect
+// : R.string.wifi_no_internet;
+// summary.append(mContext.getString(messageID));
+// } else if (mConfig != null
+// && (mConfig.getNetworkSelectionStatus().getNetworkSelectionStatus()
+// != NETWORK_SELECTION_ENABLED)) {
+// WifiConfiguration.NetworkSelectionStatus networkStatus =
+// mConfig.getNetworkSelectionStatus();
+// switch (networkStatus.getNetworkSelectionDisableReason()) {
+// case WifiConfiguration.NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE:
+// summary.append(mContext.getString(R.string
+// .wifi_disabled_password_failure));
+// break;
+// case WifiConfiguration.NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD:
+// summary.append(mContext.getString(R.string
+// .wifi_check_password_try_again));
+// break;
+// case WifiConfiguration.NetworkSelectionStatus.DISABLED_DHCP_FAILURE:
+// summary.append(mContext.getString(R.string
+// .wifi_disabled_network_failure));
+// break;
+// case WifiConfiguration.NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION:
+// summary.append(mContext.getString(R.string.wifi_disabled_generic));
+// break;
+// }
+// } else if (!isReachable()) { // Wifi out of range
+// summary.append(mContext.getString(R.string.wifi_not_in_range));
+// } else { // In range, not disabled.
+// if (mConfig != null) { // Is saved network
+// // Last attempt to connect to this failed. Show reason why
+// switch (mConfig.getRecentFailureReason()) {
+// case WifiConfiguration.RECENT_FAILURE_AP_UNABLE_TO_HANDLE_NEW_STA:
+// summary.append(mContext.getString(
+// R.string.wifi_ap_unable_to_handle_new_sta));
+// break;
+// default:
+// if (convertSavedAsDisconnected) {
+// // Disconnected
+// summary.append(mContext.getString(R.string.wifi_disconnected));
+// } else {
+// // "Saved"
+// summary.append(mContext.getString(R.string.wifi_remembered));
+// }
+// break;
+// }
+// }
+// }
+// }
+//
+//
+//
+// if (isVerboseLoggingEnabled()) {
+// summary.append(WifiUtils.buildLoggingSummary(this, mConfig));
+// }
+//
+// if (mConfig != null && (WifiUtils.isMeteredOverridden(mConfig) || mConfig.meteredHint)) {
+// return mContext.getResources().getString(
+// R.string.preference_summary_default_combination,
+// WifiUtils.getMeteredLabel(mContext, mConfig),
+// summary.toString());
+// }
+//
+// // If Speed label and summary are both present, use the preference combination to combine
+// // the two, else return the non-null one.
+// if (getSpeedLabel() != null && summary.length() != 0) {
+// return mContext.getResources().getString(
+// R.string.preference_summary_default_combination,
+// getSpeedLabel(),
+// summary.toString());
+// } else if (getSpeedLabel() != null) {
+// return getSpeedLabel();
+// } else {
+// return summary.toString();
+// }
+ return "";
+ }
+
+ /**
+ * Return whether this is the active connection.
+ * For ephemeral connections (networkId is invalid), this returns false if the network is
+ * disconnected.
+ */
+ public boolean isActive() {
+ return mNetworkInfo != null &&
+ (networkId != WifiConfiguration.INVALID_NETWORK_ID ||
+ mNetworkInfo.getState() != NetworkInfo.State.DISCONNECTED);
+ }
+
+ public boolean isConnectable() {
+ return getLevel() != -1 && getDetailedState() == null;
+ }
+
+ public boolean isEphemeral() {
+ return mInfo != null && mInfo.isEphemeral() &&
+ mNetworkInfo != null && mNetworkInfo.getState() != NetworkInfo.State.DISCONNECTED;
+ }
+
+ /**
+ * Return true if this AccessPoint represents a Passpoint AP.
+ */
+ public boolean isPasspoint() {
+ return mConfig != null && mConfig.isPasspoint();
+ }
+
+ /**
+ * Return true if this AccessPoint represents a Passpoint provider configuration.
+ */
+ public boolean isPasspointConfig() {
+ return mPasspointUniqueId != null && mConfig == null;
+ }
+
+ /**
+ * Return true if this AccessPoint represents an OSU Provider.
+ */
+ public boolean isOsuProvider() {
+ return mOsuProvider != null;
+ }
+
+ /**
+ * Return true if this AccessPoint is expired.
+ */
+ public boolean isExpired() {
+ if (mSubscriptionExpirationTimeInMillis <= 0) {
+ // Expiration time not specified.
+ return false;
+ } else {
+ return System.currentTimeMillis() >= mSubscriptionExpirationTimeInMillis;
+ }
+ }
+
+ public boolean isPasspointConfigurationR1() {
+ return mPasspointConfigurationVersion
+ == AccessPoint.PasspointConfigurationVersion.NO_OSU_PROVISIONED;
+ }
+
+ /**
+ * Return true if {@link PasspointConfiguration#isOsuProvisioned} is true, this may refer to R2
+ * or R3.
+ */
+ public boolean isPasspointConfigurationOsuProvisioned() {
+ return mPasspointConfigurationVersion
+ == AccessPoint.PasspointConfigurationVersion.OSU_PROVISIONED;
+ }
+
+ /**
+ * Starts the OSU Provisioning flow.
+ */
+ public void startOsuProvisioning(@Nullable WifiManager.ActionListener connectListener) {
+ mConnectListener = connectListener;
+
+ getWifiManager().startSubscriptionProvisioning(
+ mOsuProvider,
+ mContext.getMainExecutor(),
+ new AccessPoint.AccessPointProvisioningCallback()
+ );
+ }
+
+ /**
+ * Return whether the given {@link WifiInfo} is for this access point.
+ * If the current AP does not have a network Id then the config is used to
+ * match based on SSID and security.
+ */
+ private boolean isInfoForThisAccessPoint(WifiConfiguration config, WifiInfo info) {
+ if (info.isOsuAp() || mOsuStatus != null) {
+ return (info.isOsuAp() && mOsuStatus != null);
+ } else if (info.isPasspointAp() || isPasspoint()) {
+ // TODO: Use TextUtils.equals(info.getPasspointUniqueId(), mConfig.getKey()) when API
+ // is available
+ return (info.isPasspointAp() && isPasspoint()
+ && TextUtils.equals(info.getPasspointFqdn(), mConfig.FQDN)
+ && TextUtils.equals(info.getPasspointProviderFriendlyName(),
+ mConfig.providerFriendlyName));
+ }
+
+ if (networkId != WifiConfiguration.INVALID_NETWORK_ID) {
+ return networkId == info.getNetworkId();
+ } else if (config != null) {
+ return matches(config, info);
+ } else {
+ // Might be an ephemeral connection with no WifiConfiguration. Try matching on SSID.
+ // (Note that we only do this if the WifiConfiguration explicitly equals INVALID).
+ // TODO: Handle hex string SSIDs.
+ return TextUtils.equals(removeDoubleQuotes(info.getSSID()), ssid);
+ }
+ }
+
+ public boolean isSaved() {
+ return mConfig != null;
+ }
+
+ public Object getTag() {
+ return mTag;
+ }
+
+ public void setTag(Object tag) {
+ mTag = tag;
+ }
+
+ /**
+ * Generate and save a default wifiConfiguration with common values.
+ * Can only be called for unsecured networks.
+ */
+ public void generateOpenNetworkConfig() {
+ if (!isOpenNetwork()) {
+ throw new IllegalStateException();
+ }
+ if (mConfig != null) {
+ return;
+ }
+ mConfig = new WifiConfiguration();
+ mConfig.SSID = AccessPoint.convertToQuotedString(ssid);
+
+ if (security == SECURITY_NONE) {
+ mConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
+ } else {
+ mConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.OWE);
+ mConfig.requirePmf = true;
+ }
+ }
+
+ public void saveWifiState(Bundle savedState) {
+ if (ssid != null) savedState.putString(KEY_SSID, getSsidStr());
+ savedState.putInt(KEY_SECURITY, security);
+ savedState.putInt(KEY_SPEED, mSpeed);
+ savedState.putInt(KEY_PSKTYPE, pskType);
+ savedState.putInt(KEY_EAPTYPE, mEapType);
+ if (mConfig != null) savedState.putParcelable(KEY_CONFIG, mConfig);
+ savedState.putParcelable(KEY_WIFIINFO, mInfo);
+ synchronized (mLock) {
+ savedState.putParcelableArray(KEY_SCANRESULTS,
+ mScanResults.toArray(new Parcelable[mScanResults.size()
+ + mExtraScanResults.size()]));
+ }
+ savedState.putParcelableArrayList(KEY_SCOREDNETWORKCACHE,
+ new ArrayList<>(mScoredNetworkCache.values()));
+ if (mNetworkInfo != null) {
+ savedState.putParcelable(KEY_NETWORKINFO, mNetworkInfo);
+ }
+ if (mPasspointUniqueId != null) {
+ savedState.putString(KEY_PASSPOINT_UNIQUE_ID, mPasspointUniqueId);
+ }
+ if (mFqdn != null) {
+ savedState.putString(KEY_FQDN, mFqdn);
+ }
+ if (mProviderFriendlyName != null) {
+ savedState.putString(KEY_PROVIDER_FRIENDLY_NAME, mProviderFriendlyName);
+ }
+ savedState.putLong(KEY_SUBSCRIPTION_EXPIRATION_TIME_IN_MILLIS,
+ mSubscriptionExpirationTimeInMillis);
+ savedState.putInt(KEY_PASSPOINT_CONFIGURATION_VERSION, mPasspointConfigurationVersion);
+ savedState.putBoolean(KEY_IS_PSK_SAE_TRANSITION_MODE, mIsPskSaeTransitionMode);
+ savedState.putBoolean(KEY_IS_OWE_TRANSITION_MODE, mIsOweTransitionMode);
+ }
+
+ public void setListener(AccessPoint.AccessPointListener listener) {
+ mAccessPointListener = listener;
+ }
+
+ /**
+ * Sets {@link #mScanResults} to the given collection and updates info based on the best RSSI
+ * scan result.
+ *
+ * @param scanResults a collection of scan results to add to the internal set
+ */
+ void setScanResults(Collection<ScanResult> scanResults) {
+ if (CollectionUtils.isEmpty(scanResults)) {
+ Log.d(TAG, "Cannot set scan results to empty list");
+ return;
+ }
+
+ // Validate scan results are for current AP only by matching SSID/BSSID
+ // Passpoint networks are not bound to a specific SSID/BSSID, so skip this for passpoint.
+ if (mKey != null && !isPasspoint() && !isOsuProvider()) {
+ for (ScanResult result : scanResults) {
+ if (!matches(result)) {
+ Log.d(TAG, String.format(
+ "ScanResult %s\nkey of %s did not match current AP key %s",
+ result, getKey(mContext, result), mKey));
+ return;
+ }
+ }
+ }
+
+ int oldLevel = getLevel();
+ synchronized (mLock) {
+ mScanResults.clear();
+ mScanResults.addAll(scanResults);
+ }
+ updateBestRssiInfo();
+ int newLevel = getLevel();
+
+ // If newLevel is 0, there will be no displayed Preference since the AP is unreachable
+ if (newLevel > 0 && newLevel != oldLevel) {
+ // Only update labels on visible rssi changes
+ updateSpeed();
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onLevelChanged(this);
+ }
+ });
+
+ }
+
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(this);
+ }
+ });
+ }
+
+ /**
+ * Sets the internal scan result cache to the list of home scans.
+ * If there are no home scans, then the roaming scan list is used, and the AccessPoint is
+ * marked as roaming.
+ */
+ void setScanResultsPasspoint(
+ @Nullable Collection<ScanResult> homeScans,
+ @Nullable Collection<ScanResult> roamingScans) {
+ synchronized (mLock) {
+ mExtraScanResults.clear();
+ if (!CollectionUtils.isEmpty(homeScans)) {
+ mIsRoaming = false;
+ if (!CollectionUtils.isEmpty(roamingScans)) {
+ mExtraScanResults.addAll(roamingScans);
+ }
+ setScanResults(homeScans);
+ } else if (!CollectionUtils.isEmpty(roamingScans)) {
+ mIsRoaming = true;
+ setScanResults(roamingScans);
+ }
+ }
+ }
+
+ /**
+ * Attempt to update the AccessPoint with the current connection info.
+ * This is used to set an AccessPoint to the active one if the connection info matches, or
+ * conversely to set an AccessPoint to inactive if the connection info does not match. The RSSI
+ * is also updated upon a match. Listeners will be notified if an update occurred.
+ *
+ * This is called in {@link WifiTracker#updateAccessPoints} as well as in callbacks for handling
+ * NETWORK_STATE_CHANGED_ACTION, RSSI_CHANGED_ACTION, and onCapabilitiesChanged in WifiTracker.
+ *
+ * Returns true if an update occurred.
+ */
+ public boolean update(
+ @Nullable WifiConfiguration config, WifiInfo info, NetworkInfo networkInfo) {
+ boolean updated = false;
+ final int oldLevel = getLevel();
+ if (info != null && isInfoForThisAccessPoint(config, info)) {
+ updated = (mInfo == null);
+ if (!isPasspoint() && mConfig != config) {
+ // We do not set updated = true as we do not want to increase the amount of sorting
+ // and copying performed in WifiTracker at this time. If issues involving refresh
+ // are still seen, we will investigate further.
+ update(config); // Notifies the AccessPointListener of the change
+ }
+ if (mRssi != info.getRssi() && info.getRssi() != WifiInfo.INVALID_RSSI) {
+ mRssi = info.getRssi();
+ updated = true;
+ } else if (mNetworkInfo != null && networkInfo != null
+ && mNetworkInfo.getDetailedState() != networkInfo.getDetailedState()) {
+ updated = true;
+ }
+ mInfo = info;
+ mNetworkInfo = networkInfo;
+ } else if (mInfo != null) {
+ updated = true;
+ mInfo = null;
+ mNetworkInfo = null;
+ }
+ if (updated && mAccessPointListener != null) {
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(this);
+ }
+ });
+
+ if (oldLevel != getLevel() /* current level */) {
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onLevelChanged(this);
+ }
+ });
+ }
+ }
+
+ return updated;
+ }
+
+ void update(@Nullable WifiConfiguration config) {
+ mConfig = config;
+ if (mConfig != null && !isPasspoint()) {
+ ssid = removeDoubleQuotes(mConfig.SSID);
+ }
+ networkId = config != null ? config.networkId : WifiConfiguration.INVALID_NETWORK_ID;
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(this);
+ }
+ });
+ }
+
+ @VisibleForTesting
+ void setRssi(int rssi) {
+ mRssi = rssi;
+ }
+
+ /** Sets the rssi to {@link #UNREACHABLE_RSSI}. */
+ void setUnreachable() {
+ setRssi(AccessPoint.UNREACHABLE_RSSI);
+ }
+
+ int getSpeed() {
+ return mSpeed;
+ }
+
+// @Nullable
+// String getSpeedLabel() {
+// return getSpeedLabel(mSpeed);
+// }
+
+ @Nullable
+ @AccessPoint.Speed
+ private static int roundToClosestSpeedEnum(int speed) {
+ if (speed < AccessPoint.Speed.SLOW) {
+ return AccessPoint.Speed.NONE;
+ } else if (speed < (
+ AccessPoint.Speed.SLOW + AccessPoint.Speed.MODERATE) / 2) {
+ return AccessPoint.Speed.SLOW;
+ } else if (speed < (
+ AccessPoint.Speed.MODERATE + AccessPoint.Speed.FAST) / 2) {
+ return AccessPoint.Speed.MODERATE;
+ } else if (speed < (
+ AccessPoint.Speed.FAST + AccessPoint.Speed.VERY_FAST) / 2) {
+ return AccessPoint.Speed.FAST;
+ } else {
+ return AccessPoint.Speed.VERY_FAST;
+ }
+ }
+
+// @Nullable
+// String getSpeedLabel(@AccessPoint.Speed int speed) {
+// return getSpeedLabel(mContext, speed);
+// }
+
+// /* private static String getSpeedLabel(Context context, int speed) {
+// switch (speed) {
+// case AccessPoint.Speed.VERY_FAST:
+// return context.getString(R.string.speed_label_very_fast);
+// case AccessPoint.Speed.FAST:
+// return context.getString(R.string.speed_label_fast);
+// case AccessPoint.Speed.MODERATE:
+// return context.getString(R.string.speed_label_okay);
+// case AccessPoint.Speed.SLOW:
+// return context.getString(R.string.speed_label_slow);
+// case AccessPoint.Speed.NONE:
+// default:
+// return null;
+// }
+// }*/
+
+// /** Return the speed label for a {@link ScoredNetwork} at the specified {@code rssi} level. */
+// @Nullable
+// public static String getSpeedLabel(Context context, ScoredNetwork scoredNetwork, int rssi) {
+// return getSpeedLabel(context, roundToClosestSpeedEnum(scoredNetwork.calculateBadge
+// (rssi)));
+// }
+
+ /** Return true if the current RSSI is reachable, and false otherwise. */
+ public boolean isReachable() {
+ return mRssi != UNREACHABLE_RSSI;
+ }
+
+ private static CharSequence getAppLabel(String packageName, PackageManager packageManager) {
+ CharSequence appLabel = "";
+ ApplicationInfo appInfo = null;
+ try {
+ int userId = UserHandle.getUserId(UserHandle.USER_CURRENT);
+ appInfo = packageManager.getApplicationInfoAsUser(packageName, 0 /* flags */, userId);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "Failed to get app info", e);
+ return appLabel;
+ }
+ if (appInfo != null) {
+ appLabel = appInfo.loadLabel(packageManager);
+ }
+ return appLabel;
+ }
+
+// public static String getSummary(Context context, String ssid, NetworkInfo.DetailedState state,
+// boolean isEphemeral, String suggestionOrSpecifierPackageName) {
+// if (state == NetworkInfo.DetailedState.CONNECTED) {
+// if (isEphemeral && !TextUtils.isEmpty(suggestionOrSpecifierPackageName)) {
+// CharSequence appLabel =
+// getAppLabel(suggestionOrSpecifierPackageName, context.getPackageManager
+// ());
+// return context.getString(R.string.connected_via_app, appLabel);
+// } else if (isEphemeral) {
+// // Special case for connected + ephemeral networks.
+// final NetworkScoreManager networkScoreManager = context.getSystemService(
+// NetworkScoreManager.class);
+// NetworkScorerAppData scorer = networkScoreManager.getActiveScorer();
+// if (scorer != null && scorer.getRecommendationServiceLabel() != null) {
+// String format = context.getString(R.string.connected_via_network_scorer);
+// return String.format(format, scorer.getRecommendationServiceLabel());
+// } else {
+// return context.getString(R.string.connected_via_network_scorer_default);
+// }
+// }
+// }
+//
+// // Case when there is wifi connected without internet connectivity.
+// final ConnectivityManager cm = (ConnectivityManager)
+// context.getSystemService(Context.CONNECTIVITY_SERVICE);
+// if (state == NetworkInfo.DetailedState.CONNECTED) {
+// WifiManager wifiManager = context.getSystemService(WifiManager.class);
+// NetworkCapabilities nc = cm.getNetworkCapabilities(wifiManager.getCurrentNetwork());
+//
+// if (nc != null) {
+// if (nc.hasCapability(nc.NET_CAPABILITY_CAPTIVE_PORTAL)) {
+// int id = context.getResources()
+// .getIdentifier("network_available_sign_in", "string", "android");
+// return context.getString(id);
+// } else if (nc.hasCapability(
+// NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY)) {
+// return context.getString(R.string.wifi_limited_connection);
+// } else if (!nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
+// final String mode = Settings.Global.getString(context.getContentResolver(),
+// Settings.Global.PRIVATE_DNS_MODE);
+// if (nc.isPrivateDnsBroken()) {
+// return context.getString(R.string.private_dns_broken);
+// } else {
+// return context.getString(R.string.wifi_connected_no_internet);
+// }
+// }
+// }
+// }
+// if (state == null) {
+// Log.w(TAG, "state is null, returning empty summary");
+// return "";
+// }
+// String[] formats = context.getResources().getStringArray((ssid == null)
+// ? R.array.wifi_status : R.array.wifi_status_with_ssid);
+// int index = state.ordinal();
+//
+// if (index >= formats.length || formats[index].length() == 0) {
+// return "";
+// }
+// return String.format(formats[index], ssid);
+// }
+
+ public static String convertToQuotedString(String string) {
+ return "\"" + string + "\"";
+ }
+
+ private static int getPskType(ScanResult result) {
+ boolean wpa = result.capabilities.contains("WPA-PSK");
+ boolean wpa2 = result.capabilities.contains("RSN-PSK");
+ boolean wpa3 = result.capabilities.contains("RSN-SAE");
+ if (wpa2 && wpa) {
+ return PSK_WPA_WPA2;
+ } else if (wpa2) {
+ return PSK_WPA2;
+ } else if (wpa) {
+ return PSK_WPA;
+ } else {
+ if (!wpa3) {
+ // Suppress warning for WPA3 only networks
+ Log.w(TAG, "Received abnormal flag string: " + result.capabilities);
+ }
+ return PSK_UNKNOWN;
+ }
+ }
+
+ private static int getEapType(ScanResult result) {
+ // WPA2-Enterprise and WPA3-Enterprise (non 192-bit) advertise RSN-EAP-CCMP
+ if (result.capabilities.contains("RSN-EAP")) {
+ return EAP_WPA2_WPA3;
+ }
+ // WPA-Enterprise advertises WPA-EAP-TKIP
+ if (result.capabilities.contains("WPA-EAP")) {
+ return EAP_WPA;
+ }
+ return EAP_UNKNOWN;
+ }
+
+ private static int getSecurity(Context context, ScanResult result) {
+ final boolean isWep = result.capabilities.contains("WEP");
+ final boolean isSae = result.capabilities.contains("SAE");
+ final boolean isPsk = result.capabilities.contains("PSK");
+ final boolean isEapSuiteB192 = result.capabilities.contains("EAP_SUITE_B_192");
+ final boolean isEap = result.capabilities.contains("EAP");
+ final boolean isOwe = result.capabilities.contains("OWE");
+ final boolean isOweTransition = result.capabilities.contains("OWE_TRANSITION");
+
+ if (isSae && isPsk) {
+ final WifiManager wifiManager = (WifiManager)
+ context.getSystemService(Context.WIFI_SERVICE);
+ return wifiManager.isWpa3SaeSupported() ? SECURITY_SAE : SECURITY_PSK;
+ }
+ if (isOweTransition) {
+ final WifiManager wifiManager = (WifiManager)
+ context.getSystemService(Context.WIFI_SERVICE);
+ return wifiManager.isEnhancedOpenSupported() ? SECURITY_OWE : SECURITY_NONE;
+ }
+
+ if (isWep) {
+ return SECURITY_WEP;
+ } else if (isSae) {
+ return SECURITY_SAE;
+ } else if (isPsk) {
+ return SECURITY_PSK;
+ } else if (isEapSuiteB192) {
+ return SECURITY_EAP_SUITE_B;
+ } else if (isEap) {
+ return SECURITY_EAP;
+ } else if (isOwe) {
+ return SECURITY_OWE;
+ }
+ return SECURITY_NONE;
+ }
+
+ static int getSecurity(WifiConfiguration config) {
+ if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.SAE)) {
+ return SECURITY_SAE;
+ }
+ if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_PSK)) {
+ return SECURITY_PSK;
+ }
+ if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.SUITE_B_192)) {
+ return SECURITY_EAP_SUITE_B;
+ }
+ if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP) ||
+ config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X)) {
+ return SECURITY_EAP;
+ }
+ if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.OWE)) {
+ return SECURITY_OWE;
+ }
+ return (config.wepTxKeyIndex >= 0
+ && config.wepTxKeyIndex < config.wepKeys.length
+ && config.wepKeys[config.wepTxKeyIndex] != null)
+ ? SECURITY_WEP : SECURITY_NONE;
+ }
+
+ public static String securityToString(int security, int pskType) {
+ if (security == SECURITY_WEP) {
+ return "WEP";
+ } else if (security == SECURITY_PSK) {
+ if (pskType == PSK_WPA) {
+ return "WPA";
+ } else if (pskType == PSK_WPA2) {
+ return "WPA2";
+ } else if (pskType == PSK_WPA_WPA2) {
+ return "WPA_WPA2";
+ }
+ return "PSK";
+ } else if (security == SECURITY_EAP) {
+ return "EAP";
+ } else if (security == SECURITY_SAE) {
+ return "SAE";
+ } else if (security == SECURITY_EAP_SUITE_B) {
+ return "SUITE_B";
+ } else if (security == SECURITY_OWE) {
+ return "OWE";
+ }
+ return "NONE";
+ }
+
+ static String removeDoubleQuotes(String string) {
+ if (TextUtils.isEmpty(string)) {
+ return "";
+ }
+ int length = string.length();
+ if ((length > 1) && (string.charAt(0) == '"')
+ && (string.charAt(length - 1) == '"')) {
+ return string.substring(1, length - 1);
+ }
+ return string;
+ }
+
+ private WifiManager getWifiManager() {
+ if (mWifiManager == null) {
+ mWifiManager = mContext.getSystemService(WifiManager.class);
+ }
+ return mWifiManager;
+ }
+
+ /**
+ * Return true if this is an open network AccessPoint.
+ */
+ public boolean isOpenNetwork() {
+ return security == SECURITY_NONE || security == SECURITY_OWE;
+ }
+
+ /**
+ * Callbacks relaying changes to the AccessPoint representation.
+ *
+ * <p>All methods are invoked on the Main Thread.
+ */
+ public interface AccessPointListener {
+
+ /**
+ * Indicates a change to the externally visible state of the AccessPoint trigger by an
+ * update of ScanResults, saved configuration state, connection state, or score
+ * (labels/metered) state.
+ *
+ * <p>Clients should refresh their view of the AccessPoint to match the updated state when
+ * this is invoked. Overall this method is extraneous if clients are listening to
+ * {@link WifiTracker.WifiListener#onAccessPointsChanged()} callbacks.
+ *
+ * <p>Examples of changes include signal strength, connection state, speed label, and
+ * generally anything that would impact the summary string.
+ *
+ * @param accessPoint The accessPoint object the listener was registered on which has
+ * changed
+ */
+ @MainThread
+ void onAccessPointChanged(AccessPoint accessPoint);
+
+ /**
+ * Indicates the "wifi pie signal level" has changed, retrieved via calls to
+ * {@link AccessPoint#getLevel()}.
+ *
+ * <p>This call is a subset of {@link #onAccessPointChanged(AccessPoint)} , hence is also
+ * extraneous if the client is already reacting to that or the
+ * {@link WifiTracker.WifiListener#onAccessPointsChanged()} callbacks.
+ *
+ * @param accessPoint The accessPoint object the listener was registered on whose level has
+ * changed
+ */
+ @MainThread
+ void onLevelChanged(AccessPoint accessPoint);
+ }
+
+ private static boolean isVerboseLoggingEnabled() {
+ return WifiTracker.sVerboseLogging || Log.isLoggable(TAG, Log.VERBOSE);
+ }
+
+ /**
+ * Callbacks relaying changes to the OSU provisioning status started in startOsuProvisioning().
+ *
+ * All methods are invoked on the Main Thread
+ */
+ @VisibleForTesting
+ class AccessPointProvisioningCallback extends ProvisioningCallback {
+ @Override
+ @MainThread
+ public void onProvisioningFailure(int status) {
+// if (TextUtils.equals(mOsuStatus, mContext.getString(R.string
+// .osu_completing_sign_up))) {
+// mOsuFailure = mContext.getString(R.string.osu_sign_up_failed);
+// } else {
+// mOsuFailure = mContext.getString(R.string.osu_connect_failed);
+// }
+ mOsuStatus = null;
+ mOsuProvisioningComplete = false;
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(
+ AccessPoint.this);
+ }
+ });
+ }
+
+ @Override
+ @MainThread
+ public void onProvisioningStatus(int status) {
+ String newStatus = null;
+ switch (status) {
+ case OSU_STATUS_AP_CONNECTING:
+ case OSU_STATUS_AP_CONNECTED:
+ case OSU_STATUS_SERVER_CONNECTING:
+ case OSU_STATUS_SERVER_VALIDATED:
+ case OSU_STATUS_SERVER_CONNECTED:
+ case OSU_STATUS_INIT_SOAP_EXCHANGE:
+ case OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE:
+// newStatus = String.format(mContext.getString(R.string.osu_opening_provider),
+// mOsuProvider.getFriendlyName());
+ break;
+ case OSU_STATUS_REDIRECT_RESPONSE_RECEIVED:
+ case OSU_STATUS_SECOND_SOAP_EXCHANGE:
+ case OSU_STATUS_THIRD_SOAP_EXCHANGE:
+ case OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS:
+// newStatus = mContext.getString(
+// R.string.osu_completing_sign_up);
+ break;
+ }
+ boolean updated = !TextUtils.equals(mOsuStatus, newStatus);
+ mOsuStatus = newStatus;
+ mOsuFailure = null;
+ mOsuProvisioningComplete = false;
+ if (updated) {
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(
+ AccessPoint.this);
+ }
+ });
+ }
+ }
+
+ @Override
+ @MainThread
+ public void onProvisioningComplete() {
+ mOsuProvisioningComplete = true;
+ mOsuFailure = null;
+ mOsuStatus = null;
+
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(
+ AccessPoint.this);
+ }
+ });
+
+ // Connect to the freshly provisioned network.
+ WifiManager wifiManager = getWifiManager();
+
+ PasspointConfiguration passpointConfig = wifiManager
+ .getMatchingPasspointConfigsForOsuProviders(Collections.singleton(mOsuProvider))
+ .get(mOsuProvider);
+ if (passpointConfig == null) {
+ Log.e(TAG, "Missing PasspointConfiguration for newly provisioned network!");
+ if (mConnectListener != null) {
+ mConnectListener.onFailure(0);
+ }
+ return;
+ }
+
+ String uniqueId = passpointConfig.getUniqueId();
+ for (Pair<WifiConfiguration, Map<Integer, List<ScanResult>>> pairing :
+ wifiManager.getAllMatchingWifiConfigs(wifiManager.getScanResults())) {
+ WifiConfiguration config = pairing.first;
+ if (TextUtils.equals(config.getKey(), uniqueId)) {
+ List<ScanResult> homeScans =
+ pairing.second.get(WifiManager.PASSPOINT_HOME_NETWORK);
+ List<ScanResult> roamingScans =
+ pairing.second.get(WifiManager.PASSPOINT_ROAMING_NETWORK);
+
+ AccessPoint connectionAp =
+ new AccessPoint(mContext, config, homeScans, roamingScans);
+ wifiManager.connect(connectionAp.getConfig(), mConnectListener);
+ return;
+ }
+ }
+ if (mConnectListener != null) {
+ mConnectListener.onFailure(0);
+ }
+ }
+ }
+
+ public boolean isPskSaeTransitionMode() {
+ return mIsPskSaeTransitionMode;
+ }
+
+ public boolean isOweTransitionMode() {
+ return mIsOweTransitionMode;
+ }
+
+ private static boolean isPskSaeTransitionMode(ScanResult scanResult) {
+ return scanResult.capabilities.contains("PSK")
+ && scanResult.capabilities.contains("SAE");
+ }
+
+ private static boolean isOweTransitionMode(ScanResult scanResult) {
+ return scanResult.capabilities.contains("OWE_TRANSITION");
+ }
+
+ private boolean isSameSsidOrBssid(ScanResult scanResult) {
+ if (scanResult == null) {
+ return false;
+ }
+
+ if (TextUtils.equals(ssid, scanResult.SSID)) {
+ return true;
+ } else return scanResult.BSSID != null && TextUtils.equals(bssid, scanResult.BSSID);
+ }
+
+ private boolean isSameSsidOrBssid(WifiInfo wifiInfo) {
+ if (wifiInfo == null) {
+ return false;
+ }
+
+ if (TextUtils.equals(ssid, removeDoubleQuotes(wifiInfo.getSSID()))) {
+ return true;
+ } else return wifiInfo.getBSSID() != null && TextUtils.equals(bssid, wifiInfo.getBSSID());
+ }
+
+ private boolean isSameSsidOrBssid(AccessPoint accessPoint) {
+ if (accessPoint == null) {
+ return false;
+ }
+
+ if (TextUtils.equals(ssid, accessPoint.getSsid())) {
+ return true;
+ } else return accessPoint.getBssid() != null
+ && TextUtils.equals(bssid, accessPoint.getBssid());
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/AccessPointPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/network/AccessPointPreferenceController.java
new file mode 100644
index 0000000..f30132a
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/AccessPointPreferenceController.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.tv.settings.library.network;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.ResourcesUtil;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+/** Preference controller for access point preference in NetworkState. */
+public class AccessPointPreferenceController extends RestrictedPreferenceController {
+ private final AccessPoint mAccessPoint;
+ private static final String EXTRA_WIFI_SSID = "wifi_ssid";
+ private static final String EXTRA_WIFI_SECURITY_NAME = "wifi_security_name";
+
+
+ public AccessPointPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager, AccessPoint accessPoint,
+ String[] key) {
+ super(context, callback, stateIdentifier, preferenceCompatManager, key);
+ mAccessPoint = accessPoint;
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return UserManager.DISALLOW_CONFIG_WIFI;
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return true;
+ }
+
+ @Override
+ public void init() {
+ if (getAttrUserRestriction() != null) {
+ checkRestrictionAndSetDisabled(getAttrUserRestriction(), UserHandle.myUserId());
+ }
+ mPreferenceCompat.setTitle(mAccessPoint.getTitle());
+ mPreferenceCompat.setType(PreferenceCompat.TYPE_PREFERENCE_ACCESS_POINT);
+ if (mAccessPoint.isActive()) {
+ mPreferenceCompat.setSummary(ResourcesUtil.getString(mContext, "connected"));
+ }
+ if (mAccessPoint.isActive() && !isCaptivePortal(mAccessPoint)) {
+ Bundle extras = new Bundle();
+ WifiDetailsState.prepareArgs(extras, mAccessPoint);
+ mPreferenceCompat.setExtras(extras);
+ mPreferenceCompat.setNextState(ManagerUtil.STATE_WIFI_DETAILS);
+ mPreferenceCompat.setIntent(null);
+ } else {
+ Intent i = new Intent("com.android.settings.wifi.action.WIFI_CONNECTION_SETTINGS")
+ .putExtra(EXTRA_WIFI_SSID, mAccessPoint.getSsidStr())
+ .putExtra(EXTRA_WIFI_SECURITY_NAME, mAccessPoint.getSecurity());
+ mPreferenceCompat.setIntent(i);
+ }
+ mPreferenceCompat.addInfo(ManagerUtil.INFO_WIFI_SIGNAL_LEVEL, mAccessPoint.getLevel());
+ mPreferenceCompat.setRestricted(true);
+ update();
+ }
+
+
+ private boolean isCaptivePortal(AccessPoint accessPoint) {
+ WifiManager wifiManager = mContext.getSystemService(WifiManager.class);
+ ConnectivityManager connectivityManager = mContext.getSystemService(
+ ConnectivityManager.class);
+ if (accessPoint.getDetailedState() != NetworkInfo.DetailedState.CONNECTED) {
+ return false;
+ }
+ NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(
+ wifiManager.getCurrentNetwork());
+ return nc != null && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
+ }
+
+ public boolean performClick(boolean status) {
+ return handlePreferenceTreeClick(status);
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/AddEasyConnectPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/network/AddEasyConnectPreferenceController.java
new file mode 100644
index 0000000..4db7921
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/AddEasyConnectPreferenceController.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.tv.settings.library.network;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserManager;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+/** Preference controller for easy connect preference in NetworkState. */
+public class AddEasyConnectPreferenceController extends RestrictedPreferenceController {
+ private static final String KEY_ADD_EASY_CONNECT = "wifi_add_easyconnect";
+ private static final String ACTION_ADD_WIFI_NETWORK =
+ "com.android.settings.wifi.action.ADD_WIFI_NETWORK";
+ private static final String EXTRA_TYPE = "com.android.tv.settings.connectivity.type";
+ private static final String EXTRA_TYPE_EASYCONNECT = "easyconnect";
+
+ public AddEasyConnectPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return true;
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(boolean status) {
+ if (!mDisabledByAdmin) {
+ Intent i = new Intent(ACTION_ADD_WIFI_NETWORK)
+ .putExtra(EXTRA_TYPE, EXTRA_TYPE_EASYCONNECT);
+ mContext.startActivity(i);
+ return true;
+ }
+ return super.handlePreferenceTreeClick(status);
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return UserManager.DISALLOW_CONFIG_WIFI;
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_ADD_EASY_CONNECT};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/AddWifiPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/network/AddWifiPreferenceController.java
new file mode 100644
index 0000000..13147c2
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/AddWifiPreferenceController.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.tv.settings.library.network;
+
+import android.content.Context;
+import android.os.UserManager;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+/** Preference controller for add wifi preference in NetworkState. */
+public class AddWifiPreferenceController extends RestrictedPreferenceController {
+ private static final String KEY_ADD = "wifi_add";
+
+ public AddWifiPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return UserManager.DISALLOW_CONFIG_WIFI;
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_ADD};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/ConnectivityListener.java b/SettingsAPI/java/com/android/tv/settings/library/network/ConnectivityListener.java
new file mode 100644
index 0000000..d323726
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/ConnectivityListener.java
@@ -0,0 +1,534 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.network;
+
+import android.annotation.SuppressLint;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.EthernetManager;
+import android.net.EthernetManager.InterfaceStateListener;
+import android.net.IpConfiguration;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.telephony.PhoneStateListener;
+import android.telephony.SignalStrength;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.UiThread;
+
+import com.android.tv.settings.library.util.ThreadUtils;
+import com.android.tv.settings.library.util.lifecycle.Lifecycle;
+import com.android.tv.settings.library.util.lifecycle.LifecycleObserver;
+import com.android.tv.settings.library.util.lifecycle.events.OnStart;
+import com.android.tv.settings.library.util.lifecycle.events.OnStop;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Listens for changes to the current connectivity status.
+ */
+public class ConnectivityListener implements WifiTracker.WifiListener, LifecycleObserver, OnStart,
+ OnStop {
+
+ private static final String TAG = "ConnectivityListener";
+
+ private final Context mContext;
+ private final Listener mListener;
+ private boolean mStarted;
+
+ private WifiTracker mWifiTracker;
+
+ private final ConnectivityManager mConnectivityManager;
+ private final WifiManager mWifiManager;
+ private final EthernetManager mEthernetManager;
+ private WifiNetworkListener mWifiListener;
+ private final BroadcastReceiver mNetworkReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ updateConnectivityStatus();
+ if (mListener != null) {
+ mListener.onConnectivityChange();
+ }
+ }
+ };
+ private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+ @Override
+ public void onSignalStrengthsChanged(SignalStrength signalStrength) {
+ mCellSignalStrength = signalStrength;
+ mListener.onConnectivityChange();
+ }
+ };
+
+ private SignalStrength mCellSignalStrength;
+ private int mNetworkType;
+ private String mWifiSsid;
+ private int mWifiSignalStrength;
+ private final InterfaceStateListener mEthernetListener;
+ private final ArrayMap<String, IpConfiguration> mAvailableInterfaces = new ArrayMap<>();
+ private final Handler mUiHandler = ThreadUtils.getUiThreadHandler();
+
+ /**
+ * @deprecated use the constructor that provides a {@link Lifecycle} instead
+ */
+ @Deprecated
+ public ConnectivityListener(Context context, Listener listener) {
+ this(context, listener, null);
+ }
+
+ public ConnectivityListener(Context context, Listener listener, Lifecycle lifecycle) {
+ mContext = context;
+ mConnectivityManager = mContext.getSystemService(ConnectivityManager.class);
+ mWifiManager = mContext.getSystemService(WifiManager.class);
+ mEthernetManager = mContext.getSystemService(EthernetManager.class);
+ mListener = listener;
+ if (mWifiManager != null) {
+ mWifiTracker = new WifiTracker(context, this, true, true);
+ }
+ mEthernetListener = (iface, state, role, configuration) -> {
+ if (state == EthernetManager.STATE_LINK_UP) {
+ mAvailableInterfaces.put(iface, configuration);
+ } else {
+ mAvailableInterfaces.remove(iface);
+ }
+ updateConnectivityStatus();
+ if (mListener != null) {
+ mListener.onConnectivityChange();
+ }
+ };
+ updateConnectivityStatus();
+ }
+
+ /**
+ * Starts {@link ConnectivityListener}.
+ * This should be called only from main thread.
+ *
+ * @deprecated not needed when a {@link Lifecycle} is provided
+ */
+ @UiThread
+ @Deprecated
+ public void start() {
+ if (!mStarted && mWifiTracker != null) {
+ mWifiTracker.onStart();
+ }
+ onStart();
+ }
+
+ @Override
+ public void onStart() {
+ if (!mStarted) {
+ mStarted = true;
+ updateConnectivityStatus();
+ IntentFilter networkIntentFilter = new IntentFilter();
+ networkIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+ networkIntentFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
+ networkIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
+ networkIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+
+ mContext.registerReceiver(mNetworkReceiver, networkIntentFilter);
+ final TelephonyManager telephonyManager = mContext
+ .getSystemService(TelephonyManager.class);
+ if (telephonyManager != null) {
+ telephonyManager.listen(mPhoneStateListener,
+ PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
+ }
+ if (mEthernetManager != null) {
+ mEthernetManager.addInterfaceStateListener(r -> mUiHandler.post(r),
+ mEthernetListener);
+ }
+ }
+ }
+
+ /**
+ * Stops {@link ConnectivityListener}.
+ * This should be called only from main thread.
+ *
+ * @deprecated not needed when a {@link Lifecycle} is provided
+ */
+ @UiThread
+ @Deprecated
+ public void stop() {
+ if (mStarted && mWifiTracker != null) {
+ mWifiTracker.onStop();
+ }
+ onStop();
+ }
+
+ @Override
+ public void onStop() {
+ if (mStarted) {
+ mStarted = false;
+ mContext.unregisterReceiver(mNetworkReceiver);
+ mWifiListener = null;
+ final TelephonyManager telephonyManager = mContext
+ .getSystemService(TelephonyManager.class);
+ if (telephonyManager != null) {
+ telephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+ }
+ if (mEthernetManager != null) {
+ mEthernetManager.removeInterfaceStateListener(mEthernetListener);
+ }
+
+ }
+ }
+
+ /**
+ * Causes the background thread to quit.
+ *
+ * @deprecated not needed when a {@link Lifecycle} is provided
+ */
+ @Deprecated
+ public void destroy() {
+ if (mWifiTracker != null) {
+ mWifiTracker.onDestroy();
+ }
+ }
+
+ public void setWifiListener(WifiNetworkListener wifiListener) {
+ mWifiListener = wifiListener;
+ }
+
+ public String getWifiIpAddress() {
+ if (isWifiConnected()) {
+ Network network = mWifiManager.getCurrentNetwork();
+ return formatIpAddresses(network);
+ } else {
+ return "";
+ }
+ }
+
+ /**
+ * Return the MAC address of the currently connected Wifi AP.
+ */
+ @SuppressLint("HardwareIds")
+ public String getWifiMacAddress(AccessPoint ap) {
+ if (isWifiConnected() && mWifiManager.getConnectionInfo() != null) {
+ return mWifiManager.getConnectionInfo().getMacAddress();
+ }
+ if (ap != null) {
+ WifiConfiguration wifiConfig = ap.getConfig();
+ if (wifiConfig != null
+ && wifiConfig.macRandomizationSetting
+ == WifiConfiguration.RANDOMIZATION_PERSISTENT) {
+ return wifiConfig.getRandomizedMacAddress().toString();
+ }
+ }
+
+ // return device MAC address
+ final String[] macAddresses = mWifiManager.getFactoryMacAddresses();
+ if (macAddresses != null && macAddresses.length > 0) {
+ return macAddresses[0];
+ }
+
+ Log.e(TAG, "Unable to get MAC address");
+ return "";
+ }
+
+ /** Return whether the connected Wifi supports MAC address randomization. */
+ public boolean isMacAddressRandomizationSupported() {
+ return mWifiManager.isConnectedMacRandomizationSupported();
+ }
+
+ /** Return whether the MAC address of the currently connected Wifi AP is randomized. */
+ public int getWifiMacRandomizationSetting(AccessPoint ap) {
+ if (ap == null || ap.getConfig() == null) {
+ return WifiConfiguration.RANDOMIZATION_NONE;
+ }
+ return ap.getConfig().macRandomizationSetting;
+ }
+
+ /** Apply the setting of whether to use MAC address randimization. */
+ public void applyMacRandomizationSetting(AccessPoint ap, boolean enable) {
+ if (ap != null && ap.getConfig() != null) {
+ ap.getConfig().macRandomizationSetting = enable
+ ? WifiConfiguration.RANDOMIZATION_PERSISTENT
+ : WifiConfiguration.RANDOMIZATION_NONE;
+ mWifiManager.updateNetwork(ap.getConfig());
+ // To activate changing, we need to reconnect network. WiFi will auto connect to
+ // current network after disconnect(). Only needed when this is connected network.
+ final WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
+ if (wifiInfo != null && wifiInfo.getNetworkId() == ap.getConfig().networkId) {
+ mWifiManager.disconnect();
+ }
+ }
+ }
+
+ public boolean isEthernetConnected() {
+ return mNetworkType == ConnectivityManager.TYPE_ETHERNET;
+ }
+
+ public boolean isWifiConnected() {
+ if (mNetworkType == ConnectivityManager.TYPE_WIFI) {
+ return true;
+ } else {
+ if (mWifiManager != null) {
+ WifiInfo connectionInfo = mWifiManager.getConnectionInfo();
+ return connectionInfo.getNetworkId() != -1;
+ }
+ }
+ return false;
+ }
+
+ public boolean isCellConnected() {
+ return mNetworkType == ConnectivityManager.TYPE_MOBILE;
+ }
+
+ private void ensureRunningOnUiThread() {
+ if (mUiHandler.getLooper().getThread() != Thread.currentThread()) {
+ throw new IllegalStateException("Not running on the UI thread: "
+ + Thread.currentThread().getName());
+ }
+ }
+
+ private boolean isEthernetEnabled() {
+ return mEthernetManager != null;
+ }
+
+ /**
+ * Return whether Ethernet port is available.
+ */
+ public boolean isEthernetAvailable() {
+ ensureRunningOnUiThread();
+ return isEthernetEnabled() && (mAvailableInterfaces.size() > 0);
+ }
+
+ private Network getFirstEthernet() {
+ final Network[] networks = mConnectivityManager.getAllNetworks();
+ for (final Network network : networks) {
+ NetworkInfo networkInfo = mConnectivityManager.getNetworkInfo(network);
+ if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET) {
+ return network;
+ }
+ }
+ return null;
+ }
+
+ private String formatIpAddresses(Network network) {
+ final LinkProperties linkProperties = mConnectivityManager.getLinkProperties(network);
+ if (linkProperties == null) {
+ return null;
+ }
+ final StringBuilder sb = new StringBuilder();
+ boolean gotAddress = false;
+ for (LinkAddress linkAddress : linkProperties.getLinkAddresses()) {
+ if (gotAddress) {
+ sb.append("\n");
+ }
+ sb.append(linkAddress.getAddress().getHostAddress());
+ gotAddress = true;
+ }
+ if (gotAddress) {
+ return sb.toString();
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Returns the formatted IP addresses of the Ethernet connection or null
+ * if none available.
+ */
+ public String getEthernetIpAddress() {
+ final Network network = getFirstEthernet();
+ if (network == null) {
+ return null;
+ }
+ return formatIpAddresses(network);
+ }
+
+ /**
+ * Get the current Ethernet interface name.
+ */
+ public String getEthernetInterfaceName() {
+ ensureRunningOnUiThread();
+ if (mAvailableInterfaces.size() == 0) return null;
+ return mAvailableInterfaces.keyAt(0);
+ }
+
+ /**
+ * Get the current IP configuration of Ethernet interface.
+ */
+ public IpConfiguration getEthernetIpConfiguration() {
+ ensureRunningOnUiThread();
+ if (mAvailableInterfaces.size() == 0) return null;
+ return mAvailableInterfaces.valueAt(0);
+ }
+
+ public int getWifiSignalStrength(int maxLevel) {
+ if (mWifiManager != null) {
+ WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
+ return WifiManager.calculateSignalLevel(wifiInfo.getRssi(), maxLevel);
+ }
+ return 0;
+ }
+
+ public int getCellSignalStrength() {
+ if (isCellConnected() && mCellSignalStrength != null) {
+ return mCellSignalStrength.getLevel();
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ * Return a list of wifi networks. Ensure that if a wifi network is connected that it appears
+ * as the first item on the list.
+ */
+ public List<AccessPoint> getAvailableNetworks() {
+ return mWifiTracker == null ? new ArrayList<>() : mWifiTracker.getAccessPoints();
+ }
+
+ public boolean isWifiEnabledOrEnabling() {
+ return mWifiManager != null
+ && (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED
+ || mWifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING);
+ }
+
+ public void setWifiEnabled(boolean enable) {
+ if (mWifiManager != null) {
+ mWifiManager.setWifiEnabled(enable);
+ }
+ }
+
+ private void updateConnectivityStatus() {
+ NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
+ if (networkInfo == null) {
+ mNetworkType = ConnectivityManager.TYPE_NONE;
+ } else {
+ switch (networkInfo.getType()) {
+ case ConnectivityManager.TYPE_WIFI: {
+
+ if (mWifiManager == null) {
+ break;
+ }
+ // Determine if this is
+ // an open or secure wifi connection.
+ mNetworkType = ConnectivityManager.TYPE_WIFI;
+
+ String ssid = getSsid();
+ if (!TextUtils.equals(mWifiSsid, ssid)) {
+ mWifiSsid = ssid;
+ }
+
+ WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
+ // Calculate the signal strength.
+ int signalStrength;
+ if (wifiInfo != null) {
+ // Calculate the signal strength between 0 and 3.
+ signalStrength = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), 4);
+ } else {
+ signalStrength = 0;
+ }
+ if (mWifiSignalStrength != signalStrength) {
+ mWifiSignalStrength = signalStrength;
+ }
+ break;
+ }
+
+ case ConnectivityManager.TYPE_ETHERNET:
+ mNetworkType = ConnectivityManager.TYPE_ETHERNET;
+ break;
+
+ case ConnectivityManager.TYPE_MOBILE:
+ mNetworkType = ConnectivityManager.TYPE_MOBILE;
+ break;
+
+ default:
+ mNetworkType = ConnectivityManager.TYPE_NONE;
+ break;
+ }
+ }
+ }
+
+ @Override
+ public void onWifiStateChanged(int state) {
+ updateConnectivityStatus();
+ if (mListener != null) {
+ mListener.onConnectivityChange();
+ }
+ }
+
+ @Override
+ public void onConnectedChanged() {
+ updateConnectivityStatus();
+ if (mListener != null) {
+ mListener.onConnectivityChange();
+ }
+ }
+
+ @Override
+ public void onAccessPointsChanged() {
+ if (mWifiListener != null) {
+ mWifiListener.onWifiListChanged();
+ }
+ }
+
+ public interface Listener {
+ void onConnectivityChange();
+ }
+
+ public interface WifiNetworkListener {
+ void onWifiListChanged();
+ }
+
+ /**
+ * Get the SSID of current connected network.
+ *
+ * @return SSID
+ */
+ public String getSsid() {
+ if (mWifiManager == null) {
+ return null;
+ }
+ WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
+ // Find the SSID of network.
+ String ssid = null;
+ if (wifiInfo != null) {
+ ssid = wifiInfo.getSSID();
+ if (ssid != null) {
+ ssid = sanitizeSsid(ssid);
+ }
+ }
+ return ssid;
+ }
+
+ public static String sanitizeSsid(@Nullable String string) {
+ return removeDoubleQuotes(string);
+ }
+
+ public static String removeDoubleQuotes(@Nullable String string) {
+ if (string == null) return null;
+ final int length = string.length();
+ if ((length > 1) && (string.charAt(0) == '"') && (string.charAt(length - 1) == '"')) {
+ return string.substring(1, length - 1);
+ }
+ return string;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/ForgetNetworkPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/network/ForgetNetworkPreferenceController.java
new file mode 100644
index 0000000..afa18b0
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/ForgetNetworkPreferenceController.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.network;
+
+import static com.android.tv.settings.library.network.WifiDetailsState.REQUEST_CODE_FORGET_NETWORK;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiConfiguration;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.ResourcesUtil;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+/** Preference controller for forget network preference in WifiDetailsState. */
+public class ForgetNetworkPreferenceController extends RestrictedPreferenceController {
+ static final String INTENT_CONFIRMATION = "android.settings.ui.CONFIRM";
+ static final String EXTRA_GUIDANCE_TITLE = "guidancetitle";
+ static final String EXTRA_GUIDANCE_SUBTITLE = "guidanceSubtitle";
+ static final String EXTRA_GUIDANCE_BREADCRUMB = "guidanceBreadcrumb";
+ static final String EXTRA_GUIDANCE_ICON = "guidanceIcon";
+ private static final String KEY_FORGET_NETWORK = "forget_network";
+ private final AccessPoint mAccessPoint;
+
+ public ForgetNetworkPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager, AccessPoint accessPoint) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mAccessPoint = accessPoint;
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return null;
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(boolean status) {
+ if (!mDisabledByAdmin) {
+ Intent forgetConfirmIntent = new Intent(INTENT_CONFIRMATION)
+ .putExtra(EXTRA_GUIDANCE_TITLE,
+ ResourcesUtil.getString(mContext, "wifi_forget_network"))
+ .putExtra(EXTRA_GUIDANCE_SUBTITLE, ResourcesUtil.getString(mContext,
+ "wifi_forget_network_description", mAccessPoint.getSsidStr()));
+ ((Activity) mContext).startActivityForResult(forgetConfirmIntent,
+ ManagerUtil.calculateCompoundCode(mStateIdentifier,
+ REQUEST_CODE_FORGET_NETWORK));
+ return true;
+ }
+ return super.handlePreferenceTreeClick(status);
+ }
+
+ @Override
+ public void update() {
+ WifiConfiguration wifiConfiguration = mAccessPoint.getConfig();
+ mPreferenceCompat.setVisible(wifiConfiguration != null);
+ WifiDetailsState.updateRestrictedPreference(
+ mPreferenceCompat, mContext, mAccessPoint, this);
+ super.update();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_FORGET_NETWORK};
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/IpSettingsPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/network/IpSettingsPreferenceController.java
new file mode 100644
index 0000000..cd6972e
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/IpSettingsPreferenceController.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.tv.settings.library.network;
+
+import static com.android.tv.settings.library.network.WifiDetailsState.EXTRA_NETWORK_ID;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.IpConfiguration;
+import android.net.wifi.WifiConfiguration;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.ResourcesUtil;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+/** Preference controller for ip settings preference in WifiDetailsState. */
+public class IpSettingsPreferenceController extends RestrictedPreferenceController {
+ private static final String INTENT_IP_SETTINGS =
+ "com.android.settings.wifi.action.EDIT_IP_SETTINGS";
+ private static final String KEY_IP_SETTINGS = "ip_settings";
+ private final AccessPoint mAccessPoint;
+
+ public IpSettingsPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager, AccessPoint accessPoint) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mAccessPoint = accessPoint;
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return null;
+ }
+
+ @Override
+ public void update() {
+ WifiConfiguration wifiConfiguration = mAccessPoint.getConfig();
+ if (wifiConfiguration != null) {
+ final int networkId = wifiConfiguration.networkId;
+ IpConfiguration.IpAssignment ipAssignment =
+ wifiConfiguration.getIpConfiguration().getIpAssignment();
+ mPreferenceCompat.setSummary(ipAssignment == IpConfiguration.IpAssignment.STATIC
+ ? ResourcesUtil.getString(mContext, "wifi_action_static")
+ : ResourcesUtil.getString(mContext, "wifi_action_dhcp"));
+ mPreferenceCompat.setIntent(new Intent(INTENT_IP_SETTINGS)
+ .putExtra(EXTRA_NETWORK_ID, networkId));
+ }
+ mPreferenceCompat.setVisible(wifiConfiguration != null);
+ WifiDetailsState.updateRestrictedPreference(
+ mPreferenceCompat, mContext, mAccessPoint, this);
+ super.update();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_IP_SETTINGS};
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/service/network/NetworkModule.java b/SettingsAPI/java/com/android/tv/settings/library/network/NetworkModule.java
similarity index 64%
rename from Settings/src/com/android/tv/settings/service/network/NetworkModule.java
rename to SettingsAPI/java/com/android/tv/settings/library/network/NetworkModule.java
index 6ed5d68..98a0f4f 100644
--- a/Settings/src/com/android/tv/settings/service/network/NetworkModule.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/NetworkModule.java
@@ -14,37 +14,27 @@
* limitations under the License.
*/
-package com.android.tv.settings.service.network;
+package com.android.tv.settings.library.network;
import android.content.Context;
import android.content.pm.PackageManager;
-import android.net.ConnectivityManager;
-import android.net.wifi.WifiManager;
-import android.os.Bundle;
import android.util.ArraySet;
import android.util.Log;
-import com.android.settingslib.wifi.AccessPoint;
-import com.android.tv.settings.connectivity.ConnectivityListener;
-import com.android.tv.settings.service.PreferenceParcelable;
-import com.android.tv.settings.service.data.Module;
-import com.android.tv.settings.service.data.State;
+import com.android.tv.settings.library.State;
+import com.android.tv.settings.library.data.Module;
-import java.util.List;
-
-public class NetworkModule implements Module, ConnectivityListener.Listener {
+/** Provide network listener for all network states. */
+public class NetworkModule implements Module, ConnectivityListener.Listener,
+ ConnectivityListener.WifiNetworkListener {
private static final String TAG = "NetworkModule";
private static final boolean DEBUG = false;
private ConnectivityListener mConnectivityListener;
- private WifiManager mWifiManager;
- private ConnectivityManager mConnectivityManager;
private boolean mIsWifiHardwarePresent;
private static NetworkModule instance;
private final Context mContext;
- private List<PreferenceParcelable> mAccessPoints;
ArraySet<State> states = new ArraySet<>();
-
public static NetworkModule getInstance(Context context) {
if (instance == null) {
instance = new NetworkModule(context.getApplicationContext());
@@ -87,16 +77,15 @@
@Override
public void create() {
- mConnectivityListener = new ConnectivityListener(mContext, this, null);
mIsWifiHardwarePresent = mContext.getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_WIFI);
- mWifiManager = mContext.getSystemService(WifiManager.class);
- mConnectivityManager = mContext.getSystemService(ConnectivityManager.class);
+ mConnectivityListener = new ConnectivityListener(mContext, this, null);
+ mConnectivityListener.setWifiListener(this);
+ mConnectivityListener.start();
}
@Override
public void destroy() {
- mAccessPoints = null;
mConnectivityListener.destroy();
}
@@ -107,14 +96,6 @@
.forEach(state -> ((ConnectivityListener.Listener) state).onConnectivityChange());
}
- WifiManager getWifiManager() {
- return mWifiManager;
- }
-
- ConnectivityManager getConnectivityManager() {
- return mConnectivityManager;
- }
-
ConnectivityListener getConnectivityListener() {
return mConnectivityListener;
}
@@ -123,21 +104,12 @@
return mIsWifiHardwarePresent;
}
- AccessPoint getAccessPoint(Bundle extras) {
- AccessPoint accessPoint = new AccessPoint(mContext, extras);
- if (mAccessPoints == null) {
- return accessPoint;
- }
- PreferenceParcelable matched =
- mAccessPoints.stream()
- .filter(prefParcelable -> prefParcelable.getKey()[1].equals(
- accessPoint.getKey()))
- .findFirst().orElse(null);
- return matched == null ? accessPoint : new AccessPoint(mContext, matched.getExtras());
- }
-
- public void setAccessPoints(
- List<PreferenceParcelable> accessPoints) {
- this.mAccessPoints = accessPoints;
+ @Override
+ public void onWifiListChanged() {
+ states.stream()
+ .filter(state -> state instanceof ConnectivityListener.WifiNetworkListener)
+ .forEach(
+ state -> ((ConnectivityListener.WifiNetworkListener) state)
+ .onWifiListChanged());
}
}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/NetworkState.java b/SettingsAPI/java/com/android/tv/settings/library/network/NetworkState.java
new file mode 100644
index 0000000..d2af992
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/NetworkState.java
@@ -0,0 +1,352 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.network;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.provider.Settings;
+import android.util.ArrayMap;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.LibUtils;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/** State to provide data for rendering NetworkFragment. */
+public class NetworkState extends PreferenceControllerState implements
+ AccessPoint.AccessPointListener,
+ ConnectivityListener.WifiNetworkListener, ConnectivityListener.Listener {
+ private static final String TAG = "NetworkMainState";
+ private static final boolean DEBUG = true;
+ private static final String KEY_WIFI_ENABLE = "wifi_enable";
+ private static final String KEY_WIFI_LIST = "wifi_list";
+ private static final String KEY_WIFI_COLLAPSE = "wifi_collapse";
+ private static final String KEY_WIFI_OTHER = "wifi_other";
+ private static final String KEY_WIFI_ADD = "wifi_add";
+ private static final String KEY_WIFI_ADD_EASYCONNECT = "wifi_add_easyconnect";
+ private static final String KEY_WIFI_ALWAYS_SCAN = "wifi_always_scan";
+ private static final String KEY_ETHERNET = "ethernet";
+ private static final String KEY_ETHERNET_STATUS = "ethernet_status";
+ private static final String KEY_ETHERNET_PROXY = "ethernet_proxy";
+ private static final String KEY_ETHERNET_DHCP = "ethernet_dhcp";
+ private static final String KEY_DATA_SAVER_SLICE = "data_saver_slice";
+ private static final String KEY_DATA_ALERT_SLICE = "data_alert_slice";
+ private static final String KEY_NETWORK_DIAGNOSTICS = "network_diagnostics";
+ private static final String NETWORK_DIAGNOSTICS_ACTION =
+ "com.android.tv.settings.network.NETWORK_DIAGNOSTICS";
+ private static final int INITIAL_UPDATE_DELAY = 500;
+
+ private PreferenceCompat mEnableWifiPref;
+ private PreferenceCompat mAddPref;
+ private PreferenceCompat mEthernetCategory;
+ private PreferenceCompat mEthernetStatusPref;
+ private PreferenceCompat mEthernetProxyPref;
+ private PreferenceCompat mAlwaysScan;
+ private PreferenceCompat mWifiNetworkCategoryPref;
+ private PreferenceCompat mDataSaverSlicePref;
+ private PreferenceCompat mDataAlertSlicePref;
+ private PreferenceCompat mNetworkDiagnosticsPref;
+ private AbstractPreferenceController mAddNetworkPreferenceController;
+ private AbstractPreferenceController mEasyConnectPreferenceController;
+
+ private PreferenceCompatManager mPreferenceCompatManager;
+ private NetworkModule mNetworkModule;
+ private ConnectivityManager mConnectivityManager;
+ private final Handler mHandler = new Handler();
+ private long mNoWifiUpdateBeforeMillis;
+ private final Map<String, AccessPointPreferenceController> mAccessPointPrefControllers =
+ new ArrayMap<>();
+
+ private final Runnable mInitialUpdateWifiListRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mNoWifiUpdateBeforeMillis = 0;
+ updateWifiList();
+ }
+ };
+
+ public NetworkState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ mConnectivityManager = mContext.getSystemService(ConnectivityManager.class);
+ mNetworkModule = NetworkModule.getInstance(mContext);
+ mPreferenceCompatManager = new PreferenceCompatManager();
+ mEnableWifiPref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_WIFI_ENABLE);
+ mAlwaysScan = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_WIFI_ALWAYS_SCAN);
+ mAddPref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_WIFI_ADD);
+ mEthernetCategory = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_ETHERNET);
+ mEthernetStatusPref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_ETHERNET_STATUS);
+ mEthernetProxyPref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_ETHERNET_PROXY);
+ mWifiNetworkCategoryPref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_WIFI_LIST);
+ mWifiNetworkCategoryPref.setType(PreferenceCompat.TYPE_PREFERENCE_COLLAPSE_CATEGORY);
+ mDataSaverSlicePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_DATA_SAVER_SLICE);
+ mDataAlertSlicePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_DATA_ALERT_SLICE);
+ mNetworkDiagnosticsPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_NETWORK_DIAGNOSTICS);
+ Intent networkDiagnosticsIntent = makeNetworkDiagnosticsIntent();
+ if (networkDiagnosticsIntent != null) {
+ mNetworkDiagnosticsPref.setVisible(true);
+ mNetworkDiagnosticsPref.setIntent(networkDiagnosticsIntent);
+ } else {
+ mNetworkDiagnosticsPref.setVisible(false);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mNetworkDiagnosticsPref);
+ updateVisibilityForDataSaver();
+ super.onCreate(extras);
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ mNetworkModule.addState(this);
+ mNoWifiUpdateBeforeMillis = SystemClock.elapsedRealtime() + INITIAL_UPDATE_DELAY;
+ updateWifiList();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateConnectivity();
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ mNetworkModule.getConnectivityListener().stop();
+ mNetworkModule.removeState(this);
+ }
+
+ private void updateVisibilityForDataSaver() {
+ mDataSaverSlicePref.setVisible(isConnected());
+ mDataAlertSlicePref.setVisible(isConnected());
+ }
+
+ private boolean isConnected() {
+ NetworkInfo activeNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
+ return activeNetworkInfo != null && activeNetworkInfo.isConnected()
+ && ConnectivityManager.TYPE_ETHERNET != activeNetworkInfo.getType();
+ }
+
+ private void updateWifiList() {
+ if (!mNetworkModule.isWifiHardwarePresent()
+ || !mNetworkModule.getConnectivityListener().isWifiEnabledOrEnabling()) {
+ mNoWifiUpdateBeforeMillis = 0;
+ return;
+ }
+
+ final long now = SystemClock.elapsedRealtime();
+ if (mNoWifiUpdateBeforeMillis > now) {
+ mHandler.removeCallbacks(mInitialUpdateWifiListRunnable);
+ mHandler.postDelayed(mInitialUpdateWifiListRunnable,
+ mNoWifiUpdateBeforeMillis - now);
+ return;
+ }
+
+ final Collection<AccessPoint> accessPoints =
+ mNetworkModule.getConnectivityListener().getAvailableNetworks();
+ mWifiNetworkCategoryPref.initChildPreferences();
+ for (final AccessPoint accessPoint : accessPoints) {
+ accessPoint.setListener(this);
+ // Use preference controller but do not attach to lifecycle methods, manually call
+ // required methods to create preference compat.
+ AccessPointPreferenceController controller = new AccessPointPreferenceController(
+ mContext, mUIUpdateCallback, getStateIdentifier(), mPreferenceCompatManager,
+ accessPoint, new String[]{KEY_WIFI_LIST, accessPoint.getKey()});
+ controller.init();
+ PreferenceCompat accessPointPrefCompat = controller.getPrefCompat();
+ mAccessPointPrefControllers.put(
+ PreferenceCompatManager.getKey(accessPointPrefCompat.getKey()), controller);
+ mWifiNetworkCategoryPref.addChildPrefCompat(accessPointPrefCompat);
+ }
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mWifiNetworkCategoryPref);
+ }
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ boolean handled = true;
+ if (mAccessPointPrefControllers.containsKey(PreferenceCompatManager.getKey(key))) {
+ return mAccessPointPrefControllers.get(PreferenceCompatManager.getKey(key))
+ .performClick(status);
+ }
+ switch (key[0]) {
+ case KEY_WIFI_ENABLE:
+ mNetworkModule.getConnectivityListener().setWifiEnabled(status);
+ mEnableWifiPref.setChecked(status);
+ break;
+ case KEY_WIFI_ALWAYS_SCAN:
+ mAlwaysScan.setChecked(status);
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE,
+ status ? 1 : 0);
+ break;
+ case KEY_ETHERNET_STATUS:
+ case KEY_ETHERNET_DHCP:
+ case KEY_ETHERNET_PROXY:
+ break;
+ default:
+ handled = false;
+ }
+ handled = super.onPreferenceTreeClick(key, status) | handled;
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(),
+ mPreferenceCompatManager.getOrCreatePrefCompat(key));
+ }
+ return handled;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // no-op
+ }
+
+ private void updateConnectivity() {
+ List<PreferenceCompat> preferenceCompats = new ArrayList<>();
+ final boolean wifiEnabled = mNetworkModule.isWifiHardwarePresent()
+ && mNetworkModule.getConnectivityListener().isWifiEnabledOrEnabling();
+ mEnableWifiPref.setChecked(wifiEnabled);
+ preferenceCompats.add(mEnableWifiPref);
+
+ mWifiNetworkCategoryPref.setVisible(wifiEnabled);
+ preferenceCompats.add(mWifiNetworkCategoryPref);
+
+ mAddPref.setVisible(wifiEnabled);
+ preferenceCompats.add(mAddPref);
+
+ if (!wifiEnabled) {
+ updateWifiList();
+ }
+
+ int scanAlwaysAvailable = 0;
+ try {
+ scanAlwaysAvailable = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE);
+ } catch (Settings.SettingNotFoundException e) {
+ // Ignore
+ }
+
+ mAlwaysScan.setChecked(scanAlwaysAvailable == 1);
+ mAlwaysScan.setContentDescription(
+ ResourcesUtil.getString(mContext, "wifi_setting_always_scan_content_description"));
+
+ final boolean ethernetAvailable =
+ mNetworkModule.getConnectivityListener().isEthernetAvailable();
+ mEthernetCategory.setVisible(ethernetAvailable);
+ mEthernetStatusPref.setVisible(ethernetAvailable);
+ mEthernetProxyPref.setVisible(ethernetAvailable);
+ preferenceCompats.add(mEthernetCategory);
+ preferenceCompats.add(mEthernetStatusPref);
+ preferenceCompats.add(mEthernetProxyPref);
+
+ if (ethernetAvailable) {
+ final boolean ethernetConnected =
+ mNetworkModule.getConnectivityListener().isEthernetConnected();
+ mEthernetStatusPref.setTitle(ethernetConnected
+ ? ResourcesUtil.getString(mContext, "connected")
+ : ResourcesUtil.getString(mContext, "not_connected"));
+ mEthernetStatusPref.setSummary(
+ mNetworkModule.getConnectivityListener().getEthernetIpAddress());
+ }
+
+ updateVisibilityForDataSaver();
+ preferenceCompats.add(mDataSaverSlicePref);
+ preferenceCompats.add(mDataAlertSlicePref);
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdateAll(getStateIdentifier(), preferenceCompats);
+ }
+ }
+
+ @Override
+ public void onAccessPointChanged(AccessPoint accessPoint) {
+ PreferenceCompat accessPointPref = new PreferenceCompat(
+ new String[]{KEY_WIFI_LIST, accessPoint.getKey()});
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), accessPointPref);
+ }
+ }
+
+ @Override
+ public void onLevelChanged(AccessPoint accessPoint) {
+ PreferenceCompat accessPointPref = new PreferenceCompat(
+ new String[]{KEY_WIFI_LIST, accessPoint.getKey()});
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), accessPointPref);
+ }
+ }
+
+ @Override
+ public void onWifiListChanged() {
+ updateWifiList();
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_NETWORK;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ List<AbstractPreferenceController> controllers = new ArrayList<>();
+ mAddNetworkPreferenceController = new AddWifiPreferenceController(context,
+ mUIUpdateCallback, getStateIdentifier(), mPreferenceCompatManager);
+ mEasyConnectPreferenceController = new AddEasyConnectPreferenceController(context,
+ mUIUpdateCallback, getStateIdentifier(), mPreferenceCompatManager);
+ controllers.add(mAddNetworkPreferenceController);
+ controllers.add(mEasyConnectPreferenceController);
+ return controllers;
+ }
+
+
+ @Override
+ public void onConnectivityChange() {
+ updateConnectivity();
+ }
+
+ private Intent makeNetworkDiagnosticsIntent() {
+ Intent intent = new Intent();
+ intent.setAction(NETWORK_DIAGNOSTICS_ACTION);
+
+ ResolveInfo resolveInfo = LibUtils.systemIntentIsHandled(mContext, intent);
+ if (resolveInfo == null || resolveInfo.activityInfo == null) {
+ return null;
+ }
+
+ intent.setPackage(resolveInfo.activityInfo.packageName);
+
+ return intent;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/ProxySettingsPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/network/ProxySettingsPreferenceController.java
new file mode 100644
index 0000000..e6607ef
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/ProxySettingsPreferenceController.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.tv.settings.library.network;
+
+
+import static com.android.tv.settings.library.network.WifiDetailsState.EXTRA_NETWORK_ID;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.IpConfiguration;
+import android.net.wifi.WifiConfiguration;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.util.ResourcesUtil;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+/** Preference controller for proxy settings preference in WifiDetailsState. */
+public class ProxySettingsPreferenceController extends RestrictedPreferenceController {
+ private static final String INTENT_EDIT_PROXY_SETTINGS =
+ "com.android.settings.wifi.action.EDIT_PROXY_SETTINGS";
+ private static final String KEY_PROXY_SETTINGS = "proxy_settings";
+ private final AccessPoint mAccessPoint;
+
+ public ProxySettingsPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager, AccessPoint accessPoint) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ mAccessPoint = accessPoint;
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+ @Override
+ public String getAttrUserRestriction() {
+ return null;
+ }
+
+ @Override
+ public void update() {
+ WifiConfiguration wifiConfiguration = mAccessPoint.getConfig();
+ if (wifiConfiguration != null) {
+ final int networkId = wifiConfiguration.networkId;
+ IpConfiguration.ProxySettings proxySettings =
+ wifiConfiguration.getIpConfiguration().getProxySettings();
+ mPreferenceCompat.setSummary(proxySettings == IpConfiguration.ProxySettings.NONE
+ ? ResourcesUtil.getString(mContext, "wifi_action_proxy_none")
+ : ResourcesUtil.getString(mContext, "wifi_action_proxy_manual"));
+ mPreferenceCompat.setIntent(new Intent(INTENT_EDIT_PROXY_SETTINGS)
+ .putExtra(EXTRA_NETWORK_ID, networkId));
+ }
+ WifiDetailsState.updateRestrictedPreference(
+ mPreferenceCompat, mContext, mAccessPoint, this);
+ super.update();
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{KEY_PROXY_SETTINGS};
+ }
+
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/TimestampedScoredNetwork.java b/SettingsAPI/java/com/android/tv/settings/library/network/TimestampedScoredNetwork.java
new file mode 100644
index 0000000..e4ea171
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/TimestampedScoredNetwork.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.tv.settings.library.network;
+
+import android.net.ScoredNetwork;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Data encapsulation object to associate a time with a {@link ScoredNetwork}
+ */
+class TimestampedScoredNetwork implements Parcelable {
+ private ScoredNetwork mScore;
+ private long mUpdatedTimestampMillis;
+
+ TimestampedScoredNetwork(ScoredNetwork score, long updatedTimestampMillis) {
+ mScore = score;
+ mUpdatedTimestampMillis = updatedTimestampMillis;
+ }
+
+ protected TimestampedScoredNetwork(Parcel in) {
+ mScore = in.readParcelable(ScoredNetwork.class.getClassLoader());
+ mUpdatedTimestampMillis = in.readLong();
+ }
+
+ public void update(ScoredNetwork score, long updatedTimestampMillis) {
+ mScore = score;
+ mUpdatedTimestampMillis = updatedTimestampMillis;
+ }
+
+ public ScoredNetwork getScore() {
+ return mScore;
+ }
+
+ public long getUpdatedTimestampMillis() {
+ return mUpdatedTimestampMillis;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelable(mScore, flags);
+ dest.writeLong(mUpdatedTimestampMillis);
+ }
+
+ public static final Creator<TimestampedScoredNetwork> CREATOR =
+ new Creator<TimestampedScoredNetwork>() {
+ @Override
+ public TimestampedScoredNetwork createFromParcel(Parcel in) {
+ return new TimestampedScoredNetwork(in);
+ }
+
+ @Override
+ public TimestampedScoredNetwork[] newArray(int size) {
+ return new TimestampedScoredNetwork[size];
+ }
+ };
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/WifiDetailsState.java b/SettingsAPI/java/com/android/tv/settings/library/network/WifiDetailsState.java
new file mode 100644
index 0000000..a9ac266
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/WifiDetailsState.java
@@ -0,0 +1,299 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.network;
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+
+import com.android.tv.settings.library.ManagerUtil;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtils;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class WifiDetailsState extends PreferenceControllerState implements
+ ConnectivityListener.Listener, ConnectivityListener.WifiNetworkListener {
+ private static final String TAG = "WifiDetailsState";
+
+ private static final String ARG_ACCESS_POINT_STATE = "apBundle";
+ private static final String KEY_CONNECTION_STATUS = "connection_status";
+ private static final String KEY_IP_ADDRESS = "ip_address";
+ private static final String KEY_MAC_ADDRESS = "mac_address";
+ private static final String KEY_SIGNAL_STRENGTH = "signal_strength";
+ private static final String KEY_RANDOM_MAC = "random_mac";
+ private static final String VALUE_MAC_RANDOM = "random";
+ private static final String VALUE_MAC_DEVICE = "device";
+ public static final String EXTRA_NETWORK_ID = "network_id";
+
+ public static final int REQUEST_CODE_FORGET_NETWORK = 1;
+
+ private NetworkModule mNetworkModule;
+ private AccessPoint mAccessPoint;
+ PreferenceCompatManager mPreferenceCompatManager;
+ private PreferenceCompat mConnectionStatusPref;
+ private PreferenceCompat mIpAddressPref;
+ private PreferenceCompat mMacAddressPref;
+ private PreferenceCompat mSignalStrengthPref;
+ private PreferenceCompat mRandomMacPref;
+ private AbstractPreferenceController mProxySettingsPrefController;
+ private AbstractPreferenceController mIpSettingsPrefController;
+ private AbstractPreferenceController mForgetNetworkPrefController;
+
+ public WifiDetailsState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ mNetworkModule = NetworkModule.getInstance(mContext);
+ }
+
+ public static void prepareArgs(@NonNull Bundle args, AccessPoint accessPoint) {
+ final Bundle apBundle = new Bundle();
+ accessPoint.saveWifiState(apBundle);
+ args.putParcelable(ARG_ACCESS_POINT_STATE, apBundle);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ mNetworkModule = NetworkModule.getInstance(mContext);
+ mPreferenceCompatManager = new PreferenceCompatManager();
+ mAccessPoint = new AccessPoint(mContext, extras.getBundle(ARG_ACCESS_POINT_STATE));
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdateScreenTitle(getStateIdentifier(),
+ String.valueOf(mAccessPoint.getSsid()));
+ }
+ mConnectionStatusPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_CONNECTION_STATUS);
+ mIpAddressPref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_IP_ADDRESS);
+ mMacAddressPref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_MAC_ADDRESS);
+ mSignalStrengthPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_SIGNAL_STRENGTH);
+ mRandomMacPref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_RANDOM_MAC);
+ mRandomMacPref.setType(PreferenceCompat.TYPE_LIST);
+ super.onCreate(extras);
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ mNetworkModule.addState(this);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ update();
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ mNetworkModule.getConnectivityListener().stop();
+ mNetworkModule.removeState(this);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ return super.onPreferenceTreeClick(key, status);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == REQUEST_CODE_FORGET_NETWORK) {
+ if (resultCode == Activity.RESULT_OK) {
+ WifiManager wifiManager = mContext.getSystemService(WifiManager.class);
+ wifiManager.forget(mAccessPoint.getConfig().networkId, null);
+ }
+ }
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ mNetworkModule.getConnectivityListener().applyMacRandomizationSetting(
+ mAccessPoint,
+ VALUE_MAC_RANDOM.equals(newValue));
+ return true;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return ManagerUtil.STATE_WIFI_DETAILS;
+ }
+
+ @Override
+ public void onConnectivityChange() {
+ update();
+ }
+
+ @Override
+ public void onWifiListChanged() {
+ final List<AccessPoint> accessPoints = mNetworkModule
+ .getConnectivityListener().getAvailableNetworks();
+ for (final AccessPoint accessPoint : accessPoints) {
+ if (TextUtils.equals(mAccessPoint.getSsidStr(), accessPoint.getSsidStr())
+ && mAccessPoint.getSecurity() == accessPoint.getSecurity()) {
+ // Make sure we're not holding on to the one we inflated from the bundle, because
+ // it won't be updated
+ mAccessPoint = accessPoint;
+ break;
+ }
+ }
+ update();
+ }
+
+ private void update() {
+ List<PreferenceCompat> preferenceCompats = new ArrayList<>();
+ if (mAccessPoint == null) {
+ return;
+ }
+ final boolean active = mAccessPoint.isActive();
+
+ mConnectionStatusPref.setSummary(active
+ ? ResourcesUtil.getString(mContext, "connected")
+ : ResourcesUtil.getString(mContext, "not_connected"));
+ mIpAddressPref.setVisible(active);
+ mSignalStrengthPref.setVisible(active);
+ preferenceCompats.add(mConnectionStatusPref);
+ preferenceCompats.add(mIpAddressPref);
+ preferenceCompats.add(mSignalStrengthPref);
+ preferenceCompats.add(mMacAddressPref);
+
+ if (active) {
+ mIpAddressPref.setSummary(mNetworkModule.getConnectivityListener().getWifiIpAddress());
+ mSignalStrengthPref.setSummary(getSignalStrength());
+ }
+
+ // Mac address related Preferences (info entry and random mac setting entry)
+ String macAddress = mNetworkModule.getConnectivityListener()
+ .getWifiMacAddress(mAccessPoint);
+ if (active && !TextUtils.isEmpty(macAddress)) {
+ mMacAddressPref.setVisible(true);
+ updateMacAddressPref(macAddress);
+ updateRandomMacPref();
+ } else {
+ mMacAddressPref.setVisible(false);
+ mRandomMacPref.setVisible(false);
+ }
+
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdateAll(getStateIdentifier(), preferenceCompats);
+ }
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ List<AbstractPreferenceController> controllers = new ArrayList<>();
+ mProxySettingsPrefController = new ProxySettingsPreferenceController(context,
+ mUIUpdateCallback, getStateIdentifier(), mPreferenceCompatManager, mAccessPoint);
+ mIpSettingsPrefController = new IpSettingsPreferenceController(context,
+ mUIUpdateCallback, getStateIdentifier(), mPreferenceCompatManager, mAccessPoint);
+ mForgetNetworkPrefController = new ForgetNetworkPreferenceController(context,
+ mUIUpdateCallback, getStateIdentifier(), mPreferenceCompatManager, mAccessPoint);
+ controllers.add(mProxySettingsPrefController);
+ controllers.add(mIpSettingsPrefController);
+ controllers.add(mForgetNetworkPrefController);
+ return controllers;
+ }
+
+ private void updateMacAddressPref(String macAddress) {
+ if (WifiInfo.DEFAULT_MAC_ADDRESS.equals(macAddress)) {
+ mMacAddressPref.setSummary(
+ ResourcesUtil.getString(mContext, "mac_address_not_available"));
+ } else {
+ mMacAddressPref.setSummary(macAddress);
+ }
+ if (mAccessPoint == null || mAccessPoint.getConfig() == null) {
+ return;
+ }
+ // For saved Passpoint network, framework doesn't have the field to keep the MAC choice
+ // persistently, so Passpoint network will always use the default value so far, which is
+ // randomized MAC address, so don't need to modify title.
+ if (mAccessPoint.isPasspoint() || mAccessPoint.isPasspointConfig()) {
+ return;
+ }
+ mMacAddressPref.setTitle(
+ (mAccessPoint.getConfig().macRandomizationSetting
+ == WifiConfiguration.RANDOMIZATION_PERSISTENT)
+ ? ResourcesUtil.getString(mContext, "title_randomized_mac_address")
+ : ResourcesUtil.getString(mContext, "title_mac_address"));
+ }
+
+ private void updateRandomMacPref() {
+ ConnectivityListener connectivityListener = mNetworkModule.getConnectivityListener();
+ mRandomMacPref.setVisible(connectivityListener.isMacAddressRandomizationSupported());
+ boolean isMacRandomized =
+ (connectivityListener.getWifiMacRandomizationSetting(mAccessPoint)
+ == WifiConfiguration.RANDOMIZATION_PERSISTENT);
+ mRandomMacPref.setValue(isMacRandomized ? VALUE_MAC_RANDOM : VALUE_MAC_DEVICE);
+ if (mAccessPoint.isEphemeral() || mAccessPoint.isPasspoint()
+ || mAccessPoint.isPasspointConfig()) {
+ mRandomMacPref.setSelectable(PreferenceCompat.STATUS_OFF);
+ mRandomMacPref.setSummary(ResourcesUtil.getString(
+ mContext, "mac_address_ephemeral_summary"));
+ } else {
+ mRandomMacPref.setSelectable(PreferenceCompat.STATUS_ON);
+ String[] entries = ResourcesUtil.getStringArray(
+ mContext, "random_mac_settings_entries");
+ mRandomMacPref.setHasOnPreferenceChangeListener(true);
+ mRandomMacPref.setSummary(entries[isMacRandomized ? 0 : 1]);
+ }
+ }
+
+ private String getSignalStrength() {
+ String[] signalLevels = ResourcesUtil
+ .getStringArray(mContext, "wifi_signal_strength");
+ if (signalLevels != null) {
+ int strength = mNetworkModule.getConnectivityListener()
+ .getWifiSignalStrength(signalLevels.length);
+ return signalLevels[strength];
+ }
+ return "";
+ }
+
+ public static void updateRestrictedPreference(
+ PreferenceCompat preferenceCompat, Context context, AccessPoint accessPoint,
+ RestrictedPreferenceController restrictedPreferenceController) {
+ WifiConfiguration wifiConfiguration = accessPoint.getConfig();
+ boolean canModifyNetwork = !WifiHelper.isNetworkLockedDown(
+ context, wifiConfiguration);
+ preferenceCompat.setVisible(wifiConfiguration != null);
+ if (canModifyNetwork) {
+ restrictedPreferenceController.setDisabledByAdmin(null);
+ restrictedPreferenceController.setEnabled(true);
+ } else {
+ RestrictedLockUtils.EnforcedAdmin admin = RestrictedLockUtils.getProfileOrDeviceOwner(
+ context,
+ UserHandle.of(UserHandle.myUserId()));
+ restrictedPreferenceController.setDisabledByAdmin(admin);
+ }
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/WifiHelper.java b/SettingsAPI/java/com/android/tv/settings/library/network/WifiHelper.java
new file mode 100644
index 0000000..23fec73
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/WifiHelper.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.network;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.net.wifi.WifiConfiguration;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+
+/**
+ * Helper class that deals with Wi-fi configuration.
+ */
+public final class WifiHelper {
+ private WifiHelper() {
+ }
+
+ /**
+ * @param context Context of caller
+ * @param config The WiFi config.
+ * @return true if Settings cannot modify the config due to lockDown.
+ */
+ public static boolean isNetworkLockedDown(Context context, WifiConfiguration config) {
+ if (config == null) {
+ return false;
+ }
+
+ final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ final PackageManager pm = context.getPackageManager();
+ final UserManager um = context.getSystemService(UserManager.class);
+
+ // Check if device has DPM capability. If it has and dpm is still null, then we
+ // treat this case with suspicion and bail out.
+ if (pm.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN) && dpm == null) {
+ return true;
+ }
+
+ boolean isConfigEligibleForLockdown = false;
+ if (dpm != null) {
+ final ComponentName deviceOwner = dpm.getDeviceOwnerComponentOnAnyUser();
+ if (deviceOwner != null) {
+ final int deviceOwnerUserId = dpm.getDeviceOwnerUserId();
+ try {
+ final int deviceOwnerUid = pm.getPackageUidAsUser(deviceOwner.getPackageName(),
+ deviceOwnerUserId);
+ isConfigEligibleForLockdown = deviceOwnerUid == config.creatorUid;
+ } catch (PackageManager.NameNotFoundException e) {
+ // don't care
+ }
+ } else if (dpm.isOrganizationOwnedDeviceWithManagedProfile()) {
+ int profileOwnerUserId = getManagedProfileId(um, UserHandle.myUserId());
+ final ComponentName profileOwner = dpm.getProfileOwnerAsUser(profileOwnerUserId);
+ if (profileOwner != null) {
+ try {
+ final int profileOwnerUid = pm.getPackageUidAsUser(
+ profileOwner.getPackageName(), profileOwnerUserId);
+ isConfigEligibleForLockdown = profileOwnerUid == config.creatorUid;
+ } catch (PackageManager.NameNotFoundException e) {
+ // don't care
+ }
+ }
+ }
+ }
+ if (!isConfigEligibleForLockdown) {
+ return false;
+ }
+
+ final ContentResolver resolver = context.getContentResolver();
+ final boolean isLockdownFeatureEnabled = Settings.Global.getInt(resolver,
+ Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN, 0) != 0;
+ return isLockdownFeatureEnabled;
+ }
+
+ /**
+ * Retrieves the id for the given user's profile.
+ *
+ * @return the profile id or UserHandle.USER_NULL if there is none.
+ */
+ private static int getManagedProfileId(UserManager um, int parentUserId) {
+ final int[] profileIds = um.getProfileIdsWithDisabled(parentUserId);
+ for (int profileId : profileIds) {
+ if (profileId != parentUserId && um.isManagedProfile(profileId)) {
+ return profileId;
+ }
+ }
+ return UserHandle.USER_NULL;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/WifiSavedConfigUtils.java b/SettingsAPI/java/com/android/tv/settings/library/network/WifiSavedConfigUtils.java
new file mode 100644
index 0000000..1dbd648
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/WifiSavedConfigUtils.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.tv.settings.library.network;
+
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+import android.net.wifi.hotspot2.PasspointConfiguration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Provide utility functions for retrieving saved Wi-Fi configurations.
+ */
+public class WifiSavedConfigUtils {
+ /**
+ * Returns all the saved configurations on the device, including both Wi-Fi networks and
+ * Passpoint profiles, represented by {@link .AccessPoint}.
+ *
+ * @param context The application context
+ * @param wifiManager An instance of {@link WifiManager}
+ * @return List of {@link .AccessPoint}
+ */
+ public static List<AccessPoint> getAllConfigs(Context context, WifiManager wifiManager) {
+ List<AccessPoint> savedConfigs = new ArrayList<>();
+ List<WifiConfiguration> savedNetworks = wifiManager.getConfiguredNetworks();
+ for (WifiConfiguration network : savedNetworks) {
+ // Configuration for Passpoint network is configured temporary by WifiService for
+ // connection attempt only. The underlying configuration is saved as Passpoint
+ // configuration, which will be retrieved with WifiManager#getPasspointConfiguration
+ // call below.
+ if (network.isPasspoint()) {
+ continue;
+ }
+ // Ephemeral networks are not saved to the persistent storage, ignore them.
+ if (network.isEphemeral()) {
+ continue;
+ }
+ savedConfigs.add(new AccessPoint(context, network));
+ }
+ try {
+ List<PasspointConfiguration> savedPasspointConfigs =
+ wifiManager.getPasspointConfigurations();
+ if (savedPasspointConfigs != null) {
+ for (PasspointConfiguration config : savedPasspointConfigs) {
+ savedConfigs.add(new AccessPoint(context, config));
+ }
+ }
+ } catch (UnsupportedOperationException e) {
+ // Passpoint not supported.
+ }
+ return savedConfigs;
+ }
+
+ /**
+ * Returns the count of the saved configurations on the device, including both Wi-Fi networks
+ * and Passpoint profiles.
+ *
+ * @param context The application context
+ * @param wifiManager An instance of {@link WifiManager}
+ * @return count of saved Wi-Fi networks
+ */
+ public static int getAllConfigsCount(Context context, WifiManager wifiManager) {
+ return getAllConfigs(context, wifiManager).size();
+ }
+}
+
+
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/WifiTracker.java b/SettingsAPI/java/com/android/tv/settings/library/network/WifiTracker.java
new file mode 100644
index 0000000..ffb1919
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/WifiTracker.java
@@ -0,0 +1,1159 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.network;
+
+import android.annotation.AnyThread;
+import android.annotation.MainThread;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkKey;
+import android.net.NetworkRequest;
+import android.net.NetworkScoreManager;
+import android.net.ScoredNetwork;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.net.wifi.WifiNetworkScoreCache;
+import android.net.wifi.WifiNetworkScoreCache.CacheListener;
+import android.net.wifi.hotspot2.OsuProvider;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Message;
+import android.os.Process;
+import android.os.SystemClock;
+import android.provider.Settings;
+import android.text.format.DateUtils;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Log;
+import android.util.Pair;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+
+import com.android.tv.settings.library.util.ThreadUtils;
+import com.android.tv.settings.library.util.lifecycle.Lifecycle;
+import com.android.tv.settings.library.util.lifecycle.LifecycleObserver;
+import com.android.tv.settings.library.util.lifecycle.events.OnDestroy;
+import com.android.tv.settings.library.util.lifecycle.events.OnStart;
+import com.android.tv.settings.library.util.lifecycle.events.OnStop;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
+
+/**
+ * Tracks saved or available wifi networks and their state.
+ *
+ * @deprecated WifiTracker/AccessPoint is no longer supported, and will be removed in a future
+ * release. Clients that need a dynamic list of available wifi networks should migrate to one of the
+ * newer tracker classes,
+ * {@link com.android.wifitrackerlib.WifiPickerTracker},
+ * {@link com.android.wifitrackerlib.SavedNetworkTracker},
+ * {@link com.android.wifitrackerlib.NetworkDetailsTracker},
+ * in conjunction with {@link com.android.wifitrackerlib.WifiEntry} to represent each wifi network.
+ */
+@Deprecated
+public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestroy {
+ /**
+ * Default maximum age in millis of cached scored networks in
+ * {@link .AccessPoint#mScoredNetworkCache} to be used for speed label generation.
+ */
+ private static final long DEFAULT_MAX_CACHED_SCORE_AGE_MILLIS = 20 * DateUtils.MINUTE_IN_MILLIS;
+
+ /** Maximum age of scan results to hold onto while actively scanning. **/
+ @VisibleForTesting
+ static final long MAX_SCAN_RESULT_AGE_MILLIS = 15000;
+
+ private static final String TAG = "WifiTracker";
+
+ private static final boolean DBG() {
+ return Log.isLoggable(TAG, Log.DEBUG);
+ }
+
+ private static boolean isVerboseLoggingEnabled() {
+ return WifiTracker.sVerboseLogging || Log.isLoggable(TAG, Log.VERBOSE);
+ }
+
+ /**
+ * Verbose logging flag set thru developer debugging options and used so as to assist with
+ * in-the-field WiFi connectivity debugging.
+ *
+ * <p>{@link #isVerboseLoggingEnabled()} should be read rather than referencing this value
+ * directly, to ensure adb TAG level verbose settings are respected.
+ */
+ public static boolean sVerboseLogging;
+
+ // TODO: Allow control of this?
+ // Combo scans can take 5-6s to complete - set to 10s.
+ private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;
+
+ private final Context mContext;
+ private final WifiManager mWifiManager;
+ private final IntentFilter mFilter;
+ private final ConnectivityManager mConnectivityManager;
+ private final NetworkRequest mNetworkRequest;
+ private final AtomicBoolean mConnected = new AtomicBoolean(false);
+ private final WifiTracker.WifiListenerExecutor mListener;
+ @VisibleForTesting
+ Handler mWorkHandler;
+ private HandlerThread mWorkThread;
+
+ private WifiTracker.WifiTrackerNetworkCallback mNetworkCallback;
+
+ /**
+ * Synchronization lock for managing concurrency between main and worker threads.
+ *
+ * <p>This lock should be held for all modifications to {@link #mInternalAccessPoints} and
+ * {@link #mScanner}.
+ */
+ private final Object mLock = new Object();
+
+ /** The list of AccessPoints, aggregated visible ScanResults with metadata. */
+ @GuardedBy("mLock")
+ private final List<AccessPoint> mInternalAccessPoints = new ArrayList<>();
+
+ @GuardedBy("mLock")
+ private final Set<NetworkKey> mRequestedScores = new ArraySet<>();
+
+ /**
+ * Tracks whether fresh scan results have been received since scanning start.
+ *
+ * <p>If this variable is false, we will not invoke callbacks so that we do not
+ * update the UI with stale data / clear out existing UI elements prematurely.
+ */
+ private boolean mStaleScanResults = true;
+
+ /**
+ * Tracks whether the latest SCAN_RESULTS_AVAILABLE_ACTION contained new scans. If not, then
+ * we treat the last scan as an aborted scan and increase the eviction timeout window to avoid
+ * completely flushing the AP list before the next successful scan completes.
+ */
+ private boolean mLastScanSucceeded = true;
+
+ // Does not need to be locked as it only updated on the worker thread, with the exception of
+ // during onStart, which occurs before the receiver is registered on the work handler.
+ private final HashMap<String, ScanResult> mScanResultCache = new HashMap<>();
+ private boolean mRegistered;
+
+ private NetworkInfo mLastNetworkInfo;
+ private WifiInfo mLastInfo;
+
+ private final NetworkScoreManager mNetworkScoreManager;
+ private WifiNetworkScoreCache mScoreCache;
+ private boolean mNetworkScoringUiEnabled;
+ private long mMaxSpeedLabelScoreCacheAge;
+
+ private static final String WIFI_SECURITY_PSK = "PSK";
+ private static final String WIFI_SECURITY_EAP = "EAP";
+ private static final String WIFI_SECURITY_SAE = "SAE";
+ private static final String WIFI_SECURITY_OWE = "OWE";
+ private static final String WIFI_SECURITY_SUITE_B_192 = "SUITE_B_192";
+
+ @GuardedBy("mLock")
+ @VisibleForTesting
+ WifiTracker.Scanner mScanner;
+
+ private static IntentFilter newIntentFilter() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
+ filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
+ filter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
+ filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
+ filter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
+ filter.addAction(WifiManager.ACTION_LINK_CONFIGURATION_CHANGED);
+ filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
+ filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
+
+ return filter;
+ }
+
+ /**
+ * Use the lifecycle constructor below whenever possible
+ */
+ @Deprecated
+ public WifiTracker(Context context, WifiTracker.WifiListener wifiListener,
+ boolean includeSaved, boolean includeScans) {
+ this(context, wifiListener,
+ context.getSystemService(WifiManager.class),
+ context.getSystemService(ConnectivityManager.class),
+ context.getSystemService(NetworkScoreManager.class),
+ newIntentFilter());
+ }
+
+ // calling apps once IC window is complete
+ public WifiTracker(Context context, WifiTracker.WifiListener wifiListener,
+ @NonNull Lifecycle lifecycle, boolean includeSaved, boolean includeScans) {
+ this(context, wifiListener,
+ context.getSystemService(WifiManager.class),
+ context.getSystemService(ConnectivityManager.class),
+ context.getSystemService(NetworkScoreManager.class),
+ newIntentFilter());
+
+ lifecycle.addObserver(this);
+ }
+
+ @VisibleForTesting
+ WifiTracker(Context context, WifiTracker.WifiListener wifiListener,
+ WifiManager wifiManager, ConnectivityManager connectivityManager,
+ NetworkScoreManager networkScoreManager,
+ IntentFilter filter) {
+ mContext = context;
+ mWifiManager = wifiManager;
+ mListener = new WifiTracker.WifiListenerExecutor(wifiListener);
+ mConnectivityManager = connectivityManager;
+
+ // check if verbose logging developer option has been turned on or off
+ sVerboseLogging = mWifiManager != null && mWifiManager.isVerboseLoggingEnabled();
+
+ mFilter = filter;
+
+ mNetworkRequest = new NetworkRequest.Builder()
+ .clearCapabilities()
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
+ .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+ .build();
+
+ mNetworkScoreManager = networkScoreManager;
+
+ final HandlerThread workThread = new HandlerThread(TAG
+ + "{" + Integer.toHexString(System.identityHashCode(this)) + "}",
+ Process.THREAD_PRIORITY_BACKGROUND);
+ workThread.start();
+ setWorkThread(workThread);
+ }
+
+ /**
+ * Validity warning: this wipes out mScoreCache, so use with extreme caution
+ *
+ * @param workThread substitute Handler thread, for testing purposes only
+ */
+ @VisibleForTesting
+ // during construction
+ void setWorkThread(HandlerThread workThread) {
+ mWorkThread = workThread;
+ mWorkHandler = new Handler(workThread.getLooper());
+ mScoreCache = new WifiNetworkScoreCache(mContext, new CacheListener(mWorkHandler) {
+ @Override
+ public void networkCacheUpdated(List<ScoredNetwork> networks) {
+ if (!mRegistered) return;
+
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "Score cache was updated with networks: " + networks);
+ }
+ updateNetworkScores();
+ }
+ });
+ }
+
+ @Override
+ public void onDestroy() {
+ mWorkThread.quit();
+ }
+
+ /**
+ * Temporarily stop scanning for wifi networks.
+ *
+ * <p>Sets {@link #mStaleScanResults} to true.
+ */
+ private void pauseScanning() {
+ synchronized (mLock) {
+ if (mScanner != null) {
+ mScanner.pause();
+ mScanner = null;
+ }
+ }
+ mStaleScanResults = true;
+ }
+
+ /**
+ * Resume scanning for wifi networks after it has been paused.
+ *
+ * <p>The score cache should be registered before this method is invoked.
+ */
+ public void resumeScanning() {
+ synchronized (mLock) {
+ if (mScanner == null) {
+ mScanner = new WifiTracker.Scanner();
+ }
+
+ if (isWifiEnabled()) {
+ mScanner.resume();
+ }
+ }
+ }
+
+ /**
+ * Start tracking wifi networks and scores.
+ *
+ * <p>Registers listeners and starts scanning for wifi networks. If this is not called
+ * then forceUpdate() must be called to populate getAccessPoints().
+ */
+ @Override
+ @MainThread
+ public void onStart() {
+ // fetch current ScanResults instead of waiting for broadcast of fresh results
+ forceUpdate();
+
+ registerScoreCache();
+
+ mNetworkScoringUiEnabled =
+ Settings.Global.getInt(
+ mContext.getContentResolver(),
+ Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1;
+
+ mMaxSpeedLabelScoreCacheAge =
+ Settings.Global.getLong(
+ mContext.getContentResolver(),
+ Settings.Global.SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS,
+ DEFAULT_MAX_CACHED_SCORE_AGE_MILLIS);
+
+ resumeScanning();
+ if (!mRegistered) {
+ mContext.registerReceiver(mReceiver, mFilter, null /* permission */, mWorkHandler,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
+ // NetworkCallback objects cannot be reused. http://b/20701525 .
+ mNetworkCallback = new WifiTracker.WifiTrackerNetworkCallback();
+ mConnectivityManager.registerNetworkCallback(
+ mNetworkRequest, mNetworkCallback, mWorkHandler);
+ mRegistered = true;
+ }
+ }
+
+
+ /**
+ * Synchronously update the list of access points with the latest information.
+ *
+ * <p>Intended to only be invoked within {@link #onStart()}.
+ */
+ @MainThread
+ @VisibleForTesting
+ void forceUpdate() {
+ mLastInfo = mWifiManager.getConnectionInfo();
+ mLastNetworkInfo = mConnectivityManager.getNetworkInfo(mWifiManager.getCurrentNetwork());
+
+ fetchScansAndConfigsAndUpdateAccessPoints();
+ }
+
+ private void registerScoreCache() {
+ mNetworkScoreManager.registerNetworkScoreCache(
+ NetworkKey.TYPE_WIFI,
+ mScoreCache,
+ NetworkScoreManager.SCORE_FILTER_SCAN_RESULTS);
+ }
+
+ private void requestScoresForNetworkKeys(Collection<NetworkKey> keys) {
+ if (keys.isEmpty()) return;
+
+ if (DBG()) {
+ Log.d(TAG, "Requesting scores for Network Keys: " + keys);
+ }
+ mNetworkScoreManager.requestScores(keys.toArray(new NetworkKey[keys.size()]));
+ synchronized (mLock) {
+ mRequestedScores.addAll(keys);
+ }
+ }
+
+ /**
+ * Stop tracking wifi networks and scores.
+ *
+ * <p>This should always be called when done with a WifiTracker (if onStart was called) to
+ * ensure proper cleanup and prevent any further callbacks from occurring.
+ *
+ * <p>Calling this method will set the {@link #mStaleScanResults} bit, which prevents
+ * {@link WifiTracker.WifiListener#onAccessPointsChanged()} callbacks from being invoked (until
+ * the bit
+ * is unset on the next SCAN_RESULTS_AVAILABLE_ACTION).
+ */
+ @Override
+ @MainThread
+ public void onStop() {
+ if (mRegistered) {
+ mContext.unregisterReceiver(mReceiver);
+ mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
+ mRegistered = false;
+ }
+ unregisterScoreCache();
+ pauseScanning(); // and set mStaleScanResults
+
+ mWorkHandler.removeCallbacksAndMessages(null /* remove all */);
+ }
+
+ private void unregisterScoreCache() {
+ mNetworkScoreManager.unregisterNetworkScoreCache(NetworkKey.TYPE_WIFI, mScoreCache);
+
+ // We do not want to clear the existing scores in the cache, as this method is called during
+ // stop tracking on activity pause. Hence, on resumption we want the ability to show the
+ // last known, potentially stale, scores. However, by clearing requested scores, the scores
+ // will be requested again upon resumption of tracking, and if any changes have occurred
+ // the listeners (UI) will be updated accordingly.
+ synchronized (mLock) {
+ mRequestedScores.clear();
+ }
+ }
+
+ /**
+ * Gets the current list of access points.
+ *
+ * <p>This method is can be called on an abitrary thread by clients, but is normally called on
+ * the UI Thread by the rendering App.
+ */
+ @AnyThread
+ public List<AccessPoint> getAccessPoints() {
+ synchronized (mLock) {
+ return new ArrayList<>(mInternalAccessPoints);
+ }
+ }
+
+ public WifiManager getManager() {
+ return mWifiManager;
+ }
+
+ public boolean isWifiEnabled() {
+ return mWifiManager != null && mWifiManager.isWifiEnabled();
+ }
+
+ /**
+ * Returns the number of saved networks on the device, regardless of whether the WifiTracker
+ * is tracking saved networks.
+ * TODO(b/62292448): remove this function and update callsites to use WifiSavedConfigUtils
+ * directly.
+ */
+ public int getNumSavedNetworks() {
+ return WifiSavedConfigUtils.getAllConfigs(mContext, mWifiManager).size();
+ }
+
+ public boolean isConnected() {
+ return mConnected.get();
+ }
+
+ public void dump(PrintWriter pw) {
+ pw.println(" - wifi tracker ------");
+ for (AccessPoint accessPoint : getAccessPoints()) {
+ pw.println(" " + accessPoint);
+ }
+ }
+
+ private ArrayMap<String, List<ScanResult>> updateScanResultCache(
+ final List<ScanResult> newResults) {
+ // memory efficiency
+ for (ScanResult newResult : newResults) {
+ if (newResult.SSID == null || newResult.SSID.isEmpty()) {
+ continue;
+ }
+ mScanResultCache.put(newResult.BSSID, newResult);
+ }
+
+ // Evict old results in all conditions
+ evictOldScans();
+
+ ArrayMap<String, List<ScanResult>> scanResultsByApKey = new ArrayMap<>();
+ for (ScanResult result : mScanResultCache.values()) {
+ // Ignore hidden and ad-hoc networks.
+ if (result.SSID == null || result.SSID.length() == 0 ||
+ result.capabilities.contains("[IBSS]")) {
+ continue;
+ }
+
+ String apKey = AccessPoint.getKey(mContext, result);
+ List<ScanResult> resultList;
+ if (scanResultsByApKey.containsKey(apKey)) {
+ resultList = scanResultsByApKey.get(apKey);
+ } else {
+ resultList = new ArrayList<>();
+ scanResultsByApKey.put(apKey, resultList);
+ }
+
+ resultList.add(result);
+ }
+
+ return scanResultsByApKey;
+ }
+
+ /**
+ * Remove old scan results from the cache. If {@link #mLastScanSucceeded} is false, then
+ * increase the timeout window to avoid completely flushing the AP list before the next
+ * successful scan completes.
+ *
+ * <p>Should only ever be invoked from {@link #updateScanResultCache(List)} when
+ * {@link #mStaleScanResults} is false.
+ */
+ private void evictOldScans() {
+ long evictionTimeoutMillis = mLastScanSucceeded ? MAX_SCAN_RESULT_AGE_MILLIS
+ : MAX_SCAN_RESULT_AGE_MILLIS * 2;
+
+ long nowMs = SystemClock.elapsedRealtime();
+ for (Iterator<ScanResult> iter = mScanResultCache.values().iterator(); iter.hasNext(); ) {
+ ScanResult result = iter.next();
+ // result timestamp is in microseconds
+ if (nowMs - result.timestamp / 1000 > evictionTimeoutMillis) {
+ iter.remove();
+ }
+ }
+ }
+
+ private WifiConfiguration getWifiConfigurationForNetworkId(
+ int networkId, final List<WifiConfiguration> configs) {
+ if (configs != null) {
+ for (WifiConfiguration config : configs) {
+ if (mLastInfo != null && networkId == config.networkId) {
+ return config;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Retrieves latest scan results and wifi configs, then calls
+ * {@link #updateAccessPoints(List, List)}.
+ */
+ private void fetchScansAndConfigsAndUpdateAccessPoints() {
+ List<ScanResult> newScanResults = mWifiManager.getScanResults();
+
+ // Filter all unsupported networks from the scan result list
+ final List<ScanResult> filteredScanResults =
+ filterScanResultsByCapabilities(newScanResults);
+
+ if (isVerboseLoggingEnabled()) {
+ Log.i(TAG, "Fetched scan results: " + filteredScanResults);
+ }
+
+ List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+ updateAccessPoints(filteredScanResults, configs);
+ }
+
+ /** Update the internal list of access points. */
+ private void updateAccessPoints(final List<ScanResult> newScanResults,
+ List<WifiConfiguration> configs) {
+
+ WifiConfiguration connectionConfig = null;
+ if (mLastInfo != null) {
+ connectionConfig = getWifiConfigurationForNetworkId(mLastInfo.getNetworkId(), configs);
+ }
+
+ // Rather than dropping and reacquiring the lock multiple times in this method, we lock
+ // once for efficiency of lock acquisition time and readability
+ synchronized (mLock) {
+ ArrayMap<String, List<ScanResult>> scanResultsByApKey =
+ updateScanResultCache(newScanResults);
+
+ // Swap the current access points into a cached list for maintaining AP listeners
+ List<AccessPoint> cachedAccessPoints;
+ cachedAccessPoints = new ArrayList<>(mInternalAccessPoints);
+
+ ArrayList<AccessPoint> accessPoints = new ArrayList<>();
+
+ final List<NetworkKey> scoresToRequest = new ArrayList<>();
+
+ for (Map.Entry<String, List<ScanResult>> entry : scanResultsByApKey.entrySet()) {
+ for (ScanResult result : entry.getValue()) {
+ NetworkKey key = NetworkKey.createFromScanResult(result);
+ if (key != null && !mRequestedScores.contains(key)) {
+ scoresToRequest.add(key);
+ }
+ }
+
+ AccessPoint accessPoint =
+ getCachedOrCreate(entry.getValue(), cachedAccessPoints);
+
+ // Update the matching config if there is one, to populate saved network info
+ final List<WifiConfiguration> matchedConfigs = configs.stream()
+ .filter(config -> accessPoint.matches(config))
+ .collect(Collectors.toList());
+
+ final int matchedConfigCount = matchedConfigs.size();
+ if (matchedConfigCount == 0) {
+ accessPoint.update(null);
+ } else if (matchedConfigCount == 1) {
+ accessPoint.update(matchedConfigs.get(0));
+ } else {
+ // We may have 2 matched configured WifiCongiguration if the AccessPoint is
+ // of PSK/SAE transition mode or open/OWE transition mode.
+ Optional<WifiConfiguration> preferredConfig = matchedConfigs.stream()
+ .filter(config -> isSaeOrOwe(config)).findFirst();
+ if (preferredConfig.isPresent()) {
+ accessPoint.update(preferredConfig.get());
+ } else {
+ accessPoint.update(matchedConfigs.get(0));
+ }
+ }
+
+ accessPoints.add(accessPoint);
+ }
+
+ List<ScanResult> cachedScanResults = new ArrayList<>(mScanResultCache.values());
+
+ // Add a unique Passpoint AccessPoint for each Passpoint profile's unique identifier.
+ accessPoints.addAll(updatePasspointAccessPoints(
+ mWifiManager.getAllMatchingWifiConfigs(cachedScanResults), cachedAccessPoints));
+
+ // Add OSU Provider AccessPoints
+ accessPoints.addAll(updateOsuAccessPoints(
+ mWifiManager.getMatchingOsuProviders(cachedScanResults), cachedAccessPoints));
+
+ if (mLastInfo != null && mLastNetworkInfo != null) {
+ for (AccessPoint ap : accessPoints) {
+ ap.update(connectionConfig, mLastInfo, mLastNetworkInfo);
+ }
+ }
+
+ // If there were no scan results, create an AP for the currently connected network (if
+ // it exists).
+ if (accessPoints.isEmpty() && connectionConfig != null) {
+ AccessPoint
+ activeAp = new AccessPoint(mContext, connectionConfig);
+ activeAp.update(connectionConfig, mLastInfo, mLastNetworkInfo);
+ accessPoints.add(activeAp);
+ scoresToRequest.add(NetworkKey.createFromWifiInfo(mLastInfo));
+ }
+
+ requestScoresForNetworkKeys(scoresToRequest);
+ for (AccessPoint ap : accessPoints) {
+ ap.update(mScoreCache, mNetworkScoringUiEnabled, mMaxSpeedLabelScoreCacheAge);
+ }
+
+ // Pre-sort accessPoints to speed preference insertion
+ Collections.sort(accessPoints);
+
+ // Log accesspoints that are being removed
+ if (DBG()) {
+ Log.d(TAG,
+ "------ Dumping AccessPoints that were not seen on this scan ------");
+ for (AccessPoint prevAccessPoint : mInternalAccessPoints) {
+ String prevTitle = prevAccessPoint.getTitle();
+ boolean found = false;
+ for (AccessPoint newAccessPoint : accessPoints) {
+ if (newAccessPoint.getTitle() != null && newAccessPoint.getTitle()
+ .equals(prevTitle)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ Log.d(TAG, "Did not find " + prevTitle + " in this scan");
+ }
+ }
+ Log.d(TAG,
+ "---- Done dumping AccessPoints that were not seen on this scan ----");
+ }
+
+ mInternalAccessPoints.clear();
+ mInternalAccessPoints.addAll(accessPoints);
+ }
+
+ conditionallyNotifyListeners();
+ }
+
+ private static boolean isSaeOrOwe(WifiConfiguration config) {
+ final int security = AccessPoint.getSecurity(config);
+ return security == AccessPoint.SECURITY_SAE || security == AccessPoint.SECURITY_OWE;
+ }
+
+ @VisibleForTesting
+ List<AccessPoint> updatePasspointAccessPoints(
+ List<Pair<WifiConfiguration, Map<Integer, List<ScanResult>>>> passpointConfigsAndScans,
+ List<AccessPoint> accessPointCache) {
+ List<AccessPoint> accessPoints = new ArrayList<>();
+
+ Set<String> seenFQDNs = new ArraySet<>();
+ for (Pair<WifiConfiguration,
+ Map<Integer, List<ScanResult>>> pairing : passpointConfigsAndScans) {
+ WifiConfiguration config = pairing.first;
+ if (seenFQDNs.add(config.FQDN)) {
+ List<ScanResult> homeScans =
+ pairing.second.get(WifiManager.PASSPOINT_HOME_NETWORK);
+ List<ScanResult> roamingScans =
+ pairing.second.get(WifiManager.PASSPOINT_ROAMING_NETWORK);
+
+ AccessPoint accessPoint =
+ getCachedOrCreatePasspoint(config, homeScans, roamingScans,
+ accessPointCache);
+ accessPoints.add(accessPoint);
+ }
+ }
+ return accessPoints;
+ }
+
+ @VisibleForTesting
+ List<AccessPoint> updateOsuAccessPoints(
+ Map<OsuProvider, List<ScanResult>> providersAndScans,
+ List<AccessPoint> accessPointCache) {
+ List<AccessPoint> accessPoints = new ArrayList<>();
+
+ Set<OsuProvider> alreadyProvisioned = mWifiManager
+ .getMatchingPasspointConfigsForOsuProviders(
+ providersAndScans.keySet()).keySet();
+ for (OsuProvider provider : providersAndScans.keySet()) {
+ if (!alreadyProvisioned.contains(provider)) {
+ AccessPoint accessPointOsu =
+ getCachedOrCreateOsu(provider, providersAndScans.get(provider),
+ accessPointCache);
+ accessPoints.add(accessPointOsu);
+ }
+ }
+ return accessPoints;
+ }
+
+ private AccessPoint getCachedOrCreate(
+ List<ScanResult> scanResults,
+ List<AccessPoint> cache) {
+ AccessPoint accessPoint = getCachedByKey(cache,
+ AccessPoint.getKey(mContext, scanResults.get(0)));
+ if (accessPoint == null) {
+ accessPoint = new AccessPoint(mContext, scanResults);
+ } else {
+ accessPoint.setScanResults(scanResults);
+ }
+ return accessPoint;
+ }
+
+ private AccessPoint getCachedOrCreatePasspoint(
+ WifiConfiguration config,
+ List<ScanResult> homeScans,
+ List<ScanResult> roamingScans,
+ List<AccessPoint> cache) {
+ AccessPoint
+ accessPoint = getCachedByKey(cache, AccessPoint.getKey(config));
+ if (accessPoint == null) {
+ accessPoint = new AccessPoint(mContext, config, homeScans, roamingScans);
+ } else {
+ accessPoint.update(config);
+ accessPoint.setScanResultsPasspoint(homeScans, roamingScans);
+ }
+ return accessPoint;
+ }
+
+ private AccessPoint getCachedOrCreateOsu(
+ OsuProvider provider,
+ List<ScanResult> scanResults,
+ List<AccessPoint> cache) {
+ AccessPoint
+ accessPoint = getCachedByKey(cache, AccessPoint.getKey(provider));
+ if (accessPoint == null) {
+ accessPoint = new AccessPoint(mContext, provider, scanResults);
+ } else {
+ accessPoint.setScanResults(scanResults);
+ }
+ return accessPoint;
+ }
+
+ private AccessPoint getCachedByKey(List<AccessPoint> cache, String key) {
+ ListIterator<AccessPoint> lit = cache.listIterator();
+ while (lit.hasNext()) {
+ AccessPoint currentAccessPoint = lit.next();
+ if (currentAccessPoint.getKey().equals(key)) {
+ lit.remove();
+ return currentAccessPoint;
+ }
+ }
+ return null;
+ }
+
+ private void updateNetworkInfo(NetworkInfo networkInfo) {
+ /* Sticky broadcasts can call this when wifi is disabled */
+ if (!isWifiEnabled()) {
+ clearAccessPointsAndConditionallyUpdate();
+ return;
+ }
+
+ if (networkInfo != null) {
+ mLastNetworkInfo = networkInfo;
+ if (DBG()) {
+ Log.d(TAG, "mLastNetworkInfo set: " + mLastNetworkInfo);
+ }
+
+ if (networkInfo.isConnected() != mConnected.getAndSet(networkInfo.isConnected())) {
+ mListener.onConnectedChanged();
+ }
+ }
+
+ WifiConfiguration connectionConfig = null;
+
+ mLastInfo = mWifiManager.getConnectionInfo();
+ if (DBG()) {
+ Log.d(TAG, "mLastInfo set as: " + mLastInfo);
+ }
+ if (mLastInfo != null) {
+ connectionConfig = getWifiConfigurationForNetworkId(mLastInfo.getNetworkId(),
+ mWifiManager.getConfiguredNetworks());
+ }
+
+ boolean updated = false;
+ boolean reorder = false; // Only reorder if connected AP was changed
+
+ synchronized (mLock) {
+ for (int i = mInternalAccessPoints.size() - 1; i >= 0; --i) {
+ AccessPoint ap = mInternalAccessPoints.get(i);
+ boolean previouslyConnected = ap.isActive();
+ if (ap.update(connectionConfig, mLastInfo, mLastNetworkInfo)) {
+ updated = true;
+ if (previouslyConnected != ap.isActive()) reorder = true;
+ }
+ if (ap.update(mScoreCache, mNetworkScoringUiEnabled, mMaxSpeedLabelScoreCacheAge)) {
+ reorder = true;
+ updated = true;
+ }
+ }
+
+ if (reorder) {
+ Collections.sort(mInternalAccessPoints);
+ }
+ if (updated) {
+ conditionallyNotifyListeners();
+ }
+ }
+ }
+
+ /**
+ * Clears the access point list and conditionally invokes
+ * {@link WifiTracker.WifiListener#onAccessPointsChanged()} if required (i.e. the list was not
+ * already
+ * empty).
+ */
+ private void clearAccessPointsAndConditionallyUpdate() {
+ synchronized (mLock) {
+ if (!mInternalAccessPoints.isEmpty()) {
+ mInternalAccessPoints.clear();
+ conditionallyNotifyListeners();
+ }
+ }
+ }
+
+ /**
+ * Update all the internal access points rankingScores, badge and metering.
+ *
+ * <p>Will trigger a resort and notify listeners of changes if applicable.
+ *
+ * <p>Synchronized on {@link #mLock}.
+ */
+ private void updateNetworkScores() {
+ synchronized (mLock) {
+ boolean updated = false;
+ for (int i = 0; i < mInternalAccessPoints.size(); i++) {
+ if (mInternalAccessPoints.get(i).update(
+ mScoreCache, mNetworkScoringUiEnabled, mMaxSpeedLabelScoreCacheAge)) {
+ updated = true;
+ }
+ }
+ if (updated) {
+ Collections.sort(mInternalAccessPoints);
+ conditionallyNotifyListeners();
+ }
+ }
+ }
+
+ /**
+ * Receiver for handling broadcasts.
+ *
+ * This receiver is registered on the WorkHandler.
+ */
+ @VisibleForTesting
+ final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+
+ if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
+ updateWifiState(
+ intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
+ WifiManager.WIFI_STATE_UNKNOWN));
+ } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {
+ mStaleScanResults = false;
+ mLastScanSucceeded =
+ intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, true);
+
+ fetchScansAndConfigsAndUpdateAccessPoints();
+ } else if (WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action)
+ || WifiManager.ACTION_LINK_CONFIGURATION_CHANGED.equals(action)) {
+ fetchScansAndConfigsAndUpdateAccessPoints();
+ } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
+ // onAccessPointsChanged updates being called from this intent.
+ NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
+ updateNetworkInfo(info);
+ fetchScansAndConfigsAndUpdateAccessPoints();
+ } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
+ updateNetworkInfo(/* networkInfo= */ null);
+ }
+ }
+ };
+
+ /**
+ * Handles updates to WifiState.
+ *
+ * <p>If Wifi is not enabled in the enabled state, {@link #mStaleScanResults} will be set to
+ * true.
+ */
+ private void updateWifiState(int state) {
+ if (isVerboseLoggingEnabled()) {
+ Log.d(TAG, "updateWifiState: " + state);
+ }
+ if (state == WifiManager.WIFI_STATE_ENABLED) {
+ synchronized (mLock) {
+ if (mScanner != null) {
+ // We only need to resume if mScanner isn't null because
+ // that means we want to be scanning.
+ mScanner.resume();
+ }
+ }
+ } else {
+ clearAccessPointsAndConditionallyUpdate();
+ mLastInfo = null;
+ mLastNetworkInfo = null;
+ synchronized (mLock) {
+ if (mScanner != null) {
+ mScanner.pause();
+ }
+ }
+ mStaleScanResults = true;
+ }
+ mListener.onWifiStateChanged(state);
+ }
+
+ private final class WifiTrackerNetworkCallback extends ConnectivityManager.NetworkCallback {
+ public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
+ if (network.equals(mWifiManager.getCurrentNetwork())) {
+ // more sense fetch the latest network info here:
+
+ // We don't send a NetworkInfo object along with this message, because even if we
+ // fetch one from ConnectivityManager, it might be older than the most recent
+ // NetworkInfo message we got via a WIFI_STATE_CHANGED broadcast.
+ updateNetworkInfo(/* networkInfo= */ null);
+ }
+ }
+ }
+
+ @VisibleForTesting
+ class Scanner extends Handler {
+ static final int MSG_SCAN = 0;
+
+ private int mRetry = 0;
+
+ void resume() {
+ if (isVerboseLoggingEnabled()) {
+ Log.d(TAG, "Scanner resume");
+ }
+ if (!hasMessages(MSG_SCAN)) {
+ sendEmptyMessage(MSG_SCAN);
+ }
+ }
+
+ void pause() {
+ if (isVerboseLoggingEnabled()) {
+ Log.d(TAG, "Scanner pause");
+ }
+ mRetry = 0;
+ removeMessages(MSG_SCAN);
+ }
+
+ @VisibleForTesting
+ boolean isScanning() {
+ return hasMessages(MSG_SCAN);
+ }
+
+ @Override
+ public void handleMessage(Message message) {
+ if (message.what != MSG_SCAN) return;
+ if (mWifiManager.startScan()) {
+ mRetry = 0;
+ } else if (++mRetry >= 3) {
+ mRetry = 0;
+ if (mContext != null) {
+// Toast.makeText(mContext, R.string.wifi_fail_to_scan, Toast.LENGTH_LONG)
+// .show();
+ }
+ return;
+ }
+ sendEmptyMessageDelayed(MSG_SCAN, WIFI_RESCAN_INTERVAL_MS);
+ }
+ }
+
+ /** A restricted multimap for use in constructAccessPoints */
+ private static class Multimap<K, V> {
+ private final HashMap<K, List<V>> store = new HashMap<K, List<V>>();
+
+ /** retrieve a non-null list of values with key K */
+ List<V> getAll(K key) {
+ List<V> values = store.get(key);
+ return values != null ? values : Collections.emptyList();
+ }
+
+ void put(K key, V val) {
+ List<V> curVals = store.get(key);
+ if (curVals == null) {
+ curVals = new ArrayList<V>(3);
+ store.put(key, curVals);
+ }
+ curVals.add(val);
+ }
+ }
+
+ /**
+ * Wraps the given {@link WifiTracker.WifiListener} instance and executes its methods on the
+ * Main Thread.
+ *
+ * <p>Also logs all callbacks invocations when verbose logging is enabled.
+ */
+ @VisibleForTesting
+ class WifiListenerExecutor implements
+ WifiTracker.WifiListener {
+
+ private final WifiTracker.WifiListener mDelegatee;
+
+ public WifiListenerExecutor(WifiTracker.WifiListener listener) {
+ mDelegatee = listener;
+ }
+
+ @Override
+ public void onWifiStateChanged(int state) {
+ runAndLog(() -> mDelegatee.onWifiStateChanged(state),
+ String.format("Invoking onWifiStateChanged callback with state %d", state));
+ }
+
+ @Override
+ public void onConnectedChanged() {
+ runAndLog(mDelegatee::onConnectedChanged, "Invoking onConnectedChanged callback");
+ }
+
+ @Override
+ public void onAccessPointsChanged() {
+ runAndLog(mDelegatee::onAccessPointsChanged, "Invoking onAccessPointsChanged callback");
+ }
+
+ private void runAndLog(Runnable r, String verboseLog) {
+ ThreadUtils.postOnMainThread(() -> {
+ if (mRegistered) {
+ if (isVerboseLoggingEnabled()) {
+ Log.i(TAG, verboseLog);
+ }
+ r.run();
+ }
+ });
+ }
+ }
+
+ /**
+ * WifiListener interface that defines callbacks indicating state changes in WifiTracker.
+ *
+ * <p>All callbacks are invoked on the MainThread.
+ */
+ public interface WifiListener {
+ /**
+ * Called when the state of Wifi has changed, the state will be one of
+ * the following.
+ *
+ * <li>{@link WifiManager#WIFI_STATE_DISABLED}</li>
+ * <li>{@link WifiManager#WIFI_STATE_ENABLED}</li>
+ * <li>{@link WifiManager#WIFI_STATE_DISABLING}</li>
+ * <li>{@link WifiManager#WIFI_STATE_ENABLING}</li>
+ * <li>{@link WifiManager#WIFI_STATE_UNKNOWN}</li>
+ * <p>
+ *
+ * @param state The new state of wifi.
+ */
+ void onWifiStateChanged(int state);
+
+ /**
+ * Called when the connection state of wifi has changed and
+ * {@link WifiTracker#isConnected()} should be called to get the updated state.
+ */
+ void onConnectedChanged();
+
+ /**
+ * Called to indicate the list of AccessPoints has been updated and
+ * {@link WifiTracker#getAccessPoints()} should be called to get the updated list.
+ */
+ void onAccessPointsChanged();
+ }
+
+ /**
+ * Invokes {@link WifiTracker.WifiListenerExecutor#onAccessPointsChanged()} iif {@link
+ * #mStaleScanResults}
+ * is false.
+ */
+ private void conditionallyNotifyListeners() {
+ if (mStaleScanResults) {
+ return;
+ }
+
+ mListener.onAccessPointsChanged();
+ }
+
+ /**
+ * Filters unsupported networks from scan results. New WPA3 networks and OWE networks
+ * may not be compatible with the device HW/SW.
+ *
+ * @param scanResults List of scan results
+ * @return List of filtered scan results based on local device capabilities
+ */
+ private List<ScanResult> filterScanResultsByCapabilities(List<ScanResult> scanResults) {
+ if (scanResults == null) {
+ return null;
+ }
+
+ // Get and cache advanced capabilities
+ final boolean isOweSupported = mWifiManager.isEnhancedOpenSupported();
+ final boolean isSaeSupported = mWifiManager.isWpa3SaeSupported();
+ final boolean isSuiteBSupported = mWifiManager.isWpa3SuiteBSupported();
+
+ List<ScanResult> filteredScanResultList = new ArrayList<>();
+
+ // Iterate through the list of scan results and filter out APs which are not
+ // compatible with our device.
+ for (ScanResult scanResult : scanResults) {
+ if (scanResult.capabilities.contains(WIFI_SECURITY_PSK)) {
+ // All devices (today) support RSN-PSK or WPA-PSK
+ // Add this here because some APs may support both PSK and SAE and the check
+ // below will filter it out.
+ filteredScanResultList.add(scanResult);
+ continue;
+ }
+
+ if ((scanResult.capabilities.contains(WIFI_SECURITY_SUITE_B_192) && !isSuiteBSupported)
+ || (scanResult.capabilities.contains(WIFI_SECURITY_SAE) && !isSaeSupported)
+ || (scanResult.capabilities.contains(WIFI_SECURITY_OWE) && !isOweSupported)) {
+ if (isVerboseLoggingEnabled()) {
+ Log.v(TAG, "filterScanResultsByCapabilities: Filtering SSID "
+ + scanResult.SSID + " with capabilities: " + scanResult.capabilities);
+ }
+ } else {
+ // Safe to add
+ filteredScanResultList.add(scanResult);
+ }
+ }
+
+ return filteredScanResultList;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/network/WifiUtils.java b/SettingsAPI/java/com/android/tv/settings/library/network/WifiUtils.java
new file mode 100644
index 0000000..9141e83
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/network/WifiUtils.java
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.network;
+
+import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED;
+import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.getMaxNetworkSelectionDisableReason;
+
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
+import android.net.wifi.WifiInfo;
+
+import java.util.Map;
+
+public class WifiUtils {
+
+ private static final int INVALID_RSSI = -127;
+
+ public static String buildLoggingSummary(AccessPoint accessPoint, WifiConfiguration config) {
+ final StringBuilder summary = new StringBuilder();
+ final WifiInfo info = accessPoint.getInfo();
+ // Add RSSI/band information for this config, what was seen up to 6 seconds ago
+ // verbose WiFi Logging is only turned on thru developers settings
+ if (accessPoint.isActive() && info != null) {
+ summary.append(" f=" + info.getFrequency());
+ }
+// summary.append(" " + getVisibilityStatus(accessPoint));
+ if (config != null
+ && (config.getNetworkSelectionStatus().getNetworkSelectionStatus()
+ != NETWORK_SELECTION_ENABLED)) {
+ summary.append(" (" + config.getNetworkSelectionStatus().getNetworkStatusString());
+ if (config.getNetworkSelectionStatus().getDisableTime() > 0) {
+ long now = System.currentTimeMillis();
+ long diff = (now - config.getNetworkSelectionStatus().getDisableTime()) / 1000;
+ long sec = diff % 60; //seconds
+ long min = (diff / 60) % 60; //minutes
+ long hour = (min / 60) % 60; //hours
+ summary.append(", ");
+ if (hour > 0) summary.append(hour + "h ");
+ summary.append(min + "m ");
+ summary.append(sec + "s ");
+ }
+ summary.append(")");
+ }
+
+ if (config != null) {
+ NetworkSelectionStatus networkStatus = config.getNetworkSelectionStatus();
+ for (int reason = 0; reason <= getMaxNetworkSelectionDisableReason(); reason++) {
+ if (networkStatus.getDisableReasonCounter(reason) != 0) {
+ summary.append(" ")
+ .append(NetworkSelectionStatus
+ .getNetworkSelectionDisableReasonString(reason))
+ .append("=")
+ .append(networkStatus.getDisableReasonCounter(reason));
+ }
+ }
+ }
+
+ return summary.toString();
+ }
+
+// /**
+// * Returns the visibility status of the WifiConfiguration.
+// *
+// * @return autojoin debugging information
+// * TODO: use a string formatter
+// * ["rssi 5Ghz", "num results on 5GHz" / "rssi 5Ghz", "num results on 5GHz"]
+// * For instance [-40,5/-30,2]
+// */
+// @VisibleForTesting
+// static String getVisibilityStatus(AccessPoint accessPoint) {
+// final WifiInfo info = accessPoint.getInfo();
+// StringBuilder visibility = new StringBuilder();
+// StringBuilder scans24GHz = new StringBuilder();
+// StringBuilder scans5GHz = new StringBuilder();
+// StringBuilder scans60GHz = new StringBuilder();
+// String bssid = null;
+//
+// if (accessPoint.isActive() && info != null) {
+// bssid = info.getBSSID();
+// if (bssid != null) {
+// visibility.append(" ").append(bssid);
+// }
+// visibility.append(" standard = ").append(info.getWifiStandard());
+// visibility.append(" rssi=").append(info.getRssi());
+// visibility.append(" ");
+// visibility.append(" score=").append(info.getScore());
+// if (accessPoint.getSpeed() != AccessPoint.Speed.NONE) {
+// visibility.append(" speed=").append(accessPoint.getSpeedLabel());
+// }
+// visibility.append(String.format(" tx=%.1f,", info.getSuccessfulTxPacketsPerSecond()));
+// visibility.append(String.format("%.1f,", info.getRetriedTxPacketsPerSecond()));
+// visibility.append(String.format("%.1f ", info.getLostTxPacketsPerSecond()));
+// visibility.append(String.format("rx=%.1f", info.getSuccessfulRxPacketsPerSecond()));
+// }
+//
+// int maxRssi5 = INVALID_RSSI;
+// int maxRssi24 = INVALID_RSSI;
+// int maxRssi60 = INVALID_RSSI;
+// final int maxDisplayedScans = 4;
+// int num5 = 0; // number of scanned BSSID on 5GHz band
+// int num24 = 0; // number of scanned BSSID on 2.4Ghz band
+// int num60 = 0; // number of scanned BSSID on 60Ghz band
+// int numBlockListed = 0;
+//
+// // TODO: sort list by RSSI or age
+// long nowMs = SystemClock.elapsedRealtime();
+// for (ScanResult result : accessPoint.getScanResults()) {
+// if (result == null) {
+// continue;
+// }
+// if (result.frequency >= .AccessPoint.LOWER_FREQ_5GHZ
+// && result.frequency <= .AccessPoint.HIGHER_FREQ_5GHZ) {
+// // Strictly speaking: [4915, 5825]
+// num5++;
+//
+// if (result.level > maxRssi5) {
+// maxRssi5 = result.level;
+// }
+// if (num5 <= maxDisplayedScans) {
+// scans5GHz.append(
+// verboseScanResultSummary(accessPoint, result, bssid,
+// nowMs));
+// }
+// } else if (result.frequency >= AccessPoint.LOWER_FREQ_24GHZ
+// && result.frequency <= AccessPoint.HIGHER_FREQ_24GHZ) {
+// // Strictly speaking: [2412, 2482]
+// num24++;
+//
+// if (result.level > maxRssi24) {
+// maxRssi24 = result.level;
+// }
+// if (num24 <= maxDisplayedScans) {
+// scans24GHz.append(
+// verboseScanResultSummary(accessPoint, result, bssid,
+// nowMs));
+// }
+// } else if (result.frequency >= AccessPoint.LOWER_FREQ_60GHZ
+// && result.frequency <= AccessPoint.HIGHER_FREQ_60GHZ) {
+// // Strictly speaking: [60000, 61000]
+// num60++;
+//
+// if (result.level > maxRssi60) {
+// maxRssi60 = result.level;
+// }
+// if (num60 <= maxDisplayedScans) {
+// scans60GHz.append(
+// verboseScanResultSummary(accessPoint, result, bssid,
+// nowMs));
+// }
+// }
+// }
+// visibility.append(" [");
+// if (num24 > 0) {
+// visibility.append("(").append(num24).append(")");
+// if (num24 > maxDisplayedScans) {
+// visibility.append("max=").append(maxRssi24).append(",");
+// }
+// visibility.append(scans24GHz.toString());
+// }
+// visibility.append(";");
+// if (num5 > 0) {
+// visibility.append("(").append(num5).append(")");
+// if (num5 > maxDisplayedScans) {
+// visibility.append("max=").append(maxRssi5).append(",");
+// }
+// visibility.append(scans5GHz.toString());
+// }
+// visibility.append(";");
+// if (num60 > 0) {
+// visibility.append("(").append(num60).append(")");
+// if (num60 > maxDisplayedScans) {
+// visibility.append("max=").append(maxRssi60).append(",");
+// }
+// visibility.append(scans60GHz.toString());
+// }
+// if (numBlockListed > 0) {
+// visibility.append("!").append(numBlockListed);
+// }
+// visibility.append("]");
+//
+// return visibility.toString();
+// }
+
+// @VisibleForTesting
+// /* package */ static String verboseScanResultSummary(
+// AccessPoint accessPoint, ScanResult result,
+// String bssid, long nowMs) {
+// StringBuilder stringBuilder = new StringBuilder();
+// stringBuilder.append(" \n{").append(result.BSSID);
+// if (result.BSSID.equals(bssid)) {
+// stringBuilder.append("*");
+// }
+// stringBuilder.append("=").append(result.frequency);
+// stringBuilder.append(",").append(result.level);
+// int speed = getSpecificApSpeed(result, accessPoint.getScoredNetworkCache());
+// if (speed != AccessPoint.Speed.NONE) {
+// stringBuilder.append(",")
+// .append(accessPoint.getSpeedLabel(speed));
+// }
+// int ageSeconds = (int) (nowMs - result.timestamp / 1000) / 1000;
+// stringBuilder.append(",").append(ageSeconds).append("s");
+// stringBuilder.append("}");
+// return stringBuilder.toString();
+// }
+
+ @AccessPoint.Speed
+ private static int getSpecificApSpeed(ScanResult result,
+ Map<String, TimestampedScoredNetwork> scoredNetworkCache) {
+ TimestampedScoredNetwork timedScore = scoredNetworkCache.get(result.BSSID);
+ if (timedScore == null) {
+ return AccessPoint.Speed.NONE;
+ }
+ // For debugging purposes we may want to use mRssi rather than result.level as the average
+ // speed wil be determined by mRssi
+ return timedScore.getScore().calculateBadge(result.level);
+ }
+
+// public static String getMeteredLabel(Context context, WifiConfiguration config) {
+// // meteredOverride is whether the user manually set the metered setting or not.
+// // meteredHint is whether the network itself is telling us that it is metered
+// if (config.meteredOverride == WifiConfiguration.METERED_OVERRIDE_METERED
+// || (config.meteredHint && !isMeteredOverridden(config))) {
+// return context.getString(R.string.wifi_metered_label);
+// }
+// return context.getString(R.string.wifi_unmetered_label);
+// }
+
+ public static boolean isMeteredOverridden(WifiConfiguration config) {
+ return config.meteredOverride != WifiConfiguration.METERED_OVERRIDE_NONE;
+ }
+}
+
diff --git a/SettingsAPI/java/com/android/tv/settings/library/overlay/FeatureFactory.java b/SettingsAPI/java/com/android/tv/settings/library/overlay/FeatureFactory.java
new file mode 100644
index 0000000..2850f8a
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/overlay/FeatureFactory.java
@@ -0,0 +1,48 @@
+/*
+ * 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.tv.settings.library.overlay;
+
+import android.content.Context;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.library.basic.BasicModeFeatureProvider;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProvider;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.help.SupportFeatureProvider;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProvider;
+
+/** Interface for feature controllers. Allows customization of the settings app. */
+@Keep
+public interface FeatureFactory {
+
+
+ /** Supplies a support provider. */
+ SupportFeatureProvider getSupportFeatureProvider();
+
+ /** Supplies a provider for basic mode feature. */
+ BasicModeFeatureProvider getBasicModeFeatureProvider();
+
+ /** Supplies a provider for startup verification feature. */
+ StartupVerificationFeatureProvider getStartupVerificationFeatureProvider();
+
+ /** Supplies a provider for enterprise privacy feature */
+ EnterprisePrivacyFeatureProvider getEnterprisePrivacyFeatureProvider(Context context);
+
+ /** Supplies a provider for application infos */
+ ApplicationFeatureProvider getApplicationFeatureProvider(Context context);
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/overlay/FeatureFactoryImpl.java b/SettingsAPI/java/com/android/tv/settings/library/overlay/FeatureFactoryImpl.java
new file mode 100644
index 0000000..43ee5d2
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/overlay/FeatureFactoryImpl.java
@@ -0,0 +1,88 @@
+/*
+ * 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.tv.settings.library.overlay;
+
+import android.app.AppGlobals;
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.VpnManager;
+import android.os.UserManager;
+
+import com.android.tv.settings.library.basic.BasicModeFeatureProvider;
+import com.android.tv.settings.library.basic.BasicModeFeatureProviderImpl;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProvider;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProviderImpl;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProviderImpl;
+import com.android.tv.settings.library.help.SupportFeatureProvider;
+import com.android.tv.settings.library.help.SupportFeatureProviderImpl;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProvider;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProviderImpl;
+
+/**
+ * Default implementation of the feature factory.
+ */
+public class FeatureFactoryImpl implements FeatureFactory {
+
+ private static final String TAG = "FeatureFactoryImpl";
+
+ private EnterprisePrivacyFeatureProvider mEnterprisePrivacyFeatureProvider;
+ private ApplicationFeatureProvider mApplicationFeatureProvider;
+
+
+ @Override
+ public SupportFeatureProvider getSupportFeatureProvider() {
+ return new SupportFeatureProviderImpl();
+ }
+
+ @Override
+ public BasicModeFeatureProvider getBasicModeFeatureProvider() {
+ return new BasicModeFeatureProviderImpl();
+ }
+
+ @Override
+ public StartupVerificationFeatureProvider getStartupVerificationFeatureProvider() {
+ return new StartupVerificationFeatureProviderImpl();
+ }
+
+ @Override
+ public EnterprisePrivacyFeatureProvider getEnterprisePrivacyFeatureProvider(Context context) {
+ if (mEnterprisePrivacyFeatureProvider == null) {
+ final Context appContext = context.getApplicationContext();
+ mEnterprisePrivacyFeatureProvider = new EnterprisePrivacyFeatureProviderImpl(appContext,
+ appContext.getSystemService(DevicePolicyManager.class),
+ appContext.getPackageManager(), UserManager.get(appContext),
+ appContext.getSystemService(ConnectivityManager.class),
+ appContext.getSystemService(VpnManager.class), appContext.getResources());
+ }
+ return mEnterprisePrivacyFeatureProvider;
+ }
+
+ @Override
+ public ApplicationFeatureProvider getApplicationFeatureProvider(Context context) {
+ if (mApplicationFeatureProvider == null) {
+ final Context appContext = context.getApplicationContext();
+ mApplicationFeatureProvider = new ApplicationFeatureProviderImpl(appContext,
+ appContext.getPackageManager(),
+ AppGlobals.getPackageManager(),
+ appContext.getSystemService(DevicePolicyManager.class));
+ }
+ return mApplicationFeatureProvider;
+ }
+
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/overlay/FeatureFactoryImplTwoPanel.java b/SettingsAPI/java/com/android/tv/settings/library/overlay/FeatureFactoryImplTwoPanel.java
new file mode 100644
index 0000000..43f83ec
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/overlay/FeatureFactoryImplTwoPanel.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.overlay;
+
+import android.app.AppGlobals;
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.VpnManager;
+import android.os.UserManager;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.library.basic.BasicModeFeatureProvider;
+import com.android.tv.settings.library.basic.BasicModeFeatureProviderImpl;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProvider;
+import com.android.tv.settings.library.enterprise.EnterprisePrivacyFeatureProviderImpl;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProvider;
+import com.android.tv.settings.library.enterprise.apps.ApplicationFeatureProviderImpl;
+import com.android.tv.settings.library.help.SupportFeatureProvider;
+import com.android.tv.settings.library.help.SupportFeatureProviderImpl;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProvider;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProviderImpl;
+
+/** Two panel customized implementation of the feature factory. */
+@Keep
+public class FeatureFactoryImplTwoPanel implements FeatureFactory {
+
+ protected static final String TAG = "FeatureFactoryImplTwoP";
+
+ private EnterprisePrivacyFeatureProvider mEnterprisePrivacyFeatureProvider;
+ private ApplicationFeatureProvider mApplicationFeatureProvider;
+
+
+ @Override
+ public SupportFeatureProvider getSupportFeatureProvider() {
+ return new SupportFeatureProviderImpl();
+ }
+
+ @Override
+ public BasicModeFeatureProvider getBasicModeFeatureProvider() {
+ return new BasicModeFeatureProviderImpl();
+ }
+
+ @Override
+ public StartupVerificationFeatureProvider getStartupVerificationFeatureProvider() {
+ return new StartupVerificationFeatureProviderImpl();
+ }
+
+ @Override
+ public EnterprisePrivacyFeatureProvider getEnterprisePrivacyFeatureProvider(Context context) {
+ if (mEnterprisePrivacyFeatureProvider == null) {
+ final Context appContext = context.getApplicationContext();
+ mEnterprisePrivacyFeatureProvider = new EnterprisePrivacyFeatureProviderImpl(appContext,
+ appContext.getSystemService(DevicePolicyManager.class),
+ appContext.getPackageManager(),
+ UserManager.get(appContext),
+ appContext.getSystemService(ConnectivityManager.class),
+ appContext.getSystemService(VpnManager.class),
+ appContext.getResources());
+ }
+ return mEnterprisePrivacyFeatureProvider;
+ }
+
+ @Override
+ public ApplicationFeatureProvider getApplicationFeatureProvider(Context context) {
+ if (mApplicationFeatureProvider == null) {
+ final Context appContext = context.getApplicationContext();
+ mApplicationFeatureProvider = new ApplicationFeatureProviderImpl(appContext,
+ appContext.getPackageManager(),
+ AppGlobals.getPackageManager(),
+ appContext.getSystemService(DevicePolicyManager.class));
+ }
+ return mApplicationFeatureProvider;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/overlay/FeatureFactoryImplX.java b/SettingsAPI/java/com/android/tv/settings/library/overlay/FeatureFactoryImplX.java
new file mode 100644
index 0000000..dcae3fb
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/overlay/FeatureFactoryImplX.java
@@ -0,0 +1,41 @@
+/*
+ * 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.tv.settings.library.overlay;
+
+import androidx.annotation.Keep;
+
+import com.android.tv.settings.library.basic.BasicModeFeatureProvider;
+import com.android.tv.settings.library.basic.BasicModeFeatureProviderImplX;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProvider;
+import com.android.tv.settings.library.startup.startup.StartupVerificationFeatureProviderImplX;
+
+/** Implementation of {@FeatureFactory} that can be utilized with resource overlay. */
+@Keep
+public class FeatureFactoryImplX extends FeatureFactoryImplTwoPanel {
+
+ protected static final String TAG = "FeatureFactoryImplX";
+
+ @Override
+ public BasicModeFeatureProvider getBasicModeFeatureProvider() {
+ return new BasicModeFeatureProviderImplX();
+ }
+
+ @Override
+ public StartupVerificationFeatureProvider getStartupVerificationFeatureProvider() {
+ return new StartupVerificationFeatureProviderImplX();
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/overlay/FlavorUtils.java b/SettingsAPI/java/com/android/tv/settings/library/overlay/FlavorUtils.java
new file mode 100644
index 0000000..7329e4c
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/overlay/FlavorUtils.java
@@ -0,0 +1,99 @@
+/*
+ * 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.tv.settings.library.overlay;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+
+/** An Util class that manages logic related to build flavor and feature. */
+public final class FlavorUtils {
+
+ private static final String TAG = "OverlayUtils";
+
+ // Build flavors of TvSettings that determines
+ public static final int FLAVOR_UNDEFINED = 0b00000000; // Error/undefined flavor
+ public static final int FLAVOR_CLASSIC = 0b00000001; // Ordinary classic one panel settings
+ public static final int FLAVOR_TWO_PANEL = 0b00000010; // Two panel settings
+ public static final int FLAVOR_X = 0b00000100; // Two panel settings with the X overlay
+ public static final int FLAVOR_VENDOR = 0b00001000; // Two panel settings with Vendor overlay
+
+ public static final int ALL_FLAVORS_MASK =
+ FLAVOR_CLASSIC | FLAVOR_TWO_PANEL | FLAVOR_X | FLAVOR_VENDOR;
+ public static final int TWO_PANEL_FLAVORS_MASK = FLAVOR_TWO_PANEL | FLAVOR_X | FLAVOR_VENDOR;
+ public static final int X_EXPERIENCE_FLAVORS_MASK = FLAVOR_X | FLAVOR_VENDOR;
+ public static final int NON_X_EXPERIENCE_FLAVORS_MASK =
+ FLAVOR_UNDEFINED | FLAVOR_CLASSIC | FLAVOR_TWO_PANEL;
+
+ private static FeatureFactory sFeatureFactory;
+
+ /** Returns the flavor of current TvSettings. */
+ public static int getFlavor(@Nullable Context context) {
+ if (context == null) {
+ Log.w(TAG, "Trying to get flavor from null context. Returning undefined flavor.");
+ return FLAVOR_UNDEFINED;
+ }
+ String flavor = ResourcesUtil.getString(context, "config_tvSettingsFlavor");
+ if (TextUtils.isEmpty(flavor)) {
+ return FLAVOR_CLASSIC;
+ }
+ switch (flavor) {
+ case "Classic":
+ return FLAVOR_CLASSIC;
+ case "TwoPanel":
+ return FLAVOR_TWO_PANEL;
+ case "X":
+ return FLAVOR_X;
+ case "Vendor":
+ return FLAVOR_VENDOR;
+ default:
+ Log.w(TAG, "Flavor is unspecified. Default to Classic flavor.");
+ return FLAVOR_CLASSIC;
+ }
+ }
+
+ /** Returns whether the UI is two panel style. */
+ public static boolean isTwoPanel(@Nullable Context context) {
+ return (getFlavor(context) & TWO_PANEL_FLAVORS_MASK) != 0;
+ }
+
+ /** Returns the correct FeatureFactory. */
+ public static FeatureFactory getFeatureFactory(@Nullable Context context) {
+ if (sFeatureFactory != null) {
+ return sFeatureFactory;
+ }
+ switch (getFlavor(context)) {
+ case FLAVOR_TWO_PANEL:
+ sFeatureFactory = new FeatureFactoryImplTwoPanel();
+ break;
+ case FLAVOR_X:
+ case FLAVOR_VENDOR:
+ sFeatureFactory = new FeatureFactoryImplX();
+ break;
+ case FLAVOR_CLASSIC:
+ case FLAVOR_UNDEFINED:
+ default:
+ sFeatureFactory = new FeatureFactoryImpl();
+ }
+ return sFeatureFactory;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/privacy/LocationModePC.java b/SettingsAPI/java/com/android/tv/settings/library/privacy/LocationModePC.java
new file mode 100644
index 0000000..e46cd8c
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/privacy/LocationModePC.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.privacy;
+
+import android.content.Context;
+import android.location.LocationManager;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtils;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtilsInternal;
+import com.android.tv.settings.library.util.ResourcesUtil;
+import com.android.tv.settings.library.util.RestrictedPreferenceController;
+
+/**
+ * Preference controller to handle location mode preference.
+ */
+public class LocationModePC extends RestrictedPreferenceController {
+ private static final String LOCATION_MODE_WIFI = "wifi";
+ private static final String LOCATION_MODE_OFF = "off";
+
+ public LocationModePC(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager preferenceCompatManager) {
+ super(context, callback, stateIdentifier, preferenceCompatManager);
+ }
+
+ @Override
+ public String[] getPreferenceKey() {
+ return new String[]{LocationState.KEY_LOCATION_MODE};
+ }
+
+ @Override
+ protected void init() {
+ final RestrictedLockUtils.EnforcedAdmin admin = checkIfUserRestrictionEnforcedByAdmin();
+ if (admin == null) {
+ mPreferenceCompat.setHasOnPreferenceChangeListener(true);
+ mPreferenceCompat.setType(PreferenceCompat.TYPE_LIST);
+ mPreferenceCompat.setTitle(ResourcesUtil.getString(mContext, "location_status"));
+ mPreferenceCompat.setEntries(new CharSequence[]{
+ ResourcesUtil.getString(mContext, "location_mode_wifi_description"),
+ ResourcesUtil.getString(mContext, "off")});
+ mPreferenceCompat.setEntryValues(new CharSequence[]{
+ LOCATION_MODE_WIFI,
+ LOCATION_MODE_OFF
+ });
+ mPreferenceCompat.setEnabled(!hasUserRestriction());
+ } else {
+ mPreferenceCompat.setTitle(ResourcesUtil.getString(mContext, "location_status"));
+ setDisabledByAdmin(admin);
+ }
+ update();
+ }
+
+ private RestrictedLockUtils.EnforcedAdmin checkIfUserRestrictionEnforcedByAdmin() {
+ final RestrictedLockUtils.EnforcedAdmin admin = RestrictedLockUtilsInternal
+ .checkIfRestrictionEnforced(mContext,
+ UserManager.DISALLOW_SHARE_LOCATION, UserHandle.myUserId());
+
+ if (admin != null) {
+ return admin;
+ }
+
+ return RestrictedLockUtilsInternal.checkIfRestrictionEnforced(mContext,
+ UserManager.DISALLOW_CONFIG_LOCATION, UserHandle.myUserId());
+ }
+
+ @Override
+ public boolean useAdminDisabledSummary() {
+ return false;
+ }
+
+
+ @Override
+ public String getAttrUserRestriction() {
+ return null;
+ }
+
+
+ @Override
+ protected void update() {
+ boolean locationEnabled = mContext.getSystemService(LocationManager.class)
+ .isLocationEnabled();
+ if (!mDisabledByAdmin) {
+ if (locationEnabled) {
+ mPreferenceCompat.setValue(LOCATION_MODE_WIFI);
+ } else {
+ mPreferenceCompat.setValue(LOCATION_MODE_OFF);
+ }
+ } else {
+ if (locationEnabled) {
+ mPreferenceCompat.setSummary(
+ ResourcesUtil.getString(mContext, "location_mode_wifi_description"));
+ } else {
+ mPreferenceCompat.setSummary(
+ ResourcesUtil.getString(mContext, "off"));
+ }
+ }
+ }
+
+ private boolean hasUserRestriction() {
+ final UserManager um = UserManager.get(mContext);
+ return um.hasUserRestriction(UserManager.DISALLOW_SHARE_LOCATION)
+ || um.hasUserRestriction(UserManager.DISALLOW_CONFIG_LOCATION);
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/privacy/LocationState.java b/SettingsAPI/java/com/android/tv/settings/library/privacy/LocationState.java
new file mode 100644
index 0000000..1062e39
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/privacy/LocationState.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.privacy;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_APP_MANAGEMENT;
+import static com.android.tv.settings.library.ManagerUtil.STATE_LOCATION;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.location.LocationManager;
+import android.os.BatteryManager;
+import android.os.Bundle;
+import android.os.Process;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.device.apps.AppManagementState;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.settingslib.RecentLocationApps;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * Provide data for location settings screen in TV settings.
+ */
+public class LocationState extends PreferenceControllerState {
+ private static final String TAG = "LocationFragment";
+
+ static final String KEY_LOCATION_MODE = "locationMode";
+ private static final String KEY_WIFI_ALWAYS_SCAN = "wifi_always_scan";
+ private static final String KEY_RECENT_LOCATION_REQUESTS = "recent_location_requests";
+ private static final String KEY_NO_RECENT_APP = "key_no_recent_app";
+
+ private static final String MODE_CHANGING_ACTION =
+ "com.android.settings.location.MODE_CHANGING";
+ private static final String CURRENT_MODE_KEY = "CURRENT_MODE";
+ private static final String NEW_MODE_KEY = "NEW_MODE";
+
+ private static final String LOCATION_MODE_WIFI = "wifi";
+ private static final String LOCATION_MODE_OFF = "off";
+
+ private LocationModePC mLocationMode;
+ private PreferenceCompat mAlwaysScan;
+ private PreferenceCompat mRecentLocationRequests;
+
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Received location mode change intent: " + intent);
+ }
+ mLocationMode.updateAndNotify();
+ }
+ };
+
+ public LocationState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ if (FlavorUtils.isTwoPanel(mContext)) {
+ mAlwaysScan = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_WIFI_ALWAYS_SCAN);
+ mAlwaysScan.setTitle(ResourcesUtil.getString(mContext, "wifi_setting_always_scan"));
+ mAlwaysScan.setSummary(
+ ResourcesUtil.getString(mContext, "wifi_setting_always_scan_context"));
+ mAlwaysScan.setType(PreferenceCompat.TYPE_SWITCH);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mAlwaysScan);
+ }
+ mRecentLocationRequests = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_RECENT_LOCATION_REQUESTS);
+ mRecentLocationRequests.setTitle(
+ ResourcesUtil.getString(mContext, "location_category_recent_location_requests"));
+ mRecentLocationRequests.setType(PreferenceCompat.TYPE_PREFERENCE_CATEGORY);
+ List<RecentLocationApps.Request> recentLocationRequests =
+ new RecentLocationApps(mContext).getAppList(true);
+ List<PreferenceCompat> recentLocationPrefs = new ArrayList<>(recentLocationRequests.size());
+ for (final RecentLocationApps.Request request : recentLocationRequests) {
+ PreferenceCompat pref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_RECENT_LOCATION_REQUESTS, request.packageName});
+ pref.setIcon(request.icon);
+ pref.setTitle(request.label.toString());
+ // Most Android TV devices don't have built-in batteries and we ONLY show "High/Low
+ // battery use" for devices with built-in batteries when they are not plugged-in.
+ final BatteryManager batteryManager = (BatteryManager) mContext
+ .getSystemService(Context.BATTERY_SERVICE);
+ if (batteryManager != null && !batteryManager.isCharging()) {
+ if (request.isHighBattery) {
+ pref.setSummary(ResourcesUtil.getString(mContext, "location_high_battery_use"));
+ } else {
+ pref.setSummary(ResourcesUtil.getString(mContext, "location_low_battery_use"));
+ }
+ }
+ pref.setNextState(STATE_APP_MANAGEMENT);
+ Bundle nextStateExtras = new Bundle();
+ AppManagementState.prepareArgs(nextStateExtras, request.packageName);
+ pref.setExtras(nextStateExtras);
+ recentLocationPrefs.add(pref);
+ }
+ if (recentLocationRequests.size() > 0) {
+ addPreferencesSorted(recentLocationPrefs);
+ } else {
+ // If there's no item to display, add a "No recent apps" item.
+ PreferenceCompat banner = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_RECENT_LOCATION_REQUESTS, KEY_NO_RECENT_APP});
+ banner.setTitle(ResourcesUtil.getString(mContext, "location_no_recent_apps"));
+ banner.setSelectable(false);
+ mRecentLocationRequests.addChildPrefCompat(banner);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mRecentLocationRequests);
+
+ mContext.registerReceiver(mReceiver,
+ new IntentFilter(LocationManager.MODE_CHANGED_ACTION));
+ mLocationMode.updateAndNotify();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateConnectivity();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ mContext.unregisterReceiver(mReceiver);
+ }
+
+ private void addPreferencesSorted(List<PreferenceCompat> prefs) {
+ // If there's some items to display, sort the items and add them to the container.
+ prefs.sort(Comparator.comparing(lhs -> lhs.getTitle()));
+ for (PreferenceCompat entry : prefs) {
+ mRecentLocationRequests.addChildPrefCompat(entry);
+ }
+ }
+
+ private void updateConnectivity() {
+ if (FlavorUtils.isTwoPanel(mContext)) {
+ int scanAlwaysAvailable = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
+ mAlwaysScan.setChecked(scanAlwaysAvailable == 1);
+ }
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_LOCATION;
+ }
+
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ if (TextUtils.equals(key[0], KEY_LOCATION_MODE)) {
+ int mode = Settings.Secure.LOCATION_MODE_OFF;
+ if (TextUtils.equals((CharSequence) newValue, LOCATION_MODE_WIFI)) {
+ mode = Settings.Secure.LOCATION_MODE_ON;
+ } else if (TextUtils.equals((CharSequence) newValue, LOCATION_MODE_OFF)) {
+ mode = Settings.Secure.LOCATION_MODE_OFF;
+ } else {
+ Log.wtf(TAG, "Tried to set unknown location mode!");
+ }
+
+ writeLocationMode(mode);
+ mLocationMode.updateAndNotify();
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ if (key[0].equals(KEY_WIFI_ALWAYS_SCAN)) {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE,
+ status ? 1 : 0);
+ updateConnectivity();
+ return true;
+ }
+ return false;
+ }
+
+ private void writeLocationMode(int mode) {
+ int currentMode = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
+ Intent intent = new Intent(MODE_CHANGING_ACTION);
+ intent.putExtra(CURRENT_MODE_KEY, currentMode);
+ intent.putExtra(NEW_MODE_KEY, mode);
+ mContext.sendBroadcast(intent, android.Manifest.permission.WRITE_SECURE_SETTINGS);
+ mContext.getSystemService(LocationManager.class).setLocationEnabledForUser(
+ mode != Settings.Secure.LOCATION_MODE_OFF,
+ Process.myUserHandle());
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ List<AbstractPreferenceController> preferenceControllers = new ArrayList<>();
+ mLocationMode = new LocationModePC(mContext, mUIUpdateCallback, getStateIdentifier(),
+ mPreferenceCompatManager);
+ preferenceControllers.add(mLocationMode);
+ return preferenceControllers;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/privacy/PrivacyState.java b/SettingsAPI/java/com/android/tv/settings/library/privacy/PrivacyState.java
new file mode 100644
index 0000000..bdb5274
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/privacy/PrivacyState.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.tv.settings.library.privacy;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_PRIVACY;
+
+import android.content.Context;
+import android.os.Bundle;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+
+import java.util.List;
+
+/**
+ * Provide data for privacy settings screen in TV settings.
+ */
+public class PrivacyState extends PreferenceControllerState {
+ private static final String KEY_MIC = "microphone";
+ private static final String KEY_CAMERA = "camera";
+
+ public PrivacyState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ PreferenceCompat micPref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_MIC);
+ PreferenceCompat cameraPref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_CAMERA);
+ PrivacyToggle.MIC_TOGGLE.preparePreferenceWithSensorState(mContext,
+ micPref, SensorState.TOGGLE_EXTRA);
+ PrivacyToggle.CAMERA_TOGGLE.preparePreferenceWithSensorState(mContext,
+ cameraPref, SensorState.TOGGLE_EXTRA);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), micPref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), cameraPref);
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_PRIVACY;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/privacy/PrivacyToggle.java b/SettingsAPI/java/com/android/tv/settings/library/privacy/PrivacyToggle.java
new file mode 100644
index 0000000..71dd600
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/privacy/PrivacyToggle.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.tv.settings.library.privacy;
+
+import android.annotation.Nullable;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.hardware.SensorPrivacyManager;
+import android.provider.DeviceConfig;
+
+import com.android.tv.settings.library.PreferenceCompat;
+
+public enum PrivacyToggle {
+ CAMERA_TOGGLE(
+ "camera",
+ "camera_toggle_title",
+ "camera_toggle_info_title",
+ "camera_toggle_info_content",
+ "open_camera_permissions",
+ "android.permission-group.CAMERA",
+ SensorPrivacyManager.Sensors.CAMERA,
+ new int[]{AppOpsManager.OP_CAMERA, AppOpsManager.OP_PHONE_CALL_CAMERA},
+ "camera_toggle_enabled"
+ ),
+
+ MIC_TOGGLE(
+ "microphone",
+ "mic_toggle_title",
+ "mic_toggle_info_title",
+ "mic_toggle_info_content",
+ "open_mic_permissions",
+ "android.permission-group.MICROPHONE",
+ SensorPrivacyManager.Sensors.MICROPHONE,
+ new int[]{AppOpsManager.OP_RECORD_AUDIO, AppOpsManager.OP_PHONE_CALL_MICROPHONE},
+ "mic_toggle_enabled"
+ );
+
+ public final String screenTitle;
+ public final String toggleTitle;
+ public final String toggleInfoTitle;
+ public final String toggleInfoText;
+ public final String appPermissionsTitle;
+ public final String permissionsGroupName;
+ @SensorPrivacyManager.Sensors.Sensor
+ public final int sensor;
+ public final int[] appOps;
+ public final String deviceConfigName;
+
+ PrivacyToggle(String screenTitle, String toggleTitle, String toggleInfoTitle,
+ String toggleInfoText,
+ String appPermissionsTitle, String permissionsGroupName,
+ @SensorPrivacyManager.Sensors.Sensor int sensor, int[] appOps,
+ String deviceConfigName) {
+ this.screenTitle = screenTitle;
+ this.toggleTitle = toggleTitle;
+ this.toggleInfoTitle = toggleInfoTitle;
+ this.toggleInfoText = toggleInfoText;
+ this.appPermissionsTitle = appPermissionsTitle;
+ this.permissionsGroupName = permissionsGroupName;
+ this.sensor = sensor;
+ this.appOps = appOps;
+ this.deviceConfigName = deviceConfigName;
+ }
+
+ /**
+ * Checks if the privacy toggle should be shown.
+ */
+ public boolean isPresentAndEnabled(Context context) {
+ return context.getSystemService(SensorPrivacyManager.class).supportsSensorToggle(
+ sensor) && DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY,
+ deviceConfigName, /* defaultValue= */ true);
+ }
+
+ /**
+ * Hides the preference if the toggle shouldn't be shown and adds the toggle to the extras so
+ * the SensorFragment knows which sensor is meant.
+ */
+ public void preparePreferenceWithSensorState(Context context,
+ @Nullable PreferenceCompat prefCompat, String extrasKey) {
+ if (prefCompat == null) {
+ return;
+ }
+ if (isPresentAndEnabled(context)) {
+ prefCompat.addInfo(extrasKey, this);
+ } else {
+ prefCompat.setVisible(false);
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/privacy/RecentlyAccessedByUtils.java b/SettingsAPI/java/com/android/tv/settings/library/privacy/RecentlyAccessedByUtils.java
similarity index 90%
rename from Settings/src/com/android/tv/settings/privacy/RecentlyAccessedByUtils.java
rename to SettingsAPI/java/com/android/tv/settings/library/privacy/RecentlyAccessedByUtils.java
index fabf025..8b6da48 100644
--- a/Settings/src/com/android/tv/settings/privacy/RecentlyAccessedByUtils.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/privacy/RecentlyAccessedByUtils.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.privacy;
+package com.android.tv.settings.library.privacy;
import android.app.AppOpsManager;
import android.content.Context;
@@ -35,7 +35,7 @@
/**
* Helper class for the 'Recently Accessed By' sections.
*/
-class RecentlyAccessedByUtils {
+public class RecentlyAccessedByUtils {
// Get the last 24 hours of app ops access information.
private static final long RECENT_TIME_INTERVAL_MILLIS = DateUtils.DAY_IN_MILLIS;
@@ -47,7 +47,7 @@
/**
* Gets list of apps that recently used the given AppOps sorted by the most recent access.
*/
- static List<App> getAppList(Context context, int[] appOps) {
+ public static List<App> getAppList(Context context, int[] appOps) {
PackageManager packageManager = context.getPackageManager();
IconDrawableFactory iconDrawableFactory = IconDrawableFactory.newInstance(context);
long currentTime = System.currentTimeMillis();
@@ -97,11 +97,6 @@
long accessEnd = entry.getLastAccessTime(AppOpsManager.OP_FLAGS_ALL)
+ entry.getLastDuration(AppOpsManager.OP_FLAGS_ALL);
- if (DEBUG) {
- Log.v(TAG, "appOp: " + entry.getOpStr()
- + ", running: " + entry.isRunning()
- + ", accessEnd: " + accessEnd);
- }
if (entry.isRunning()) {
mostRecentAccessEnd = currentTime;
} else if (accessEnd >= recentAccessCutoffTime && accessEnd >= mostRecentAccessEnd) {
@@ -126,11 +121,11 @@
return new App(packageName, icon, appLabel, mostRecentAccessEnd);
}
- static class App {
- final String mPackageName;
- final Drawable mIcon;
- final CharSequence mLabel;
- final long mLastAccess;
+ public static class App {
+ public final String mPackageName;
+ public final Drawable mIcon;
+ public final CharSequence mLabel;
+ public final long mLastAccess;
private App(String packageName, Drawable icon, CharSequence label, long lastAccess) {
this.mPackageName = packageName;
diff --git a/SettingsAPI/java/com/android/tv/settings/library/privacy/SensorState.java b/SettingsAPI/java/com/android/tv/settings/library/privacy/SensorState.java
new file mode 100644
index 0000000..dfeeb85
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/privacy/SensorState.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.privacy;
+
+import static android.hardware.SensorPrivacyManager.Sources.SETTINGS;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_APP_MANAGEMENT;
+import static com.android.tv.settings.library.ManagerUtil.STATE_SENSOR;
+
+import android.content.Context;
+import android.content.Intent;
+import android.hardware.SensorPrivacyManager;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.device.apps.AppManagementState;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.List;
+
+/**
+ * Provide data for microphone/camera settings screen in TV settings.
+ */
+public class SensorState extends PreferenceControllerState {
+ private static final String TAG = "SensorState";
+ private static final boolean DEBUG = true;
+
+ public static final String TOGGLE_EXTRA = "toggle";
+
+ private static final String KEY_SENSOR_TOGGLE = "sensor_toggle";
+ private static final String KEY_SENSOR_TOGGLE_INFO = "sensor_toggle_info";
+ private static final String KEY_RECENT_REQUESTS = "recent_requests";
+ private static final String KEY_NO_RECENT = "no_recent";
+ private static final String KEY_OPEN_PERMISSION_CONTROLLER = "open_permission_controller";
+ private PrivacyToggle mToggle;
+ private PreferenceCompat mSensorToggle;
+ private PreferenceCompat mSensorToggleInfo;
+ private PreferenceCompat mRecentAppsCategory;
+ private PreferenceCompat mOpenPermissionController;
+
+ private SensorPrivacyManager mSensorPrivacyManager;
+
+ private final SensorPrivacyManager.OnSensorPrivacyChangedListener mPrivacyChangedListener =
+ (sensor, enabled) -> {
+ if (mSensorToggle != null) {
+ mSensorToggle.setChecked(!enabled);
+ }
+ };
+
+ public SensorState(Context context,
+ UIUpdateCallback callback) {
+
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ mSensorPrivacyManager = (SensorPrivacyManager)
+ mContext.getSystemService(Context.SENSOR_PRIVACY_SERVICE);
+
+ mToggle = (PrivacyToggle) extras.get(TOGGLE_EXTRA);
+ if (mToggle == null) {
+ throw new IllegalArgumentException("PrivacyToggle extra missing");
+ }
+ mUIUpdateCallback.notifyUpdateScreenTitle(getStateIdentifier(),
+ ResourcesUtil.getString(mContext, mToggle.screenTitle));
+ addSensorToggleWithInfo();
+ addRecentAppsGroup();
+ addPermissionControllerPreference();
+ super.onCreate(extras);
+ }
+
+ /**
+ * Adds the sensor toggle with an InfoFragment (in two-panel mode) or an info text below (in
+ * one-panel mode).
+ */
+ private void addSensorToggleWithInfo() {
+ mSensorToggle = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_SENSOR_TOGGLE);
+ mSensorToggle.setTitle(ResourcesUtil.getString(mContext, mToggle.toggleTitle));
+ mSensorToggle.setType(PreferenceCompat.TYPE_SWITCH);
+ mSensorToggle.setSummary(ResourcesUtil.getString(mContext, "sensor_toggle_description"));
+
+ // If privacy is enabled, the sensor access is turned off
+ mSensorToggle.setChecked(
+ !mSensorPrivacyManager.isSensorPrivacyEnabled(mToggle.sensor));
+ mSensorPrivacyManager.addSensorPrivacyListener(mToggle.sensor,
+ mPrivacyChangedListener);
+
+ if (!FlavorUtils.isTwoPanel(mContext)) {
+ // Show the toggle info text beneath instead.
+ mSensorToggleInfo = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_SENSOR_TOGGLE_INFO);
+ mSensorToggleInfo.setSummary(ResourcesUtil.getString(mContext, mToggle.toggleInfoText));
+ mSensorToggleInfo.setSelectable(false);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mSensorToggleInfo);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mSensorToggle);
+ }
+
+ /**
+ * Adds section that shows an expandable list of apps that have recently accessed the sensor.
+ */
+ private void addRecentAppsGroup() {
+ // Create the Recently Accessed By section.
+ mRecentAppsCategory = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_RECENT_REQUESTS);
+ mRecentAppsCategory.setTitle(
+ ResourcesUtil.getString(mContext, "recently_accessed_by_category"));
+ mRecentAppsCategory.clearChildPrefCompats();
+ // Get recent accesses.
+ List<RecentlyAccessedByUtils.App> recentApps = RecentlyAccessedByUtils.getAppList(
+ mContext, mToggle.appOps);
+ if (DEBUG) Log.v(TAG, "recently accessed by " + recentApps.size() + " apps");
+
+ // Create a preference for each access.
+ for (RecentlyAccessedByUtils.App app : recentApps) {
+ if (DEBUG) Log.v(TAG, "last access: " + app.mLastAccess);
+ PreferenceCompat pref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_RECENT_REQUESTS, app.mPackageName});
+ pref.setTitle(app.mLabel.toString());
+ pref.setIcon(app.mIcon);
+ pref.setNextState(STATE_APP_MANAGEMENT);
+ pref.setExtras(new Bundle());
+ AppManagementState.prepareArgs(pref.getExtras(), app.mPackageName);
+ mRecentAppsCategory.addChildPrefCompat(pref);
+ }
+
+ if (mRecentAppsCategory.getChildPrefsCount() == 0) {
+ PreferenceCompat banner = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{KEY_RECENT_REQUESTS, KEY_NO_RECENT});
+ banner.setSummary(ResourcesUtil.getString(mContext, "no_recent_sensor_accesses"));
+ banner.setSelectable(false);
+ mRecentAppsCategory.addChildPrefCompat(banner);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mRecentAppsCategory);
+ }
+
+ /**
+ * Adds a preference that opens the overview of the PermissionGroup pertaining to the sensor.
+ */
+ private void addPermissionControllerPreference() {
+ mOpenPermissionController = mPreferenceCompatManager.getOrCreatePrefCompat(
+ KEY_OPEN_PERMISSION_CONTROLLER);
+ mOpenPermissionController.setTitle(
+ ResourcesUtil.getString(mContext, mToggle.appPermissionsTitle));
+ Intent showSensorPermissions = new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS);
+ showSensorPermissions.putExtra(Intent.EXTRA_PERMISSION_NAME,
+ mToggle.permissionsGroupName);
+ mOpenPermissionController.setIntent(showSensorPermissions);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mOpenPermissionController);
+ }
+
+
+ @Override
+ public void onDestroy() {
+ mSensorPrivacyManager.removeSensorPrivacyListener(mToggle.sensor, mPrivacyChangedListener);
+ super.onDestroy();
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_SENSOR;
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ if (KEY_SENSOR_TOGGLE.equals(key[0])) {
+ mSensorPrivacyManager.setSensorPrivacy(SETTINGS, mToggle.sensor, !status);
+ return true;
+ }
+ return super.onPreferenceTreeClick(key, status);
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/AccessibilityUtils.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/AccessibilityUtils.java
new file mode 100644
index 0000000..29f844c
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/AccessibilityUtils.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.tv.settings.library.settingslib;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.ArraySet;
+import android.view.accessibility.AccessibilityManager;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+public class AccessibilityUtils {
+ public static final char ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR = ':';
+
+ /**
+ * @return the set of enabled accessibility services. If there are no services,
+ * it returns the unmodifiable {@link Collections#emptySet()}.
+ */
+ public static Set<ComponentName> getEnabledServicesFromSettings(Context context) {
+ return getEnabledServicesFromSettings(context, UserHandle.myUserId());
+ }
+
+ /**
+ * Check if the accessibility service is crashed
+ *
+ * @param packageName The package name to check
+ * @param serviceName The service name to check
+ * @param installedServiceInfos The list of installed accessibility service
+ * @return {@code true} if the accessibility service is crashed for the user.
+ * {@code false} otherwise.
+ */
+ public static boolean hasServiceCrashed(String packageName, String serviceName,
+ List<AccessibilityServiceInfo> installedServiceInfos) {
+ for (int i = 0; i < installedServiceInfos.size(); i++) {
+ final AccessibilityServiceInfo accessibilityServiceInfo = installedServiceInfos.get(i);
+ final ServiceInfo serviceInfo =
+ installedServiceInfos.get(i).getResolveInfo().serviceInfo;
+ if (TextUtils.equals(serviceInfo.packageName, packageName)
+ && TextUtils.equals(serviceInfo.name, serviceName)) {
+ return accessibilityServiceInfo.crashed;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @return the set of enabled accessibility services for {@param userId}. If there are no
+ * services, it returns the unmodifiable {@link Collections#emptySet()}.
+ */
+ public static Set<ComponentName> getEnabledServicesFromSettings(Context context, int userId) {
+ final String enabledServicesSetting = Settings.Secure.getStringForUser(
+ context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ userId);
+ if (TextUtils.isEmpty(enabledServicesSetting)) {
+ return Collections.emptySet();
+ }
+
+ final Set<ComponentName> enabledServices = new HashSet<>();
+ final TextUtils.StringSplitter colonSplitter =
+ new TextUtils.SimpleStringSplitter(ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR);
+ colonSplitter.setString(enabledServicesSetting);
+
+ for (String componentNameString : colonSplitter) {
+ final ComponentName enabledService = ComponentName.unflattenFromString(
+ componentNameString);
+ if (enabledService != null) {
+ enabledServices.add(enabledService);
+ }
+ }
+
+ return enabledServices;
+ }
+
+ /**
+ * @return a localized version of the text resource specified by resId
+ */
+ public static CharSequence getTextForLocale(Context context, Locale locale, int resId) {
+ final Resources res = context.getResources();
+ final Configuration config = new Configuration(res.getConfiguration());
+ config.setLocale(locale);
+ final Context langContext = context.createConfigurationContext(config);
+ return langContext.getText(resId);
+ }
+
+ /**
+ * Changes an accessibility component's state.
+ */
+ public static void setAccessibilityServiceState(Context context, ComponentName toggledService,
+ boolean enabled) {
+ setAccessibilityServiceState(context, toggledService, enabled, UserHandle.myUserId());
+ }
+
+ /**
+ * Changes an accessibility component's state for {@param userId}.
+ */
+ public static void setAccessibilityServiceState(Context context, ComponentName toggledService,
+ boolean enabled, int userId) {
+ // Parse the enabled services.
+ Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(
+ context, userId);
+
+ if (enabledServices.isEmpty()) {
+ enabledServices = new ArraySet<>(1);
+ }
+
+ // Determine enabled services and accessibility state.
+ boolean accessibilityEnabled = false;
+ if (enabled) {
+ enabledServices.add(toggledService);
+ // Enabling at least one service enables accessibility.
+ accessibilityEnabled = true;
+ } else {
+ enabledServices.remove(toggledService);
+ // Check how many enabled and installed services are present.
+ Set<ComponentName> installedServices = getInstalledServices(context);
+ for (ComponentName enabledService : enabledServices) {
+ if (installedServices.contains(enabledService)) {
+ // Disabling the last service disables accessibility.
+ accessibilityEnabled = true;
+ break;
+ }
+ }
+ }
+
+ // Update the enabled services setting.
+ StringBuilder enabledServicesBuilder = new StringBuilder();
+ // Keep the enabled services even if they are not installed since we
+ // have no way to know whether the application restore process has
+ // completed. In general the system should be responsible for the
+ // clean up not settings.
+ for (ComponentName enabledService : enabledServices) {
+ enabledServicesBuilder.append(enabledService.flattenToString());
+ enabledServicesBuilder.append(
+ AccessibilityUtils.ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR);
+ }
+ final int enabledServicesBuilderLength = enabledServicesBuilder.length();
+ if (enabledServicesBuilderLength > 0) {
+ enabledServicesBuilder.deleteCharAt(enabledServicesBuilderLength - 1);
+ }
+ Settings.Secure.putStringForUser(context.getContentResolver(),
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ enabledServicesBuilder.toString(), userId);
+ }
+
+ /**
+ * Get the name of the service that should be toggled by the accessibility shortcut. Use
+ * an OEM-configurable default if the setting has never been set.
+ *
+ * @param context A valid context
+ * @param userId The user whose settings should be checked
+ * @return The component name, flattened to a string, of the target service.
+ */
+ public static String getShortcutTargetServiceComponentNameString(
+ Context context, int userId) {
+ final String currentShortcutServiceId = Settings.Secure.getStringForUser(
+ context.getContentResolver(), Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
+ userId);
+ if (currentShortcutServiceId != null) {
+ return currentShortcutServiceId;
+ }
+ return context.getString(
+ context.getResources().getIdentifier("config_defaultAccessibilityService",
+ "string", "android"));
+ }
+
+ private static Set<ComponentName> getInstalledServices(Context context) {
+ final Set<ComponentName> installedServices = new HashSet<>();
+ installedServices.clear();
+
+ final List<AccessibilityServiceInfo> installedServiceInfos =
+ AccessibilityManager.getInstance(context)
+ .getInstalledAccessibilityServiceList();
+ if (installedServiceInfos == null) {
+ return installedServices;
+ }
+
+ for (final AccessibilityServiceInfo info : installedServiceInfos) {
+ final ResolveInfo resolveInfo = info.getResolveInfo();
+ final ComponentName installedService = new ComponentName(
+ resolveInfo.serviceInfo.packageName,
+ resolveInfo.serviceInfo.name);
+ installedServices.add(installedService);
+ }
+ return installedServices;
+ }
+
+}
diff --git a/Settings/src/com/android/tv/settings/autofill/AutofillHelper.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/AutofillHelper.java
similarity index 96%
rename from Settings/src/com/android/tv/settings/autofill/AutofillHelper.java
rename to SettingsAPI/java/com/android/tv/settings/library/settingslib/AutofillHelper.java
index 467a05f..8e00f64 100644
--- a/Settings/src/com/android/tv/settings/autofill/AutofillHelper.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/AutofillHelper.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.autofill;
+package com.android.tv.settings.library.settingslib;
import android.Manifest;
import android.content.ComponentName;
@@ -32,8 +32,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import com.android.settingslib.applications.DefaultAppInfo;
-
import java.util.ArrayList;
import java.util.List;
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/CandidateInfo.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/CandidateInfo.java
new file mode 100644
index 0000000..4363ba2
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/CandidateInfo.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.tv.settings.library.settingslib;
+
+import android.graphics.drawable.Drawable;
+
+/**
+ * Base class for defining a selectable item in UI.
+ */
+public abstract class CandidateInfo {
+
+ public final boolean enabled;
+
+ public CandidateInfo(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public abstract CharSequence loadLabel();
+
+ public abstract Drawable loadIcon();
+
+ public abstract String getKey();
+}
+
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/DefaultAppInfo.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/DefaultAppInfo.java
new file mode 100644
index 0000000..4c4193e
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/DefaultAppInfo.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.settingslib;
+
+import android.app.AppGlobals;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ComponentInfo;
+import android.content.pm.PackageItemInfo;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.os.RemoteException;
+
+
+/**
+ * Data model representing an app in DefaultAppPicker UI.
+ */
+public class DefaultAppInfo extends CandidateInfo {
+
+ public final int userId;
+ public final ComponentName componentName;
+ public final PackageItemInfo packageItemInfo;
+ public final String summary;
+ protected final PackageManager mPm;
+ private final Context mContext;
+
+ public DefaultAppInfo(Context context, PackageManager pm, int uid, ComponentName cn) {
+ this(context, pm, uid, cn, null /* summary */, true /* enabled */);
+ }
+
+ public DefaultAppInfo(Context context, PackageManager pm, int uid, PackageItemInfo info) {
+ this(context, pm, uid, info, null /* summary */, true /* enabled */);
+ }
+
+ public DefaultAppInfo(Context context, PackageManager pm, int uid, ComponentName cn,
+ String summary, boolean enabled) {
+ super(enabled);
+ mContext = context;
+ mPm = pm;
+ packageItemInfo = null;
+ userId = uid;
+ componentName = cn;
+ this.summary = summary;
+ }
+
+ public DefaultAppInfo(Context context, PackageManager pm, int uid, PackageItemInfo info,
+ String summary, boolean enabled) {
+ super(enabled);
+ mContext = context;
+ mPm = pm;
+ userId = uid;
+ packageItemInfo = info;
+ componentName = null;
+ this.summary = summary;
+ }
+
+ @Override
+ public CharSequence loadLabel() {
+ if (componentName != null) {
+ try {
+ final ComponentInfo componentInfo = getComponentInfo();
+ if (componentInfo != null) {
+ return componentInfo.loadLabel(mPm);
+ } else {
+ final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser(
+ componentName.getPackageName(), 0, userId);
+ return appInfo.loadLabel(mPm);
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ return null;
+ }
+ } else if (packageItemInfo != null) {
+ return packageItemInfo.loadLabel(mPm);
+ } else {
+ return null;
+ }
+
+ }
+
+ @Override
+ public Drawable loadIcon() {
+ return null;
+ }
+
+ @Override
+ public String getKey() {
+ if (componentName != null) {
+ return componentName.flattenToString();
+ } else if (packageItemInfo != null) {
+ return packageItemInfo.packageName;
+ } else {
+ return null;
+ }
+ }
+
+ private ComponentInfo getComponentInfo() {
+ try {
+ ComponentInfo componentInfo = AppGlobals.getPackageManager().getActivityInfo(
+ componentName, 0, userId);
+ if (componentInfo == null) {
+ componentInfo = AppGlobals.getPackageManager().getServiceInfo(
+ componentName, 0, userId);
+ }
+ return componentInfo;
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+}
+
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/DreamBackend.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/DreamBackend.java
new file mode 100644
index 0000000..f382fbf
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/DreamBackend.java
@@ -0,0 +1,403 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.settingslib;
+
+import android.annotation.IntDef;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.graphics.drawable.Drawable;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+import android.service.dreams.DreamService;
+import android.service.dreams.IDreamManager;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.Xml;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public class DreamBackend {
+ private static final String TAG = "DreamBackend";
+ private static final boolean DEBUG = false;
+
+ public static class DreamInfo {
+ public CharSequence caption;
+ public Drawable icon;
+ public boolean isActive;
+ public ComponentName componentName;
+ public ComponentName settingsComponentName;
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder(DreamBackend.DreamInfo.class.getSimpleName());
+ sb.append('[').append(caption);
+ if (isActive) {
+ sb.append(",active");
+ }
+ sb.append(',').append(componentName);
+ if (settingsComponentName != null) {
+ sb.append("settings=").append(settingsComponentName);
+ }
+ return sb.append(']').toString();
+ }
+ }
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({WHILE_CHARGING, WHILE_DOCKED, EITHER, NEVER})
+ public @interface WhenToDream {
+ }
+
+ public static final int WHILE_CHARGING = 0;
+ public static final int WHILE_DOCKED = 1;
+ public static final int EITHER = 2;
+ public static final int NEVER = 3;
+
+ private final Context mContext;
+ private final IDreamManager mDreamManager;
+ private final DreamBackend.DreamInfoComparator mComparator;
+ private final boolean mDreamsEnabledByDefault;
+ private final boolean mDreamsActivatedOnSleepByDefault;
+ private final boolean mDreamsActivatedOnDockByDefault;
+
+ private static DreamBackend sInstance;
+
+ public static DreamBackend getInstance(Context context) {
+ if (sInstance == null) {
+ sInstance = new DreamBackend(context);
+ }
+ return sInstance;
+ }
+
+ public DreamBackend(Context context) {
+ mContext = context.getApplicationContext();
+ mDreamManager = IDreamManager.Stub.asInterface(
+ ServiceManager.getService(DreamService.DREAM_SERVICE));
+ mComparator = new DreamBackend.DreamInfoComparator(getDefaultDream());
+ mDreamsEnabledByDefault = mContext.getResources()
+ .getBoolean(mContext.getResources().getIdentifier("config_dreamsEnabledByDefault",
+ "bool", "android"));
+ mDreamsActivatedOnSleepByDefault = mContext.getResources()
+ .getBoolean(mContext.getResources().getIdentifier(
+ "config_dreamsActivatedOnSleepByDefault", "bool", "android"));
+ mDreamsActivatedOnDockByDefault = mContext.getResources()
+ .getBoolean(mContext.getResources().getIdentifier(
+ "config_dreamsActivatedOnDockByDefault", "bool", "android"));
+ }
+
+ public List<DreamBackend.DreamInfo> getDreamInfos() {
+ logd("getDreamInfos()");
+ ComponentName activeDream = getActiveDream();
+ PackageManager pm = mContext.getPackageManager();
+ Intent dreamIntent = new Intent(DreamService.SERVICE_INTERFACE);
+ List<ResolveInfo> resolveInfos = pm.queryIntentServices(dreamIntent,
+ PackageManager.GET_META_DATA);
+ List<DreamBackend.DreamInfo> dreamInfos = new ArrayList<>(resolveInfos.size());
+ for (ResolveInfo resolveInfo : resolveInfos) {
+ if (resolveInfo.serviceInfo == null) {
+ continue;
+ }
+ DreamBackend.DreamInfo
+ dreamInfo = new DreamBackend.DreamInfo();
+ dreamInfo.caption = resolveInfo.loadLabel(pm);
+ dreamInfo.icon = resolveInfo.loadIcon(pm);
+ dreamInfo.componentName = getDreamComponentName(resolveInfo);
+ dreamInfo.isActive = dreamInfo.componentName.equals(activeDream);
+ dreamInfo.settingsComponentName = getSettingsComponentName(pm, resolveInfo);
+ dreamInfos.add(dreamInfo);
+ }
+ Collections.sort(dreamInfos, mComparator);
+ return dreamInfos;
+ }
+
+ public ComponentName getDefaultDream() {
+ if (mDreamManager == null) {
+ return null;
+ }
+ try {
+ return mDreamManager.getDefaultDreamComponentForUser(mContext.getUserId());
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to get default dream", e);
+ return null;
+ }
+ }
+
+ public CharSequence getActiveDreamName() {
+ ComponentName cn = getActiveDream();
+ if (cn != null) {
+ PackageManager pm = mContext.getPackageManager();
+ try {
+ ServiceInfo ri = pm.getServiceInfo(cn, 0);
+ if (ri != null) {
+ return ri.loadLabel(pm);
+ }
+ } catch (PackageManager.NameNotFoundException exc) {
+ return null; // uninstalled?
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Gets an icon from active dream.
+ */
+ public Drawable getActiveIcon() {
+ final ComponentName cn = getActiveDream();
+ if (cn != null) {
+ final PackageManager pm = mContext.getPackageManager();
+ try {
+ final ServiceInfo ri = pm.getServiceInfo(cn, 0);
+ if (ri != null) {
+ return ri.loadIcon(pm);
+ }
+ } catch (PackageManager.NameNotFoundException exc) {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ public @DreamBackend.WhenToDream
+ int getWhenToDreamSetting() {
+ if (!isEnabled()) {
+ return NEVER;
+ }
+ return isActivatedOnDock() && isActivatedOnSleep() ? EITHER
+ : isActivatedOnDock() ? WHILE_DOCKED
+ : isActivatedOnSleep() ? WHILE_CHARGING
+ : NEVER;
+ }
+
+ public void setWhenToDream(@DreamBackend.WhenToDream int whenToDream) {
+ setEnabled(whenToDream != NEVER);
+
+ switch (whenToDream) {
+ case WHILE_CHARGING:
+ setActivatedOnDock(false);
+ setActivatedOnSleep(true);
+ break;
+
+ case WHILE_DOCKED:
+ setActivatedOnDock(true);
+ setActivatedOnSleep(false);
+ break;
+
+ case EITHER:
+ setActivatedOnDock(true);
+ setActivatedOnSleep(true);
+ break;
+
+ case NEVER:
+ default:
+ break;
+ }
+
+ }
+
+ public boolean isEnabled() {
+ return getBoolean(Settings.Secure.SCREENSAVER_ENABLED, mDreamsEnabledByDefault);
+ }
+
+ public void setEnabled(boolean value) {
+ logd("setEnabled(%s)", value);
+ setBoolean(Settings.Secure.SCREENSAVER_ENABLED, value);
+ }
+
+ public boolean isActivatedOnDock() {
+ return getBoolean(Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
+ mDreamsActivatedOnDockByDefault);
+ }
+
+ public void setActivatedOnDock(boolean value) {
+ logd("setActivatedOnDock(%s)", value);
+ setBoolean(Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, value);
+ }
+
+ public boolean isActivatedOnSleep() {
+ return getBoolean(Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
+ mDreamsActivatedOnSleepByDefault);
+ }
+
+ public void setActivatedOnSleep(boolean value) {
+ logd("setActivatedOnSleep(%s)", value);
+ setBoolean(Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP, value);
+ }
+
+ private boolean getBoolean(String key, boolean def) {
+ return Settings.Secure.getInt(mContext.getContentResolver(), key, def ? 1 : 0) == 1;
+ }
+
+ private void setBoolean(String key, boolean value) {
+ Settings.Secure.putInt(mContext.getContentResolver(), key, value ? 1 : 0);
+ }
+
+ public void setActiveDream(ComponentName dream) {
+ logd("setActiveDream(%s)", dream);
+ if (mDreamManager == null) {
+ return;
+ }
+ try {
+ ComponentName[] dreams = {dream};
+ mDreamManager.setDreamComponents(dream == null ? null : dreams);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to set active dream to " + dream, e);
+ }
+ }
+
+ public ComponentName getActiveDream() {
+ if (mDreamManager == null) {
+ return null;
+ }
+ try {
+ ComponentName[] dreams = mDreamManager.getDreamComponents();
+ return dreams != null && dreams.length > 0 ? dreams[0] : null;
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to get active dream", e);
+ return null;
+ }
+ }
+
+ public void launchSettings(Context uiContext, DreamBackend.DreamInfo dreamInfo) {
+ logd("launchSettings(%s)", dreamInfo);
+ if (dreamInfo == null || dreamInfo.settingsComponentName == null) {
+ return;
+ }
+ uiContext.startActivity(new Intent().setComponent(dreamInfo.settingsComponentName));
+ }
+
+ public void preview(DreamBackend.DreamInfo dreamInfo) {
+ logd("preview(%s)", dreamInfo);
+ if (mDreamManager == null || dreamInfo == null || dreamInfo.componentName == null) {
+ return;
+ }
+ try {
+ mDreamManager.testDream(mContext.getUserId(), dreamInfo.componentName);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to preview " + dreamInfo, e);
+ }
+ }
+
+ public void startDreaming() {
+ logd("startDreaming()");
+ if (mDreamManager == null) {
+ return;
+ }
+ try {
+ mDreamManager.dream();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to dream", e);
+ }
+ }
+
+ private static ComponentName getDreamComponentName(ResolveInfo resolveInfo) {
+ if (resolveInfo == null || resolveInfo.serviceInfo == null) {
+ return null;
+ }
+ return new ComponentName(resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name);
+ }
+
+ private static ComponentName getSettingsComponentName(PackageManager pm,
+ ResolveInfo resolveInfo) {
+ if (resolveInfo == null
+ || resolveInfo.serviceInfo == null
+ || resolveInfo.serviceInfo.metaData == null) {
+ return null;
+ }
+ String cn = null;
+ XmlResourceParser parser = null;
+ Exception caughtException = null;
+ try {
+ parser = resolveInfo.serviceInfo.loadXmlMetaData(pm, DreamService.DREAM_META_DATA);
+ if (parser == null) {
+ Log.w(TAG, "No " + DreamService.DREAM_META_DATA + " meta-data");
+ return null;
+ }
+ Resources res = pm.getResourcesForApplication(resolveInfo.serviceInfo.applicationInfo);
+ AttributeSet attrs = Xml.asAttributeSet(parser);
+ int type;
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && type != XmlPullParser.START_TAG) {
+ }
+ String nodeName = parser.getName();
+ if (!"dream".equals(nodeName)) {
+ Log.w(TAG, "Meta-data does not start with dream tag");
+ return null;
+ }
+ TypedArray sa = res.obtainAttributes(attrs, com.android.internal.R.styleable.Dream);
+ cn = sa.getString(
+ res.getIdentifier("Dream_settingsActivity", "styleable", "android"));
+ sa.recycle();
+ } catch (PackageManager.NameNotFoundException | IOException | XmlPullParserException e) {
+ caughtException = e;
+ } finally {
+ if (parser != null) parser.close();
+ }
+ if (caughtException != null) {
+ Log.w(TAG, "Error parsing : " + resolveInfo.serviceInfo.packageName, caughtException);
+ return null;
+ }
+ if (cn != null && cn.indexOf('/') < 0) {
+ cn = resolveInfo.serviceInfo.packageName + "/" + cn;
+ }
+ return cn == null ? null : ComponentName.unflattenFromString(cn);
+ }
+
+ private static void logd(String msg, Object... args) {
+ if (DEBUG) {
+ Log.d(TAG, args == null || args.length == 0 ? msg : String.format(msg, args));
+ }
+ }
+
+ private static class DreamInfoComparator implements
+ Comparator<DreamBackend.DreamInfo> {
+ private final ComponentName mDefaultDream;
+
+ public DreamInfoComparator(ComponentName defaultDream) {
+ mDefaultDream = defaultDream;
+ }
+
+ @Override
+ public int compare(
+ DreamBackend.DreamInfo lhs, DreamBackend.DreamInfo rhs) {
+ return sortKey(lhs).compareTo(sortKey(rhs));
+ }
+
+ private String sortKey(DreamBackend.DreamInfo di) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(di.componentName.equals(mDefaultDream) ? '0' : '1');
+ sb.append(di.caption);
+ return sb.toString();
+ }
+ }
+}
+
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/InputMethodAndSubtypeUtil.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/InputMethodAndSubtypeUtil.java
new file mode 100644
index 0000000..3ba6ac3
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/InputMethodAndSubtypeUtil.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.settingslib;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.icu.text.ListFormatter;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
+
+import com.android.internal.app.LocaleHelper;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+
+public class InputMethodAndSubtypeUtil {
+
+ private static final boolean DEBUG = false;
+ private static final String TAG = "InputMethdAndSubtypeUtl";
+
+ private static final String SUBTYPE_MODE_KEYBOARD = "keyboard";
+ private static final char INPUT_METHOD_SEPARATER = ':';
+ private static final char INPUT_METHOD_SUBTYPE_SEPARATER = ';';
+ private static final int NOT_A_SUBTYPE_ID = -1;
+
+ private static final TextUtils.SimpleStringSplitter sStringInputMethodSplitter
+ = new TextUtils.SimpleStringSplitter(INPUT_METHOD_SEPARATER);
+
+ private static final TextUtils.SimpleStringSplitter sStringInputMethodSubtypeSplitter
+ = new TextUtils.SimpleStringSplitter(INPUT_METHOD_SUBTYPE_SEPARATER);
+
+ // InputMethods and subtypes are saved in the settings as follows:
+ // ime0;subtype0;subtype1:ime1;subtype0:ime2:ime3;subtype0;subtype1
+ public static String buildInputMethodsAndSubtypesString(
+ final HashMap<String, HashSet<String>> imeToSubtypesMap) {
+ final StringBuilder builder = new StringBuilder();
+ for (final String imi : imeToSubtypesMap.keySet()) {
+ if (builder.length() > 0) {
+ builder.append(INPUT_METHOD_SEPARATER);
+ }
+ final HashSet<String> subtypeIdSet = imeToSubtypesMap.get(imi);
+ builder.append(imi);
+ for (final String subtypeId : subtypeIdSet) {
+ builder.append(INPUT_METHOD_SUBTYPE_SEPARATER).append(subtypeId);
+ }
+ }
+ return builder.toString();
+ }
+
+ private static String buildInputMethodsString(final HashSet<String> imiList) {
+ final StringBuilder builder = new StringBuilder();
+ for (final String imi : imiList) {
+ if (builder.length() > 0) {
+ builder.append(INPUT_METHOD_SEPARATER);
+ }
+ builder.append(imi);
+ }
+ return builder.toString();
+ }
+
+ private static int getInputMethodSubtypeSelected(ContentResolver resolver) {
+ try {
+ return Settings.Secure.getInt(resolver,
+ Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE);
+ } catch (Settings.SettingNotFoundException e) {
+ return NOT_A_SUBTYPE_ID;
+ }
+ }
+
+ private static boolean isInputMethodSubtypeSelected(ContentResolver resolver) {
+ return getInputMethodSubtypeSelected(resolver) != NOT_A_SUBTYPE_ID;
+ }
+
+ private static void putSelectedInputMethodSubtype(ContentResolver resolver, int hashCode) {
+ Settings.Secure.putInt(resolver, Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE, hashCode);
+ }
+
+ // Needs to modify InputMethodManageService if you want to change the format of saved string.
+ static HashMap<String, HashSet<String>> getEnabledInputMethodsAndSubtypeList(
+ ContentResolver resolver) {
+ final String enabledInputMethodsStr = Settings.Secure.getString(
+ resolver, Settings.Secure.ENABLED_INPUT_METHODS);
+ if (DEBUG) {
+ Log.d(TAG, "--- Load enabled input methods: " + enabledInputMethodsStr);
+ }
+ return parseInputMethodsAndSubtypesString(enabledInputMethodsStr);
+ }
+
+ public static HashMap<String, HashSet<String>> parseInputMethodsAndSubtypesString(
+ final String inputMethodsAndSubtypesString) {
+ final HashMap<String, HashSet<String>> subtypesMap = new HashMap<>();
+ if (TextUtils.isEmpty(inputMethodsAndSubtypesString)) {
+ return subtypesMap;
+ }
+ sStringInputMethodSplitter.setString(inputMethodsAndSubtypesString);
+ while (sStringInputMethodSplitter.hasNext()) {
+ final String nextImsStr = sStringInputMethodSplitter.next();
+ sStringInputMethodSubtypeSplitter.setString(nextImsStr);
+ if (sStringInputMethodSubtypeSplitter.hasNext()) {
+ final HashSet<String> subtypeIdSet = new HashSet<>();
+ // The first element is {@link InputMethodInfoId}.
+ final String imiId = sStringInputMethodSubtypeSplitter.next();
+ while (sStringInputMethodSubtypeSplitter.hasNext()) {
+ subtypeIdSet.add(sStringInputMethodSubtypeSplitter.next());
+ }
+ subtypesMap.put(imiId, subtypeIdSet);
+ }
+ }
+ return subtypesMap;
+ }
+
+ private static HashSet<String> getDisabledSystemIMEs(ContentResolver resolver) {
+ HashSet<String> set = new HashSet<>();
+ String disabledIMEsStr = Settings.Secure.getString(
+ resolver, Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS);
+ if (TextUtils.isEmpty(disabledIMEsStr)) {
+ return set;
+ }
+ sStringInputMethodSplitter.setString(disabledIMEsStr);
+ while (sStringInputMethodSplitter.hasNext()) {
+ set.add(sStringInputMethodSplitter.next());
+ }
+ return set;
+ }
+
+
+ @NonNull
+ public static String getSubtypeLocaleNameAsSentence(@Nullable InputMethodSubtype subtype,
+ @NonNull final Context context, @NonNull final InputMethodInfo inputMethodInfo) {
+ if (subtype == null) {
+ return "";
+ }
+ final Locale locale = getDisplayLocale(context);
+ final CharSequence subtypeName = subtype.getDisplayName(context,
+ inputMethodInfo.getPackageName(), inputMethodInfo.getServiceInfo()
+ .applicationInfo);
+ return LocaleHelper.toSentenceCase(subtypeName.toString(), locale);
+ }
+
+ @NonNull
+ public static String getSubtypeLocaleNameListAsSentence(
+ @NonNull final List<InputMethodSubtype> subtypes, @NonNull final Context context,
+ @NonNull final InputMethodInfo inputMethodInfo) {
+ if (subtypes.isEmpty()) {
+ return "";
+ }
+ final Locale locale = getDisplayLocale(context);
+ final int subtypeCount = subtypes.size();
+ final CharSequence[] subtypeNames = new CharSequence[subtypeCount];
+ for (int i = 0; i < subtypeCount; i++) {
+ subtypeNames[i] = subtypes.get(i).getDisplayName(context,
+ inputMethodInfo.getPackageName(), inputMethodInfo.getServiceInfo()
+ .applicationInfo);
+ }
+ return LocaleHelper.toSentenceCase(
+ ListFormatter.getInstance(locale).format((Object[]) subtypeNames), locale);
+ }
+
+ @NonNull
+ private static Locale getDisplayLocale(@Nullable final Context context) {
+ if (context == null) {
+ return Locale.getDefault();
+ }
+ if (context.getResources() == null) {
+ return Locale.getDefault();
+ }
+ final Configuration configuration = context.getResources().getConfiguration();
+ if (configuration == null) {
+ return Locale.getDefault();
+ }
+ final Locale configurationLocale = configuration.getLocales().get(0);
+ if (configurationLocale == null) {
+ return Locale.getDefault();
+ }
+ return configurationLocale;
+ }
+
+ public static boolean isValidNonAuxAsciiCapableIme(InputMethodInfo imi) {
+ if (imi.isAuxiliaryIme()) {
+ return false;
+ }
+ final int subtypeCount = imi.getSubtypeCount();
+ for (int i = 0; i < subtypeCount; ++i) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(i);
+ if (SUBTYPE_MODE_KEYBOARD.equalsIgnoreCase(subtype.getMode())
+ && subtype.isAsciiCapable()) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/InputMethodAndSubtypeUtilCompat.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/InputMethodAndSubtypeUtilCompat.java
new file mode 100644
index 0000000..2ef14c2
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/InputMethodAndSubtypeUtilCompat.java
@@ -0,0 +1,352 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.settingslib;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.icu.text.ListFormatter;
+import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
+
+import com.android.internal.app.LocaleHelper;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+
+public class InputMethodAndSubtypeUtilCompat {
+
+ private static final boolean DEBUG = false;
+ private static final String TAG = "InputMethdAndSubtypeUtlCompat";
+
+ private static final String SUBTYPE_MODE_KEYBOARD = "keyboard";
+ private static final char INPUT_METHOD_SEPARATER = ':';
+ private static final char INPUT_METHOD_SUBTYPE_SEPARATER = ';';
+ private static final int NOT_A_SUBTYPE_ID = -1;
+
+ private static final TextUtils.SimpleStringSplitter sStringInputMethodSplitter
+ = new TextUtils.SimpleStringSplitter(INPUT_METHOD_SEPARATER);
+
+ private static final TextUtils.SimpleStringSplitter sStringInputMethodSubtypeSplitter
+ = new TextUtils.SimpleStringSplitter(INPUT_METHOD_SUBTYPE_SEPARATER);
+
+ // InputMethods and subtypes are saved in the settings as follows:
+ // ime0;subtype0;subtype1:ime1;subtype0:ime2:ime3;subtype0;subtype1
+ public static String buildInputMethodsAndSubtypesString(
+ final HashMap<String, HashSet<String>> imeToSubtypesMap) {
+ final StringBuilder builder = new StringBuilder();
+ for (final String imi : imeToSubtypesMap.keySet()) {
+ if (builder.length() > 0) {
+ builder.append(INPUT_METHOD_SEPARATER);
+ }
+ final HashSet<String> subtypeIdSet = imeToSubtypesMap.get(imi);
+ builder.append(imi);
+ for (final String subtypeId : subtypeIdSet) {
+ builder.append(INPUT_METHOD_SUBTYPE_SEPARATER).append(subtypeId);
+ }
+ }
+ return builder.toString();
+ }
+
+ private static String buildInputMethodsString(final HashSet<String> imiList) {
+ final StringBuilder builder = new StringBuilder();
+ for (final String imi : imiList) {
+ if (builder.length() > 0) {
+ builder.append(INPUT_METHOD_SEPARATER);
+ }
+ builder.append(imi);
+ }
+ return builder.toString();
+ }
+
+ private static int getInputMethodSubtypeSelected(ContentResolver resolver) {
+ try {
+ return Settings.Secure.getInt(resolver,
+ Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE);
+ } catch (SettingNotFoundException e) {
+ return NOT_A_SUBTYPE_ID;
+ }
+ }
+
+ private static boolean isInputMethodSubtypeSelected(ContentResolver resolver) {
+ return getInputMethodSubtypeSelected(resolver) != NOT_A_SUBTYPE_ID;
+ }
+
+ private static void putSelectedInputMethodSubtype(ContentResolver resolver, int hashCode) {
+ Settings.Secure.putInt(resolver, Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE, hashCode);
+ }
+
+ // Needs to modify InputMethodManageService if you want to change the format of saved string.
+ static HashMap<String, HashSet<String>> getEnabledInputMethodsAndSubtypeList(
+ ContentResolver resolver) {
+ final String enabledInputMethodsStr = Settings.Secure.getString(
+ resolver, Settings.Secure.ENABLED_INPUT_METHODS);
+ if (DEBUG) {
+ Log.d(TAG, "--- Load enabled input methods: " + enabledInputMethodsStr);
+ }
+ return parseInputMethodsAndSubtypesString(enabledInputMethodsStr);
+ }
+
+ public static HashMap<String, HashSet<String>> parseInputMethodsAndSubtypesString(
+ final String inputMethodsAndSubtypesString) {
+ final HashMap<String, HashSet<String>> subtypesMap = new HashMap<>();
+ if (TextUtils.isEmpty(inputMethodsAndSubtypesString)) {
+ return subtypesMap;
+ }
+ sStringInputMethodSplitter.setString(inputMethodsAndSubtypesString);
+ while (sStringInputMethodSplitter.hasNext()) {
+ final String nextImsStr = sStringInputMethodSplitter.next();
+ sStringInputMethodSubtypeSplitter.setString(nextImsStr);
+ if (sStringInputMethodSubtypeSplitter.hasNext()) {
+ final HashSet<String> subtypeIdSet = new HashSet<>();
+ // The first element is {@link InputMethodInfoId}.
+ final String imiId = sStringInputMethodSubtypeSplitter.next();
+ while (sStringInputMethodSubtypeSplitter.hasNext()) {
+ subtypeIdSet.add(sStringInputMethodSubtypeSplitter.next());
+ }
+ subtypesMap.put(imiId, subtypeIdSet);
+ }
+ }
+ return subtypesMap;
+ }
+
+ private static HashSet<String> getDisabledSystemIMEs(ContentResolver resolver) {
+ HashSet<String> set = new HashSet<>();
+ String disabledIMEsStr = Settings.Secure.getString(
+ resolver, Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS);
+ if (TextUtils.isEmpty(disabledIMEsStr)) {
+ return set;
+ }
+ sStringInputMethodSplitter.setString(disabledIMEsStr);
+ while (sStringInputMethodSplitter.hasNext()) {
+ set.add(sStringInputMethodSplitter.next());
+ }
+ return set;
+ }
+
+ public static void saveInputMethodSubtypeList(Context context,
+ PreferenceCompatManager preferenceCompatManager,
+ ContentResolver resolver, List<InputMethodInfo> inputMethodInfos,
+ boolean hasHardKeyboard) {
+ String currentInputMethodId = Settings.Secure.getString(resolver,
+ Settings.Secure.DEFAULT_INPUT_METHOD);
+ final int selectedInputMethodSubtype = getInputMethodSubtypeSelected(resolver);
+ final HashMap<String, HashSet<String>> enabledIMEsAndSubtypesMap =
+ getEnabledInputMethodsAndSubtypeList(resolver);
+ final HashSet<String> disabledSystemIMEs = getDisabledSystemIMEs(resolver);
+
+ boolean needsToResetSelectedSubtype = false;
+ for (final InputMethodInfo imi : inputMethodInfos) {
+ final String imiId = imi.getId();
+ final PreferenceCompat pref = preferenceCompatManager.getOrCreatePrefCompat(imiId);
+ if (pref == null) {
+ continue;
+ }
+ // In the choose input method screen or in the subtype enabler screen,
+ // <code>pref</code> is an instance of TwoStatePreference.
+ final boolean isImeChecked = pref.getType() == PreferenceCompat.TYPE_SWITCH
+ ? pref.getChecked() == PreferenceCompat.STATUS_ON
+ : enabledIMEsAndSubtypesMap.containsKey(imiId);
+ final boolean isCurrentInputMethod = imiId.equals(currentInputMethodId);
+ final boolean systemIme = imi.isSystem();
+ if ((!hasHardKeyboard && InputMethodSettingValuesWrapper.getInstance(
+ context).isAlwaysCheckedIme(imi))
+ || isImeChecked) {
+ if (!enabledIMEsAndSubtypesMap.containsKey(imiId)) {
+ // imiId has just been enabled
+ enabledIMEsAndSubtypesMap.put(imiId, new HashSet<>());
+ }
+ final HashSet<String> subtypesSet = enabledIMEsAndSubtypesMap.get(imiId);
+
+ boolean subtypePrefFound = false;
+ final int subtypeCount = imi.getSubtypeCount();
+ for (int i = 0; i < subtypeCount; ++i) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(i);
+ final String subtypeHashCodeStr = String.valueOf(subtype.hashCode());
+ final PreferenceCompat subtypePref = preferenceCompatManager
+ .getOrCreatePrefCompat(imiId + subtypeHashCodeStr);
+ // In the Configure input method screen which does not have subtype preferences.
+ if (subtypePref == null) {
+ continue;
+ }
+ if (!subtypePrefFound) {
+ // Once subtype preference is found, subtypeSet needs to be cleared.
+ // Because of system change, hashCode value could have been changed.
+ subtypesSet.clear();
+ // If selected subtype preference is disabled, needs to reset.
+ needsToResetSelectedSubtype = true;
+ subtypePrefFound = true;
+ }
+ // Checking <code>subtypePref.isEnabled()</code> is insufficient to determine
+ // whether the user manually enabled this subtype or not. Implicitly-enabled
+ // subtypes are also checked just as an indicator to users. We also need to
+ // check <code>subtypePref.isEnabled()</code> so that only manually enabled
+ // subtypes can be saved here.
+ if (subtypePref.getEnabled() == PreferenceCompat.STATUS_ON
+ && subtypePref.getChecked() == PreferenceCompat.STATUS_OFF) {
+ subtypesSet.add(subtypeHashCodeStr);
+ if (isCurrentInputMethod) {
+ if (selectedInputMethodSubtype == subtype.hashCode()) {
+ // Selected subtype is still enabled, there is no need to reset
+ // selected subtype.
+ needsToResetSelectedSubtype = false;
+ }
+ }
+ } else {
+ subtypesSet.remove(subtypeHashCodeStr);
+ }
+ }
+ } else {
+ enabledIMEsAndSubtypesMap.remove(imiId);
+ if (isCurrentInputMethod) {
+ // We are processing the current input method, but found that it's not enabled.
+ // This means that the current input method has been uninstalled.
+ // If currentInputMethod is already uninstalled, InputMethodManagerService will
+ // find the applicable IME from the history and the system locale.
+ if (DEBUG) {
+ Log.d(TAG, "Current IME was uninstalled or disabled.");
+ }
+ currentInputMethodId = null;
+ }
+ }
+ // If it's a disabled system ime, add it to the disabled list so that it
+ // doesn't get enabled automatically on any changes to the package list
+ if (systemIme && hasHardKeyboard) {
+ if (disabledSystemIMEs.contains(imiId)) {
+ if (isImeChecked) {
+ disabledSystemIMEs.remove(imiId);
+ }
+ } else {
+ if (!isImeChecked) {
+ disabledSystemIMEs.add(imiId);
+ }
+ }
+ }
+ }
+
+ final String enabledIMEsAndSubtypesString = buildInputMethodsAndSubtypesString(
+ enabledIMEsAndSubtypesMap);
+ final String disabledSystemIMEsString = buildInputMethodsString(disabledSystemIMEs);
+ if (DEBUG) {
+ Log.d(TAG, "--- Save enabled inputmethod settings. :" + enabledIMEsAndSubtypesString);
+ Log.d(TAG, "--- Save disabled system inputmethod settings. :"
+ + disabledSystemIMEsString);
+ Log.d(TAG, "--- Save default inputmethod settings. :" + currentInputMethodId);
+ Log.d(TAG, "--- Needs to reset the selected subtype :" + needsToResetSelectedSubtype);
+ Log.d(TAG, "--- Subtype is selected :" + isInputMethodSubtypeSelected(resolver));
+ }
+
+ // Redefines SelectedSubtype when all subtypes are unchecked or there is no subtype
+ // selected. And if the selected subtype of the current input method was disabled,
+ // We should reset the selected input method's subtype.
+ if (needsToResetSelectedSubtype || !isInputMethodSubtypeSelected(resolver)) {
+ if (DEBUG) {
+ Log.d(TAG, "--- Reset inputmethod subtype because it's not defined.");
+ }
+ putSelectedInputMethodSubtype(resolver, NOT_A_SUBTYPE_ID);
+ }
+
+ Settings.Secure.putString(resolver,
+ Settings.Secure.ENABLED_INPUT_METHODS, enabledIMEsAndSubtypesString);
+ if (disabledSystemIMEsString.length() > 0) {
+ Settings.Secure.putString(resolver, Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS,
+ disabledSystemIMEsString);
+ }
+ // If the current input method is unset, InputMethodManagerService will find the applicable
+ // IME from the history and the system locale.
+ Settings.Secure.putString(resolver, Settings.Secure.DEFAULT_INPUT_METHOD,
+ currentInputMethodId != null ? currentInputMethodId : "");
+ }
+
+
+ @NonNull
+ public static String getSubtypeLocaleNameAsSentence(@Nullable InputMethodSubtype subtype,
+ @NonNull final Context context, @NonNull final InputMethodInfo inputMethodInfo) {
+ if (subtype == null) {
+ return "";
+ }
+ final Locale locale = getDisplayLocale(context);
+ final CharSequence subtypeName = subtype.getDisplayName(context,
+ inputMethodInfo.getPackageName(), inputMethodInfo.getServiceInfo()
+ .applicationInfo);
+ return LocaleHelper.toSentenceCase(subtypeName.toString(), locale);
+ }
+
+ @NonNull
+ public static String getSubtypeLocaleNameListAsSentence(
+ @NonNull final List<InputMethodSubtype> subtypes, @NonNull final Context context,
+ @NonNull final InputMethodInfo inputMethodInfo) {
+ if (subtypes.isEmpty()) {
+ return "";
+ }
+ final Locale locale = getDisplayLocale(context);
+ final int subtypeCount = subtypes.size();
+ final CharSequence[] subtypeNames = new CharSequence[subtypeCount];
+ for (int i = 0; i < subtypeCount; i++) {
+ subtypeNames[i] = subtypes.get(i).getDisplayName(context,
+ inputMethodInfo.getPackageName(), inputMethodInfo.getServiceInfo()
+ .applicationInfo);
+ }
+ return LocaleHelper.toSentenceCase(
+ ListFormatter.getInstance(locale).format((Object[]) subtypeNames), locale);
+ }
+
+ @NonNull
+ private static Locale getDisplayLocale(@Nullable final Context context) {
+ if (context == null) {
+ return Locale.getDefault();
+ }
+ if (context.getResources() == null) {
+ return Locale.getDefault();
+ }
+ final Configuration configuration = context.getResources().getConfiguration();
+ if (configuration == null) {
+ return Locale.getDefault();
+ }
+ final Locale configurationLocale = configuration.getLocales().get(0);
+ if (configurationLocale == null) {
+ return Locale.getDefault();
+ }
+ return configurationLocale;
+ }
+
+ public static boolean isValidSystemNonAuxAsciiCapableIme(InputMethodInfo imi) {
+ if (imi.isAuxiliaryIme() || !imi.isSystem()) {
+ return false;
+ }
+ final int subtypeCount = imi.getSubtypeCount();
+ for (int i = 0; i < subtypeCount; ++i) {
+ final InputMethodSubtype subtype = imi.getSubtypeAt(i);
+ if (SUBTYPE_MODE_KEYBOARD.equalsIgnoreCase(subtype.getMode())
+ && subtype.isAsciiCapable()) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
diff --git a/Settings/src/com/android/tv/settings/inputmethod/InputMethodHelper.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/InputMethodHelper.java
similarity index 95%
rename from Settings/src/com/android/tv/settings/inputmethod/InputMethodHelper.java
rename to SettingsAPI/java/com/android/tv/settings/library/settingslib/InputMethodHelper.java
index 7491f58..767ab6e 100644
--- a/Settings/src/com/android/tv/settings/inputmethod/InputMethodHelper.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/InputMethodHelper.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 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.
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.tv.settings.inputmethod;
+package com.android.tv.settings.library.settingslib;
import android.app.ActivityManager;
import android.content.Context;
@@ -26,7 +26,7 @@
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
-import com.android.tv.settings.util.SliceUtils;
+import com.android.tv.settings.library.util.SliceUtils;
import java.util.ArrayList;
import java.util.List;
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/InputMethodSettingValuesWrapper.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/InputMethodSettingValuesWrapper.java
new file mode 100644
index 0000000..5b8b77c
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/InputMethodSettingValuesWrapper.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.tv.settings.library.settingslib;
+
+import android.annotation.UiThread;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.util.Log;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+
+/**
+ * This class is a wrapper for {@link InputMethodManager} and
+ * {@link android.provider.Settings.Secure#ENABLED_INPUT_METHODS}. You need to refresh internal
+ * states manually on some events when "InputMethodInfo"s and "InputMethodSubtype"s can be changed.
+ */
+@UiThread
+public class InputMethodSettingValuesWrapper {
+ private static final String TAG = InputMethodSettingValuesWrapper.class.getSimpleName();
+
+ private static volatile InputMethodSettingValuesWrapper sInstance;
+ private final ArrayList<InputMethodInfo> mMethodList = new ArrayList<>();
+ private final ContentResolver mContentResolver;
+ private final InputMethodManager mImm;
+
+ public static InputMethodSettingValuesWrapper getInstance(
+ Context context) {
+ if (sInstance == null) {
+ synchronized (TAG) {
+ if (sInstance == null) {
+ sInstance = new InputMethodSettingValuesWrapper(context);
+ }
+ }
+ }
+ return sInstance;
+ }
+
+ // Ensure singleton
+ private InputMethodSettingValuesWrapper(Context context) {
+ mContentResolver = context.getContentResolver();
+ mImm = context.getSystemService(InputMethodManager.class);
+ refreshAllInputMethodAndSubtypes();
+ }
+
+ public void refreshAllInputMethodAndSubtypes() {
+ mMethodList.clear();
+ mMethodList.addAll(mImm.getInputMethodList());
+ }
+
+ public List<InputMethodInfo> getInputMethodList() {
+ return new ArrayList<>(mMethodList);
+ }
+
+ public boolean isAlwaysCheckedIme(InputMethodInfo imi) {
+ final boolean isEnabled = isEnabledImi(imi);
+ if (getEnabledInputMethodList().size() <= 1 && isEnabled) {
+ return true;
+ }
+
+ final int enabledValidNonAuxAsciiCapableImeCount =
+ getEnabledValidNonAuxAsciiCapableImeCount();
+
+ return enabledValidNonAuxAsciiCapableImeCount <= 1
+ && !(enabledValidNonAuxAsciiCapableImeCount == 1 && !isEnabled)
+ && imi.isSystem()
+ && InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(imi);
+ }
+
+ private int getEnabledValidNonAuxAsciiCapableImeCount() {
+ int count = 0;
+ final List<InputMethodInfo> enabledImis = getEnabledInputMethodList();
+ for (final InputMethodInfo imi : enabledImis) {
+ if (InputMethodAndSubtypeUtil.isValidNonAuxAsciiCapableIme(imi)) {
+ ++count;
+ }
+ }
+ if (count == 0) {
+ Log.w(TAG, "No \"enabledValidNonAuxAsciiCapableIme\"s found.");
+ }
+ return count;
+ }
+
+ public boolean isEnabledImi(InputMethodInfo imi) {
+ final List<InputMethodInfo> enabledImis = getEnabledInputMethodList();
+ for (final InputMethodInfo tempImi : enabledImis) {
+ if (tempImi.getId().equals(imi.getId())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns the list of the enabled {@link InputMethodInfo} determined by
+ * {@link android.provider.Settings.Secure#ENABLED_INPUT_METHODS} rather than just returning
+ * {@link InputMethodManager#getEnabledInputMethodList()}.
+ *
+ * @return the list of the enabled {@link InputMethodInfo}
+ */
+ private ArrayList<InputMethodInfo> getEnabledInputMethodList() {
+ final HashMap<String, HashSet<String>> enabledInputMethodsAndSubtypes =
+ InputMethodAndSubtypeUtil.getEnabledInputMethodsAndSubtypeList(mContentResolver);
+ final ArrayList<InputMethodInfo> result = new ArrayList<>();
+ for (InputMethodInfo imi : mMethodList) {
+ if (enabledInputMethodsAndSubtypes.containsKey(imi.getId())) {
+ result.add(imi);
+ }
+ }
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/RecentLocationApps.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/RecentLocationApps.java
new file mode 100644
index 0000000..bf9682c
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/RecentLocationApps.java
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.settingslib;
+
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.PermissionChecker;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.text.format.DateUtils;
+import android.util.IconDrawableFactory;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * Retrieves the information of applications which accessed location recently.
+ */
+public class RecentLocationApps {
+ private static final String TAG = RecentLocationApps.class.getSimpleName();
+ @VisibleForTesting
+ static final String ANDROID_SYSTEM_PACKAGE_NAME = "android";
+
+ // Keep last 24 hours of location app information.
+ private static final long RECENT_TIME_INTERVAL_MILLIS = DateUtils.DAY_IN_MILLIS;
+
+ @VisibleForTesting
+ static final int[] LOCATION_REQUEST_OPS = new int[]{
+ AppOpsManager.OP_MONITOR_LOCATION,
+ AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION,
+ };
+ @VisibleForTesting
+ static final int[] LOCATION_PERMISSION_OPS = new int[]{
+ AppOpsManager.OP_FINE_LOCATION,
+ AppOpsManager.OP_COARSE_LOCATION,
+ };
+
+ private final PackageManager mPackageManager;
+ private final Context mContext;
+ private final IconDrawableFactory mDrawableFactory;
+
+ public RecentLocationApps(Context context) {
+ mContext = context;
+ mPackageManager = context.getPackageManager();
+ mDrawableFactory = IconDrawableFactory.newInstance(context);
+ }
+
+ /**
+ * Fills a list of applications which queried location recently within specified time.
+ * Apps are sorted by recency. Apps with more recent location requests are in the front.
+ */
+ public List<RecentLocationApps.Request> getAppList(boolean showSystemApps) {
+ // Retrieve a location usage list from AppOps
+ PackageManager pm = mContext.getPackageManager();
+ // Retrieve a location usage list from AppOps
+ AppOpsManager aoManager =
+ (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
+ List<AppOpsManager.PackageOps> appOps = aoManager.getPackagesForOps(LOCATION_REQUEST_OPS);
+
+ final int appOpsCount = appOps != null ? appOps.size() : 0;
+
+ // Process the AppOps list and generate a preference list.
+ ArrayList<RecentLocationApps.Request> requests = new ArrayList<>(appOpsCount);
+ final long now = System.currentTimeMillis();
+ final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ final List<UserHandle> profiles = um.getUserProfiles();
+
+ for (int i = 0; i < appOpsCount; ++i) {
+ AppOpsManager.PackageOps ops = appOps.get(i);
+ // Don't show the Android System in the list - it's not actionable for the user.
+ // Also don't show apps belonging to background users except managed users.
+ String packageName = ops.getPackageName();
+ int uid = ops.getUid();
+ final UserHandle user = UserHandle.getUserHandleForUid(uid);
+
+ boolean isAndroidOs =
+ (uid == android.os.Process.SYSTEM_UID) && ANDROID_SYSTEM_PACKAGE_NAME.equals(
+ packageName);
+ if (isAndroidOs || !profiles.contains(user)) {
+ continue;
+ }
+
+ // Don't show apps that do not have user sensitive location permissions
+ boolean showApp = true;
+ if (!showSystemApps) {
+ for (int op : LOCATION_PERMISSION_OPS) {
+ final String permission = AppOpsManager.opToPermission(op);
+ final int permissionFlags = pm.getPermissionFlags(permission, packageName,
+ user);
+ if (PermissionChecker.checkPermissionForPreflight(mContext, permission,
+ PermissionChecker.PID_UNKNOWN, uid, packageName)
+ == PermissionChecker.PERMISSION_GRANTED) {
+ if ((permissionFlags
+ & PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED)
+ == 0) {
+ showApp = false;
+ break;
+ }
+ } else {
+ if ((permissionFlags
+ & PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED) == 0) {
+ showApp = false;
+ break;
+ }
+ }
+ }
+ }
+ if (showApp) {
+ RecentLocationApps.Request request = getRequestFromOps(now, ops);
+ if (request != null) {
+ requests.add(request);
+ }
+ }
+ }
+ return requests;
+ }
+
+ /**
+ * Gets a list of apps that requested for location recently, sorting by recency.
+ *
+ * @param showSystemApps whether includes system apps in the list.
+ * @return the list of apps that recently requested for location.
+ */
+ public List<RecentLocationApps.Request> getAppListSorted(boolean showSystemApps) {
+ List<RecentLocationApps.Request> requests = getAppList(showSystemApps);
+ // Sort the list of Requests by recency. Most recent request first.
+ Collections.sort(requests,
+ Collections.reverseOrder(new Comparator<RecentLocationApps.Request>() {
+ @Override
+ public int compare(RecentLocationApps.Request request1,
+ RecentLocationApps.Request request2) {
+ return Long.compare(request1.requestFinishTime, request2.requestFinishTime);
+ }
+ }));
+ return requests;
+ }
+
+ /**
+ * Creates a Request entry for the given PackageOps.
+ *
+ * This method examines the time interval of the PackageOps first. If the PackageOps is older
+ * than the designated interval, this method ignores the PackageOps object and returns null.
+ * When the PackageOps is fresh enough, this method returns a Request object for the package
+ */
+ private RecentLocationApps.Request getRequestFromOps(long now,
+ AppOpsManager.PackageOps ops) {
+ String packageName = ops.getPackageName();
+ List<AppOpsManager.OpEntry> entries = ops.getOps();
+ boolean highBattery = false;
+ boolean normalBattery = false;
+ long locationRequestFinishTime = 0L;
+ // Earliest time for a location request to end and still be shown in list.
+ long recentLocationCutoffTime = now - RECENT_TIME_INTERVAL_MILLIS;
+ for (AppOpsManager.OpEntry entry : entries) {
+ if (entry.isRunning() || entry.getTime() >= recentLocationCutoffTime) {
+ locationRequestFinishTime = entry.getTime() + entry.getDuration();
+ switch (entry.getOp()) {
+ case AppOpsManager.OP_MONITOR_LOCATION:
+ normalBattery = true;
+ break;
+ case AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION:
+ highBattery = true;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ if (!highBattery && !normalBattery) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, packageName + " hadn't used location within the time interval.");
+ }
+ return null;
+ }
+
+ // The package is fresh enough, continue.
+ int uid = ops.getUid();
+ int userId = UserHandle.getUserId(uid);
+
+ RecentLocationApps.Request request = null;
+ try {
+ ApplicationInfo appInfo = mPackageManager.getApplicationInfoAsUser(
+ packageName, PackageManager.GET_META_DATA, userId);
+ if (appInfo == null) {
+ Log.w(TAG, "Null application info retrieved for package " + packageName
+ + ", userId " + userId);
+ return null;
+ }
+
+ final UserHandle userHandle = new UserHandle(userId);
+ Drawable icon = mDrawableFactory.getBadgedIcon(appInfo, userId);
+ CharSequence appLabel = mPackageManager.getApplicationLabel(appInfo);
+ CharSequence badgedAppLabel = mPackageManager.getUserBadgedLabel(appLabel, userHandle);
+ if (appLabel.toString().contentEquals(badgedAppLabel)) {
+ // If badged label is not different from original then no need for it as
+ // a separate content description.
+ badgedAppLabel = null;
+ }
+ request = new RecentLocationApps.Request(packageName, userHandle, icon, appLabel,
+ highBattery,
+ badgedAppLabel, locationRequestFinishTime);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.w(TAG, "package name not found for " + packageName + ", userId " + userId);
+ }
+ return request;
+ }
+
+ public static class Request {
+ public final String packageName;
+ public final UserHandle userHandle;
+ public final Drawable icon;
+ public final CharSequence label;
+ public final boolean isHighBattery;
+ public final CharSequence contentDescription;
+ public final long requestFinishTime;
+
+ public Request(String packageName, UserHandle userHandle, Drawable icon,
+ CharSequence label, boolean isHighBattery, CharSequence contentDescription,
+ long requestFinishTime) {
+ this.packageName = packageName;
+ this.userHandle = userHandle;
+ this.icon = icon;
+ this.label = label;
+ this.isHighBattery = isHighBattery;
+ this.contentDescription = contentDescription;
+ this.requestFinishTime = requestFinishTime;
+ }
+ }
+}
+
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/RestrictedLockUtils.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/RestrictedLockUtils.java
new file mode 100644
index 0000000..4a4c4fa
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/RestrictedLockUtils.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.settingslib;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+
+import androidx.annotation.Nullable;
+
+import java.util.Objects;
+
+/**
+ * Utility class to host methods usable in adding a restricted padlock icon and showing admin
+ * support message dialog.
+ */
+public class RestrictedLockUtils {
+ public static EnforcedAdmin getProfileOrDeviceOwner(
+ Context context, UserHandle user) {
+ return getProfileOrDeviceOwner(context, null, user);
+ }
+
+ public static RestrictedLockUtils.EnforcedAdmin getProfileOrDeviceOwner(
+ Context context, String enforcedRestriction, UserHandle user) {
+ if (user == null) {
+ return null;
+ }
+ final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ if (dpm == null) {
+ return null;
+ }
+
+ Context userContext;
+ try {
+ userContext = context.createPackageContextAsUser(context.getPackageName(), 0, user);
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new IllegalStateException(e);
+ }
+
+ ComponentName adminComponent = userContext.getSystemService(
+ DevicePolicyManager.class).getProfileOwner();
+ if (adminComponent != null) {
+ return new EnforcedAdmin(adminComponent, enforcedRestriction, user);
+ }
+ if (Objects.equals(dpm.getDeviceOwnerUser(), user)) {
+ adminComponent = dpm.getDeviceOwnerComponentOnAnyUser();
+ if (adminComponent != null) {
+ return new EnforcedAdmin(adminComponent, enforcedRestriction, user);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Send the intent to trigger the {@code android.settings.ShowAdminSupportDetailsDialog}.
+ */
+ public static void sendShowAdminSupportDetailsIntent(Context context, EnforcedAdmin admin) {
+ final Intent intent = getShowAdminSupportDetailsIntent(context, admin);
+ int targetUserId = UserHandle.myUserId();
+ if (admin != null) {
+ if (admin.user != null
+ && isCurrentUserOrProfile(context, admin.user.getIdentifier())) {
+ targetUserId = admin.user.getIdentifier();
+ }
+ intent.putExtra(DevicePolicyManager.EXTRA_RESTRICTION, admin.enforcedRestriction);
+ }
+ context.startActivityAsUser(intent, UserHandle.of(targetUserId));
+ }
+
+ public static Intent getShowAdminSupportDetailsIntent(Context context, EnforcedAdmin admin) {
+ final Intent intent = new Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS);
+ if (admin != null) {
+ if (admin.component != null) {
+ intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, admin.component);
+ }
+ intent.putExtra(Intent.EXTRA_USER, admin.user);
+ }
+ return intent;
+ }
+
+ public static boolean isCurrentUserOrProfile(Context context, int userId) {
+ UserManager um = context.getSystemService(UserManager.class);
+ return um.getUserProfiles().contains(UserHandle.of(userId));
+ }
+
+ public static class EnforcedAdmin {
+ @Nullable
+ public ComponentName component = null;
+ /**
+ * The restriction enforced by admin. It could be any user restriction or policy like
+ * {@link DevicePolicyManager#POLICY_DISABLE_CAMERA}.
+ */
+ @Nullable
+ public String enforcedRestriction = null;
+ @Nullable
+ public UserHandle user = null;
+
+ // We use this to represent the case where a policy is enforced by multiple admins.
+ public final static RestrictedLockUtils.EnforcedAdmin MULTIPLE_ENFORCED_ADMIN =
+ new EnforcedAdmin();
+
+ public static EnforcedAdmin createDefaultEnforcedAdminWithRestriction(
+ String enforcedRestriction) {
+ EnforcedAdmin enforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ enforcedAdmin.enforcedRestriction = enforcedRestriction;
+ return enforcedAdmin;
+ }
+
+ public EnforcedAdmin(ComponentName component, UserHandle user) {
+ this.component = component;
+ this.user = user;
+ }
+
+ public EnforcedAdmin(ComponentName component, String enforcedRestriction, UserHandle user) {
+ this.component = component;
+ this.enforcedRestriction = enforcedRestriction;
+ this.user = user;
+ }
+
+ public EnforcedAdmin(EnforcedAdmin other) {
+ if (other == null) {
+ throw new IllegalArgumentException();
+ }
+ this.component = other.component;
+ this.enforcedRestriction = other.enforcedRestriction;
+ this.user = other.user;
+ }
+
+ public EnforcedAdmin() {
+ }
+
+ /**
+ * Combines two {@link EnforcedAdmin} into one: if one of them is null, then just return
+ * the other. If both of them are the same, then return that. Otherwise return the symbolic
+ * {@link #MULTIPLE_ENFORCED_ADMIN}
+ */
+ public static EnforcedAdmin combine(EnforcedAdmin admin1, EnforcedAdmin admin2) {
+ if (admin1 == null) {
+ return admin2;
+ }
+ if (admin2 == null) {
+ return admin1;
+ }
+ if (admin1.equals(admin2)) {
+ return admin1;
+ }
+ if (!admin1.enforcedRestriction.equals(admin2.enforcedRestriction)) {
+ throw new IllegalArgumentException(
+ "Admins with different restriction cannot be combined");
+ }
+ return MULTIPLE_ENFORCED_ADMIN;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ EnforcedAdmin that = (EnforcedAdmin) o;
+ return Objects.equals(user, that.user) &&
+ Objects.equals(component, that.component) &&
+ Objects.equals(enforcedRestriction, that.enforcedRestriction);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(component, enforcedRestriction, user);
+ }
+
+ @Override
+ public String toString() {
+ return "EnforcedAdmin{" +
+ "component=" + component +
+ ", enforcedRestriction='" + enforcedRestriction +
+ ", user=" + user +
+ '}';
+ }
+ }
+}
+
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/RestrictedLockUtilsInternal.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/RestrictedLockUtilsInternal.java
new file mode 100644
index 0000000..2599950
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/RestrictedLockUtilsInternal.java
@@ -0,0 +1,632 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.settingslib;
+
+import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NONE;
+import static android.app.admin.DevicePolicyManager.PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.app.AppGlobals;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.internal.widget.LockPatternUtils;
+
+import java.util.List;
+
+/**
+ * Utility class to host methods usable in adding a restricted padlock icon and showing admin
+ * support message dialog.
+ */
+public class RestrictedLockUtilsInternal extends RestrictedLockUtils {
+
+ private static final String LOG_TAG = "RestrictedLockUtils";
+
+ /**
+ * @return drawables for displaying with settings that are locked by a device admin.
+ */
+ public static Drawable getRestrictedPadlock(Context context) {
+ Drawable restrictedPadlock = context.getDrawable(android.R.drawable.ic_info);
+ final int iconSize = context.getResources().getDimensionPixelSize(
+ android.R.dimen.config_restrictedIconSize);
+
+ TypedArray ta = context.obtainStyledAttributes(new int[]{android.R.attr.colorAccent});
+ int colorAccent = ta.getColor(0, 0);
+ ta.recycle();
+ restrictedPadlock.setTint(colorAccent);
+
+ restrictedPadlock.setBounds(0, 0, iconSize, iconSize);
+ return restrictedPadlock;
+ }
+
+ /**
+ * Checks if a restriction is enforced on a user and returns the enforced admin and
+ * admin userId.
+ *
+ * @param userRestriction Restriction to check
+ * @param userId User which we need to check if restriction is enforced on.
+ * @return EnforcedAdmin Object containing the enforced admin component and admin user details,
+ * or {@code null} If the restriction is not set. If the restriction is set by both device owner
+ * and profile owner, then the admin component will be set to {@code null} and userId to
+ * {@link UserHandle#USER_NULL}.
+ */
+ public static EnforcedAdmin checkIfRestrictionEnforced(Context context,
+ String userRestriction, int userId) {
+ final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ if (dpm == null) {
+ return null;
+ }
+
+ final UserManager um = UserManager.get(context);
+ final List<UserManager.EnforcingUser> enforcingUsers =
+ um.getUserRestrictionSources(userRestriction, UserHandle.of(userId));
+
+ if (enforcingUsers.isEmpty()) {
+ // Restriction is not enforced.
+ return null;
+ } else if (enforcingUsers.size() > 1) {
+ return EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(userRestriction);
+ }
+
+ final int restrictionSource = enforcingUsers.get(0).getUserRestrictionSource();
+ final int adminUserId = enforcingUsers.get(0).getUserHandle().getIdentifier();
+ if (restrictionSource == UserManager.RESTRICTION_SOURCE_PROFILE_OWNER) {
+ // Check if it is a profile owner of the user under consideration.
+ if (adminUserId == userId) {
+ return getProfileOwner(context, userRestriction, adminUserId);
+ } else {
+ // Check if it is a profile owner of a managed profile of the current user.
+ // Otherwise it is in a separate user and we return a default EnforcedAdmin.
+ final UserInfo parentUser = um.getProfileParent(adminUserId);
+ return (parentUser != null && parentUser.id == userId)
+ ? getProfileOwner(context, userRestriction, adminUserId)
+ : EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(userRestriction);
+ }
+ } else if (restrictionSource == UserManager.RESTRICTION_SOURCE_DEVICE_OWNER) {
+ // When the restriction is enforced by device owner, return the device owner admin only
+ // if the admin is for the {@param userId} otherwise return a default EnforcedAdmin.
+ return adminUserId == userId
+ ? getDeviceOwner(context, userRestriction)
+ : EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(userRestriction);
+ }
+
+ // If the restriction is enforced by system then return null.
+ return null;
+ }
+
+ public static boolean hasBaseUserRestriction(Context context,
+ String userRestriction, int userId) {
+ final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
+ return um.hasBaseUserRestriction(userRestriction, UserHandle.of(userId));
+ }
+
+ /**
+ * Checks whether keyguard features are disabled by policy.
+ *
+ * @param context {@link Context} for the calling user.
+ * @param keyguardFeatures Any one of keyguard features that can be
+ * disabled by {@link DevicePolicyManager#setKeyguardDisabledFeatures}.
+ * @param userId User to check enforced admin status for.
+ * @return EnforcedAdmin Object containing the enforced admin component and admin user details,
+ * or {@code null} If the notification features are not disabled. If the restriction is set by
+ * multiple admins, then the admin component will be set to {@code null} and userId to
+ * {@link UserHandle#USER_NULL}.
+ */
+ public static EnforcedAdmin checkIfKeyguardFeaturesDisabled(Context context,
+ int keyguardFeatures, final @UserIdInt int userId) {
+ final LockSettingCheck check = (dpm, admin, checkUser) -> {
+ int effectiveFeatures = dpm.getKeyguardDisabledFeatures(admin, checkUser);
+ if (checkUser != userId) {
+ effectiveFeatures &= PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
+ }
+ return (effectiveFeatures & keyguardFeatures) != KEYGUARD_DISABLE_FEATURES_NONE;
+ };
+ if (UserManager.get(context).getUserInfo(userId).isManagedProfile()) {
+ DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ return findEnforcedAdmin(dpm.getActiveAdminsAsUser(userId), dpm, userId, check);
+ }
+ return checkForLockSetting(context, userId, check);
+ }
+
+ /**
+ * @return the UserHandle for a userId. Return null for USER_NULL
+ */
+ private static UserHandle getUserHandleOf(@UserIdInt int userId) {
+ if (userId == UserHandle.USER_NULL) {
+ return null;
+ } else {
+ return UserHandle.of(userId);
+ }
+ }
+
+ /**
+ * Filter a set of device admins based on a predicate {@code check}. This is equivalent to
+ * {@code admins.stream().filter(check).map(x → new EnforcedAdmin(admin, userId)} except it's
+ * returning a zero/one/many-type thing.
+ *
+ * @param admins set of candidate device admins identified by {@link ComponentName}.
+ * @param userId user to create the resultant {@link EnforcedAdmin} as.
+ * @param check filter predicate.
+ * @return {@code null} if none of the {@param admins} match.
+ * An {@link EnforcedAdmin} if exactly one of the admins matches.
+ * Otherwise, {@link EnforcedAdmin#MULTIPLE_ENFORCED_ADMIN} for multiple matches.
+ */
+ @Nullable
+ private static EnforcedAdmin findEnforcedAdmin(@Nullable List<ComponentName> admins,
+ @NonNull DevicePolicyManager dpm, @UserIdInt int userId,
+ @NonNull LockSettingCheck check) {
+ if (admins == null) {
+ return null;
+ }
+
+ final UserHandle user = getUserHandleOf(userId);
+ EnforcedAdmin enforcedAdmin = null;
+ for (ComponentName admin : admins) {
+ if (check.isEnforcing(dpm, admin, userId)) {
+ if (enforcedAdmin == null) {
+ enforcedAdmin = new EnforcedAdmin(admin, user);
+ } else {
+ return EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN;
+ }
+ }
+ }
+ return enforcedAdmin;
+ }
+
+ public static EnforcedAdmin checkIfUninstallBlocked(Context context,
+ String packageName, int userId) {
+ EnforcedAdmin allAppsControlDisallowedAdmin = checkIfRestrictionEnforced(context,
+ UserManager.DISALLOW_APPS_CONTROL, userId);
+ if (allAppsControlDisallowedAdmin != null) {
+ return allAppsControlDisallowedAdmin;
+ }
+ EnforcedAdmin allAppsUninstallDisallowedAdmin = checkIfRestrictionEnforced(context,
+ UserManager.DISALLOW_UNINSTALL_APPS, userId);
+ if (allAppsUninstallDisallowedAdmin != null) {
+ return allAppsUninstallDisallowedAdmin;
+ }
+ IPackageManager ipm = AppGlobals.getPackageManager();
+ try {
+ if (ipm.getBlockUninstallForUser(packageName, userId)) {
+ return getProfileOrDeviceOwner(context, getUserHandleOf(userId));
+ }
+ } catch (RemoteException e) {
+ // Nothing to do
+ }
+ return null;
+ }
+
+ /**
+ * Check if an application is suspended.
+ *
+ * @return EnforcedAdmin Object containing the enforced admin component and admin user details,
+ * or {@code null} if the application is not suspended.
+ */
+ public static EnforcedAdmin checkIfApplicationIsSuspended(Context context, String packageName,
+ int userId) {
+ IPackageManager ipm = AppGlobals.getPackageManager();
+ try {
+ if (ipm.isPackageSuspendedForUser(packageName, userId)) {
+ return getProfileOrDeviceOwner(context, getUserHandleOf(userId));
+ }
+ } catch (RemoteException | IllegalArgumentException e) {
+ // Nothing to do
+ }
+ return null;
+ }
+
+ public static EnforcedAdmin checkIfInputMethodDisallowed(Context context,
+ String packageName, int userId) {
+ DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ if (dpm == null) {
+ return null;
+ }
+ EnforcedAdmin admin = getProfileOrDeviceOwner(context, getUserHandleOf(userId));
+ boolean permitted = true;
+ if (admin != null) {
+ permitted = dpm.isInputMethodPermittedByAdmin(admin.component,
+ packageName, userId);
+ }
+
+ boolean permittedByParentAdmin = true;
+ EnforcedAdmin profileAdmin = null;
+ int managedProfileId = getManagedProfileId(context, userId);
+ if (managedProfileId != UserHandle.USER_NULL) {
+ profileAdmin = getProfileOrDeviceOwner(context, getUserHandleOf(managedProfileId));
+ // If the device is an organization-owned device with a managed profile, the
+ // managedProfileId will be used instead of the affected userId. This is because
+ // isInputMethodPermittedByAdmin is called on the parent DPM instance, which will
+ // return results affecting the personal profile.
+ if (profileAdmin != null && dpm.isOrganizationOwnedDeviceWithManagedProfile()) {
+ DevicePolicyManager parentDpm = sProxy.getParentProfileInstance(dpm,
+ UserManager.get(context).getUserInfo(managedProfileId));
+ permittedByParentAdmin = parentDpm.isInputMethodPermittedByAdmin(
+ profileAdmin.component, packageName, managedProfileId);
+ }
+ }
+ if (!permitted && !permittedByParentAdmin) {
+ return EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN;
+ } else if (!permitted) {
+ return admin;
+ } else if (!permittedByParentAdmin) {
+ return profileAdmin;
+ }
+ return null;
+ }
+
+ /**
+ * @param userId user id of a managed profile.
+ * @return is remote contacts search disallowed.
+ */
+ public static EnforcedAdmin checkIfRemoteContactSearchDisallowed(Context context, int userId) {
+ DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ if (dpm == null) {
+ return null;
+ }
+ EnforcedAdmin admin = getProfileOwner(context, userId);
+ if (admin == null) {
+ return null;
+ }
+ UserHandle userHandle = UserHandle.of(userId);
+ if (dpm.getCrossProfileContactsSearchDisabled(userHandle)
+ && dpm.getCrossProfileCallerIdDisabled(userHandle)) {
+ return admin;
+ }
+ return null;
+ }
+
+ public static EnforcedAdmin checkIfAccessibilityServiceDisallowed(Context context,
+ String packageName, int userId) {
+ DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ if (dpm == null) {
+ return null;
+ }
+ EnforcedAdmin admin = getProfileOrDeviceOwner(context, getUserHandleOf(userId));
+ boolean permitted = true;
+ if (admin != null) {
+ permitted = dpm.isAccessibilityServicePermittedByAdmin(admin.component,
+ packageName, userId);
+ }
+ int managedProfileId = getManagedProfileId(context, userId);
+ EnforcedAdmin profileAdmin = getProfileOrDeviceOwner(context,
+ getUserHandleOf(managedProfileId));
+ boolean permittedByProfileAdmin = true;
+ if (profileAdmin != null) {
+ permittedByProfileAdmin = dpm.isAccessibilityServicePermittedByAdmin(
+ profileAdmin.component, packageName, managedProfileId);
+ }
+ if (!permitted && !permittedByProfileAdmin) {
+ return EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN;
+ } else if (!permitted) {
+ return admin;
+ } else if (!permittedByProfileAdmin) {
+ return profileAdmin;
+ }
+ return null;
+ }
+
+ private static int getManagedProfileId(Context context, int userId) {
+ UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
+ List<UserInfo> userProfiles = um.getProfiles(userId);
+ for (UserInfo uInfo : userProfiles) {
+ if (uInfo.id == userId) {
+ continue;
+ }
+ if (uInfo.isManagedProfile()) {
+ return uInfo.id;
+ }
+ }
+ return UserHandle.USER_NULL;
+ }
+
+ /**
+ * Check if account management for a specific type of account is disabled by admin.
+ * Only a profile or device owner can disable account management. So, we check if account
+ * management is disabled and return profile or device owner on the calling user.
+ *
+ * @return EnforcedAdmin Object containing the enforced admin component and admin user details,
+ * or {@code null} if the account management is not disabled.
+ */
+ public static EnforcedAdmin checkIfAccountManagementDisabled(Context context,
+ String accountType, int userId) {
+ if (accountType == null) {
+ return null;
+ }
+ DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ PackageManager pm = context.getPackageManager();
+ if (!pm.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN) || dpm == null) {
+ return null;
+ }
+ boolean isAccountTypeDisabled = false;
+ String[] disabledTypes = dpm.getAccountTypesWithManagementDisabledAsUser(userId);
+ for (String type : disabledTypes) {
+ if (accountType.equals(type)) {
+ isAccountTypeDisabled = true;
+ break;
+ }
+ }
+ if (!isAccountTypeDisabled) {
+ return null;
+ }
+ return getProfileOrDeviceOwner(context, getUserHandleOf(userId));
+ }
+
+ /**
+ * Check if USB data signaling (except from charging functions) is disabled by the admin.
+ * Only a device owner or a profile owner on an organization-owned managed profile can disable
+ * USB data signaling.
+ *
+ * @return EnforcedAdmin Object containing the enforced admin component and admin user details,
+ * or {@code null} if USB data signaling is not disabled.
+ */
+ public static EnforcedAdmin checkIfUsbDataSignalingIsDisabled(Context context, int userId) {
+ DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ if (dpm == null || dpm.isUsbDataSignalingEnabledForUser(userId)) {
+ return null;
+ } else {
+ EnforcedAdmin admin = getProfileOrDeviceOwner(context, getUserHandleOf(userId));
+ int managedProfileId = getManagedProfileId(context, userId);
+ if (admin == null && managedProfileId != UserHandle.USER_NULL) {
+ admin = getProfileOrDeviceOwner(context, getUserHandleOf(managedProfileId));
+ }
+ return admin;
+ }
+ }
+
+ /**
+ * Check if {@param packageName} is restricted by the profile or device owner from using
+ * metered data.
+ *
+ * @return EnforcedAdmin object containing the enforced admin component and admin user details,
+ * or {@code null} if the {@param packageName} is not restricted.
+ */
+ public static EnforcedAdmin checkIfMeteredDataRestricted(Context context,
+ String packageName, int userId) {
+ final EnforcedAdmin enforcedAdmin = getProfileOrDeviceOwner(context,
+ getUserHandleOf(userId));
+ if (enforcedAdmin == null) {
+ return null;
+ }
+
+ final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ return dpm.isMeteredDataDisabledPackageForUser(enforcedAdmin.component, packageName, userId)
+ ? enforcedAdmin : null;
+ }
+
+ /**
+ * Checks if an admin has enforced minimum password quality or complexity requirements on the
+ * given user.
+ *
+ * @return EnforcedAdmin Object containing the enforced admin component and admin user details,
+ * or {@code null} if no quality requirements are set. If the requirements are set by
+ * multiple device admins, then the admin component will be set to {@code null} and userId to
+ * {@link UserHandle#USER_NULL}.
+ */
+ public static EnforcedAdmin checkIfPasswordQualityIsSet(Context context, int userId) {
+ final LockSettingCheck check =
+ (DevicePolicyManager dpm, ComponentName admin, @UserIdInt int checkUser) ->
+ dpm.getPasswordQuality(admin, checkUser)
+ > DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
+
+ final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ if (dpm == null) {
+ return null;
+ }
+
+ LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
+ final int aggregatedComplexity = dpm.getAggregatedPasswordComplexityForUser(userId);
+ if (aggregatedComplexity > DevicePolicyManager.PASSWORD_COMPLEXITY_NONE) {
+ // First, check if there's a Device Owner. If so, then only it can apply password
+ // complexity requiremnts (there can be no secondary profiles).
+ final UserHandle deviceOwnerUser = dpm.getDeviceOwnerUser();
+ if (deviceOwnerUser != null) {
+ return new EnforcedAdmin(dpm.getDeviceOwnerComponentOnAnyUser(), deviceOwnerUser);
+ }
+
+ // The complexity could be enforced by a Profile Owner - either in the current user
+ // or the current user is the parent user that is affected by the profile owner.
+ for (UserInfo userInfo : UserManager.get(context).getProfiles(userId)) {
+ final ComponentName profileOwnerComponent = dpm.getProfileOwnerAsUser(userInfo.id);
+ if (profileOwnerComponent != null) {
+ return new EnforcedAdmin(profileOwnerComponent, getUserHandleOf(userInfo.id));
+ }
+ }
+
+ // Should not get here: A Device Owner or Profile Owner should be found.
+ throw new IllegalStateException(
+ String.format("Could not find admin enforcing complexity %d for user %d",
+ aggregatedComplexity, userId));
+ }
+
+ if (sProxy.isSeparateProfileChallengeEnabled(lockPatternUtils, userId)) {
+ // userId is managed profile and has a separate challenge, only consider
+ // the admins in that user.
+ final List<ComponentName> admins = dpm.getActiveAdminsAsUser(userId);
+ if (admins == null) {
+ return null;
+ }
+ EnforcedAdmin enforcedAdmin = null;
+ final UserHandle user = getUserHandleOf(userId);
+ for (ComponentName admin : admins) {
+ if (check.isEnforcing(dpm, admin, userId)) {
+ if (enforcedAdmin == null) {
+ enforcedAdmin = new EnforcedAdmin(admin, user);
+ } else {
+ return EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN;
+ }
+ }
+ }
+ return enforcedAdmin;
+ } else {
+ return checkForLockSetting(context, userId, check);
+ }
+ }
+
+ /**
+ * Checks if any admin has set maximum time to lock.
+ *
+ * @return EnforcedAdmin Object containing the enforced admin component and admin user details,
+ * or {@code null} if no admin has set this restriction. If multiple admins has set this, then
+ * the admin component will be set to {@code null} and userId to {@link UserHandle#USER_NULL}
+ */
+ public static EnforcedAdmin checkIfMaximumTimeToLockIsSet(Context context) {
+ return checkForLockSetting(context, UserHandle.myUserId(),
+ (DevicePolicyManager dpm, ComponentName admin, @UserIdInt int userId) ->
+ dpm.getMaximumTimeToLock(admin, userId) > 0);
+ }
+
+ private interface LockSettingCheck {
+ boolean isEnforcing(DevicePolicyManager dpm, ComponentName admin, @UserIdInt int userId);
+ }
+
+ /**
+ * Checks whether any of the user's profiles enforce the lock setting. A managed profile is only
+ * included if it does not have a separate challenge.
+ *
+ * The user identified by {@param userId} is always included.
+ */
+ private static EnforcedAdmin checkForLockSetting(
+ Context context, @UserIdInt int userId, LockSettingCheck check) {
+ final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ if (dpm == null) {
+ return null;
+ }
+ final LockPatternUtils lockPatternUtils = new LockPatternUtils(context);
+ EnforcedAdmin enforcedAdmin = null;
+ // Return all admins for this user and the profiles that are visible from this
+ // user that do not use a separate work challenge.
+ for (UserInfo userInfo : UserManager.get(context).getProfiles(userId)) {
+ final List<ComponentName> admins = dpm.getActiveAdminsAsUser(userInfo.id);
+ if (admins == null) {
+ continue;
+ }
+ final UserHandle user = getUserHandleOf(userInfo.id);
+ final boolean isSeparateProfileChallengeEnabled =
+ sProxy.isSeparateProfileChallengeEnabled(lockPatternUtils, userInfo.id);
+ for (ComponentName admin : admins) {
+ if (!isSeparateProfileChallengeEnabled) {
+ if (check.isEnforcing(dpm, admin, userInfo.id)) {
+ if (enforcedAdmin == null) {
+ enforcedAdmin = new EnforcedAdmin(admin, user);
+ } else {
+ return EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN;
+ }
+ // This same admins could have set policies both on the managed profile
+ // and on the parent. So, if the admin has set the policy on the
+ // managed profile here, we don't need to further check if that admin
+ // has set policy on the parent admin.
+ continue;
+ }
+ }
+ if (userInfo.isManagedProfile()) {
+ // If userInfo.id is a managed profile, we also need to look at
+ // the policies set on the parent.
+ DevicePolicyManager parentDpm = sProxy.getParentProfileInstance(dpm, userInfo);
+ if (check.isEnforcing(parentDpm, admin, userInfo.id)) {
+ if (enforcedAdmin == null) {
+ enforcedAdmin = new EnforcedAdmin(admin, user);
+ } else {
+ return EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN;
+ }
+ }
+ }
+ }
+ }
+ return enforcedAdmin;
+ }
+
+ public static EnforcedAdmin getDeviceOwner(Context context) {
+ return getDeviceOwner(context, null);
+ }
+
+ private static EnforcedAdmin getDeviceOwner(Context context, String enforcedRestriction) {
+ final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ if (dpm == null) {
+ return null;
+ }
+ ComponentName adminComponent = dpm.getDeviceOwnerComponentOnAnyUser();
+ if (adminComponent != null) {
+ return new EnforcedAdmin(
+ adminComponent, enforcedRestriction, dpm.getDeviceOwnerUser());
+ }
+ return null;
+ }
+
+ private static EnforcedAdmin getProfileOwner(Context context, int userId) {
+ return getProfileOwner(context, null, userId);
+ }
+
+ private static EnforcedAdmin getProfileOwner(
+ Context context, String enforcedRestriction, int userId) {
+ if (userId == UserHandle.USER_NULL) {
+ return null;
+ }
+ final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ if (dpm == null) {
+ return null;
+ }
+ ComponentName adminComponent = dpm.getProfileOwnerAsUser(userId);
+ if (adminComponent != null) {
+ return new EnforcedAdmin(adminComponent, enforcedRestriction, getUserHandleOf(userId));
+ }
+ return null;
+ }
+
+ public static boolean isAdminInCurrentUserOrProfile(Context context, ComponentName admin) {
+ DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ UserManager um = UserManager.get(context);
+ for (UserInfo userInfo : um.getProfiles(UserHandle.myUserId())) {
+ if (dpm.isAdminActiveAsUser(admin, userInfo.id)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * Static {@link LockPatternUtils} and {@link DevicePolicyManager} wrapper for testing purposes.
+ * {@link LockPatternUtils} is an internal API not supported by robolectric.
+ * {@link DevicePolicyManager} has a {@code getProfileParent} not yet suppored by robolectric.
+ */
+ @VisibleForTesting
+ static Proxy sProxy = new Proxy();
+
+ @VisibleForTesting
+ static class Proxy {
+ public boolean isSeparateProfileChallengeEnabled(LockPatternUtils utils, int userHandle) {
+ return utils.isSeparateProfileChallengeEnabled(userHandle);
+ }
+
+ public DevicePolicyManager getParentProfileInstance(DevicePolicyManager dpm, UserInfo ui) {
+ return dpm.getParentProfileInstance(ui);
+ }
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/StorageMeasurement.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/StorageMeasurement.java
new file mode 100644
index 0000000..973b201
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/StorageMeasurement.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.settingslib;
+
+import android.app.usage.ExternalStorageStats;
+import android.app.usage.StorageStats;
+import android.app.usage.StorageStatsManager;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.AsyncTask;
+import android.os.Environment;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.os.storage.StorageVolume;
+import android.os.storage.VolumeInfo;
+import android.util.Log;
+import android.util.SparseArray;
+import android.util.SparseLongArray;
+
+import java.io.IOException;
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Utility for measuring the disk usage of internal storage or a physical
+ * {@link StorageVolume}.
+ */
+public class StorageMeasurement {
+ private static final String TAG = "StorageMeasurement";
+
+ public static class MeasurementDetails {
+ /** Size of storage device. */
+ public long totalSize;
+ /** Size of available space. */
+ public long availSize;
+ /** Size of all cached data. */
+ public long cacheSize;
+
+ /**
+ * Total disk space used by everything.
+ * <p>
+ * Key is {@link UserHandle}.
+ */
+ public SparseLongArray usersSize = new SparseLongArray();
+
+ /**
+ * Total disk space used by apps.
+ * <p>
+ * Key is {@link UserHandle}.
+ */
+ public SparseLongArray appsSize = new SparseLongArray();
+
+ /**
+ * Total disk space used by media on shared storage.
+ * <p>
+ * First key is {@link UserHandle}. Second key is media type, such as
+ * {@link Environment#DIRECTORY_PICTURES}.
+ */
+ public SparseArray<HashMap<String, Long>> mediaSize = new SparseArray<>();
+
+ /**
+ * Total disk space used by non-media on shared storage.
+ * <p>
+ * Key is {@link UserHandle}.
+ */
+ public SparseLongArray miscSize = new SparseLongArray();
+
+ @Override
+ public String toString() {
+ return "MeasurementDetails: [totalSize: " + totalSize + " availSize: " + availSize
+ + " cacheSize: " + cacheSize + " mediaSize: " + mediaSize
+ + " miscSize: " + miscSize + "usersSize: " + usersSize + "]";
+ }
+ }
+
+ public interface MeasurementReceiver {
+ void onDetailsChanged(MeasurementDetails details);
+ }
+
+ private WeakReference<MeasurementReceiver>
+ mReceiver;
+
+ private final Context mContext;
+ private final UserManager mUser;
+ private final StorageStatsManager mStats;
+
+ private final VolumeInfo mVolume;
+ private final VolumeInfo mSharedVolume;
+
+ public StorageMeasurement(Context context, VolumeInfo volume, VolumeInfo sharedVolume) {
+ mContext = context.getApplicationContext();
+ mUser = mContext.getSystemService(UserManager.class);
+ mStats = mContext.getSystemService(StorageStatsManager.class);
+
+ mVolume = volume;
+ mSharedVolume = sharedVolume;
+ }
+
+ public void setReceiver(MeasurementReceiver receiver) {
+ if (mReceiver == null || mReceiver.get() == null) {
+ mReceiver = new WeakReference<MeasurementReceiver>(receiver);
+ }
+ }
+
+ public void forceMeasure() {
+ measure();
+ }
+
+ public void measure() {
+ new StorageMeasurement.MeasureTask().execute();
+ }
+
+ public void onDestroy() {
+ mReceiver = null;
+ }
+
+ private class MeasureTask extends AsyncTask<Void, Void, MeasurementDetails> {
+ @Override
+ protected MeasurementDetails doInBackground(Void... params) {
+ return measureExactStorage();
+ }
+
+ @Override
+ protected void onPostExecute(MeasurementDetails result) {
+ final MeasurementReceiver receiver = (mReceiver != null) ? mReceiver.get() : null;
+ if (receiver != null) {
+ receiver.onDetailsChanged(result);
+ }
+ }
+ }
+
+ private MeasurementDetails measureExactStorage() {
+ final List<UserInfo> users = mUser.getUsers();
+
+ final long start = SystemClock.elapsedRealtime();
+
+ final MeasurementDetails details = new MeasurementDetails();
+ if (mVolume == null) return details;
+
+ if (mVolume.getType() == VolumeInfo.TYPE_PUBLIC
+ || mVolume.getType() == VolumeInfo.TYPE_STUB) {
+ details.totalSize = mVolume.getPath().getTotalSpace();
+ details.availSize = mVolume.getPath().getUsableSpace();
+ return details;
+ }
+
+ try {
+ details.totalSize = mStats.getTotalBytes(mVolume.fsUuid);
+ details.availSize = mStats.getFreeBytes(mVolume.fsUuid);
+ } catch (IOException e) {
+ // The storage volume became null while we were measuring it.
+ Log.w(TAG, e);
+ return details;
+ }
+
+ final long finishTotal = SystemClock.elapsedRealtime();
+ Log.d(TAG, "Measured total storage in " + (finishTotal - start) + "ms");
+
+ if (mSharedVolume != null && mSharedVolume.isMountedReadable()) {
+ for (UserInfo user : users) {
+ final HashMap<String, Long> mediaMap = new HashMap<>();
+ details.mediaSize.put(user.id, mediaMap);
+
+ final ExternalStorageStats stats;
+ try {
+ stats = mStats.queryExternalStatsForUser(mSharedVolume.fsUuid,
+ UserHandle.of(user.id));
+ } catch (IOException e) {
+ Log.w(TAG, e);
+ continue;
+ }
+
+ addValue(details.usersSize, user.id, stats.getTotalBytes());
+
+ // Track detailed data types
+ mediaMap.put(Environment.DIRECTORY_MUSIC, stats.getAudioBytes());
+ mediaMap.put(Environment.DIRECTORY_MOVIES, stats.getVideoBytes());
+ mediaMap.put(Environment.DIRECTORY_PICTURES, stats.getImageBytes());
+
+ final long miscBytes = stats.getTotalBytes() - stats.getAudioBytes()
+ - stats.getVideoBytes() - stats.getImageBytes();
+ addValue(details.miscSize, user.id, miscBytes);
+ }
+ }
+
+ final long finishShared = SystemClock.elapsedRealtime();
+ Log.d(TAG, "Measured shared storage in " + (finishShared - finishTotal) + "ms");
+
+ if ((mVolume.getType() == VolumeInfo.TYPE_PRIVATE) && mVolume.isMountedReadable()) {
+ for (UserInfo user : users) {
+ final StorageStats stats;
+ try {
+ stats = mStats.queryStatsForUser(mVolume.fsUuid, UserHandle.of(user.id));
+ } catch (IOException e) {
+ Log.w(TAG, e);
+ continue;
+ }
+
+ // Only count code once against current user
+ if (user.id == UserHandle.myUserId()) {
+ addValue(details.usersSize, user.id, stats.getAppBytes());
+ }
+
+ addValue(details.usersSize, user.id, stats.getDataBytes());
+ addValue(details.appsSize, user.id, stats.getAppBytes() + stats.getDataBytes());
+
+ details.cacheSize += stats.getCacheBytes();
+ }
+ }
+
+ final long finishPrivate = SystemClock.elapsedRealtime();
+ Log.d(TAG, "Measured private storage in " + (finishPrivate - finishShared) + "ms");
+
+ return details;
+ }
+
+ private static void addValue(SparseLongArray array, int key, long value) {
+ array.put(key, array.get(key) + value);
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/ActionDisabledByAdminController.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/ActionDisabledByAdminController.java
new file mode 100644
index 0000000..33b549f
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/ActionDisabledByAdminController.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.settingslib.enterprise;
+
+import android.annotation.NonNull;
+import android.annotation.UserIdInt;
+import android.content.Context;
+import android.content.DialogInterface;
+
+import androidx.annotation.Nullable;
+
+import com.android.tv.settings.library.settingslib.RestrictedLockUtils;
+
+/**
+ * A controller used to customize the action disabled by admin dialog.
+ */
+public interface ActionDisabledByAdminController {
+
+ /**
+ * Sets the {@link ActionDisabledLearnMoreButtonLauncher}.
+ */
+ void initialize(ActionDisabledLearnMoreButtonLauncher launcher);
+
+ /**
+ * Handles the adding and setting up of the learn more button. If button is not needed, then
+ * this method can be left empty.
+ */
+ void setupLearnMoreButton(Context context);
+
+ /**
+ * Returns the admin support dialog's title resource id.
+ */
+ String getAdminSupportTitle(@Nullable String restriction);
+
+ /**
+ * Returns the admin support dialog's content string.
+ */
+ CharSequence getAdminSupportContentString(Context context,
+ @Nullable CharSequence supportMessage);
+
+ /**
+ * Updates the enforced admin
+ */
+ void updateEnforcedAdmin(RestrictedLockUtils.EnforcedAdmin admin, @UserIdInt int adminUserId);
+
+ /**
+ * Returns a listener for handling positive button clicks
+ */
+ @Nullable
+ default DialogInterface.OnClickListener getPositiveButtonListener(@NonNull Context context,
+ @NonNull RestrictedLockUtils.EnforcedAdmin enforcedAdmin) {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java
new file mode 100644
index 0000000..1d46b7e
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.settingslib.enterprise;
+
+import static java.util.Objects.requireNonNull;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
+/**
+ * Helper class meant to set up the "Learn more" button in the action disabled dialog.
+ */
+public abstract class ActionDisabledLearnMoreButtonLauncher {
+
+ public static ResolveActivityChecker DEFAULT_RESOLVE_ACTIVITY_CHECKER =
+ (packageManager, url, userHandle) -> packageManager.resolveActivityAsUser(
+ createLearnMoreIntent(url),
+ PackageManager.MATCH_DEFAULT_ONLY,
+ userHandle.getIdentifier()) != null;
+
+ interface ResolveActivityChecker {
+ boolean canResolveActivityAsUser(
+ PackageManager packageManager, String url, UserHandle userHandle);
+ }
+
+ /**
+ * Sets up a "learn more" button which shows a screen with device policy settings
+ */
+ public final void setupLearnMoreButtonToShowAdminPolicies(Context context,
+ int enforcementAdminUserId, EnforcedAdmin enforcedAdmin) {
+ requireNonNull(context, "context cannot be null");
+ requireNonNull(enforcedAdmin, "enforcedAdmin cannot be null");
+
+ // The "Learn more" button appears only if the restriction is enforced by an admin in the
+ // same profile group or by the device owner. Otherwise the admin package and its policies
+ // are not accessible to the current user.
+ if (isSameProfileGroup(context, enforcementAdminUserId)
+ || isEnforcedByDeviceOwnerOnSystemUserMode(context, enforcementAdminUserId)) {
+ setLearnMoreButton(() -> showAdminPolicies(context, enforcedAdmin));
+ }
+ }
+
+ /**
+ * Sets up a "learn more" button which launches a help page
+ */
+ public final void setupLearnMoreButtonToLaunchHelpPage(
+ Context context, String url, UserHandle userHandle) {
+ requireNonNull(context, "context cannot be null");
+ requireNonNull(url, "url cannot be null");
+
+ setLearnMoreButton(() -> showHelpPage(context, url, userHandle));
+ }
+
+ /**
+ * Sets the "learning more" button.
+ *
+ * @param action action to be run when the button is tapped.
+ */
+ public abstract void setLearnMoreButton(Runnable action);
+
+ /**
+ * Launches the settings page with info about the given admin.
+ */
+ protected abstract void launchShowAdminPolicies(Context context, UserHandle user,
+ ComponentName admin);
+
+ /**
+ * Launches the settings page that shows all admins.
+ */
+ protected abstract void launchShowAdminSettings(Context context);
+
+ /**
+ * Callback to finish the activity associated with the launcher.
+ */
+ protected void finishSelf() {
+ }
+
+ @VisibleForTesting
+ protected boolean isSameProfileGroup(Context context, int enforcementAdminUserId) {
+ UserManager um = context.getSystemService(UserManager.class);
+
+ return um.isSameProfileGroup(enforcementAdminUserId, um.getProcessUserId());
+ }
+
+ private boolean isEnforcedByDeviceOwnerOnSystemUserMode(
+ Context context, int enforcementAdminUserId) {
+ if (enforcementAdminUserId != UserHandle.USER_SYSTEM) {
+ return false;
+ }
+ DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
+ return enforcementAdminUserId == dpm.getDeviceOwnerUserId();
+ }
+
+ /**
+ * Shows the help page using the given {@code url}.
+ */
+ @VisibleForTesting
+ public void showHelpPage(Context context, String url, UserHandle userHandle) {
+ context.startActivityAsUser(createLearnMoreIntent(url), userHandle);
+ finishSelf();
+ }
+
+ protected final boolean canLaunchHelpPage(
+ PackageManager packageManager,
+ String url,
+ UserHandle userHandle,
+ ResolveActivityChecker resolveActivityChecker) {
+ return resolveActivityChecker.canResolveActivityAsUser(packageManager, url, userHandle);
+ }
+
+ private void showAdminPolicies(Context context, EnforcedAdmin enforcedAdmin) {
+ if (enforcedAdmin.component != null) {
+ launchShowAdminPolicies(context, enforcedAdmin.user, enforcedAdmin.component);
+ } else {
+ launchShowAdminSettings(context);
+ }
+ finishSelf();
+ }
+
+ private static Intent createLearnMoreIntent(String url) {
+ return new Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(
+ Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/BaseActionDisabledByAdminController.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/BaseActionDisabledByAdminController.java
new file mode 100644
index 0000000..f3d6950
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/BaseActionDisabledByAdminController.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.settingslib.enterprise;
+
+import static java.util.Objects.requireNonNull;
+
+import android.annotation.UserIdInt;
+
+import com.android.internal.util.Preconditions;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
+/**
+ * Base class for {@link ActionDisabledByAdminController} implementations.
+ */
+abstract class BaseActionDisabledByAdminController
+ implements ActionDisabledByAdminController {
+
+ protected @UserIdInt
+ int mEnforcementAdminUserId;
+ protected EnforcedAdmin mEnforcedAdmin;
+ protected ActionDisabledLearnMoreButtonLauncher mLauncher;
+ protected final DeviceAdminStringProvider mStringProvider;
+
+ BaseActionDisabledByAdminController(DeviceAdminStringProvider stringProvider) {
+ mStringProvider = stringProvider;
+ }
+
+ @Override
+ public final void initialize(ActionDisabledLearnMoreButtonLauncher launcher) {
+ mLauncher = requireNonNull(launcher, "launcher cannot be null");
+ }
+
+ @Override
+ public final void updateEnforcedAdmin(EnforcedAdmin admin, int adminUserId) {
+ assertInitialized();
+ mEnforcementAdminUserId = adminUserId;
+ mEnforcedAdmin = requireNonNull(admin, "admin cannot be null");
+ }
+
+ protected final void assertInitialized() {
+ Preconditions.checkState(mLauncher != null, "must call initialize() first");
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/BiometricActionDisabledByAdminController.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/BiometricActionDisabledByAdminController.java
new file mode 100644
index 0000000..fc7f2dc
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/BiometricActionDisabledByAdminController.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.tv.settings.library.settingslib.enterprise;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+
+import com.android.tv.settings.library.settingslib.RestrictedLockUtils;
+
+public class BiometricActionDisabledByAdminController extends
+ BaseActionDisabledByAdminController {
+
+ private static final String TAG = "BiometricActionDisabledByAdminController";
+
+ // These MUST not change, as they are the stable API between here and device admin specified
+ // by the component below.
+ private static final String ACTION_LEARN_MORE =
+ "android.intent.action.MANAGE_RESTRICTED_SETTING";
+ private static final String EXTRA_SETTING_KEY = "extra_setting";
+ private static final String EXTRA_SETTING_VALUE = "biometric_disabled_by_admin_controller";
+
+ BiometricActionDisabledByAdminController(
+ DeviceAdminStringProvider stringProvider) {
+ super(stringProvider);
+ }
+
+ @Override
+ public void setupLearnMoreButton(Context context) {
+
+ }
+
+ @Override
+ public String getAdminSupportTitle(@Nullable String restriction) {
+ return mStringProvider.getDisabledBiometricsParentConsentTitle();
+ }
+
+ @Override
+ public CharSequence getAdminSupportContentString(Context context,
+ @Nullable CharSequence supportMessage) {
+ return mStringProvider.getDisabledBiometricsParentConsentContent();
+ }
+
+ @Override
+ public DialogInterface.OnClickListener getPositiveButtonListener(@NonNull Context context,
+ @NonNull RestrictedLockUtils.EnforcedAdmin enforcedAdmin) {
+ return (dialog, which) -> {
+ Log.d(TAG, "Positive button clicked, component: " + enforcedAdmin.component);
+ final Intent intent = new Intent(ACTION_LEARN_MORE)
+ .setComponent(enforcedAdmin.component)
+ .putExtra(EXTRA_SETTING_KEY, EXTRA_SETTING_VALUE)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(intent);
+ };
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/DeviceAdminStringProvider.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/DeviceAdminStringProvider.java
new file mode 100644
index 0000000..b0bbcd8
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/DeviceAdminStringProvider.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.tv.settings.library.settingslib.enterprise;
+
+/**
+ * A {@code String} provider for the action disabled by admin dialog.
+ */
+public interface DeviceAdminStringProvider {
+
+ /**
+ * Returns the default dialog title for the case when an action is disabled by policy on a
+ * managed device.
+ */
+ String getDefaultDisabledByPolicyTitle();
+
+ /**
+ * Returns the dialog title for the case when volume adjusting is disabled.
+ */
+ String getDisallowAdjustVolumeTitle();
+
+ /**
+ * Returns the dialog title for the case when outgoing calls are disabled.
+ */
+ String getDisallowOutgoingCallsTitle();
+
+ /**
+ * Returns the dialog title for the case when sending SMS is disabled.
+ */
+ String getDisallowSmsTitle();
+
+ /**
+ * Returns the dialog title for the case when the camera is disabled.
+ */
+ String getDisableCameraTitle();
+
+ /**
+ * Returns the dialog title for the case when screen capturing is disabled.
+ */
+ String getDisableScreenCaptureTitle();
+
+ /**
+ * Returns the dialog title for the case when suspending apps is disabled.
+ */
+ String getSuspendPackagesTitle();
+
+ /**
+ * Returns the default dialog content for the case when an action is disabled by policy.
+ */
+ String getDefaultDisabledByPolicyContent();
+
+ /**
+ * Returns the URL for the page to be shown when the learn more button is chosen.
+ */
+ String getLearnMoreHelpPageUrl();
+
+ /**
+ * Returns the default dialog title for the case when an action is disabled by policy on
+ * a financed device.
+ */
+ String getDisabledByPolicyTitleForFinancedDevice();
+
+ /**
+ * Returns the dialog title for when biometrics require parental consent.
+ */
+ String getDisabledBiometricsParentConsentTitle();
+
+ /**
+ * Returns the dialog contents for when biometrics require parental consent.
+ */
+ String getDisabledBiometricsParentConsentContent();
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/FinancedDeviceActionDisabledByAdminController.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/FinancedDeviceActionDisabledByAdminController.java
new file mode 100644
index 0000000..bb6ea4e
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/FinancedDeviceActionDisabledByAdminController.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.tv.settings.library.settingslib.enterprise;
+
+import android.content.Context;
+
+import androidx.annotation.Nullable;
+
+/**
+ * An {@link ActionDisabledByAdminController} to be used with financed devices.
+ */
+final class FinancedDeviceActionDisabledByAdminController
+ extends BaseActionDisabledByAdminController {
+
+ FinancedDeviceActionDisabledByAdminController(DeviceAdminStringProvider stringProvider) {
+ super(stringProvider);
+ }
+
+ @Override
+ public void setupLearnMoreButton(Context context) {
+ assertInitialized();
+
+ mLauncher.setupLearnMoreButtonToShowAdminPolicies(context, mEnforcementAdminUserId,
+ mEnforcedAdmin);
+ }
+
+ @Override
+ public String getAdminSupportTitle(@Nullable String restriction) {
+ return mStringProvider.getDisabledByPolicyTitleForFinancedDevice();
+ }
+
+ @Override
+ public CharSequence getAdminSupportContentString(Context context, CharSequence supportMessage) {
+ return supportMessage;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java
new file mode 100644
index 0000000..ff1b2ff
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.settingslib.enterprise;
+
+import static java.util.Objects.requireNonNull;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.text.TextUtils;
+
+import androidx.annotation.Nullable;
+
+import com.android.tv.settings.library.settingslib.enterprise.ActionDisabledLearnMoreButtonLauncher.ResolveActivityChecker;
+
+
+/**
+ * An {@link ActionDisabledByAdminController} to be used with managed devices.
+ */
+final class ManagedDeviceActionDisabledByAdminController
+ extends BaseActionDisabledByAdminController {
+
+ interface ForegroundUserChecker {
+ boolean isUserForeground(Context context, UserHandle userHandle);
+ }
+
+ public final static ForegroundUserChecker DEFAULT_FOREGROUND_USER_CHECKER =
+ ManagedDeviceActionDisabledByAdminController::isUserForeground;
+
+ /**
+ * The {@link UserHandle} which is preferred for launching the web help page in
+ * <p>If not able to launch the web help page in this user, the current user will be used as
+ * fallback instead. If the current user cannot open it either, the admin policies page will
+ * be used instead.
+ */
+ private final UserHandle mPreferredUserHandle;
+
+ private final ForegroundUserChecker mForegroundUserChecker;
+ private final ResolveActivityChecker mResolveActivityChecker;
+
+ /**
+ * Constructs a {@link ManagedDeviceActionDisabledByAdminController}
+ *
+ * @param preferredUserHandle - user on which to launch the help web page, if necessary
+ */
+ ManagedDeviceActionDisabledByAdminController(
+ DeviceAdminStringProvider stringProvider,
+ UserHandle preferredUserHandle,
+ ForegroundUserChecker foregroundUserChecker,
+ ResolveActivityChecker resolveActivityChecker) {
+ super(stringProvider);
+ mPreferredUserHandle = requireNonNull(preferredUserHandle);
+ mForegroundUserChecker = requireNonNull(foregroundUserChecker);
+ mResolveActivityChecker = requireNonNull(resolveActivityChecker);
+ }
+
+ @Override
+ public void setupLearnMoreButton(Context context) {
+ assertInitialized();
+
+ String url = mStringProvider.getLearnMoreHelpPageUrl();
+
+ if (!TextUtils.isEmpty(url)
+ && canLaunchHelpPageInPreferredOrCurrentUser(context, url, mPreferredUserHandle)) {
+ setupLearnMoreButtonToLaunchHelpPage(context, url, mPreferredUserHandle);
+ } else {
+ mLauncher.setupLearnMoreButtonToShowAdminPolicies(context, mEnforcementAdminUserId,
+ mEnforcedAdmin);
+ }
+ }
+
+ private boolean canLaunchHelpPageInPreferredOrCurrentUser(
+ Context context, String url, UserHandle preferredUserHandle) {
+ PackageManager packageManager = context.getPackageManager();
+ if (mLauncher.canLaunchHelpPage(
+ packageManager, url, preferredUserHandle, mResolveActivityChecker)
+ && mForegroundUserChecker.isUserForeground(context, preferredUserHandle)) {
+ return true;
+ }
+ return mLauncher.canLaunchHelpPage(
+ packageManager, url, context.getUser(), mResolveActivityChecker);
+ }
+
+ /**
+ * Sets up the "Learn more" button to launch the web help page in the {@code
+ * preferredUserHandle} user. If not possible to launch it there, it sets up the button to
+ * launch it in the current user instead.
+ */
+ private void setupLearnMoreButtonToLaunchHelpPage(
+ Context context, String url, UserHandle preferredUserHandle) {
+ PackageManager packageManager = context.getPackageManager();
+ if (mLauncher.canLaunchHelpPage(
+ packageManager, url, preferredUserHandle, mResolveActivityChecker)
+ && mForegroundUserChecker.isUserForeground(context, preferredUserHandle)) {
+ mLauncher.setupLearnMoreButtonToLaunchHelpPage(context, url, preferredUserHandle);
+ }
+ if (mLauncher.canLaunchHelpPage(
+ packageManager, url, context.getUser(), mResolveActivityChecker)) {
+ mLauncher.setupLearnMoreButtonToLaunchHelpPage(context, url, context.getUser());
+ }
+ }
+
+ private static boolean isUserForeground(Context context, UserHandle userHandle) {
+ return context.createContextAsUser(userHandle, /* flags= */ 0)
+ .getSystemService(UserManager.class).isUserForeground();
+ }
+
+ @Override
+ public String getAdminSupportTitle(@Nullable String restriction) {
+ if (restriction == null) {
+ return mStringProvider.getDefaultDisabledByPolicyTitle();
+ }
+ switch (restriction) {
+ case UserManager.DISALLOW_ADJUST_VOLUME:
+ return mStringProvider.getDisallowAdjustVolumeTitle();
+ case UserManager.DISALLOW_OUTGOING_CALLS:
+ return mStringProvider.getDisallowOutgoingCallsTitle();
+ case UserManager.DISALLOW_SMS:
+ return mStringProvider.getDisallowSmsTitle();
+ case DevicePolicyManager.POLICY_DISABLE_CAMERA:
+ return mStringProvider.getDisableCameraTitle();
+ case DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE:
+ return mStringProvider.getDisableScreenCaptureTitle();
+ case DevicePolicyManager.POLICY_SUSPEND_PACKAGES:
+ return mStringProvider.getSuspendPackagesTitle();
+ default:
+ return mStringProvider.getDefaultDisabledByPolicyTitle();
+ }
+ }
+
+ @Override
+ public CharSequence getAdminSupportContentString(Context context, CharSequence supportMessage) {
+ return supportMessage != null
+ ? supportMessage
+ : mStringProvider.getDefaultDisabledByPolicyContent();
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/startup/StartupVerificationFeatureProvider.java b/SettingsAPI/java/com/android/tv/settings/library/startup/startup/StartupVerificationFeatureProvider.java
similarity index 92%
rename from Settings/src/com/android/tv/settings/startup/StartupVerificationFeatureProvider.java
rename to SettingsAPI/java/com/android/tv/settings/library/startup/startup/StartupVerificationFeatureProvider.java
index eab0a42..0ac1af2 100644
--- a/Settings/src/com/android/tv/settings/startup/StartupVerificationFeatureProvider.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/startup/startup/StartupVerificationFeatureProvider.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.startup;
+package com.android.tv.settings.library.startup.startup;
import android.app.Activity;
@@ -33,7 +33,8 @@
* - show challenge/informative UI (e.g., adult re-auth) based on device's status and invoke
* setResult(RESULT_OK) before finishing ONLY IF it has determined that TvSettings should be
* launched normally.
- * @param activity the activity to invoke startActivityForResult() from
+ *
+ * @param activity the activity to invoke startActivityForResult() from
* @param requestCode the requestCode expected by onActivityResult() to receive result of
* startup verification activity
* @return whether the Activity is found and started. The false result, aka the absence of the
diff --git a/Settings/src/com/android/tv/settings/startup/StartupVerificationFeatureProviderImpl.java b/SettingsAPI/java/com/android/tv/settings/library/startup/startup/StartupVerificationFeatureProviderImpl.java
similarity index 94%
rename from Settings/src/com/android/tv/settings/startup/StartupVerificationFeatureProviderImpl.java
rename to SettingsAPI/java/com/android/tv/settings/library/startup/startup/StartupVerificationFeatureProviderImpl.java
index 5398013..aca718d 100644
--- a/Settings/src/com/android/tv/settings/startup/StartupVerificationFeatureProviderImpl.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/startup/startup/StartupVerificationFeatureProviderImpl.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.startup;
+package com.android.tv.settings.library.startup.startup;
import android.app.Activity;
diff --git a/Settings/src/com/android/tv/settings/startup/StartupVerificationFeatureProviderImplX.java b/SettingsAPI/java/com/android/tv/settings/library/startup/startup/StartupVerificationFeatureProviderImplX.java
similarity index 89%
rename from Settings/src/com/android/tv/settings/startup/StartupVerificationFeatureProviderImplX.java
rename to SettingsAPI/java/com/android/tv/settings/library/startup/startup/StartupVerificationFeatureProviderImplX.java
index 8c81ce4..ce101e4 100644
--- a/Settings/src/com/android/tv/settings/startup/StartupVerificationFeatureProviderImplX.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/startup/startup/StartupVerificationFeatureProviderImplX.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.startup;
+package com.android.tv.settings.library.startup.startup;
import android.app.Activity;
import android.content.Intent;
@@ -25,7 +25,7 @@
import androidx.annotation.NonNull;
-import com.android.tv.settings.R;
+import com.android.tv.settings.library.util.ResourcesUtil;
import java.util.List;
@@ -41,9 +41,9 @@
public boolean startStartupVerificationActivityForResult(
@NonNull Activity activity, int requestCode) {
final String startupVerificationAction =
- activity.getString(R.string.startup_verification_action);
+ ResourcesUtil.getString(activity, "startup_verification_action");
final String startupVerificationPackage =
- activity.getString(R.string.startup_verification_package);
+ ResourcesUtil.getString(activity, "startup_verification_package");
if (TextUtils.isEmpty(startupVerificationAction)
|| TextUtils.isEmpty(startupVerificationPackage)) {
Log.e(TAG, "Activity for handling startup verification is undefined.");
diff --git a/SettingsAPI/java/com/android/tv/settings/library/system/DateTimeState.java b/SettingsAPI/java/com/android/tv/settings/library/system/DateTimeState.java
new file mode 100644
index 0000000..3c6b27a
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/system/DateTimeState.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.system;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_SYSTEM_DATE_TIME;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.text.format.DateFormat;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.State;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.users.RestrictedProfileModel;
+
+import java.util.Calendar;
+import java.util.Date;
+
+/** State to provide data for rendering DateTimeFragmentCompat. */
+public class DateTimeState implements State {
+ private static final String KEY_AUTO_DATE_TIME = "auto_date_time";
+ private static final String KEY_SET_DATE = "set_date";
+ private static final String KEY_SET_TIME = "set_time";
+ private static final String KEY_SET_TIME_ZONE = "set_time_zone";
+ private static final String KEY_USE_24_HOUR = "use_24_hour";
+
+ private static final String AUTO_DATE_TIME_NTP = "network";
+ private static final String AUTO_DATE_TIME_TS = "transport_stream";
+ private static final String AUTO_DATE_TIME_OFF = "off";
+
+ private static final String HOURS_12 = "12";
+ private static final String HOURS_24 = "24";
+
+ private Calendar mNow = Calendar.getInstance();
+ private final Calendar mDummyDate = Calendar.getInstance();
+
+ private PreferenceCompat mDatePref;
+ private PreferenceCompat mTimePref;
+ private PreferenceCompat mTimeZonePref;
+ private PreferenceCompat mTime24Pref;
+ private PreferenceCompat mAutoDateTimePref;
+
+ private final Context mContext;
+ private final UIUpdateCallback mUIUpdateCallback;
+ private PreferenceCompatManager mPreferenceCompatManager;
+
+ public DateTimeState(Context context, UIUpdateCallback callback) {
+ mUIUpdateCallback = callback;
+ mContext = context;
+ }
+
+ private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ updateTimeAndDateDisplay();
+ }
+ };
+
+ @Override
+ public void onAttach() {
+ // no-op
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ mPreferenceCompatManager = new PreferenceCompatManager();
+
+ final boolean isRestricted = isRestrictedProfileInEffect();
+ mDatePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_SET_DATE);
+ mDatePref.setVisible(!isRestricted);
+ mTimePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_SET_TIME);
+ mTimePref.setVisible(!isRestricted);
+ mAutoDateTimePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_AUTO_DATE_TIME);
+ mAutoDateTimePref.setValue(getAutoDateTimeState());
+ mAutoDateTimePref.setVisible(!isRestricted);
+ mTimeZonePref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_SET_TIME_ZONE);
+ mTimeZonePref.setVisible(!isRestricted);
+ mTime24Pref = mPreferenceCompatManager.getOrCreatePrefCompat(KEY_USE_24_HOUR);
+ }
+
+ @Override
+ public void onStart() {
+ // no-op
+ }
+
+ @Override
+ public void onResume() {
+ // Register for time ticks and other reasons for time change
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_TIME_TICK);
+ filter.addAction(Intent.ACTION_TIME_CHANGED);
+ filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
+ mContext.registerReceiver(mIntentReceiver, filter, null, null);
+
+ updateTimeAndDateDisplay();
+ updateTimeDateEnable();
+ }
+
+ @Override
+ public void onPause() {
+ mContext.unregisterReceiver(mIntentReceiver);
+ }
+
+ @Override
+ public void onStop() {
+ // no-op
+ }
+
+ @Override
+ public void onDestroy() {
+ // no-op
+ }
+
+ @Override
+ public void onDetach() {
+ // no-op
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ // no-op
+ return false;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // no-op
+ }
+
+ @Override
+ public boolean onPreferenceChange(String[] key, Object newValue) {
+ if (TextUtils.equals(key[0], KEY_AUTO_DATE_TIME)) {
+ String value = (String) newValue;
+ if (TextUtils.equals(value, AUTO_DATE_TIME_NTP)) {
+ setAutoDateTime(true);
+ } else if (TextUtils.equals(value, AUTO_DATE_TIME_TS)) {
+ throw new IllegalStateException("TS date is not yet implemented");
+// mTvInputManager.syncTimefromBroadcast(true);
+// setAutoDateTime(false);
+ } else if (TextUtils.equals(value, AUTO_DATE_TIME_OFF)) {
+ setAutoDateTime(false);
+ } else {
+ throw new IllegalArgumentException("Unknown auto time value " + value);
+ }
+ updateTimeDateEnable();
+ updateAutoDateTimeUI();
+ } else if (TextUtils.equals(key[0], KEY_USE_24_HOUR)) {
+ final boolean use24Hour = (Boolean) newValue;
+ set24Hour(use24Hour);
+ timeUpdated(use24Hour);
+ updateTimeAndDateDisplayUI();
+ }
+ return true;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_SYSTEM_DATE_TIME;
+ }
+
+ private void updateTimeAndDateDisplay() {
+ mTime24Pref.setChecked(is24Hour());
+
+ mNow = Calendar.getInstance();
+ mDummyDate.setTimeZone(mNow.getTimeZone());
+ // We use December 31st because it's unambiguous when demonstrating the date format.
+ // We use 13:00 so we can demonstrate the 12/24 hour options.
+ mDummyDate.set(mNow.get(Calendar.YEAR), 11, 31, 13, 0, 0);
+ Date dummyDate = mDummyDate.getTime();
+
+ mDatePref.setSummary(DateFormat.getLongDateFormat(mContext).format(mNow.getTime()));
+ mTimePref.setSummary(DateFormat.getTimeFormat(mContext).format(mNow.getTime()));
+ mTime24Pref.setSummary(DateFormat.getTimeFormat(mContext).format(dummyDate));
+
+ updateTimeAndDateDisplayUI();
+ }
+
+ private void updateTimeAndDateDisplayUI() {
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mDatePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mTimePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mTimeZonePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mTime24Pref);
+ }
+ }
+
+ private void updateAutoDateTimeUI() {
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mAutoDateTimePref);
+ }
+ }
+
+ private void updateTimeDateEnable() {
+ final boolean enable = TextUtils.equals(getAutoDateTimeState(), AUTO_DATE_TIME_OFF);
+
+ mDatePref.setEnabled(enable);
+ mTimePref.setEnabled(enable);
+
+ if (mUIUpdateCallback != null) {
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mDatePref);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), mTimePref);
+ }
+ }
+
+ private boolean is24Hour() {
+ return DateFormat.is24HourFormat(mContext);
+ }
+
+ private void timeUpdated(boolean use24Hour) {
+ Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED);
+ int timeFormatPreference =
+ use24Hour ? Intent.EXTRA_TIME_PREF_VALUE_USE_24_HOUR
+ : Intent.EXTRA_TIME_PREF_VALUE_USE_12_HOUR;
+ timeChanged.putExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, timeFormatPreference);
+ mContext.sendBroadcast(timeChanged);
+ }
+
+ private void set24Hour(boolean use24Hour) {
+ Settings.System.putString(mContext.getContentResolver(),
+ Settings.System.TIME_12_24,
+ use24Hour ? HOURS_24 : HOURS_12);
+ }
+
+ private void setAutoDateTime(boolean on) {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.AUTO_TIME, on ? 1 : 0);
+ }
+
+ private String getAutoDateTimeState() {
+ int value = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.AUTO_TIME, 0);
+ if (value > 0) {
+ return AUTO_DATE_TIME_NTP;
+ }
+
+ return AUTO_DATE_TIME_OFF;
+ }
+
+ /** Get current time for updating UI of date & time */
+ public Calendar getNow() {
+ return mNow;
+ }
+
+ private boolean isRestrictedProfileInEffect() {
+ return new RestrictedProfileModel(mContext).isCurrentUser();
+ }
+
+ @Override
+ public void onDisplayDialogPreference(String[] key) {
+
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/system/DevelopmentState.java b/SettingsAPI/java/com/android/tv/settings/library/system/DevelopmentState.java
new file mode 100644
index 0000000..d11984e
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/system/DevelopmentState.java
@@ -0,0 +1,419 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.system;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_DEVELOPMENT;
+import static com.android.tv.settings.library.overlay.FlavorUtils.X_EXPERIENCE_FLAVORS_MASK;
+
+import android.app.AppOpsManager;
+import android.app.admin.DevicePolicyManager;
+import android.app.backup.IBackupManager;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.net.wifi.WifiManager;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.ServiceManager;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.sysprop.AdbProperties;
+import android.view.IWindowManager;
+import android.widget.Toast;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.overlay.FlavorUtils;
+import com.android.tv.settings.library.system.development.audio.AudioDebug;
+import com.android.tv.settings.library.system.development.audio.AudioMetrics;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+import com.android.tv.settings.library.util.ResourcesUtil;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+
+public class DevelopmentState extends PreferenceControllerState {
+ private static final String TAG = "DevelopmentSettings";
+
+ private static final String ENABLE_DEVELOPER = "development_settings_enable";
+ private static final String ENABLE_ADB = "enable_adb";
+ private static final String CLEAR_ADB_KEYS = "clear_adb_keys";
+ private static final String ENABLE_TERMINAL = "enable_terminal";
+ private static final String KEEP_SCREEN_ON = "keep_screen_on";
+ private static final String BT_HCI_SNOOP_LOG = "bt_hci_snoop_log";
+ private static final String BTSNOOP_LOG_MODE_PROPERTY = "persist.bluetooth.btsnooplogmode";
+ private static final String ENABLE_OEM_UNLOCK = "oem_unlock_enable";
+ private static final String HDCP_CHECKING_KEY = "hdcp_checking";
+ private static final String HDCP_CHECKING_PROPERTY = "persist.sys.hdcp_checking";
+ private static final String LOCAL_BACKUP_PASSWORD = "local_backup_password";
+ private static final String BUGREPORT = "bugreport";
+ private static final String BUGREPORT_IN_POWER_KEY = "bugreport_in_power";
+
+ private static final String DEBUG_APP_KEY = "debug_app";
+ private static final String WAIT_FOR_DEBUGGER_KEY = "wait_for_debugger";
+ private static final String MOCK_LOCATION_APP_KEY = "mock_location_app";
+ private static final String VERIFY_APPS_OVER_USB_KEY = "verify_apps_over_usb";
+ private static final String DEBUG_VIEW_ATTRIBUTES = "debug_view_attributes";
+ private static final String FORCE_ALLOW_ON_EXTERNAL_KEY = "force_allow_on_external";
+ private static final String STRICT_MODE_KEY = "strict_mode";
+ private static final String POINTER_LOCATION_KEY = "pointer_location";
+ private static final String SHOW_TOUCHES_KEY = "show_touches";
+ private static final String SHOW_SCREEN_UPDATES_KEY = "show_screen_updates";
+ private static final String DISABLE_OVERLAYS_KEY = "disable_overlays";
+ private static final String SIMULATE_COLOR_SPACE = "simulate_color_space";
+ private static final String USB_AUDIO_KEY = "usb_audio";
+ private static final String RECORD_AUDIO_KEY = "record_audio";
+ private static final String PLAY_RECORDED_AUDIO_KEY = "play_recorded_audio";
+ private static final String SAVE_RECORDED_AUDIO_KEY = "save_recorded_audio";
+ private static final String TIME_TO_START_READ_KEY = "time_to_start_read";
+ private static final String TIME_TO_VALID_AUDIO_KEY = "time_to_valid_audio";
+ private static final String EMPTY_AUDIO_DURATION_KEY = "empty_audio_duration";
+ private static final String FORCE_MSAA_KEY = "force_msaa";
+ private static final String TRACK_FRAME_TIME_KEY = "track_frame_time";
+ private static final String SHOW_NON_RECTANGULAR_CLIP_KEY = "show_non_rect_clip";
+ private static final String SHOW_HW_SCREEN_UPDATES_KEY = "show_hw_screen_updates";
+ private static final String SHOW_HW_LAYERS_UPDATES_KEY = "show_hw_layers_updates";
+ private static final String DEBUG_HW_OVERDRAW_KEY = "debug_hw_overdraw";
+ private static final String DEBUG_LAYOUT_KEY = "debug_layout";
+ private static final String FORCE_RTL_LAYOUT_KEY = "force_rtl_layout_all_locales";
+ private static final String WINDOW_BLURS_KEY = "window_blurs";
+ private static final String WINDOW_ANIMATION_SCALE_KEY = "window_animation_scale";
+ private static final String TRANSITION_ANIMATION_SCALE_KEY = "transition_animation_scale";
+ private static final String ANIMATOR_DURATION_SCALE_KEY = "animator_duration_scale";
+ private static final String OVERLAY_DISPLAY_DEVICES_KEY = "overlay_display_devices";
+ private static final String DEBUG_DEBUGGING_CATEGORY_KEY = "debug_debugging_category";
+
+ private static final String WIFI_DISPLAY_CERTIFICATION_KEY = "wifi_display_certification";
+ private static final String WIFI_VERBOSE_LOGGING_KEY = "wifi_verbose_logging";
+ private static final String USB_CONFIGURATION_KEY = "select_usb_configuration";
+ private static final String MOBILE_DATA_ALWAYS_ON = "mobile_data_always_on";
+ private static final String KEY_COLOR_MODE = "color_mode";
+ private static final String FORCE_RESIZABLE_KEY = "force_resizable_activities";
+
+ private static final String INACTIVE_APPS_KEY = "inactive_apps";
+
+ private static final String OPENGL_TRACES_KEY = "enable_opengl_traces";
+
+ private static final String IMMEDIATELY_DESTROY_ACTIVITIES_KEY =
+ "immediately_destroy_activities";
+ private static final String APP_PROCESS_LIMIT_KEY = "app_process_limit";
+
+ private static final String SHOW_ALL_ANRS_KEY = "show_all_anrs";
+
+ private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";
+
+ private static final String TERMINAL_APP_PACKAGE = "com.android.terminal";
+
+ private static final String KEY_CONVERT_FBE = "convert_to_file_encryption";
+
+ private static final int RESULT_DEBUG_APP = 1000;
+ private static final int RESULT_MOCK_LOCATION_APP = 1001;
+
+ private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst";
+
+ private static final String DEFAULT_LOG_RING_BUFFER_SIZE_IN_BYTES = "262144"; // 256K
+
+ private static final int[] MOCK_LOCATION_APP_OPS = new int[]{AppOpsManager.OP_MOCK_LOCATION};
+
+ private static final String STATE_SHOWING_DIALOG_KEY = "showing_dialog_key";
+
+ private String mPendingDialogKey;
+
+ private IWindowManager mWindowManager;
+ private IBackupManager mBackupManager;
+ private DevicePolicyManager mDpm;
+ private UserManager mUm;
+ private WifiManager mWifiManager;
+ private ContentResolver mContentResolver;
+
+ private boolean mLastEnabledState;
+ private boolean mHaveDebugSettings;
+
+ private PreferenceCompat mEnableDeveloper;
+ private PreferenceCompat mEnableAdb;
+ private PreferenceCompat mClearAdbKeys;
+ private PreferenceCompat mEnableTerminal;
+ private PreferenceCompat mBugreport;
+ private PreferenceCompat mKeepScreenOn;
+ private PreferenceCompat mDebugDebuggingCategory;
+ private PreferenceCompat mBtHciSnoopLog;
+ private PreferenceCompat mDebugViewAttributes;
+ private PreferenceCompat mForceAllowOnExternal;
+
+ private PreferenceCompat mPassword;
+ private String mDebugApp;
+ private PreferenceCompat mDebugAppPref;
+
+ private String mMockLocationApp;
+ private PreferenceCompat mMockLocationAppPref;
+
+ private PreferenceCompat mWaitForDebugger;
+ private PreferenceCompat mVerifyAppsOverUsb;
+ private PreferenceCompat mWifiDisplayCertification;
+ private PreferenceCompat mWifiVerboseLogging;
+ private PreferenceCompat mMobileDataAlwaysOn;
+
+ private PreferenceCompat mStrictMode;
+ private PreferenceCompat mPointerLocation;
+ private PreferenceCompat mShowTouches;
+ private PreferenceCompat mShowScreenUpdates;
+ private PreferenceCompat mDisableOverlays;
+ private PreferenceCompat mForceMsaa;
+ private PreferenceCompat mShowHwScreenUpdates;
+ private PreferenceCompat mShowHwLayersUpdates;
+ private PreferenceCompat mDebugLayout;
+ private PreferenceCompat mForceRtlLayout;
+ private PreferenceCompat mWindowBlurs;
+ private PreferenceCompat mDebugHwOverdraw;
+ private PreferenceCompat mTrackFrameTime;
+ private PreferenceCompat mShowNonRectClip;
+ private PreferenceCompat mWindowAnimationScale;
+ private PreferenceCompat mTransitionAnimationScale;
+ private PreferenceCompat mAnimatorDurationScale;
+ private PreferenceCompat mOverlayDisplayDevices;
+ private PreferenceCompat mOpenGLTraces;
+ private PreferenceCompat mSimulateColorSpace;
+ private PreferenceCompat mUSBAudio;
+ private PreferenceCompat mRecordAudio;
+ private PreferenceCompat mPlayRecordedAudio;
+ private PreferenceCompat mSaveAudio;
+ private PreferenceCompat mTimeToStartRead;
+ private PreferenceCompat mTimeToValidAudio;
+ private PreferenceCompat mEmptyAudioDuration;
+ private PreferenceCompat mImmediatelyDestroyActivities;
+ private PreferenceCompat mAppProcessLimit;
+ private PreferenceCompat mShowAllANRs;
+ private PreferenceCompat mForceResizable;
+ private PreferenceCompat mHdcpChecking;
+
+ private boolean mUnavailable;
+
+ private AudioDebug mAudioDebug;
+ private final ArrayList<PreferenceCompat> mAllPrefCompats = new ArrayList<>();
+ private final ArrayList<PreferenceCompat> mResetSwitchPrefCompats = new ArrayList<>();
+ private final HashSet<PreferenceCompat> mDisabledPrefCompats = new HashSet<>();
+
+ public DevelopmentState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ if (extras != null) {
+ // Don't show this in onCreate since we might be on the back stack
+ mPendingDialogKey = extras.getString(STATE_SHOWING_DIALOG_KEY);
+ }
+
+ mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
+ mBackupManager = IBackupManager.Stub.asInterface(
+ ServiceManager.getService(Context.BACKUP_SERVICE));
+ mDpm = mContext.getSystemService(DevicePolicyManager.class);
+ mUm = mContext.getSystemService(UserManager.class);
+
+ mWifiManager = mContext.getSystemService(WifiManager.class);
+
+ mContentResolver = mContext.getContentResolver();
+
+ mAudioDebug = new AudioDebug(mContext,
+ (boolean successful) -> onAudioRecorded(successful),
+ (AudioMetrics.Data data) -> updateAudioRecordingMetrics(data));
+ mEnableDeveloper = mPreferenceCompatManager.getOrCreatePrefCompat(ENABLE_DEVELOPER);
+ mEnableAdb = findAndInitSwitchPrefCompat(ENABLE_DEVELOPER);
+ mDebugDebuggingCategory = mPreferenceCompatManager.getOrCreatePrefCompat(
+ DEBUG_DEBUGGING_CATEGORY_KEY);
+ mClearAdbKeys = mPreferenceCompatManager.getOrCreatePrefCompat(CLEAR_ADB_KEYS);
+ mKeepScreenOn = mPreferenceCompatManager.getOrCreatePrefCompat(KEEP_SCREEN_ON);
+ if (!AdbProperties.secure().orElse(false)) {
+ mClearAdbKeys.setVisible(false);
+ }
+ mAllPrefCompats.add(mClearAdbKeys);
+ mEnableTerminal = findAndInitSwitchPrefCompat(ENABLE_TERMINAL);
+ if (!isPackageInstalled(mContext, TERMINAL_APP_PACKAGE)) {
+ mEnableTerminal.setVisible(false);
+ }
+ mBugreport = mPreferenceCompatManager.getOrCreatePrefCompat(BUGREPORT);
+ if (!showBugReportPreference()) {
+ mBugreport.setVisible(false);
+ }
+
+ mKeepScreenOn = findAndInitSwitchPrefCompat(KEEP_SCREEN_ON);
+ mBtHciSnoopLog = addListPrefCompat(BT_HCI_SNOOP_LOG);
+ mDebugViewAttributes = findAndInitSwitchPrefCompat(DEBUG_VIEW_ATTRIBUTES);
+ mForceAllowOnExternal = findAndInitSwitchPrefCompat(FORCE_ALLOW_ON_EXTERNAL_KEY);
+ if (!mUm.isAdminUser()) {
+ disableForUser(mEnableAdb);
+ disableForUser(mClearAdbKeys);
+ disableForUser(mEnableTerminal);
+ disableForUser(mPassword);
+ }
+ mDebugAppPref = mPreferenceCompatManager.getOrCreatePrefCompat(DEBUG_APP_KEY);
+ mAllPrefCompats.add(mDebugAppPref);
+ mWaitForDebugger = findAndInitSwitchPrefCompat(WAIT_FOR_DEBUGGER_KEY);
+ mMockLocationAppPref = mPreferenceCompatManager.getOrCreatePrefCompat(
+ MOCK_LOCATION_APP_KEY);
+ mAllPrefCompats.add(mMockLocationAppPref);
+ mVerifyAppsOverUsb = findAndInitSwitchPrefCompat(VERIFY_APPS_OVER_USB_KEY);
+ if (!showVerifierSetting()) {
+ mVerifyAppsOverUsb.setVisible(false);
+ mVerifyAppsOverUsb.setEnabled(false);
+ }
+ mStrictMode = findAndInitSwitchPrefCompat(STRICT_MODE_KEY);
+ mPointerLocation = findAndInitSwitchPrefCompat(POINTER_LOCATION_KEY);
+ mShowTouches = findAndInitSwitchPrefCompat(SHOW_TOUCHES_KEY);
+ mShowScreenUpdates = findAndInitSwitchPrefCompat(SHOW_SCREEN_UPDATES_KEY);
+ mDisableOverlays = findAndInitSwitchPrefCompat(DISABLE_OVERLAYS_KEY);
+ mForceMsaa = findAndInitSwitchPrefCompat(FORCE_MSAA_KEY);
+ mTrackFrameTime = addListPrefCompat(TRACK_FRAME_TIME_KEY);
+ mShowNonRectClip = addListPrefCompat(SHOW_NON_RECTANGULAR_CLIP_KEY);
+ mShowHwScreenUpdates = findAndInitSwitchPrefCompat(SHOW_HW_SCREEN_UPDATES_KEY);
+ mShowHwLayersUpdates = findAndInitSwitchPrefCompat(SHOW_HW_LAYERS_UPDATES_KEY);
+ mDebugLayout = findAndInitSwitchPrefCompat(DEBUG_LAYOUT_KEY);
+ mForceRtlLayout = findAndInitSwitchPrefCompat(FORCE_RTL_LAYOUT_KEY);
+ mWindowBlurs = findAndInitSwitchPrefCompat(WINDOW_BLURS_KEY);
+ mDebugHwOverdraw = addListPrefCompat(DEBUG_HW_OVERDRAW_KEY);
+ mWifiDisplayCertification = findAndInitSwitchPrefCompat(WIFI_DISPLAY_CERTIFICATION_KEY);
+ mWifiVerboseLogging = findAndInitSwitchPrefCompat(WIFI_VERBOSE_LOGGING_KEY);
+ mMobileDataAlwaysOn = findAndInitSwitchPrefCompat(MOBILE_DATA_ALWAYS_ON);
+
+ mWindowAnimationScale = addListPrefCompat(WINDOW_ANIMATION_SCALE_KEY);
+ mTransitionAnimationScale = addListPrefCompat(TRANSITION_ANIMATION_SCALE_KEY);
+ mAnimatorDurationScale = addListPrefCompat(ANIMATOR_DURATION_SCALE_KEY);
+ mOverlayDisplayDevices = addListPrefCompat(OVERLAY_DISPLAY_DEVICES_KEY);
+ mOpenGLTraces = addListPrefCompat(OPENGL_TRACES_KEY);
+ mSimulateColorSpace = addListPrefCompat(SIMULATE_COLOR_SPACE);
+ mUSBAudio = findAndInitSwitchPrefCompat(USB_AUDIO_KEY);
+ mRecordAudio = findAndInitSwitchPrefCompat(RECORD_AUDIO_KEY);
+ mPlayRecordedAudio = mPreferenceCompatManager.getOrCreatePrefCompat(
+ PLAY_RECORDED_AUDIO_KEY);
+ mPlayRecordedAudio.setVisible(false);
+ mSaveAudio = mPreferenceCompatManager.getOrCreatePrefCompat(SAVE_RECORDED_AUDIO_KEY);
+ mSaveAudio.setVisible(false);
+ mTimeToStartRead = mPreferenceCompatManager.getOrCreatePrefCompat(TIME_TO_START_READ_KEY);
+ mTimeToStartRead.setVisible(false);
+ mTimeToValidAudio = mPreferenceCompatManager.getOrCreatePrefCompat(TIME_TO_VALID_AUDIO_KEY);
+ mTimeToValidAudio.setVisible(false);
+ mEmptyAudioDuration = mPreferenceCompatManager.getOrCreatePrefCompat(
+ EMPTY_AUDIO_DURATION_KEY);
+ mEmptyAudioDuration.setVisible(false);
+ mForceResizable = findAndInitSwitchPrefCompat(FORCE_RESIZABLE_KEY);
+
+ mImmediatelyDestroyActivities = findAndInitSwitchPrefCompat(
+ IMMEDIATELY_DESTROY_ACTIVITIES_KEY);
+
+ mAppProcessLimit = addListPrefCompat(APP_PROCESS_LIMIT_KEY);
+
+ mShowAllANRs = findAndInitSwitchPrefCompat(SHOW_ALL_ANRS_KEY);
+
+ mHdcpChecking = mPreferenceCompatManager.getOrCreatePrefCompat(HDCP_CHECKING_KEY);
+ mAllPrefCompats.add(mHdcpChecking);
+ removePreferenceForProduction(mHdcpChecking);
+ }
+
+
+ private PreferenceCompat addListPrefCompat(String prefKey) {
+ PreferenceCompat pref = mPreferenceCompatManager.getOrCreatePrefCompat(prefKey);
+ pref.setType(PreferenceCompat.TYPE_LIST);
+ mAllPrefCompats.add(pref);
+ return pref;
+ }
+
+ /** Called when audio recording is finished. Updates UI component states. */
+ private void onAudioRecorded(boolean successful) {
+ mPlayRecordedAudio.setVisible(successful);
+ mSaveAudio.setVisible(successful);
+ mRecordAudio.setChecked(false);
+
+ if (!successful) {
+ Toast errorToast = Toast.makeText(mContext,
+ ResourcesUtil.getString(mContext, "show_audio_recording_failed"),
+ Toast.LENGTH_SHORT);
+ errorToast.show();
+ }
+ }
+
+ /** Updates displayed audio recording metrics */
+ private void updateAudioRecordingMetrics(AudioMetrics.Data data) {
+ updateAudioRecordingMetric(mTimeToStartRead, data.timeToStartReadMs);
+ updateAudioRecordingMetric(mTimeToValidAudio, data.timeToValidAudioMs);
+ updateAudioRecordingMetric(mEmptyAudioDuration, data.emptyAudioDurationMs);
+ }
+
+ private static void updateAudioRecordingMetric(PreferenceCompat preference, Optional<Long> ts) {
+ ts.ifPresent(x -> preference.setVisible(true));
+ if (preference.getVisible() == PreferenceCompat.STATUS_ON) {
+ preference.setSummary(AudioMetrics.msTimestampToString(ts));
+ }
+ }
+
+ private boolean removePreferenceForProduction(PreferenceCompat preference) {
+ if ("user".equals(Build.TYPE)) {
+ preference.setVisible(false);
+ return true;
+ }
+ return false;
+ }
+
+ private boolean showVerifierSetting() {
+ return Settings.Global.getInt(mContentResolver,
+ Settings.Global.PACKAGE_VERIFIER_SETTING_VISIBLE, 1) > 0;
+ }
+
+ private PreferenceCompat findAndInitSwitchPrefCompat(String key) {
+ PreferenceCompat pref = mPreferenceCompatManager.getOrCreatePrefCompat(key);
+ pref.setType(PreferenceCompat.TYPE_SWITCH);
+ if (pref == null) {
+ throw new IllegalArgumentException("Cannot find preference with key = " + key);
+ }
+ mAllPrefCompats.add(pref);
+ mResetSwitchPrefCompats.add(pref);
+ return pref;
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_DEVELOPMENT;
+ }
+
+ private static boolean isPackageInstalled(Context context, String packageName) {
+ try {
+ return context.getPackageManager().getPackageInfo(packageName, 0) != null;
+ } catch (PackageManager.NameNotFoundException e) {
+ return false;
+ }
+ }
+
+ private void disableForUser(PreferenceCompat pref) {
+ if (pref != null) {
+ pref.setEnabled(false);
+ mDisabledPrefCompats.add(pref);
+ }
+ }
+
+ private boolean showBugReportPreference() {
+ return (FlavorUtils.getFlavor(mContext) & X_EXPERIENCE_FLAVORS_MASK) == 0;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/system/LanguageState.java b/SettingsAPI/java/com/android/tv/settings/library/system/LanguageState.java
new file mode 100644
index 0000000..9535f9a
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/system/LanguageState.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.tv.settings.library.system;
+
+import static com.android.tv.settings.library.ManagerUtil.STATE_LANGUAGE;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import com.android.internal.app.LocalePicker;
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.about.DevelopmentSettingsEnabler;
+import com.android.tv.settings.library.data.PreferenceControllerState;
+import com.android.tv.settings.library.util.AbstractPreferenceController;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * State to handle the business logic for LanguageFragment.
+ */
+public class LanguageState extends PreferenceControllerState {
+ private static final String TAG = "LanguageFragment";
+
+ // Pseudo locales used for internal purposes only should not be shown in the
+ // language picker.
+ private static final String PSEUDO_LOCALE_EN_XC = "en-XC";
+
+ private static final String LANGUAGE_RADIO_GROUP = "language";
+
+ private final Map<String, LocalePicker.LocaleInfo> mLocaleInfoMap = new ArrayMap<>();
+
+ // Adjust this value to keep things relatively responsive without janking animations
+ private static final int LANGUAGE_SET_DELAY_MS = 500;
+ private final Handler mDelayHandler = new Handler();
+ private Locale mNewLocale;
+ private final Runnable mSetLanguageRunnable = new Runnable() {
+ @Override
+ public void run() {
+ LocalePicker.updateLocale(mNewLocale);
+ }
+ };
+
+ public LanguageState(Context context,
+ UIUpdateCallback callback) {
+ super(context, callback);
+ }
+
+ @Override
+ public void onCreate(Bundle extras) {
+ super.onCreate(extras);
+ Locale currentLocale = null;
+ try {
+ currentLocale = ActivityManager.getService().getConfiguration()
+ .getLocales().get(0);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not retrieve locale", e);
+ }
+
+ final List<LocalePicker.LocaleInfo> localeInfoList =
+ LocalePicker.getAllAssetLocales(mContext,
+ DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext));
+
+ PreferenceCompat languageList = mPreferenceCompatManager.getOrCreatePrefCompat(
+ LANGUAGE_RADIO_GROUP);
+ for (final LocalePicker.LocaleInfo localeInfo : localeInfoList) {
+ final String languageTag = localeInfo.getLocale().toLanguageTag();
+ if (PSEUDO_LOCALE_EN_XC.equals(languageTag)) {
+ continue;
+ }
+ mLocaleInfoMap.put(languageTag, localeInfo);
+
+ final PreferenceCompat radioPreference = mPreferenceCompatManager.getOrCreatePrefCompat(
+ new String[]{LANGUAGE_RADIO_GROUP, languageTag});
+ radioPreference.setType(PreferenceCompat.TYPE_RADIO);
+ radioPreference.setTitle(localeInfo.getLabel());
+ if (localeInfo.getLocale().equals(currentLocale)) {
+ radioPreference.setChecked(true);
+ radioPreference.setFocused(true);
+ } else {
+ radioPreference.setChecked(false);
+ radioPreference.setFocused(false);
+ }
+ languageList.addChildPrefCompat(radioPreference);
+ }
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), languageList);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // no-op
+ }
+
+ @Override
+ public int getStateIdentifier() {
+ return STATE_LANGUAGE;
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(String[] key, boolean status) {
+ if (key.length < 2) {
+ return false;
+ }
+ PreferenceCompat preferenceCompat = mPreferenceCompatManager.getPrefCompat(key);
+ PreferenceCompat languageList = mPreferenceCompatManager
+ .getPrefCompat(new String[]{LANGUAGE_RADIO_GROUP});
+ if (preferenceCompat.getChecked() == PreferenceCompat.STATUS_OFF) {
+ mNewLocale = mLocaleInfoMap.get(preferenceCompat.getKey()[1]).getLocale();
+ mDelayHandler.removeCallbacks(mSetLanguageRunnable);
+ mDelayHandler.postDelayed(mSetLanguageRunnable, LANGUAGE_SET_DELAY_MS);
+ preferenceCompat.setChecked(true);
+ clearOtherRadioPreferences(preferenceCompat, languageList);
+ mUIUpdateCallback.notifyUpdate(getStateIdentifier(), languageList);
+ }
+ return true;
+ }
+
+ public PreferenceCompat clearOtherRadioPreferences(PreferenceCompat checkedPrefCompat,
+ PreferenceCompat languageList) {
+ languageList.getChildPrefCompats().stream().filter(preferenceCompat ->
+ !keyEquals(preferenceCompat.getKey(), checkedPrefCompat.getKey())).forEach(
+ preferenceCompat -> {
+ preferenceCompat.setChecked(false);
+ }
+ );
+ return languageList;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> onCreatePreferenceControllers(Context context) {
+ return null;
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/system/development/audio/AudioDebug.java b/SettingsAPI/java/com/android/tv/settings/library/system/development/audio/AudioDebug.java
similarity index 97%
rename from Settings/src/com/android/tv/settings/system/development/audio/AudioDebug.java
rename to SettingsAPI/java/com/android/tv/settings/library/system/development/audio/AudioDebug.java
index f2100fe..2312a29 100644
--- a/Settings/src/com/android/tv/settings/system/development/audio/AudioDebug.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/system/development/audio/AudioDebug.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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.system.development.audio;
+package com.android.tv.settings.library.system.development.audio;
import android.annotation.Nullable;
import android.content.Context;
diff --git a/Settings/src/com/android/tv/settings/system/development/audio/AudioMetrics.java b/SettingsAPI/java/com/android/tv/settings/library/system/development/audio/AudioMetrics.java
similarity index 96%
rename from Settings/src/com/android/tv/settings/system/development/audio/AudioMetrics.java
rename to SettingsAPI/java/com/android/tv/settings/library/system/development/audio/AudioMetrics.java
index b652f60..ae97885 100644
--- a/Settings/src/com/android/tv/settings/system/development/audio/AudioMetrics.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/system/development/audio/AudioMetrics.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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.system.development.audio;
+package com.android.tv.settings.library.system.development.audio;
import android.os.Handler;
import android.os.Looper;
diff --git a/Settings/src/com/android/tv/settings/system/development/audio/AudioReader.java b/SettingsAPI/java/com/android/tv/settings/library/system/development/audio/AudioReader.java
similarity index 97%
rename from Settings/src/com/android/tv/settings/system/development/audio/AudioReader.java
rename to SettingsAPI/java/com/android/tv/settings/library/system/development/audio/AudioReader.java
index 1f47b81..42882e9 100644
--- a/Settings/src/com/android/tv/settings/system/development/audio/AudioReader.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/system/development/audio/AudioReader.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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.system.development.audio;
+package com.android.tv.settings.library.system.development.audio;
import android.media.AudioFormat;
import android.media.AudioRecord;
diff --git a/Settings/src/com/android/tv/settings/system/development/audio/AudioReaderException.java b/SettingsAPI/java/com/android/tv/settings/library/system/development/audio/AudioReaderException.java
similarity index 86%
rename from Settings/src/com/android/tv/settings/system/development/audio/AudioReaderException.java
rename to SettingsAPI/java/com/android/tv/settings/library/system/development/audio/AudioReaderException.java
index 18e4af4..53df1c0 100644
--- a/Settings/src/com/android/tv/settings/system/development/audio/AudioReaderException.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/system/development/audio/AudioReaderException.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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.system.development.audio;
+package com.android.tv.settings.library.system.development.audio;
/** Represents an error in an audio recording thread. */
public class AudioReaderException extends Exception {
diff --git a/Settings/src/com/android/tv/settings/system/development/audio/WavWriter.java b/SettingsAPI/java/com/android/tv/settings/library/system/development/audio/WavWriter.java
similarity index 97%
rename from Settings/src/com/android/tv/settings/system/development/audio/WavWriter.java
rename to SettingsAPI/java/com/android/tv/settings/library/system/development/audio/WavWriter.java
index 113c3c1..2c101d9 100644
--- a/Settings/src/com/android/tv/settings/system/development/audio/WavWriter.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/system/development/audio/WavWriter.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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.system.development.audio;
+package com.android.tv.settings.library.system.development.audio;
import android.util.Log;
diff --git a/Settings/src/com/android/tv/settings/users/RestrictedProfileModel.java b/SettingsAPI/java/com/android/tv/settings/library/users/RestrictedProfileModel.java
similarity index 82%
rename from Settings/src/com/android/tv/settings/users/RestrictedProfileModel.java
rename to SettingsAPI/java/com/android/tv/settings/library/users/RestrictedProfileModel.java
index 8c1d867..aaec69b 100644
--- a/Settings/src/com/android/tv/settings/users/RestrictedProfileModel.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/users/RestrictedProfileModel.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.users;
+package com.android.tv.settings.library.users;
import android.app.ActivityManager;
import android.content.Context;
@@ -24,10 +24,6 @@
import android.provider.Settings;
import android.util.Log;
-import com.android.internal.widget.LockPatternUtils;
-import com.android.internal.widget.LockPatternUtils.RequestThrottledException;
-import com.android.internal.widget.LockscreenCredential;
-
/**
* Manipulate and list restricted profiles on the device.
*/
@@ -47,7 +43,7 @@
this(context, /* applyRestrictions= */ true);
}
- RestrictedProfileModel(final Context context, final boolean applyRestrictions) {
+ public RestrictedProfileModel(final Context context, final boolean applyRestrictions) {
mContext = context;
mApplyRestrictions = applyRestrictions;
@@ -101,7 +97,7 @@
/**
* @return a @{link UserInfo} for the restricted profile, or {@code null} if there is no
- * restricted profile on the device.
+ * restricted profile on the device.
*/
public UserInfo getUser() {
if (mCurrentUserInfo.isRestricted()) {
@@ -156,21 +152,9 @@
*/
private boolean shouldAllowRunInBackground() {
final boolean defaultValue = mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_keepRestrictedProfilesInBackground);
+ mContext.getResources().getIdentifier("config_keepRestrictedProfilesInBackground",
+ "bool", "android"));
return Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.KEEP_PROFILE_IN_BACKGROUND, defaultValue ? 1 : 0) > 0;
}
-
- /**
- * @return {@code true} if {@code password} is a correct PIN for exiting the restricted user.
- */
- public boolean checkPassword(String password) {
- try (LockscreenCredential credential = LockscreenCredential.createPinOrNone(password)) {
- final int userId = getOwnerUserId();
- return new LockPatternUtils(mContext).checkCredential(credential, userId, null);
- } catch (RequestThrottledException e) {
- Log.e(TAG, "Unable to check password for unlocking the user", e);
- }
- return false;
- }
}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/util/AbstractPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/util/AbstractPreferenceController.java
new file mode 100644
index 0000000..854ef99
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/AbstractPreferenceController.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.util;
+
+import android.content.Context;
+
+import com.android.tv.settings.library.PreferenceCompat;
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+
+
+/**
+ * A controller that manages event for preference.
+ */
+public abstract class AbstractPreferenceController {
+
+ private static final String TAG = "AbstractPrefController";
+
+ protected final Context mContext;
+ protected final UIUpdateCallback mUIUpdateCallback;
+ protected final int mStateIdentifier;
+ protected final PreferenceCompatManager mPreferenceCompatManager;
+ protected final String[] mKey;
+ protected final PreferenceCompat mPreferenceCompat;
+
+ public AbstractPreferenceController(Context context, UIUpdateCallback callback,
+ int stateIdentifier, PreferenceCompatManager preferenceCompatManager) {
+ mUIUpdateCallback = callback;
+ mContext = context;
+ mStateIdentifier = stateIdentifier;
+ mPreferenceCompatManager = preferenceCompatManager;
+ mKey = getPreferenceKey();
+ mPreferenceCompat = mPreferenceCompatManager.getOrCreatePrefCompat(mKey);
+ }
+
+ public AbstractPreferenceController(Context context, UIUpdateCallback callback,
+ int stateIdentifier, PreferenceCompatManager preferenceCompatManager, String[] key) {
+ mUIUpdateCallback = callback;
+ mContext = context;
+ mStateIdentifier = stateIdentifier;
+ mPreferenceCompatManager = preferenceCompatManager;
+ mKey = key;
+ mPreferenceCompat = mPreferenceCompatManager.getOrCreatePrefCompat(mKey);
+ }
+
+ /**
+ * @return whether the setting controlled by the controller is available.
+ */
+ public abstract boolean isAvailable();
+
+ /**
+ * Initialize preference compat.
+ */
+ protected abstract void init();
+
+ /**
+ * Initialize preference compat and notify to update UI.
+ */
+ public void initAndNotify() {
+ init();
+ notifyChange();
+ }
+
+ /**
+ * Updates the current status of preference compat.
+ */
+ public void updateAndNotify() {
+ update();
+ notifyChange();
+ }
+
+ public void notifyChange() {
+ if (mPreferenceCompat != null) {
+ mUIUpdateCallback.notifyUpdate(mStateIdentifier, mPreferenceCompat);
+ }
+ }
+
+ /**
+ * Update preference compat.
+ */
+ protected abstract void update();
+
+
+ /**
+ * Handle preference click.
+ *
+ * @param status status of new state
+ * @return whether the click is handled
+ */
+ public boolean handlePreferenceTreeClick(boolean status) {
+ return false;
+ }
+
+ /**
+ * Handle preference change.
+ *
+ * @param newValue new value of state
+ * @return whether the click is handled
+ */
+ public boolean handlePreferenceChange(Object newValue) {
+ return false;
+ }
+
+ public PreferenceCompat getPrefCompat() {
+ return mPreferenceCompat;
+ }
+
+ public String[] getPreferenceKey() {
+ return mKey;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/util/LibUtils.java b/SettingsAPI/java/com/android/tv/settings/library/util/LibUtils.java
new file mode 100644
index 0000000..f440fa0
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/LibUtils.java
@@ -0,0 +1,330 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.util;
+
+import android.annotation.ColorInt;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.Signature;
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
+import android.graphics.drawable.Drawable;
+import android.os.BatteryManager;
+import android.os.UserHandle;
+import android.print.PrintManager;
+import android.text.TextUtils;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.core.graphics.drawable.RoundedBitmapDrawable;
+import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.text.NumberFormat;
+
+public class LibUtils {
+
+ @VisibleForTesting
+ static final String STORAGE_MANAGER_ENABLED_PROPERTY =
+ "ro.storage_manager.enabled";
+
+
+ public static final String PROPERTY_APP_HIBERNATION_ENABLED =
+ "app_hibernation_enabled";
+
+ private static Signature[] sSystemSignature;
+ private static String sPermissionControllerPackageName;
+ private static String sServicesSystemSharedLibPackageName;
+ private static String sSharedSystemSharedLibPackageName;
+
+
+
+ /** Formats a double from 0.0..100.0 with an option to round **/
+ public static String formatPercentage(double percentage, boolean round) {
+ final int localPercentage = round ? Math.round((float) percentage) : (int) percentage;
+ return formatPercentage(localPercentage);
+ }
+
+ /** Formats the ratio of amount/total as a percentage. */
+ public static String formatPercentage(long amount, long total) {
+ return formatPercentage(((double) amount) / total);
+ }
+
+ /** Formats an integer from 0..100 as a percentage. */
+ public static String formatPercentage(int percentage) {
+ return formatPercentage(((double) percentage) / 100.0);
+ }
+
+ /** Formats a double from 0.0..1.0 as a percentage. */
+ public static String formatPercentage(double percentage) {
+ return NumberFormat.getPercentInstance().format(percentage);
+ }
+
+ public static int getBatteryLevel(Intent batteryChangedIntent) {
+ int level = batteryChangedIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
+ int scale = batteryChangedIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
+ return (level * 100) / scale;
+ }
+
+ public static ColorStateList getColorAccent(Context context) {
+ return getColorAttr(context, android.R.attr.colorAccent);
+ }
+
+ public static ColorStateList getColorError(Context context) {
+ return getColorAttr(context, android.R.attr.colorError);
+ }
+
+ @ColorInt
+ public static int getColorAccentDefaultColor(Context context) {
+ return getColorAttrDefaultColor(context, android.R.attr.colorAccent);
+ }
+
+ @ColorInt
+ public static int getColorErrorDefaultColor(Context context) {
+ return getColorAttrDefaultColor(context, android.R.attr.colorError);
+ }
+
+ @ColorInt
+ public static int getColorStateListDefaultColor(Context context, int resId) {
+ final ColorStateList list =
+ context.getResources().getColorStateList(resId, context.getTheme());
+ return list.getDefaultColor();
+ }
+
+ /**
+ * This method computes disabled color from normal color
+ *
+ * @param context the context
+ * @param inputColor normal color.
+ * @return disabled color.
+ */
+ @ColorInt
+ public static int getDisabled(Context context, int inputColor) {
+ return applyAlphaAttr(context, android.R.attr.disabledAlpha, inputColor);
+ }
+
+ @ColorInt
+ public static int applyAlphaAttr(Context context, int attr, int inputColor) {
+ TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+ float alpha = ta.getFloat(0, 0);
+ ta.recycle();
+ return applyAlpha(alpha, inputColor);
+ }
+
+ @ColorInt
+ public static int applyAlpha(float alpha, int inputColor) {
+ alpha *= Color.alpha(inputColor);
+ return Color.argb((int) (alpha), Color.red(inputColor), Color.green(inputColor),
+ Color.blue(inputColor));
+ }
+
+ @ColorInt
+ public static int getColorAttrDefaultColor(Context context, int attr) {
+ TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+ @ColorInt int colorAccent = ta.getColor(0, 0);
+ ta.recycle();
+ return colorAccent;
+ }
+
+ public static ColorStateList getColorAttr(Context context, int attr) {
+ TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+ ColorStateList stateList = null;
+ try {
+ stateList = ta.getColorStateList(0);
+ } finally {
+ ta.recycle();
+ }
+ return stateList;
+ }
+
+ public static int getThemeAttr(Context context, int attr) {
+ return getThemeAttr(context, attr, 0);
+ }
+
+ public static int getThemeAttr(Context context, int attr, int defaultValue) {
+ TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+ int theme = ta.getResourceId(0, defaultValue);
+ ta.recycle();
+ return theme;
+ }
+
+ public static Drawable getDrawable(Context context, int attr) {
+ TypedArray ta = context.obtainStyledAttributes(new int[]{attr});
+ Drawable drawable = ta.getDrawable(0);
+ ta.recycle();
+ return drawable;
+ }
+
+ /**
+ * Create a color matrix suitable for a ColorMatrixColorFilter that modifies only the color but
+ * preserves the alpha for a given drawable
+ *
+ * @return a color matrix that uses the source alpha and given color
+ */
+ public static ColorMatrix getAlphaInvariantColorMatrixForColor(@ColorInt int color) {
+ int r = Color.red(color);
+ int g = Color.green(color);
+ int b = Color.blue(color);
+
+ ColorMatrix cm = new ColorMatrix(new float[]{
+ 0, 0, 0, 0, r,
+ 0, 0, 0, 0, g,
+ 0, 0, 0, 0, b,
+ 0, 0, 0, 1, 0});
+
+ return cm;
+ }
+
+ /**
+ * Create a ColorMatrixColorFilter to tint a drawable but retain its alpha characteristics
+ *
+ * @return a ColorMatrixColorFilter which changes the color of the output but is invariant on
+ * the source alpha
+ */
+ public static ColorFilter getAlphaInvariantColorFilterForColor(@ColorInt int color) {
+ return new ColorMatrixColorFilter(getAlphaInvariantColorMatrixForColor(color));
+ }
+
+ /**
+ * Determine whether a package is a "system package", in which case certain things (like
+ * disabling notifications or disabling the package altogether) should be disallowed.
+ */
+ public static boolean isSystemPackage(Resources resources, PackageManager pm, PackageInfo pkg) {
+ if (sSystemSignature == null) {
+ sSystemSignature = new Signature[]{getSystemSignature(pm)};
+ }
+ if (sPermissionControllerPackageName == null) {
+ sPermissionControllerPackageName = pm.getPermissionControllerPackageName();
+ }
+ if (sServicesSystemSharedLibPackageName == null) {
+ sServicesSystemSharedLibPackageName = pm.getServicesSystemSharedLibraryPackageName();
+ }
+ if (sSharedSystemSharedLibPackageName == null) {
+ sSharedSystemSharedLibPackageName = pm.getSharedSystemSharedLibraryPackageName();
+ }
+ return (sSystemSignature[0] != null
+ && sSystemSignature[0].equals(getFirstSignature(pkg)))
+ || pkg.packageName.equals(sPermissionControllerPackageName)
+ || pkg.packageName.equals(sServicesSystemSharedLibPackageName)
+ || pkg.packageName.equals(sSharedSystemSharedLibPackageName)
+ || pkg.packageName.equals(PrintManager.PRINT_SPOOLER_PACKAGE_NAME)
+ || isDeviceProvisioningPackage(resources, pkg.packageName);
+ }
+
+ /**
+ * Returns {@code true} if the supplied package is the device provisioning app. Otherwise,
+ * returns {@code false}.
+ */
+ public static boolean isDeviceProvisioningPackage(Resources resources, String packageName) {
+ String deviceProvisioningPackage = resources.getString(
+ resources.getIdentifier("config_deviceProvisioningPackage",
+ "string", "android"));
+ return deviceProvisioningPackage != null && deviceProvisioningPackage.equals(packageName);
+ }
+
+ private static Signature getFirstSignature(PackageInfo pkg) {
+ if (pkg != null && pkg.signatures != null && pkg.signatures.length > 0) {
+ return pkg.signatures[0];
+ }
+ return null;
+ }
+
+ private static Signature getSystemSignature(PackageManager pm) {
+ try {
+ final PackageInfo sys = pm.getPackageInfo("android", PackageManager.GET_SIGNATURES);
+ return getFirstSignature(sys);
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ return null;
+ }
+
+
+ /** Get the corresponding adaptive icon drawable. */
+ public static Drawable getBadgedIcon(Context context, Drawable icon, UserHandle user) {
+ return icon;
+ }
+
+ /** Get the {@link Drawable} that represents the app icon */
+ public static Drawable getBadgedIcon(Context context, ApplicationInfo appInfo) {
+ return getBadgedIcon(context, appInfo.loadUnbadgedIcon(context.getPackageManager()),
+ UserHandle.getUserHandleForUid(appInfo.uid));
+ }
+
+ /**
+ * Returns a bitmap with rounded corner.
+ *
+ * @param context application context.
+ * @param source bitmap to apply round corner.
+ * @param cornerRadius corner radius value.
+ */
+ public static Bitmap convertCornerRadiusBitmap(@NonNull Context context,
+ @NonNull Bitmap source, @NonNull float cornerRadius) {
+ final Bitmap roundedBitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(),
+ Bitmap.Config.ARGB_8888);
+ final RoundedBitmapDrawable drawable =
+ RoundedBitmapDrawableFactory.create(context.getResources(), source);
+ drawable.setAntiAlias(true);
+ drawable.setCornerRadius(cornerRadius);
+ final Canvas canvas = new Canvas(roundedBitmap);
+ drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+ drawable.draw(canvas);
+ return roundedBitmap;
+ }
+
+ /**
+ * Returns the ResolveInfo for the system activity that matches given intent filter or null if
+ * no such activity exists.
+ *
+ * @param context Context of the caller
+ * @param intent The intent matching the desired system app
+ * @return ResolveInfo of the matching activity or null if no match exists
+ */
+ public static ResolveInfo systemIntentIsHandled(Context context, Intent intent) {
+ if (intent == null) {
+ return null;
+ }
+
+ final PackageManager pm = context.getPackageManager();
+ for (ResolveInfo info : pm.queryIntentActivities(intent, 0)) {
+ if (info.activityInfo != null
+ && (info.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
+ == ApplicationInfo.FLAG_SYSTEM) {
+ return info;
+ }
+ }
+ return null;
+ }
+
+ public static void showToast(Context context, String resName) {
+ String toast = ResourcesUtil.getString(context, resName);
+ if (!TextUtils.isEmpty(toast)) {
+ Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
+ }
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/util/PreferenceCompatUtils.java b/SettingsAPI/java/com/android/tv/settings/library/util/PreferenceCompatUtils.java
new file mode 100644
index 0000000..1e3c8cf
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/PreferenceCompatUtils.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.util;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+
+import com.android.tv.settings.library.PreferenceCompat;
+
+import java.util.List;
+
+public class PreferenceCompatUtils {
+
+ public static final int FLAG_SET_TITLE = 1;
+
+ public static void resolveSystemActivityOrRemove(Context context, List<PreferenceCompat> parent,
+ PreferenceCompat preference, int flags) {
+ if (preference == null) {
+ return;
+ }
+
+ Intent intent = preference.getIntent();
+ if (intent != null) {
+ // Find the activity that is in the system image
+ PackageManager pm = context.getPackageManager();
+ List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
+ for (final ResolveInfo resolveInfo : list) {
+ if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
+ != 0) {
+
+ // Replace the intent with this specific activity
+ preference.setIntent(new Intent().setClassName(
+ resolveInfo.activityInfo.packageName,
+ resolveInfo.activityInfo.name));
+
+ if ((flags & FLAG_SET_TITLE) != 0) {
+ // Set the preference title to the activity's label
+ preference.setTitle(resolveInfo.loadLabel(pm).toString());
+ }
+
+ return;
+ }
+ }
+ }
+
+ // Did not find a matching activity, so remove the preference
+ parent.remove(preference);
+ }
+
+ public static boolean isParent(PreferenceCompat child, PreferenceCompat parent) {
+ if (parent.getChildPrefCompats() == null) {
+ return false;
+ }
+ return parent.getChildPrefCompats().stream().anyMatch(child1 -> child == child1);
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/util/ResourcesUtil.java b/SettingsAPI/java/com/android/tv/settings/library/util/ResourcesUtil.java
new file mode 100644
index 0000000..1696389
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/ResourcesUtil.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.util;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+
+public final class ResourcesUtil {
+ private static final String SETTINGS_PACKAGE_NAME = "com.android.tv.settings";
+
+ public static String getString(Context context, String name) {
+ try {
+ Resources resources = context.getPackageManager()
+ .getResourcesForApplication(SETTINGS_PACKAGE_NAME);
+ int id = resources.getIdentifier(name, "string", SETTINGS_PACKAGE_NAME);
+ if (id != 0) {
+ return resources.getString(id);
+ }
+ return null;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public static boolean getBoolean(Context context, String name) {
+ try {
+ Resources resources = context.getPackageManager()
+ .getResourcesForApplication(SETTINGS_PACKAGE_NAME);
+ int id = resources.getIdentifier(name, "string", SETTINGS_PACKAGE_NAME);
+ if (id != 0) {
+ return resources.getBoolean(id);
+ }
+ return false;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ public static String getQuantityString(Context context, String name, int count,
+ Object... formatArgs) {
+
+ try {
+ Resources resources = context.getPackageManager()
+ .getResourcesForApplication(SETTINGS_PACKAGE_NAME);
+ int id = resources.getIdentifier(name, "string", SETTINGS_PACKAGE_NAME);
+ if (id != 0) {
+ return resources.getQuantityString(id, count, formatArgs);
+ }
+ return null;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public static String getString(Context context, String name, Object... formatArgs) {
+ try {
+ Resources resources = context.getPackageManager()
+ .getResourcesForApplication(SETTINGS_PACKAGE_NAME);
+ int id = resources.getIdentifier(name, "string", SETTINGS_PACKAGE_NAME);
+ if (id != 0) {
+ return resources.getString(id, formatArgs);
+ }
+ return null;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+
+ public static Drawable getDrawable(Context context, String name) {
+ try {
+ Resources resources = context.getPackageManager()
+ .getResourcesForApplication(SETTINGS_PACKAGE_NAME);
+ int id = resources.getIdentifier(name, "drawable", SETTINGS_PACKAGE_NAME);
+ if (id != 0) {
+ return resources.getDrawable(id);
+ }
+ return null;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public static String[] getStringArray(Context context, String name) {
+ try {
+ Resources resources = context.getPackageManager()
+ .getResourcesForApplication(SETTINGS_PACKAGE_NAME);
+ int id = resources.getIdentifier(name, "array", SETTINGS_PACKAGE_NAME);
+ if (id != 0) {
+ return resources.getStringArray(id);
+ }
+ return null;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public static int[] getIntArray(Context context, String name) {
+ try {
+ Resources resources = context.getPackageManager()
+ .getResourcesForApplication(SETTINGS_PACKAGE_NAME);
+ int id = resources.getIdentifier(name, "array", SETTINGS_PACKAGE_NAME);
+ if (id != 0) {
+ return resources.getIntArray(id);
+ }
+ return null;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/util/RestrictedPreferenceController.java b/SettingsAPI/java/com/android/tv/settings/library/util/RestrictedPreferenceController.java
new file mode 100644
index 0000000..292982b
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/RestrictedPreferenceController.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.util;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.text.TextUtils;
+
+import com.android.tv.settings.library.UIUpdateCallback;
+import com.android.tv.settings.library.data.PreferenceCompatManager;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtils;
+import com.android.tv.settings.library.settingslib.RestrictedLockUtilsInternal;
+
+/** Abstract PreferenceController to handle restricted preference businesss logic. */
+public abstract class RestrictedPreferenceController extends AbstractPreferenceController {
+ protected boolean mDisabledByAdmin;
+ private String mAttrUserRestriction;
+ private RestrictedLockUtils.EnforcedAdmin mEnforcedAdmin;
+ private boolean mUseAdminDisabledSummary = false;
+
+ public RestrictedPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager prefCompatManager) {
+ super(context, callback, stateIdentifier, prefCompatManager);
+ mAttrUserRestriction = getAttrUserRestriction();
+ mUseAdminDisabledSummary = useAdminDisabledSummary();
+ // If the system has set the user restriction, then we shouldn't add the padlock.
+ if (RestrictedLockUtilsInternal.hasBaseUserRestriction(mContext, mAttrUserRestriction,
+ UserHandle.myUserId())) {
+ mAttrUserRestriction = null;
+ return;
+ }
+ }
+
+ public RestrictedPreferenceController(Context context,
+ UIUpdateCallback callback, int stateIdentifier,
+ PreferenceCompatManager prefCompatManager, String[] key) {
+ super(context, callback, stateIdentifier, prefCompatManager, key);
+ mAttrUserRestriction = getAttrUserRestriction();
+ mUseAdminDisabledSummary = useAdminDisabledSummary();
+ // If the system has set the user restriction, then we shouldn't add the padlock.
+ if (RestrictedLockUtilsInternal.hasBaseUserRestriction(mContext, mAttrUserRestriction,
+ UserHandle.myUserId())) {
+ mAttrUserRestriction = null;
+ return;
+ }
+ }
+
+ @Override
+ protected void init() {
+ if (mAttrUserRestriction != null) {
+ checkRestrictionAndSetDisabled(mAttrUserRestriction, UserHandle.myUserId());
+ }
+ update();
+ }
+
+ public void checkRestrictionAndSetDisabled(String userRestriction, int userId) {
+ RestrictedLockUtils.EnforcedAdmin
+ admin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(mContext,
+ userRestriction, userId);
+ setDisabledByAdmin(admin);
+ }
+
+ @Override
+ protected void update() {
+ if (mDisabledByAdmin) {
+ mPreferenceCompat.setEnabled(true);
+ }
+ if (mUseAdminDisabledSummary) {
+ String disabledText = ResourcesUtil.getString(
+ mContext, "disabled_by_admin_summary_text");
+ if (mDisabledByAdmin) {
+ mPreferenceCompat.setSummary(disabledText);
+ } else if (TextUtils.equals(disabledText, mPreferenceCompat.getSummary())) {
+ // It's previously set to disabled text, clear it.
+ mPreferenceCompat.setSummary(null);
+ }
+ }
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(boolean status) {
+ if (mDisabledByAdmin) {
+ RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext, mEnforcedAdmin);
+ return true;
+ }
+ return false;
+ }
+
+
+ @Override
+ public boolean isAvailable() {
+ return true;
+ }
+
+ public void setEnabled(boolean enabled) {
+ if (enabled && isDisabledByAdmin()) {
+ boolean changed = setDisabledByAdmin(null);
+ if (changed) {
+ notifyChange();
+ }
+ return;
+ }
+ }
+
+ /**
+ * Disable this preference based on the enforce admin.
+ *
+ * @param admin details of the admin who enforced the restriction. If it is
+ * {@code null}, then this preference will be enabled. Otherwise, it will be
+ * disabled.
+ * Only gray out the preference which is not {@link RestrictedTopLevelPreference}.
+ * @return whether to notify for update.
+ */
+ public boolean setDisabledByAdmin(RestrictedLockUtils.EnforcedAdmin admin) {
+ final boolean disabled = (admin != null);
+ mEnforcedAdmin = admin;
+ boolean changed = false;
+ if (mDisabledByAdmin != disabled) {
+ mDisabledByAdmin = disabled;
+ changed = true;
+ }
+ mPreferenceCompat.setEnabled(!disabled);
+ mPreferenceCompat.setDisabledByAdmin(mDisabledByAdmin);
+ return changed;
+ }
+
+ public boolean isDisabledByAdmin() {
+ return mDisabledByAdmin;
+ }
+
+ public abstract boolean useAdminDisabledSummary();
+
+ public void setUseAdminDisabledSummary(boolean useAdminDisabledSummary) {
+ mUseAdminDisabledSummary = useAdminDisabledSummary;
+ }
+
+ public abstract String getAttrUserRestriction();
+
+}
diff --git a/Settings/src/com/android/tv/settings/util/SliceUtils.java b/SettingsAPI/java/com/android/tv/settings/library/util/SliceUtils.java
similarity index 76%
rename from Settings/src/com/android/tv/settings/util/SliceUtils.java
rename to SettingsAPI/java/com/android/tv/settings/library/util/SliceUtils.java
index fa23637..ef218f4 100644
--- a/Settings/src/com/android/tv/settings/util/SliceUtils.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/SliceUtils.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.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.tv.settings.util;
+package com.android.tv.settings.library.util;
import android.app.slice.SliceManager;
import android.content.ContentProviderClient;
@@ -22,8 +22,6 @@
import android.net.Uri;
import android.util.Log;
-import com.android.tv.settings.R;
-
import java.util.Collection;
/** Utility class for slice **/
@@ -32,6 +30,7 @@
public static final String PATH_SLICE_FRAGMENT =
"com.android.tv.twopanelsettings.slices.SliceFragment";
+
/**
* Check if slice provider exists.
*/
@@ -51,11 +50,15 @@
/**
* Checks if the slice is enabled
- * @param context Current context of the app
- * @param uri Settings slice uri
+ *
+ * @param context Current context of the app
+ * @param uri Settings slice uri
+ * @param topLevelSettingsSliceUri Top level settings slice uri, if null, use provided uri to
+ * deduce top level settings slice uri.
* @return returns true if slice is enabled, false otherwise
*/
- public static boolean isSettingsSliceEnabled(Context context, String uri) {
+ public static boolean isSettingsSliceEnabled(Context context, String uri,
+ String topLevelSettingsSliceUri) {
if (uri == null) {
return false;
}
@@ -64,8 +67,11 @@
return false;
}
try {
- final Collection<Uri> enabledSlicesUri = sliceManager.getSliceDescendants(
- Uri.parse(context.getString(R.string.top_level_settings_slice_uri)));
+ Uri topLevelSettingsSlice = topLevelSettingsSliceUri == null
+ ? Uri.parse(uri).buildUpon().path("/").build()
+ : Uri.parse(ResourcesUtil.getString(context, topLevelSettingsSliceUri));
+ final Collection<Uri> enabledSlicesUri = sliceManager
+ .getSliceDescendants(topLevelSettingsSlice);
if (enabledSlicesUri != null) {
for (final Uri sliceUri : enabledSlicesUri) {
Log.i(TAG, "Enabled slice: " + sliceUri);
diff --git a/SettingsAPI/java/com/android/tv/settings/library/util/StringUtil.java b/SettingsAPI/java/com/android/tv/settings/library/util/StringUtil.java
new file mode 100644
index 0000000..0ba05ea
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/StringUtil.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.settings.library.util;
+
+import android.content.Context;
+import android.icu.text.MeasureFormat;
+import android.icu.text.RelativeDateTimeFormatter;
+import android.icu.util.Measure;
+import android.icu.util.MeasureUnit;
+import android.icu.util.ULocale;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.style.TtsSpan;
+
+import java.util.ArrayList;
+import java.util.Locale;
+
+/** Utility class for generally useful string methods **/
+public class StringUtil {
+
+ public static final int SECONDS_PER_MINUTE = 60;
+ public static final int SECONDS_PER_HOUR = 60 * 60;
+ public static final int SECONDS_PER_DAY = 24 * 60 * 60;
+
+ private static final int LIMITED_TIME_UNIT_COUNT = 2;
+
+ /**
+ * Returns elapsed time for the given millis, in the following format:
+ * 2 days, 5 hr, 40 min, 29 sec
+ *
+ * @param context the application context
+ * @param millis the elapsed time in milli seconds
+ * @param withSeconds include seconds?
+ * @param collapseTimeUnit limit the output to top 2 time unit
+ * e.g. 2 days, 5 hr, 40 min, 29 sec will convert to 2 days, 5 hr
+ * @return the formatted elapsed time
+ */
+ public static CharSequence formatElapsedTime(Context context, double millis,
+ boolean withSeconds, boolean collapseTimeUnit) {
+ SpannableStringBuilder sb = new SpannableStringBuilder();
+ int seconds = (int) Math.floor(millis / 1000);
+ if (!withSeconds) {
+ // Round up.
+ seconds += 30;
+ }
+
+ int days = 0, hours = 0, minutes = 0;
+ if (seconds >= SECONDS_PER_DAY) {
+ days = seconds / SECONDS_PER_DAY;
+ seconds -= days * SECONDS_PER_DAY;
+ }
+ if (seconds >= SECONDS_PER_HOUR) {
+ hours = seconds / SECONDS_PER_HOUR;
+ seconds -= hours * SECONDS_PER_HOUR;
+ }
+ if (seconds >= SECONDS_PER_MINUTE) {
+ minutes = seconds / SECONDS_PER_MINUTE;
+ seconds -= minutes * SECONDS_PER_MINUTE;
+ }
+
+ final ArrayList<Measure> measureList = new ArrayList(4);
+ if (days > 0) {
+ measureList.add(new Measure(days, MeasureUnit.DAY));
+ }
+ if (hours > 0) {
+ measureList.add(new Measure(hours, MeasureUnit.HOUR));
+ }
+ if (minutes > 0) {
+ measureList.add(new Measure(minutes, MeasureUnit.MINUTE));
+ }
+ if (withSeconds && seconds > 0) {
+ measureList.add(new Measure(seconds, MeasureUnit.SECOND));
+ }
+ if (measureList.size() == 0) {
+ // Everything addable was zero, so nothing was added. We add a zero.
+ measureList.add(new Measure(0, withSeconds ? MeasureUnit.SECOND : MeasureUnit.MINUTE));
+ }
+
+ if (collapseTimeUnit && measureList.size() > LIMITED_TIME_UNIT_COUNT) {
+ // Limit the output to top 2 time unit.
+ measureList.subList(LIMITED_TIME_UNIT_COUNT, measureList.size()).clear();
+ }
+
+ final Measure[] measureArray = measureList.toArray(new Measure[measureList.size()]);
+
+ final Locale locale = context.getResources().getConfiguration().locale;
+ final MeasureFormat measureFormat = MeasureFormat.getInstance(
+ locale, MeasureFormat.FormatWidth.SHORT);
+ sb.append(measureFormat.formatMeasures(measureArray));
+
+ if (measureArray.length == 1 && MeasureUnit.MINUTE.equals(measureArray[0].getUnit())) {
+ // Add ttsSpan if it only have minute value, because it will be read as "meters"
+ final TtsSpan ttsSpan = new TtsSpan.MeasureBuilder().setNumber(minutes)
+ .setUnit("minute").build();
+ sb.setSpan(ttsSpan, 0, sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ }
+
+ return sb;
+ }
+
+ /**
+ * Returns relative time for the given millis in the past with different format style.
+ * In a short format such as "2 days ago", "5 hr. ago", "40 min. ago", or "29 sec. ago".
+ * In a long format such as "2 days ago", "5 hours ago", "40 minutes ago" or "29 seconds ago".
+ *
+ * <p>The unit is chosen to have good information value while only using one unit. So 27 hours
+ * and 50 minutes would be formatted as "28 hr. ago", while 50 hours would be formatted as
+ * "2 days ago".
+ *
+ * @param context the application context
+ * @param millis the elapsed time in milli seconds
+ * @param withSeconds include seconds?
+ * @param formatStyle format style
+ * @return the formatted elapsed time
+ */
+ public static CharSequence formatRelativeTime(Context context, double millis,
+ boolean withSeconds, RelativeDateTimeFormatter.Style formatStyle) {
+ final int seconds = (int) Math.floor(millis / 1000);
+ final RelativeDateTimeFormatter.RelativeUnit unit;
+ final int value;
+ if (withSeconds && seconds < 2 * SECONDS_PER_MINUTE) {
+ return ResourcesUtil.getString(context, "time_unit_just_now");
+ } else if (seconds < 2 * SECONDS_PER_HOUR) {
+ unit = RelativeDateTimeFormatter.RelativeUnit.MINUTES;
+ value = (seconds + SECONDS_PER_MINUTE / 2)
+ / SECONDS_PER_MINUTE;
+ } else if (seconds < 2 * SECONDS_PER_DAY) {
+ unit = RelativeDateTimeFormatter.RelativeUnit.HOURS;
+ value = (seconds + SECONDS_PER_HOUR / 2)
+ / SECONDS_PER_HOUR;
+ } else {
+ unit = RelativeDateTimeFormatter.RelativeUnit.DAYS;
+ value = (seconds + SECONDS_PER_DAY / 2)
+ / SECONDS_PER_DAY;
+ }
+
+ final Locale locale = context.getResources().getConfiguration().locale;
+ final RelativeDateTimeFormatter formatter = RelativeDateTimeFormatter.getInstance(
+ ULocale.forLocale(locale),
+ null /* default NumberFormat */,
+ formatStyle,
+ android.icu.text.DisplayContext.CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE);
+
+ return formatter.format(value, RelativeDateTimeFormatter.Direction.LAST, unit);
+ }
+
+ /**
+ * Returns relative time for the given millis in the past, in a long format such as "2 days
+ * ago", "5 hours ago", "40 minutes ago" or "29 seconds ago".
+ *
+ * <p>The unit is chosen to have good information value while only using one unit. So 27 hours
+ * and 50 minutes would be formatted as "28 hr. ago", while 50 hours would be formatted as
+ * "2 days ago".
+ *
+ * @param context the application context
+ * @param millis the elapsed time in milli seconds
+ * @param withSeconds include seconds?
+ * @return the formatted elapsed time
+ * @deprecated use {@link #formatRelativeTime(Context, double, boolean,
+ * RelativeDateTimeFormatter.Style)} instead.
+ */
+ @Deprecated
+ public static CharSequence formatRelativeTime(Context context, double millis,
+ boolean withSeconds) {
+ return formatRelativeTime(context, millis, withSeconds,
+ RelativeDateTimeFormatter.Style.LONG);
+ }
+}
+
diff --git a/SettingsAPI/java/com/android/tv/settings/library/util/ThreadUtils.java b/SettingsAPI/java/com/android/tv/settings/library/util/ThreadUtils.java
new file mode 100644
index 0000000..c1f04f3
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/ThreadUtils.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.tv.settings.library.util;
+
+import android.os.Handler;
+import android.os.Looper;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+public class ThreadUtils {
+
+ private static volatile Thread sMainThread;
+ private static volatile Handler sMainThreadHandler;
+ private static volatile ExecutorService sThreadExecutor;
+
+ /**
+ * Returns true if the current thread is the UI thread.
+ */
+ public static boolean isMainThread() {
+ if (sMainThread == null) {
+ sMainThread = Looper.getMainLooper().getThread();
+ }
+ return Thread.currentThread() == sMainThread;
+ }
+
+ /**
+ * Returns a shared UI thread handler.
+ */
+ public static Handler getUiThreadHandler() {
+ if (sMainThreadHandler == null) {
+ sMainThreadHandler = new Handler(Looper.getMainLooper());
+ }
+
+ return sMainThreadHandler;
+ }
+
+ /**
+ * Checks that the current thread is the UI thread. Otherwise throws an exception.
+ */
+ public static void ensureMainThread() {
+ if (!isMainThread()) {
+ throw new RuntimeException("Must be called on the UI thread");
+ }
+ }
+
+ /**
+ * Posts runnable in background using shared background thread pool.
+ *
+ * @Return A future of the task that can be monitored for updates or cancelled.
+ */
+ public static Future postOnBackgroundThread(Runnable runnable) {
+ return getThreadExecutor().submit(runnable);
+ }
+
+ /**
+ * Posts callable in background using shared background thread pool.
+ *
+ * @Return A future of the task that can be monitored for updates or cancelled.
+ */
+ public static Future postOnBackgroundThread(Callable callable) {
+ return getThreadExecutor().submit(callable);
+ }
+
+ /**
+ * Posts the runnable on the main thread.
+ */
+ public static void postOnMainThread(Runnable runnable) {
+ getUiThreadHandler().post(runnable);
+ }
+
+ private static synchronized ExecutorService getThreadExecutor() {
+ if (sThreadExecutor == null) {
+ sThreadExecutor = Executors.newFixedThreadPool(
+ Runtime.getRuntime().availableProcessors());
+ }
+ return sThreadExecutor;
+ }
+}
diff --git a/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/Lifecycle.java b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/Lifecycle.java
new file mode 100644
index 0000000..f69b801
--- /dev/null
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/Lifecycle.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tv.settings.library.util.lifecycle;
+
+import android.annotation.UiThread;
+import android.os.Bundle;
+
+import androidx.preference.PreferenceScreen;
+
+import com.android.tv.settings.library.util.ThreadUtils;
+import com.android.tv.settings.library.util.lifecycle.events.OnAttach;
+import com.android.tv.settings.library.util.lifecycle.events.OnCreate;
+import com.android.tv.settings.library.util.lifecycle.events.OnDestroy;
+import com.android.tv.settings.library.util.lifecycle.events.OnPause;
+import com.android.tv.settings.library.util.lifecycle.events.OnResume;
+import com.android.tv.settings.library.util.lifecycle.events.OnSaveInstanceState;
+import com.android.tv.settings.library.util.lifecycle.events.OnStart;
+import com.android.tv.settings.library.util.lifecycle.events.OnStop;
+import com.android.tv.settings.library.util.lifecycle.events.SetPreferenceScreen;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Dispatcher for lifecycle events.
+ */
+public class Lifecycle {
+ private static final String TAG = "LifecycleObserver";
+
+ private final List<LifecycleObserver> mObservers = new ArrayList<>();
+
+ /**
+ * Registers a new observer of lifecycle events.
+ */
+ @UiThread
+ public void addObserver(LifecycleObserver observer) {
+ ThreadUtils.ensureMainThread();
+ mObservers.add(observer);
+ }
+
+ @UiThread
+ public void removeObserver(LifecycleObserver observer) {
+ ThreadUtils.ensureMainThread();
+ mObservers.remove(observer);
+ }
+
+ /**
+ * Pass all onAttach event to {@link LifecycleObserver}.
+ */
+ public void onAttach() {
+ for (int i = 0, size = mObservers.size(); i < size; i++) {
+ final LifecycleObserver observer = mObservers.get(i);
+ if (observer instanceof OnAttach) {
+ ((OnAttach) observer).onAttach();
+ }
+ }
+ }
+
+ public void onCreate(Bundle savedInstanceState) {
+ for (int i = 0, size = mObservers.size(); i < size; i++) {
+ final LifecycleObserver observer = mObservers.get(i);
+ if (observer instanceof OnCreate) {
+ ((OnCreate) observer).onCreate(savedInstanceState);
+ }
+ }
+ }
+
+ public void onStart() {
+ for (int i = 0, size = mObservers.size(); i < size; i++) {
+ final LifecycleObserver observer = mObservers.get(i);
+ if (observer instanceof OnStart) {
+ ((OnStart) observer).onStart();
+ }
+ }
+ }
+
+ public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
+ for (int i = 0, size = mObservers.size(); i < size; i++) {
+ final LifecycleObserver observer = mObservers.get(i);
+ if (observer instanceof SetPreferenceScreen) {
+ ((SetPreferenceScreen) observer).setPreferenceScreen(preferenceScreen);
+ }
+ }
+ }
+
+ public void onResume() {
+ for (int i = 0, size = mObservers.size(); i < size; i++) {
+ final LifecycleObserver observer = mObservers.get(i);
+ if (observer instanceof OnResume) {
+ ((OnResume) observer).onResume();
+ }
+ }
+ }
+
+ public void onPause() {
+ for (int i = 0, size = mObservers.size(); i < size; i++) {
+ final LifecycleObserver observer = mObservers.get(i);
+ if (observer instanceof OnPause) {
+ ((OnPause) observer).onPause();
+ }
+ }
+ }
+
+ public void onSaveInstanceState(Bundle outState) {
+ for (int i = 0, size = mObservers.size(); i < size; i++) {
+ final LifecycleObserver observer = mObservers.get(i);
+ if (observer instanceof OnSaveInstanceState) {
+ ((OnSaveInstanceState) observer).onSaveInstanceState(outState);
+ }
+ }
+ }
+
+ public void onStop() {
+ for (int i = 0, size = mObservers.size(); i < size; i++) {
+ final LifecycleObserver observer = mObservers.get(i);
+ if (observer instanceof OnStop) {
+ ((OnStop) observer).onStop();
+ }
+ }
+ }
+
+ public void onDestroy() {
+ for (int i = 0, size = mObservers.size(); i < size; i++) {
+ final LifecycleObserver observer = mObservers.get(i);
+ if (observer instanceof OnDestroy) {
+ ((OnDestroy) observer).onDestroy();
+ }
+ }
+ }
+}
diff --git a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/LifecycleObserver.java
similarity index 81%
rename from Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
rename to SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/LifecycleObserver.java
index c065485..6ab86fc 100644
--- a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/LifecycleObserver.java
@@ -13,7 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.android.tv.settings.library.util.lifecycle;
-package com.android.tv.settings.service;
-
-parcelable PreferenceParcelable;
\ No newline at end of file
+/**
+ * Observer of lifecycle events.
+ */
+public interface LifecycleObserver {
+}
diff --git a/Settings/src/com/android/tv/settings/service/data/Module.java b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnAttach.java
similarity index 68%
copy from Settings/src/com/android/tv/settings/service/data/Module.java
copy to SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnAttach.java
index efcb368..43e6acd 100644
--- a/Settings/src/com/android/tv/settings/service/data/Module.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnAttach.java
@@ -13,16 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.android.tv.settings.library.util.lifecycle.events;
-package com.android.tv.settings.service.data;
-
-/** Implement this to provide back-end data for multiple states. */
-public interface Module {
- void addState(State state);
-
- void removeState(State state);
-
- void create();
-
- void destroy();
+/**
+ * An Interface used by {@link LifecycleObserver} which changes to onAttach state.
+ */
+public interface OnAttach {
+ /**
+ * Called when {@link LifecycleObserver} is entering onAttach
+ */
+ void onAttach();
}
diff --git a/Settings/src/com/android/tv/settings/service/data/Module.java b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnCreate.java
similarity index 71%
copy from Settings/src/com/android/tv/settings/service/data/Module.java
copy to SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnCreate.java
index efcb368..549e7a3 100644
--- a/Settings/src/com/android/tv/settings/service/data/Module.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnCreate.java
@@ -13,16 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.android.tv.settings.library.util.lifecycle.events;
-package com.android.tv.settings.service.data;
-/** Implement this to provide back-end data for multiple states. */
-public interface Module {
- void addState(State state);
+import android.os.Bundle;
- void removeState(State state);
-
- void create();
-
- void destroy();
+/**
+ * @deprecated use {@link androidx.lifecycle.OnLifecycleEvent}
+ */
+public interface OnCreate {
+ void onCreate(Bundle savedInstanceState);
}
diff --git a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnCreateOptionsMenu.java
similarity index 72%
copy from Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
copy to SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnCreateOptionsMenu.java
index c065485..9965379 100644
--- a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnCreateOptionsMenu.java
@@ -14,6 +14,11 @@
* limitations under the License.
*/
-package com.android.tv.settings.service;
+package com.android.tv.settings.library.util.lifecycle.events;
-parcelable PreferenceParcelable;
\ No newline at end of file
+import android.view.Menu;
+import android.view.MenuInflater;
+
+public interface OnCreateOptionsMenu {
+ void onCreateOptionsMenu(Menu menu, MenuInflater inflater);
+}
diff --git a/Settings/src/com/android/tv/settings/service/data/Module.java b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnDestroy.java
similarity index 70%
copy from Settings/src/com/android/tv/settings/service/data/Module.java
copy to SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnDestroy.java
index efcb368..abc9eda 100644
--- a/Settings/src/com/android/tv/settings/service/data/Module.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnDestroy.java
@@ -13,16 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.android.tv.settings.library.util.lifecycle.events;
-package com.android.tv.settings.service.data;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.OnLifecycleEvent;
-/** Implement this to provide back-end data for multiple states. */
-public interface Module {
- void addState(State state);
-
- void removeState(State state);
-
- void create();
-
- void destroy();
+/**
+ * @deprecated use {@link OnLifecycleEvent(Lifecycle.Event) }
+ */
+public interface OnDestroy {
+ void onDestroy();
}
diff --git a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnOptionsItemSelected.java
similarity index 75%
copy from Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
copy to SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnOptionsItemSelected.java
index c065485..b33c825 100644
--- a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnOptionsItemSelected.java
@@ -14,6 +14,10 @@
* limitations under the License.
*/
-package com.android.tv.settings.service;
+package com.android.tv.settings.library.util.lifecycle.events;
-parcelable PreferenceParcelable;
\ No newline at end of file
+import android.view.MenuItem;
+
+public interface OnOptionsItemSelected {
+ boolean onOptionsItemSelected(MenuItem menuItem);
+}
diff --git a/Settings/src/com/android/tv/settings/service/data/Module.java b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnPause.java
similarity index 69%
copy from Settings/src/com/android/tv/settings/service/data/Module.java
copy to SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnPause.java
index efcb368..2589145 100644
--- a/Settings/src/com/android/tv/settings/service/data/Module.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnPause.java
@@ -13,16 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.android.tv.settings.library.util.lifecycle.events;
-package com.android.tv.settings.service.data;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.OnLifecycleEvent;
-/** Implement this to provide back-end data for multiple states. */
-public interface Module {
- void addState(State state);
-
- void removeState(State state);
-
- void create();
-
- void destroy();
+/**
+ * @deprecated use {@link OnLifecycleEvent(Lifecycle.Event) }
+ */
+@Deprecated
+public interface OnPause {
+ void onPause();
}
diff --git a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnPrepareOptionsMenu.java
similarity index 77%
copy from Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
copy to SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnPrepareOptionsMenu.java
index c065485..887d1ad 100644
--- a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnPrepareOptionsMenu.java
@@ -14,6 +14,10 @@
* limitations under the License.
*/
-package com.android.tv.settings.service;
+package com.android.tv.settings.library.util.lifecycle.events;
-parcelable PreferenceParcelable;
\ No newline at end of file
+import android.view.Menu;
+
+public interface OnPrepareOptionsMenu {
+ void onPrepareOptionsMenu(Menu menu);
+}
diff --git a/Settings/src/com/android/tv/settings/service/data/Module.java b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnResume.java
similarity index 69%
copy from Settings/src/com/android/tv/settings/service/data/Module.java
copy to SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnResume.java
index efcb368..998bf40 100644
--- a/Settings/src/com/android/tv/settings/service/data/Module.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnResume.java
@@ -13,16 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.android.tv.settings.library.util.lifecycle.events;
-package com.android.tv.settings.service.data;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.OnLifecycleEvent;
-/** Implement this to provide back-end data for multiple states. */
-public interface Module {
- void addState(State state);
-
- void removeState(State state);
-
- void create();
-
- void destroy();
+/**
+ * @deprecated use {@link OnLifecycleEvent(Lifecycle.Event)}
+ */
+@Deprecated
+public interface OnResume {
+ void onResume();
}
diff --git a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnSaveInstanceState.java
similarity index 77%
copy from Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
copy to SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnSaveInstanceState.java
index c065485..50d1597 100644
--- a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnSaveInstanceState.java
@@ -13,7 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.android.tv.settings.library.util.lifecycle.events;
-package com.android.tv.settings.service;
+import android.os.Bundle;
-parcelable PreferenceParcelable;
\ No newline at end of file
+
+public interface OnSaveInstanceState {
+ void onSaveInstanceState(Bundle outState);
+}
diff --git a/Settings/src/com/android/tv/settings/service/data/Module.java b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnStart.java
similarity index 69%
copy from Settings/src/com/android/tv/settings/service/data/Module.java
copy to SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnStart.java
index efcb368..f8064c0 100644
--- a/Settings/src/com/android/tv/settings/service/data/Module.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnStart.java
@@ -13,16 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.android.tv.settings.library.util.lifecycle.events;
-package com.android.tv.settings.service.data;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.OnLifecycleEvent;
-/** Implement this to provide back-end data for multiple states. */
-public interface Module {
- void addState(State state);
-
- void removeState(State state);
-
- void create();
-
- void destroy();
+/**
+ * @deprecated use {@link OnLifecycleEvent(Lifecycle.Event) }
+ */
+@Deprecated
+public interface OnStart {
+ void onStart();
}
diff --git a/Settings/src/com/android/tv/settings/service/data/Module.java b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnStop.java
similarity index 69%
copy from Settings/src/com/android/tv/settings/service/data/Module.java
copy to SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnStop.java
index efcb368..a9e415e 100644
--- a/Settings/src/com/android/tv/settings/service/data/Module.java
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/OnStop.java
@@ -13,16 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.android.tv.settings.library.util.lifecycle.events;
-package com.android.tv.settings.service.data;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.OnLifecycleEvent;
-/** Implement this to provide back-end data for multiple states. */
-public interface Module {
- void addState(State state);
-
- void removeState(State state);
-
- void create();
-
- void destroy();
+/**
+ * @deprecated use {@link OnLifecycleEvent(Lifecycle.Event) }
+ */
+@Deprecated
+public interface OnStop {
+ void onStop();
}
diff --git a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/SetPreferenceScreen.java
similarity index 73%
copy from Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
copy to SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/SetPreferenceScreen.java
index c065485..cfb4d9b 100644
--- a/Settings/src/com/android/tv/settings/service/PreferenceParcelable.aidl
+++ b/SettingsAPI/java/com/android/tv/settings/library/util/lifecycle/events/SetPreferenceScreen.java
@@ -14,6 +14,11 @@
* limitations under the License.
*/
-package com.android.tv.settings.service;
+package com.android.tv.settings.library.util.lifecycle.events;
-parcelable PreferenceParcelable;
\ No newline at end of file
+import androidx.preference.PreferenceScreen;
+
+public interface SetPreferenceScreen {
+
+ void setPreferenceScreen(PreferenceScreen preferenceScreen);
+}
diff --git a/TwoPanelSettingsLib/res/anim/easing_browse.xml b/TwoPanelSettingsLib/res/anim/easing_browse.xml
new file mode 100644
index 0000000..9ea0181
--- /dev/null
+++ b/TwoPanelSettingsLib/res/anim/easing_browse.xml
@@ -0,0 +1,23 @@
+<?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.
+ -->
+
+<!-- Transition interpolator for tab switch, accelerate-decelerate with a custom curve. -->
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:controlX1="0.18"
+ android:controlY1="1.00"
+ android:controlX2="0.22"
+ android:controlY2="1.00" />
\ No newline at end of file
diff --git a/TwoPanelSettingsLib/res/anim/easing_enter.xml b/TwoPanelSettingsLib/res/anim/easing_enter.xml
new file mode 100644
index 0000000..bc341e1
--- /dev/null
+++ b/TwoPanelSettingsLib/res/anim/easing_enter.xml
@@ -0,0 +1,23 @@
+<?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.
+ -->
+
+<!-- Transition interpolator for tab switch, accelerate-decelerate with a custom curve. -->
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:controlX1="0.12"
+ android:controlY1="1.00"
+ android:controlX2="0.40"
+ android:controlY2="1.00" />
\ No newline at end of file
diff --git a/TwoPanelSettingsLib/res/anim/easing_exit.xml b/TwoPanelSettingsLib/res/anim/easing_exit.xml
new file mode 100644
index 0000000..0fda693
--- /dev/null
+++ b/TwoPanelSettingsLib/res/anim/easing_exit.xml
@@ -0,0 +1,23 @@
+<?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.
+ -->
+
+<!-- Transition interpolator for tab switch, accelerate-decelerate with a custom curve. -->
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:controlX1="0.40"
+ android:controlY1="1.00"
+ android:controlX2="0.12"
+ android:controlY2="1.00" />
\ No newline at end of file
diff --git a/TwoPanelSettingsLib/res/animator/fade_in_preview_panel.xml b/TwoPanelSettingsLib/res/animator/fade_in_preview_panel.xml
new file mode 100644
index 0000000..d8cd4f1
--- /dev/null
+++ b/TwoPanelSettingsLib/res/animator/fade_in_preview_panel.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.
+ -->
+
+<!-- Enter transition for background fadeing in without motion. -->
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:ordering="together">
+ <objectAnimator
+ android:propertyName="alpha"
+ android:valueFrom="0.0"
+ android:valueTo="1.0"
+ android:duration="@android:integer/config_longAnimTime"
+ android:interpolator="@anim/easing_enter" />
+</set>
\ No newline at end of file
diff --git a/TwoPanelSettingsLib/res/animator/fade_out_preview_panel.xml b/TwoPanelSettingsLib/res/animator/fade_out_preview_panel.xml
new file mode 100644
index 0000000..ac2ea24
--- /dev/null
+++ b/TwoPanelSettingsLib/res/animator/fade_out_preview_panel.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.
+ -->
+
+<!-- Enter transition for background fadeing in without motion. -->
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:ordering="together">
+ <objectAnimator
+ android:propertyName="alpha"
+ android:valueFrom="1.0"
+ android:valueTo="0.0"
+ android:duration="@android:integer/config_longAnimTime"
+ android:interpolator="@anim/easing_exit" />
+</set>
\ No newline at end of file
diff --git a/TwoPanelSettingsLib/res/layout/preference_reversed_icon.xml b/TwoPanelSettingsLib/res/layout/preference_reversed_icon.xml
new file mode 100644
index 0000000..04dc1a5
--- /dev/null
+++ b/TwoPanelSettingsLib/res/layout/preference_reversed_icon.xml
@@ -0,0 +1,77 @@
+<?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
+ -->
+
+<!-- Originally copied from leanback_preference.xml in TwoPanelSettingsOverlay-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/tp_preference_min_height"
+ android:background="?android:attr/selectableItemBackground"
+ android:clickable="true"
+ android:focusable="true"
+ android:descendantFocusability="blocksDescendants"
+ android:orientation="horizontal"
+ android:layout_marginBottom="@dimen/tp_preference_item_margin_bottom"
+ android:paddingTop="@dimen/lb_preference_item_text_space_top"
+ android:paddingBottom="@dimen/lb_preference_item_text_space_bottom"
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" >
+
+ <LinearLayout android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:duplicateParentState="true"
+ android:layout_gravity="center_vertical"
+ android:orientation="vertical">
+ <TextView
+ android:id="@android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/tp_preference_title_min_height"
+ android:includeFontPadding="false"
+ android:duplicateParentState="true"
+ android:textAppearance="?android:attr/textAppearanceListItem"/>
+ <TextView
+ android:id="@android:id/summary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/lb_preference_item_primary_text_margin_bottom"
+ android:minHeight="@dimen/tp_preference_summary_min_height"
+ android:includeFontPadding="false"
+ android:duplicateParentState="true"
+ android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+ android:singleLine="false"
+ android:maxLines="4" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/icon_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:duplicateParentState="true"
+ android:gravity="center_vertical"
+ android:orientation="vertical" >
+ <ImageView
+ android:id="@android:id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:clickable="false"
+ android:focusable="false" />
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml b/TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml
index 4fb0392..310b997 100644
--- a/TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml
+++ b/TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml
@@ -68,7 +68,7 @@
android:layout_width="@dimen/preference_pane_extra_padding_start"
android:layout_height="match_parent" />
- <FrameLayout
+ <com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout
android:id="@+id/frame1"
android:background="@color/tp_preference_panel_background_color"
android:layout_width="@dimen/tp_settings_preference_pane_width"
@@ -77,9 +77,9 @@
android:paddingEnd="@dimen/preference_pane_padding_end"
android:clipChildren="false"
android:clipToPadding="false">
- </FrameLayout>
+ </com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout>
- <FrameLayout
+ <com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout
android:id="@+id/frame2"
android:background="@color/tp_preference_panel_background_color"
android:layout_width="@dimen/tp_settings_preference_pane_width"
@@ -88,9 +88,9 @@
android:paddingEnd="@dimen/preference_pane_padding_end"
android:clipChildren="false"
android:clipToPadding="false">
- </FrameLayout>
+ </com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout>
- <FrameLayout
+ <com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout
android:id="@+id/frame3"
android:background="@color/tp_preference_panel_background_color"
android:layout_width="@dimen/tp_settings_preference_pane_width"
@@ -99,9 +99,9 @@
android:paddingEnd="@dimen/preference_pane_padding_end"
android:clipChildren="false"
android:clipToPadding="false">
- </FrameLayout>
+ </com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout>
- <FrameLayout
+ <com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout
android:id="@+id/frame4"
android:background="@color/tp_preference_panel_background_color"
android:layout_width="@dimen/tp_settings_preference_pane_width"
@@ -110,9 +110,9 @@
android:paddingEnd="@dimen/preference_pane_padding_end"
android:clipChildren="false"
android:clipToPadding="false">
- </FrameLayout>
+ </com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout>
- <FrameLayout
+ <com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout
android:id="@+id/frame5"
android:background="@color/tp_preference_panel_background_color"
android:layout_width="@dimen/tp_settings_preference_pane_width"
@@ -121,9 +121,9 @@
android:paddingEnd="@dimen/preference_pane_padding_end"
android:clipChildren="false"
android:clipToPadding="false">
- </FrameLayout>
+ </com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout>
- <FrameLayout
+ <com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout
android:id="@+id/frame6"
android:background="@color/tp_preference_panel_background_color"
android:layout_width="@dimen/tp_settings_preference_pane_width"
@@ -132,9 +132,9 @@
android:paddingEnd="@dimen/preference_pane_padding_end"
android:clipChildren="false"
android:clipToPadding="false">
- </FrameLayout>
+ </com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout>
- <FrameLayout
+ <com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout
android:id="@+id/frame7"
android:background="@color/tp_preference_panel_background_color"
android:layout_width="@dimen/tp_settings_preference_pane_width"
@@ -143,9 +143,9 @@
android:paddingEnd="@dimen/preference_pane_padding_end"
android:clipChildren="false"
android:clipToPadding="false">
- </FrameLayout>
+ </com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout>
- <FrameLayout
+ <com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout
android:id="@+id/frame8"
android:background="@color/tp_preference_panel_background_color"
android:layout_width="@dimen/tp_settings_preference_pane_width"
@@ -154,9 +154,9 @@
android:paddingEnd="@dimen/preference_pane_padding_end"
android:clipChildren="false"
android:clipToPadding="false">
- </FrameLayout>
+ </com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout>
- <FrameLayout
+ <com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout
android:id="@+id/frame9"
android:background="@color/tp_preference_panel_background_color"
android:layout_width="@dimen/tp_settings_preference_pane_width"
@@ -165,9 +165,9 @@
android:paddingEnd="@dimen/preference_pane_padding_end"
android:clipChildren="false"
android:clipToPadding="false">
- </FrameLayout>
+ </com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout>
- <FrameLayout
+ <com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout
android:id="@+id/frame10"
android:background="@color/tp_preference_panel_background_color"
android:layout_width="@dimen/tp_settings_preference_pane_width"
@@ -176,7 +176,7 @@
android:paddingEnd="@dimen/preference_pane_padding_end"
android:clipChildren="false"
android:clipToPadding="false">
- </FrameLayout>
+ </com.android.tv.twopanelsettings.TwoPanelSettingsFrameLayout>
<!-- extra_padding_rtl, the extra paddingStart of preference pane in RTL -->
<FrameLayout
diff --git a/TwoPanelSettingsLib/res/values/dimens.xml b/TwoPanelSettingsLib/res/values/dimens.xml
index e882315..f893820 100644
--- a/TwoPanelSettingsLib/res/values/dimens.xml
+++ b/TwoPanelSettingsLib/res/values/dimens.xml
@@ -28,6 +28,10 @@
<dimen name="tp_preference_decor_subtitle_text_size">14sp</dimen>
<dimen name="tp_preference_item_primary_text_size">14sp</dimen>
<dimen name="tp_preference_item_secondary_text_size">12sp</dimen>
+ <dimen name="tp_preference_min_height">60dp</dimen>
+ <dimen name="tp_preference_title_min_height">20dp</dimen>
+ <dimen name="tp_preference_summary_min_height">16dp</dimen>
+ <dimen name="tp_preference_item_margin_bottom">4dp</dimen>
<dimen name="decor_icon_width">50dp</dimen>
<dimen name="decor_icon_height">50dp</dimen>
<dimen name="decor_icon_margin_top">6dp</dimen>
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/SettingsPreferenceFragmentBase.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/SettingsPreferenceFragmentBase.java
index 2e68f36..f658f81 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/SettingsPreferenceFragmentBase.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/SettingsPreferenceFragmentBase.java
@@ -16,6 +16,10 @@
package com.android.tv.twopanelsettings;
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.NonNull;
import androidx.leanback.preference.LeanbackPreferenceFragmentCompat;
/**
@@ -24,8 +28,8 @@
*/
public abstract class SettingsPreferenceFragmentBase extends LeanbackPreferenceFragmentCompat {
@Override
- public void onResume() {
- super.onResume();
+ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
if (getCallbackFragment() instanceof TwoPanelSettingsFragment) {
TwoPanelSettingsFragment parentFragment =
(TwoPanelSettingsFragment) getCallbackFragment();
@@ -34,8 +38,8 @@
}
@Override
- public void onPause() {
- super.onPause();
+ public void onDestroyView() {
+ super.onDestroyView();
if (getCallbackFragment() instanceof TwoPanelSettingsFragment) {
TwoPanelSettingsFragment parentFragment =
(TwoPanelSettingsFragment) getCallbackFragment();
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelScrollView.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelScrollView.java
index 6c886d9..9fdd5f7 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelScrollView.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelScrollView.java
@@ -17,6 +17,7 @@
import android.content.Context;
import android.util.AttributeSet;
+import android.view.MotionEvent;
import android.widget.HorizontalScrollView;
/**
@@ -36,4 +37,28 @@
public boolean arrowScroll(int direction) {
return false;
}
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ switch (ev.getActionMasked()) {
+ case MotionEvent.ACTION_DOWN:
+ case MotionEvent.ACTION_MOVE:
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ return false;
+ }
+ return super.onInterceptTouchEvent(ev);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ switch (ev.getActionMasked()) {
+ case MotionEvent.ACTION_DOWN:
+ case MotionEvent.ACTION_MOVE:
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ return false;
+ }
+ return super.onInterceptTouchEvent(ev);
+ }
}
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelSettingsFragment.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelSettingsFragment.java
index bb30038..035428b 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelSettingsFragment.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelSettingsFragment.java
@@ -25,6 +25,7 @@
import android.animation.AnimatorSet;
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
+import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.ContentProviderClient;
import android.content.Context;
@@ -38,12 +39,15 @@
import android.provider.Settings;
import android.text.TextUtils;
import android.transition.Fade;
+import android.util.ArrayMap;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
+import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.view.animation.AnimationUtils;
import android.widget.HorizontalScrollView;
import android.widget.TextView;
@@ -70,10 +74,11 @@
import com.android.tv.twopanelsettings.slices.InfoFragment;
import com.android.tv.twopanelsettings.slices.SliceFragment;
import com.android.tv.twopanelsettings.slices.SlicePreference;
+import com.android.tv.twopanelsettings.slices.SliceSeekbarPreference;
import com.android.tv.twopanelsettings.slices.SliceSwitchPreference;
import com.android.tv.twopanelsettings.slices.SlicesConstants;
-import com.android.tv.twopanelsettings.slices.SliceSeekbarPreference;
+import java.util.Map;
import java.util.Set;
/**
@@ -98,9 +103,14 @@
{R.id.frame1, R.id.frame2, R.id.frame3, R.id.frame4, R.id.frame5, R.id.frame6,
R.id.frame7, R.id.frame8, R.id.frame9, R.id.frame10};
- private static final long PANEL_ANIMATION_MS = 400;
+ private static final long PANEL_ANIMATION_SLIDE_MS = 1000;
+ private static final long PANEL_ANIMATION_ALPHA_MS = 200;
+ private static final long PANEL_BACKGROUND_ANIMATION_ALPHA_MS = 500;
private static final long PANEL_ANIMATION_DELAY_MS = 200;
- private static final long PREVIEW_PANEL_DEFAULT_DELAY_MS = 0;
+ private static final long PREVIEW_PANEL_DEFAULT_DELAY_MS =
+ ActivityManager.isLowRamDeviceStatic() ? 100 : 0;
+ private static final boolean DEFAULT_CHECK_SCROLL_STATE =
+ ActivityManager.isLowRamDeviceStatic();
private static final long CHECK_IDLE_STATE_MS = 100;
private long mPreviewPanelCreationDelay = 0;
private static final float PREVIEW_PANEL_ALPHA = 0.6f;
@@ -115,16 +125,19 @@
private Preference mFocusedPreference;
private boolean mIsWaitingForUpdatingPreview = false;
private AudioManager mAudioManager;
+ private final Map<VerticalGridView, OnChildViewHolderSelectedListenerTwoPanel>
+ mHasOnChildViewHolderSelectedListener = new ArrayMap<>();
private static final String DELAY_MS = "delay_ms";
private static final String CHECK_SCROLL_STATE = "check_scroll_state";
/** An broadcast receiver to help OEM test best delay for preview panel fragment creation. */
- private BroadcastReceiver mPreviewPanelDelayReceiver = new BroadcastReceiver() {
+ private final BroadcastReceiver mPreviewPanelDelayReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
long delay = intent.getLongExtra(DELAY_MS, PREVIEW_PANEL_DEFAULT_DELAY_MS);
- boolean checkScrollState = intent.getBooleanExtra(CHECK_SCROLL_STATE, false);
+ boolean checkScrollState = intent.getBooleanExtra(
+ CHECK_SCROLL_STATE, DEFAULT_CHECK_SCROLL_STATE);
Log.d(TAG, "New delay for creating preview panel fragment " + delay
+ " check scroll state " + checkScrollState);
mPreviewPanelCreationDelay = delay;
@@ -132,28 +145,6 @@
}
};
- private final OnChildViewHolderSelectedListener mOnChildViewHolderSelectedListener =
- new OnChildViewHolderSelectedListener() {
- @Override
- public void onChildViewHolderSelected(RecyclerView parent,
- RecyclerView.ViewHolder child, int position, int subposition) {
- if (parent == null || child == null) {
- return;
- }
- int adapterPosition = child.getAdapterPosition();
- PreferenceGroupAdapter preferenceGroupAdapter =
- (PreferenceGroupAdapter) parent.getAdapter();
- if (preferenceGroupAdapter != null) {
- Preference preference = preferenceGroupAdapter.getItem(adapterPosition);
- onPreferenceFocused(preference);
- }
- }
-
- @Override
- public void onChildViewHolderSelectedAndPositioned(RecyclerView parent,
- RecyclerView.ViewHolder child, int position, int subposition) {
- }
- };
private final OnGlobalLayoutListener mOnGlobalLayoutListener = new OnGlobalLayoutListener() {
@Override
@@ -166,6 +157,35 @@
}
};
+ private class OnChildViewHolderSelectedListenerTwoPanel extends
+ OnChildViewHolderSelectedListener {
+ private final int mPaneLIndex;
+
+ OnChildViewHolderSelectedListenerTwoPanel(int panelIndex) {
+ mPaneLIndex = panelIndex;
+ }
+
+ @Override
+ public void onChildViewHolderSelected(RecyclerView parent,
+ RecyclerView.ViewHolder child, int position, int subposition) {
+ if (parent == null || child == null) {
+ return;
+ }
+ int adapterPosition = child.getAdapterPosition();
+ PreferenceGroupAdapter preferenceGroupAdapter =
+ (PreferenceGroupAdapter) parent.getAdapter();
+ if (preferenceGroupAdapter != null) {
+ Preference preference = preferenceGroupAdapter.getItem(adapterPosition);
+ onPreferenceFocused(preference, mPaneLIndex);
+ }
+ }
+
+ @Override
+ public void onChildViewHolderSelectedAndPositioned(RecyclerView parent,
+ RecyclerView.ViewHolder child, int position, int subposition) {
+ }
+ }
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -173,9 +193,17 @@
.getBoolean(R.bool.config_check_scroll_state);
mPreviewPanelCreationDelay = getContext().getResources()
.getInteger(R.integer.config_preview_panel_create_delay);
+
+ updatePreviewPanelCreationDelayForLowRamDevice();
mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
}
+ private void updatePreviewPanelCreationDelayForLowRamDevice() {
+ if (ActivityManager.isLowRamDeviceStatic() && mPreviewPanelCreationDelay == 0) {
+ mPreviewPanelCreationDelay = PREVIEW_PANEL_DEFAULT_DELAY_MS;
+ }
+ }
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@@ -252,9 +280,18 @@
return false;
}
try {
- Fragment immersiveFragment = Fragment.instantiate(getActivity(), pref.getFragment(),
+ Fragment fragment = Fragment.instantiate(getActivity(), pref.getFragment(),
pref.getExtras());
- startImmersiveFragment(immersiveFragment);
+ if (fragment instanceof GuidedStepSupportFragment) {
+ startImmersiveFragment(fragment);
+ } else {
+ if (DEBUG) {
+ Log.d(TAG, "No-op: Preference is clicked before preview is shown");
+ }
+ // return true so it won't be handled by onPreferenceTreeClick
+ // in PreferenceFragment
+ return true;
+ }
} catch (Exception e) {
Log.e(TAG, "error trying to instantiate fragment " + e);
// return true so it won't be handled by onPreferenceTreeClick in PreferenceFragment
@@ -299,9 +336,9 @@
mPrefPanelIdx++;
- Fragment fragment = getChildFragmentManager().findFragmentById(frameResIds[mPrefPanelIdx]);
- addOrRemovePreferenceFocusedListener(fragment, true);
-
+ Fragment fragmentToBeMainPanel = getChildFragmentManager()
+ .findFragmentById(frameResIds[mPrefPanelIdx]);
+ addOrRemovePreferenceFocusedListener(fragmentToBeMainPanel, true);
final FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.replace(frameResIds[mPrefPanelIdx + 1], initialPreviewFragment,
PREVIEW_FRAGMENT_TAG);
@@ -312,6 +349,9 @@
}
private boolean isA11yOn() {
+ if (getActivity() == null) {
+ return false;
+ }
return Settings.Secure.getInt(
getActivity().getContentResolver(),
Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
@@ -358,9 +398,18 @@
VerticalGridView listView = (VerticalGridView) leanbackPreferenceFragment.getListView();
if (listView != null) {
if (isAddingListener) {
- listView.setOnChildViewHolderSelectedListener(mOnChildViewHolderSelectedListener);
+ if (!mHasOnChildViewHolderSelectedListener.containsKey(listView)) {
+ OnChildViewHolderSelectedListenerTwoPanel listener =
+ new OnChildViewHolderSelectedListenerTwoPanel(mPrefPanelIdx);
+ listView.addOnChildViewHolderSelectedListener(listener);
+ mHasOnChildViewHolderSelectedListener.put(listView, listener);
+ }
} else {
- listView.setOnChildViewHolderSelectedListener(null);
+ if (mHasOnChildViewHolderSelectedListener.containsKey(listView)) {
+ listView.removeOnChildViewHolderSelectedListener(
+ mHasOnChildViewHolderSelectedListener.get(listView));
+ mHasOnChildViewHolderSelectedListener.remove(listView);
+ }
}
}
}
@@ -374,6 +423,7 @@
if (DEBUG) {
Log.d(TAG, "startPreferenceFragment");
}
+ addOrRemovePreferenceFocusedListener(fragment, true);
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(frameResIds[mPrefPanelIdx], fragment, PREFERENCE_FRAGMENT_TAG);
transaction.commitNow();
@@ -455,11 +505,11 @@
void onSeekbarPreferenceChanged(SliceSeekbarPreference preference, int addValue);
}
- protected void onPreferenceFocused(Preference pref) {
- onPreferenceFocusedImpl(pref, false);
+ protected void onPreferenceFocused(Preference pref, int panelIndex) {
+ onPreferenceFocusedImpl(pref, false, panelIndex);
}
- private void onPreferenceFocusedImpl(Preference pref, boolean forceRefresh) {
+ private void onPreferenceFocusedImpl(Preference pref, boolean forceRefresh, int panelIndex) {
if (pref == null) {
return;
}
@@ -477,9 +527,9 @@
VerticalGridView listView = (VerticalGridView)
((LeanbackPreferenceFragmentCompat) prefFragment).getListView();
mHandler.postDelayed(new PostShowPreviewRunnable(
- listView, pref, forceRefresh), mPreviewPanelCreationDelay);
+ listView, pref, forceRefresh, panelIndex), mPreviewPanelCreationDelay);
} else {
- handleFragmentTransactionWhenFocused(pref, forceRefresh);
+ handleFragmentTransactionWhenFocused(pref, forceRefresh, panelIndex);
}
}
@@ -487,11 +537,14 @@
private final VerticalGridView mListView;
private final Preference mPref;
private final boolean mForceFresh;
+ private final int mPanelIndex;
- PostShowPreviewRunnable(VerticalGridView listView, Preference pref, boolean forceFresh) {
+ PostShowPreviewRunnable(VerticalGridView listView, Preference pref, boolean forceFresh,
+ int panelIndex) {
this.mListView = listView;
this.mPref = pref;
this.mForceFresh = forceFresh;
+ mPanelIndex = panelIndex;
}
@Override
@@ -500,14 +553,18 @@
if (mListView.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {
mHandler.postDelayed(this, CHECK_IDLE_STATE_MS);
} else {
- handleFragmentTransactionWhenFocused(mPref, mForceFresh);
+ handleFragmentTransactionWhenFocused(mPref, mForceFresh, mPanelIndex);
mIsWaitingForUpdatingPreview = false;
}
}
}
}
- private void handleFragmentTransactionWhenFocused(Preference pref, boolean forceRefresh) {
+ private void handleFragmentTransactionWhenFocused(Preference pref, boolean forceRefresh,
+ int panelIndex) {
+ if (!isAdded() || panelIndex != mPrefPanelIdx) {
+ return;
+ }
Fragment previewFragment = null;
final Fragment prefFragment =
getChildFragmentManager().findFragmentById(frameResIds[mPrefPanelIdx]);
@@ -546,16 +603,15 @@
}
previewFragment.setEnterTransition(new Fade());
previewFragment.setExitTransition(null);
-
final FragmentTransaction transaction =
getChildFragmentManager().beginTransaction();
- transaction.setCustomAnimations(android.R.animator.fade_in,
- android.R.animator.fade_out);
+ transaction.setCustomAnimations(R.animator.fade_in_preview_panel,
+ R.animator.fade_out_preview_panel);
transaction.replace(frameResIds[mPrefPanelIdx + 1], previewFragment);
- transaction.commit();
+ transaction.commitNow();
// Some fragments may steal focus on creation. Reclaim focus on main fragment.
- if (getView() != null && getView().getViewTreeObserver() != null) {
+ if (getView() != null && getView().getViewTreeObserver() != null) {
getView().getViewTreeObserver().addOnGlobalLayoutListener(
mOnGlobalLayoutListener);
}
@@ -582,7 +638,8 @@
super.onResume();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.android.tv.settings.PREVIEW_DELAY");
- getContext().registerReceiver(mPreviewPanelDelayReceiver, intentFilter);
+ getContext().registerReceiver(mPreviewPanelDelayReceiver, intentFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
// Trap back button presses
final TwoPanelSettingsRootView rootView = (TwoPanelSettingsRootView) getView();
if (rootView != null) {
@@ -612,6 +669,7 @@
if (DEBUG) {
Log.d(TAG, "Starting immersive fragment.");
}
+ addOrRemovePreferenceFocusedListener(fragment, true);
final FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
Fragment target = getChildFragmentManager().findFragmentById(frameResIds[mPrefPanelIdx]);
fragment.setTargetFragment(target, 0);
@@ -680,6 +738,10 @@
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
+ if (!isAdded()) {
+ Log.d(TAG, "Fragment not attached yet.");
+ return true;
+ }
Fragment prefFragment =
getChildFragmentManager().findFragmentById(frameResIds[mPrefPanelIdx]);
@@ -715,21 +777,7 @@
if (event.getAction() == KeyEvent.ACTION_DOWN
&& ((!isRTL() && keyCode == KeyEvent.KEYCODE_DPAD_RIGHT)
|| (isRTL() && keyCode == KeyEvent.KEYCODE_DPAD_LEFT))) {
- if (shouldPerformClick()) {
- v.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,
- KeyEvent.KEYCODE_DPAD_CENTER));
- v.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,
- KeyEvent.KEYCODE_DPAD_CENTER));
- } else {
- Fragment previewFragment = getChildFragmentManager()
- .findFragmentById(frameResIds[mPrefPanelIdx + 1]);
- if (!(previewFragment instanceof InfoFragment)
- && !mIsWaitingForUpdatingPreview) {
- mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT);
-
- navigateToPreviewFragment();
- }
- }
+ forward();
// TODO(b/163432209): improve NavigationCallback and be more specific here.
// Do not consume the KeyEvent for NavigationCallback classes such as date & time
// picker.
@@ -739,6 +787,28 @@
}
}
+ private void forward() {
+ if (!isAdded()) {
+ Log.d(TAG, "Fragment not attached yet.");
+ return;
+ }
+ final TwoPanelSettingsRootView rootView = (TwoPanelSettingsRootView) getView();
+ if (shouldPerformClick()) {
+ rootView.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,
+ KeyEvent.KEYCODE_DPAD_CENTER));
+ rootView.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,
+ KeyEvent.KEYCODE_DPAD_CENTER));
+ } else {
+ Fragment previewFragment = getChildFragmentManager()
+ .findFragmentById(frameResIds[mPrefPanelIdx + 1]);
+ if (!(previewFragment instanceof InfoFragment)
+ && !mIsWaitingForUpdatingPreview) {
+ mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT);
+ navigateToPreviewFragment();
+ }
+ }
+ }
+
private boolean shouldPerformClick() {
Fragment prefFragment =
getChildFragmentManager().findFragmentById(frameResIds[mPrefPanelIdx]);
@@ -757,6 +827,10 @@
}
private boolean back(boolean isKeyBackPressed) {
+ if (!isAdded()) {
+ Log.d(TAG, "Fragment not attached yet.");
+ return true;
+ }
if (mIsNavigatingBack) {
mHandler.postDelayed(new Runnable() {
@Override
@@ -805,9 +879,6 @@
}
mIsNavigatingBack = true;
- Fragment preferenceFragment =
- getChildFragmentManager().findFragmentById(frameResIds[mPrefPanelIdx]);
- addOrRemovePreferenceFocusedListener(preferenceFragment, false);
getChildFragmentManager().popBackStack();
mPrefPanelIdx--;
@@ -882,11 +953,19 @@
int distanceToScrollToRight;
int panelWidth = getResources().getDimensionPixelSize(
R.dimen.tp_settings_preference_pane_width);
- View scrollToPanel = getView().findViewById(frameResIds[index]);
- View previewPanel = getView().findViewById(frameResIds[index + 1]);
+ TwoPanelSettingsFrameLayout scrollToPanel = getView().findViewById(frameResIds[index]);
+ TwoPanelSettingsFrameLayout previewPanel = getView().findViewById(
+ frameResIds[index + 1]);
if (scrollToPanel == null || previewPanel == null) {
return;
}
+ scrollToPanel.setOnDispatchTouchListener(null);
+ previewPanel.setOnDispatchTouchListener((view, env) -> {
+ if (env.getActionMasked() == MotionEvent.ACTION_UP) {
+ forward();
+ }
+ return true;
+ });
View scrollToPanelHead = scrollToPanel.findViewById(R.id.decor_title_container);
View previewPanelHead = previewPanel.findViewById(R.id.decor_title_container);
boolean scrollsToPreview =
@@ -907,7 +986,7 @@
ObjectAnimator slideAnim = ObjectAnimator.ofInt(mScrollView, "scrollX",
mScrollView.getScrollX(), animationEnd);
slideAnim.setAutoCancel(true);
- slideAnim.setDuration(PANEL_ANIMATION_MS);
+ slideAnim.setDuration(PANEL_ANIMATION_SLIDE_MS);
slideAnim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
@@ -918,6 +997,8 @@
}
}
});
+ slideAnim.setInterpolator(AnimationUtils.loadInterpolator(
+ getContext(), R.anim.easing_browse));
slideAnim.start();
// Color animation
if (scrollsToPreview) {
@@ -932,7 +1013,9 @@
"backgroundColor",
new ArgbEvaluator(), previewPanelColor, mainPanelColor);
alphaAnim.setAutoCancel(true);
+ alphaAnim.setDuration(PANEL_ANIMATION_ALPHA_MS);
backgroundColorAnim.setAutoCancel(true);
+ backgroundColorAnim.setDuration(PANEL_BACKGROUND_ANIMATION_ALPHA_MS);
AnimatorSet animatorSet = new AnimatorSet();
if (scrollToPanelHead != null) {
ObjectAnimator backgroundColorAnimForHead = ObjectAnimator.ofObject(
@@ -940,12 +1023,14 @@
"backgroundColor",
new ArgbEvaluator(), previewPanelColor, mainPanelColor);
backgroundColorAnimForHead.setAutoCancel(true);
+ backgroundColorAnimForHead.setDuration(PANEL_BACKGROUND_ANIMATION_ALPHA_MS);
animatorSet.playTogether(alphaAnim, backgroundColorAnim,
backgroundColorAnimForHead);
} else {
animatorSet.playTogether(alphaAnim, backgroundColorAnim);
}
- animatorSet.setDuration(PANEL_ANIMATION_MS);
+ animatorSet.setInterpolator(AnimationUtils.loadInterpolator(
+ getContext(), R.anim.easing_browse));
animatorSet.start();
} else {
scrollToPanel.setAlpha(1f);
@@ -959,7 +1044,9 @@
"backgroundColor",
new ArgbEvaluator(), mainPanelColor, previewPanelColor);
alphaAnim.setAutoCancel(true);
+ alphaAnim.setDuration(PANEL_ANIMATION_ALPHA_MS);
backgroundColorAnim.setAutoCancel(true);
+ backgroundColorAnim.setDuration(PANEL_BACKGROUND_ANIMATION_ALPHA_MS);
AnimatorSet animatorSet = new AnimatorSet();
if (previewPanelHead != null) {
ObjectAnimator backgroundColorAnimForHead = ObjectAnimator.ofObject(
@@ -967,12 +1054,14 @@
"backgroundColor",
new ArgbEvaluator(), mainPanelColor, previewPanelColor);
backgroundColorAnimForHead.setAutoCancel(true);
+ backgroundColorAnimForHead.setDuration(PANEL_BACKGROUND_ANIMATION_ALPHA_MS);
animatorSet.playTogether(alphaAnim, backgroundColorAnim,
backgroundColorAnimForHead);
} else {
animatorSet.playTogether(alphaAnim, backgroundColorAnim);
}
- animatorSet.setDuration(PANEL_ANIMATION_MS);
+ animatorSet.setInterpolator(AnimationUtils.loadInterpolator(
+ getContext(), R.anim.easing_browse));
animatorSet.start();
}
} else {
@@ -1078,7 +1167,7 @@
updateInfoFragmentStatus(fragment);
}
if (chosenPreference instanceof ListPreference) {
- refocusPreferenceForceRefresh(chosenPreference);
+ refocusPreferenceForceRefresh(chosenPreference, fragment);
}
}
} catch (ClassNotFoundException e) {
@@ -1087,8 +1176,11 @@
}
/** Force refresh preview panel. */
- public void refocusPreferenceForceRefresh(Preference chosenPreference) {
- onPreferenceFocusedImpl(chosenPreference, true);
+ public void refocusPreferenceForceRefresh(Preference chosenPreference, Fragment fragment) {
+ if (!isFragmentInTheMainPanel(fragment)) {
+ return;
+ }
+ onPreferenceFocusedImpl(chosenPreference, true, mPrefPanelIdx);
}
/** Show error message in preview panel **/
@@ -1103,8 +1195,8 @@
Fragment newPrefFragment = onCreatePreviewFragment(null, preference);
final FragmentTransaction transaction =
getChildFragmentManager().beginTransaction();
- transaction.setCustomAnimations(android.R.animator.fade_in,
- android.R.animator.fade_out);
+ transaction.setCustomAnimations(R.animator.fade_in_preview_panel,
+ R.animator.fade_out_preview_panel);
transaction.replace(frameResIds[mPrefPanelIdx], newPrefFragment);
transaction.commit();
} else {
@@ -1114,7 +1206,7 @@
appendErrorToContentDescription(prefFragment, errorMessage);
}
updatePreferenceWithErrorMessage(preference, errorMessage, getContext());
- onPreferenceFocused(preference);
+ onPreferenceFocused(preference, mPrefPanelIdx);
}
}
}
@@ -1215,9 +1307,11 @@
preference.getExtras());
} else {
Fragment f = null;
- if (preference instanceof ListPreference) {
+ if (preference instanceof ListPreference
+ && ((ListPreference) preference).getEntries() != null) {
f = TwoPanelListPreferenceDialogFragment.newInstanceSingle(preference.getKey());
- } else if (preference instanceof MultiSelectListPreference) {
+ } else if (preference instanceof MultiSelectListPreference
+ && ((MultiSelectListPreference) preference).getEntries() != null) {
f = LeanbackListPreferenceDialogFragmentCompat.newInstanceMulti(
preference.getKey());
}
@@ -1242,7 +1336,11 @@
}
}
- /** Add focus listener to the child fragment **/
+ /**
+ * Add focus listener to the child fragment. It must always be called after
+ * the child fragment view is created since the listener is attached to the
+ * {@link VerticalGridView} in the child fragment view.
+ */
public void addListenerForFragment(Fragment fragment) {
if (isFragmentInTheMainPanel(fragment)) {
addOrRemovePreferenceFocusedListener(fragment, true);
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelSettingsFrameLayout.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelSettingsFrameLayout.java
new file mode 100644
index 0000000..f2d7f63
--- /dev/null
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelSettingsFrameLayout.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.tv.twopanelsettings;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+/**
+ * Provides a FrameLayout for {@link TwoPanelSettingsFragment} with ability to intercept touch event
+ * before sent to a corresponding child view.
+ */
+public class TwoPanelSettingsFrameLayout extends FrameLayout {
+ /**
+ * Interface definition for a callback to be invoked when a touch event is going to be
+ * dispatched to this view. The callback will be invoked before the touch
+ * event is given to the view.
+ */
+ public interface OnDispatchTouchListener {
+ /**
+ * Called when a touch event is going to be dispatched to a view. This allows listeners to
+ * get a chance to respond before the target view.
+ *
+ * @param v The view the touch event is going to be dispatched to.
+ * @param event The MotionEvent object containing full information about
+ * the event.
+ * @return True if the listener has consumed the event, false otherwise.
+ */
+ boolean onDispatchTouch(View v, MotionEvent event);
+ }
+
+ private OnDispatchTouchListener mOnDispatchTouchListener;
+
+ public TwoPanelSettingsFrameLayout(@NonNull Context context) {
+ super(context);
+ }
+
+ public TwoPanelSettingsFrameLayout(@NonNull Context context,
+ @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public TwoPanelSettingsFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs,
+ int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public TwoPanelSettingsFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs,
+ int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ public void setOnDispatchTouchListener(@Nullable OnDispatchTouchListener listener) {
+ mOnDispatchTouchListener = listener;
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ boolean handled = false;
+ if (mOnDispatchTouchListener != null) {
+ handled = mOnDispatchTouchListener.onDispatchTouch(this, ev);
+ }
+ return handled || super.dispatchTouchEvent(ev);
+ }
+}
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/ContextSingleton.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/ContextSingleton.java
index 62fc17b..4103595 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/ContextSingleton.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/ContextSingleton.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.net.Uri;
import android.util.ArrayMap;
+import android.util.Log;
import com.android.tv.twopanelsettings.slices.PreferenceSliceLiveData.SliceLiveDataImpl;
@@ -28,6 +29,7 @@
* Ensure the SliceLiveData with same uri is created only once across the activity.
*/
public class ContextSingleton {
+ private static final String TAG = "TvSettingsContext";
private static ContextSingleton sInstance;
private ArrayMap<Uri, SliceLiveDataImpl> mSliceMap;
private boolean mGivenFullSliceAccess;
@@ -76,12 +78,11 @@
* Grant full access to specific package.
*/
public void grantFullAccess(Context ctx, String uri, String packageName) {
- if (!mGivenFullSliceAccess) {
- // Uri cannot be null here as SliceManagerService calls notifyChange(uri, null) in
- // grantPermissionFromUser.
+ try {
ctx.getSystemService(SliceManager.class).grantPermissionFromUser(
Uri.parse(uri), packageName, true);
- mGivenFullSliceAccess = true;
+ } catch (Exception e) {
+ Log.e(TAG, "Cannot grant full access to " + packageName + " " + e);
}
}
}
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/CustomContentDescriptionPreference.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/CustomContentDescriptionPreference.java
index 61ebe56..bf0c904 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/CustomContentDescriptionPreference.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/CustomContentDescriptionPreference.java
@@ -21,15 +21,14 @@
import android.util.AttributeSet;
import android.view.View;
+import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
-import com.android.settingslib.RestrictedPreference;
-
/**
* Preference that allows external classes to set its view's content description for accessibility
* purposes.
*/
-public class CustomContentDescriptionPreference extends RestrictedPreference implements
+public class CustomContentDescriptionPreference extends Preference implements
HasCustomContentDescription {
private String mContentDescription;
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/CustomContentDescriptionPreferenceCategory.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/CustomContentDescriptionPreferenceCategory.java
new file mode 100644
index 0000000..7dd620a
--- /dev/null
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/CustomContentDescriptionPreferenceCategory.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.twopanelsettings.slices;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceViewHolder;
+
+/**
+ * PreferenceCategory that allows external classes to set its view's content description for
+ * accessibility purposes.
+ */
+public class CustomContentDescriptionPreferenceCategory extends PreferenceCategory
+ implements HasCustomContentDescription {
+ private String mContentDescription;
+ public CustomContentDescriptionPreferenceCategory(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public CustomContentDescriptionPreferenceCategory(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+ if (!TextUtils.isEmpty(mContentDescription)) {
+ holder.itemView.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
+ holder.itemView.setContentDescription(mContentDescription);
+ }
+ }
+
+ /**
+ * Sets the accessibility content description that will be read to the TalkBack users when they
+ * focus on this preference.
+ */
+ public void setContentDescription(String contentDescription) {
+ this.mContentDescription = contentDescription;
+ }
+
+ public String getContentDescription() {
+ return mContentDescription;
+ }
+}
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/CustomContentDescriptionRestrictedPreference.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/CustomContentDescriptionRestrictedPreference.java
new file mode 100644
index 0000000..91fc417
--- /dev/null
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/CustomContentDescriptionRestrictedPreference.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tv.twopanelsettings.slices;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.settingslib.RestrictedPreference;
+
+/**
+ * Restricted preference that allows external classes to set its view's content description for
+ * accessibility purposes.
+ */
+public class CustomContentDescriptionRestrictedPreference extends RestrictedPreference implements
+ HasCustomContentDescription {
+
+ private String mContentDescription;
+
+ public CustomContentDescriptionRestrictedPreference(Context context) {
+ super(context);
+ }
+
+ public CustomContentDescriptionRestrictedPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+ if (!TextUtils.isEmpty(mContentDescription)) {
+ holder.itemView.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
+ holder.itemView.setContentDescription(mContentDescription);
+ }
+ }
+
+ /**
+ * Sets the accessibility content description that will be read to the TalkBack users when they
+ * focus on this preference.
+ */
+ public void setContentDescription(String contentDescription) {
+ this.mContentDescription = contentDescription;
+ }
+
+ public String getContentDescription() {
+ return mContentDescription;
+ }
+}
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/EmbeddedSlicePreference.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/EmbeddedSlicePreference.java
index c58adbe..a1611bc 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/EmbeddedSlicePreference.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/EmbeddedSlicePreference.java
@@ -24,12 +24,15 @@
* items, but will automatically update its status and communicates with external apps through
* slice api.
*/
-public class EmbeddedSlicePreference extends SlicePreference {
+public class EmbeddedSlicePreference extends SlicePreference
+ implements HasCustomContentDescription {
private static final String TAG = "EmbeddedSlicePreference";
private final EmbeddedSlicePreferenceHelper mHelper;
+ private String mContentDescription;
public EmbeddedSlicePreference(Context context, String uri) {
super(context);
+ setUri(uri);
mHelper = new EmbeddedSlicePreferenceHelper(this, getUri());
}
@@ -59,6 +62,7 @@
}
void update() {
+ setEnabled(mHelper.mNewPref.isEnabled());
setTitle(mHelper.mNewPref.getTitle());
setSummary(mHelper.mNewPref.getSummary());
setIcon(mHelper.mNewPref.getIcon());
@@ -67,4 +71,17 @@
setIntent(((HasSliceAction) mHelper.mNewPref).getSliceAction().getAction().getIntent());
}
}
+
+
+ /**
+ * Sets the accessibility content description that will be read to the TalkBack users when they
+ * focus on this preference.
+ */
+ public void setContentDescription(String contentDescription) {
+ this.mContentDescription = contentDescription;
+ }
+
+ public String getContentDescription() {
+ return mContentDescription;
+ }
}
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/InfoPreference.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/InfoPreference.java
index dc2b834..de85c16 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/InfoPreference.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/InfoPreference.java
@@ -33,8 +33,8 @@
/**
* InfoPreference which could be used to display a list of information.
*/
-public class InfoPreference extends Preference {
-
+public class InfoPreference extends Preference implements HasCustomContentDescription {
+ private String mContentDescription;
private List<Pair<CharSequence, CharSequence>> mInfoList;
public InfoPreference(Context context, List<Pair<CharSequence, CharSequence>> infoList) {
@@ -57,4 +57,16 @@
container.addView(view);
}
}
+
+ /**
+ * Sets the accessibility content description that will be read to the TalkBack users when they
+ * focus on this preference.
+ */
+ public void setContentDescription(String contentDescription) {
+ this.mContentDescription = contentDescription;
+ }
+
+ public String getContentDescription() {
+ return mContentDescription;
+ }
}
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceCheckboxPreference.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceCheckboxPreference.java
index 539edbf..ea82a20 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceCheckboxPreference.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceCheckboxPreference.java
@@ -17,18 +17,23 @@
package com.android.tv.twopanelsettings.slices;
import android.content.Context;
+import android.text.TextUtils;
import android.util.AttributeSet;
+import android.view.View;
import androidx.preference.CheckBoxPreference;
+import androidx.preference.PreferenceViewHolder;
import androidx.slice.core.SliceActionImpl;
/**
* Slice version of CheckboxPreference.
*/
-public class SliceCheckboxPreference extends CheckBoxPreference implements HasSliceAction {
+public class SliceCheckboxPreference extends CheckBoxPreference implements HasSliceAction,
+ HasCustomContentDescription {
private int mActionId;
private SliceActionImpl mAction;
private SliceActionImpl mFollowupSliceAction;
+ private String mContentDescription;
public SliceCheckboxPreference(Context context, SliceActionImpl action) {
super(context);
@@ -43,6 +48,15 @@
}
@Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+ if (!TextUtils.isEmpty(mContentDescription)) {
+ holder.itemView.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
+ holder.itemView.setContentDescription(mContentDescription);
+ }
+ }
+
+ @Override
public int getActionId() {
return mActionId;
}
@@ -75,4 +89,16 @@
private void update() {
this.setChecked(mAction.isChecked());
}
+
+ /**
+ * Sets the accessibility content description that will be read to the TalkBack users when they
+ * select this preference.
+ */
+ public void setContentDescription(String contentDescription) {
+ this.mContentDescription = contentDescription;
+ }
+
+ public String getContentDescription() {
+ return mContentDescription;
+ }
}
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceFragment.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceFragment.java
index 7b42ddc..f94bb26 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceFragment.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceFragment.java
@@ -39,6 +39,7 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.Parcelable;
+import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
@@ -49,6 +50,7 @@
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
+import android.widget.Toast;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
@@ -73,7 +75,9 @@
import com.android.tv.twopanelsettings.slices.SlicePreferencesUtil.Data;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* A screen presenting a slice in TV settings.
@@ -82,6 +86,7 @@
public class SliceFragment extends SettingsPreferenceFragment implements Observer<Slice>,
SliceFragmentCallback {
private static final int SLICE_REQUEST_CODE = 10000;
+ private static final int A11Y_FOCUS_REQUEST_DELAY = 1000;
private static final String TAG = "SliceFragment";
private static final String KEY_PREFERENCE_FOLLOWUP_INTENT = "key_preference_followup_intent";
private static final String KEY_PREFERENCE_FOLLOWUP_RESULT_CODE =
@@ -135,7 +140,12 @@
@Override
public void onCreate(Bundle savedInstanceState) {
mUriString = getArguments().getString(SlicesConstants.TAG_TARGET_URI);
- ContextSingleton.getInstance().grantFullAccess(getContext(), Uri.parse(mUriString));
+ if (!TextUtils.isEmpty(mUriString)) {
+ ContextSingleton.getInstance().grantFullAccess(getContext(), Uri.parse(mUriString));
+ }
+ if (TextUtils.isEmpty(mScreenTitle)) {
+ mScreenTitle = getArguments().getCharSequence(SlicesConstants.TAG_SCREEN_TITLE, "");
+ }
super.onCreate(savedInstanceState);
}
@@ -147,13 +157,17 @@
this.getPreferenceScreen().removeAll();
showProgressBar();
- getSliceLiveData().observeForever(this);
+ if (!TextUtils.isEmpty(mUriString)) {
+ getSliceLiveData().observeForever(this);
+ }
if (TextUtils.isEmpty(mScreenTitle)) {
mScreenTitle = getArguments().getCharSequence(SlicesConstants.TAG_SCREEN_TITLE, "");
}
super.onResume();
- getContext().getContentResolver().registerContentObserver(
- SlicePreferencesUtil.getStatusPath(mUriString), false, mContentObserver);
+ if (!TextUtils.isEmpty(mUriString)) {
+ getContext().getContentResolver().registerContentObserver(
+ SlicePreferencesUtil.getStatusPath(mUriString), false, mContentObserver);
+ }
fireFollowupPendingIntent();
}
@@ -297,7 +311,9 @@
for (SliceContent contentItem : items) {
SliceItem item = contentItem.getSliceItem();
if (SlicesConstants.TYPE_PREFERENCE.equals(item.getSubType())
- || SlicesConstants.TYPE_PREFERENCE_CATEGORY.equals(item.getSubType())) {
+ || SlicesConstants.TYPE_PREFERENCE_CATEGORY.equals(item.getSubType())
+ || SlicesConstants.TYPE_PREFERENCE_EMBEDDED_PLACEHOLDER.equals(
+ item.getSubType())) {
Preference preference =
SlicePreferencesUtil.getPreference(
item, mContextThemeWrapper, getClass().getCanonicalName(),
@@ -318,6 +334,31 @@
((TwoPanelSettingsFragment) getParentFragment()).refocusPreference(this);
}
mIsMainPanelReady = true;
+
+ resetA11yFocusIfNeeded();
+ }
+
+ // Because the SliceProvider may call for updates an uncertain amount of times, we
+ // should have the current focus request a11yFocus after the update, since it will
+ // be lost otherwise. The delay is to give the screen reader enough time to
+ // process the update.
+ private void resetA11yFocusIfNeeded() {
+ if (isA11yOn()) {
+ mHandler.postDelayed(() -> {
+ if (isResumed() && getListView() != null && getListView().findFocus() != null) {
+ getListView().findFocus().requestAccessibilityFocus();
+ }
+ }, A11Y_FOCUS_REQUEST_DELAY);
+ }
+ }
+
+ private boolean isA11yOn() {
+ if (getActivity() == null) {
+ return false;
+ }
+ return Settings.Secure.getInt(
+ getActivity().getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
}
@@ -345,7 +386,7 @@
if (chosenPreference != null && chosenPreference instanceof HasSliceUri
&& ((HasSliceUri) chosenPreference).getUri() != null) {
chosenPreference.setFragment(SliceFragment.class.getCanonicalName());
- parentFragment.refocusPreferenceForceRefresh(chosenPreference);
+ parentFragment.refocusPreferenceForceRefresh(chosenPreference, this);
}
if (parentFragment.isFragmentInTheMainPanel(this)) {
parentFragment.navigateToPreviewFragment();
@@ -357,16 +398,20 @@
}
private void updatePreferenceScreen(PreferenceScreen screen, List<Preference> newPrefs) {
- // Remove all the preferences in the screen that satisfy such two cases:
+ // Remove all the preferences in the screen that satisfy such three cases:
// (a) Preference without key
// (b) Preference with key which does not appear in the new list.
+ // (c) Preference with key which does appear in the new list, but the preference has changed
+ // ability to handle slices and needs to be replaced instead of re-used.
int index = 0;
while (index < screen.getPreferenceCount()) {
boolean needToRemoveCurrentPref = true;
Preference oldPref = screen.getPreference(index);
if (oldPref != null && oldPref.getKey() != null) {
for (Preference newPref : newPrefs) {
- if (newPref.getKey() != null && newPref.getKey().equals(oldPref.getKey())) {
+ if (newPref.getKey() != null && newPref.getKey().equals(oldPref.getKey())
+ && (newPref instanceof HasSliceUri)
+ == (oldPref instanceof HasSliceUri)) {
needToRemoveCurrentPref = false;
break;
}
@@ -379,6 +424,14 @@
}
}
+ Map<Integer, Boolean> twoStatePreferenceIsCheckedByOrder = new HashMap<>();
+ for (int i = 0; i < newPrefs.size(); i++) {
+ if (newPrefs.get(i) instanceof TwoStatePreference) {
+ twoStatePreferenceIsCheckedByOrder.put(
+ i, ((TwoStatePreference) newPrefs.get(i)).isChecked());
+ }
+ }
+
//Iterate the new preferences list and give each preference a correct order
for (int i = 0; i < newPrefs.size(); i++) {
Preference newPref = newPrefs.get(i);
@@ -388,7 +441,13 @@
if (newPref.getKey() != null) {
for (int j = 0; j < screen.getPreferenceCount(); j++) {
Preference oldPref = screen.getPreference(j);
- if (oldPref.getKey() != null && oldPref.getKey().equals(newPref.getKey())) {
+ // EmbeddedSlicePreference has its own slice observer
+ // (EmbeddedSlicePreferenceHelper). Should therefore not be updated by
+ // slice observer in SliceFragment.
+ boolean allowUpdate = !(oldPref instanceof EmbeddedSlicePreference);
+ boolean sameKey = oldPref.getKey() != null
+ && oldPref.getKey().equals(newPref.getKey());
+ if (allowUpdate && sameKey) {
oldPref.setIcon(newPref.getIcon());
oldPref.setTitle(newPref.getTitle());
oldPref.setSummary(newPref.getSummary());
@@ -396,11 +455,6 @@
oldPref.setSelectable(newPref.isSelectable());
oldPref.setFragment(newPref.getFragment());
oldPref.getExtras().putAll(newPref.getExtras());
- if ((oldPref instanceof TwoStatePreference)
- && (newPref instanceof TwoStatePreference)) {
- ((TwoStatePreference) oldPref)
- .setChecked(((TwoStatePreference) newPref).isChecked());
- }
if ((oldPref instanceof HasSliceAction)
&& (newPref instanceof HasSliceAction)) {
((HasSliceAction) oldPref)
@@ -411,7 +465,15 @@
((HasSliceUri) oldPref)
.setUri(((HasSliceUri) newPref).getUri());
}
+ if ((oldPref instanceof HasCustomContentDescription)
+ && (newPref instanceof HasCustomContentDescription)) {
+ ((HasCustomContentDescription) oldPref).setContentDescription(
+ ((HasCustomContentDescription) newPref)
+ .getContentDescription());
+ }
oldPref.setOrder(i);
+ }
+ if (sameKey) {
neededToAddNewPref = false;
break;
}
@@ -424,6 +486,16 @@
screen.addPreference(newPref);
}
}
+ //addPreference will reset the checked status of TwoStatePreference.
+ //So we need to add them back
+ for (int i = 0; i < screen.getPreferenceCount(); i++) {
+ Preference screenPref = screen.getPreference(i);
+ if (screenPref instanceof TwoStatePreference
+ && twoStatePreferenceIsCheckedByOrder.get(i) != null) {
+ ((TwoStatePreference) screenPref)
+ .setChecked(twoStatePreferenceIsCheckedByOrder.get(i));
+ }
+ }
removeAnimationClipping(getView());
}
@@ -659,8 +731,22 @@
private void handleUri(Uri uri) {
String uriString = uri.getQueryParameter(SlicesConstants.PARAMETER_URI);
+ String errorMessage = uri.getQueryParameter(SlicesConstants.PARAMETER_ERROR);
+ // Display the errorMessage based upon two different scenarios:
+ // a) If the provided uri string matches with current page slice uri(usually happens
+ // when the data fails to correctly load), show the errors in the current panel using
+ // InfoFragment UI.
+ // b) If the provided uri string does not match with current page slice uri(usually happens
+ // when the data fails to save), show the error message as the toast.
+ if (uriString != null && errorMessage != null) {
+ if (!uriString.equals(mUriString)) {
+ showErrorMessageAsToast(errorMessage);
+ } else {
+ showErrorMessage(errorMessage);
+ }
+ }
// Provider should provide the correct slice uri in the parameter if it wants to do certain
- // action(includes go back, forward, error message), otherwise TvSettings would ignore it.
+ // action(includes go back, forward), otherwise TvSettings would ignore it.
if (uriString == null || !uriString.equals(mUriString)) {
return;
}
@@ -674,11 +760,10 @@
finish();
}
}
+ }
- String errorMessage = uri.getQueryParameter(SlicesConstants.PARAMETER_ERROR);
- if (errorMessage != null) {
- showErrorMessage(errorMessage);
- }
+ private void showErrorMessageAsToast(String errorMessage) {
+ Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_SHORT).show();
}
private void finish() {
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SlicePreference.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SlicePreference.java
index e25bb32..dac0a75 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SlicePreference.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SlicePreference.java
@@ -62,7 +62,7 @@
}
}
- private void init(@Nullable AttributeSet attrs) {
+ protected void init(@Nullable AttributeSet attrs) {
if (attrs != null) {
initStyleAttributes(attrs);
}
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SlicePreferencesUtil.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SlicePreferencesUtil.java
index db95ee0..67a4ac2 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SlicePreferencesUtil.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SlicePreferencesUtil.java
@@ -38,8 +38,8 @@
import static com.android.tv.twopanelsettings.slices.SlicesConstants.EXTRA_PREFERENCE_INFO_TEXT;
import static com.android.tv.twopanelsettings.slices.SlicesConstants.EXTRA_PREFERENCE_INFO_TITLE_ICON;
import static com.android.tv.twopanelsettings.slices.SlicesConstants.RADIO;
-import static com.android.tv.twopanelsettings.slices.SlicesConstants.SWITCH;
import static com.android.tv.twopanelsettings.slices.SlicesConstants.SEEKBAR;
+import static com.android.tv.twopanelsettings.slices.SlicesConstants.SWITCH;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
@@ -51,7 +51,6 @@
import androidx.core.graphics.drawable.IconCompat;
import androidx.preference.Preference;
-import androidx.preference.PreferenceCategory;
import androidx.slice.Slice;
import androidx.slice.SliceItem;
import androidx.slice.core.SliceActionImpl;
@@ -79,7 +78,8 @@
if (item.getSubType() != null) {
String subType = item.getSubType();
if (subType.equals(SlicesConstants.TYPE_PREFERENCE)
- || subType.equals(SlicesConstants.TYPE_PREFERENCE_EMBEDDED)) {
+ || subType.equals(SlicesConstants.TYPE_PREFERENCE_EMBEDDED)
+ || subType.equals(SlicesConstants.TYPE_PREFERENCE_EMBEDDED_PLACEHOLDER)) {
// TODO: Figure out all the possible cases and reorganize the logic
if (data.mInfoItems.size() > 0) {
preference = new InfoPreference(
@@ -142,17 +142,19 @@
CharSequence uri = getText(data.mTargetSliceItem);
if (uri == null || TextUtils.isEmpty(uri)) {
if (preference == null) {
- // if contains info text
- if (getInfoSummary(item) != null) {
- preference = new CustomContentDescriptionPreference(
- contextThemeWrapper);
- } else {
- preference = new Preference(contextThemeWrapper);
- }
+ preference = new CustomContentDescriptionPreference(contextThemeWrapper);
}
} else {
if (preference == null) {
- preference = new SlicePreference(contextThemeWrapper);
+ if (subType.equals(SlicesConstants.TYPE_PREFERENCE_EMBEDDED_PLACEHOLDER)) {
+ preference = new EmbeddedSlicePreference(contextThemeWrapper,
+ String.valueOf(uri));
+ } else {
+ preference = new SlicePreference(contextThemeWrapper);
+ }
+ if (hasEndIcon(data.mHasEndIconItem)) {
+ preference.setLayoutResource(R.layout.preference_reversed_icon);
+ }
}
((HasSliceUri) preference).setUri(uri.toString());
if (preference instanceof HasSliceAction) {
@@ -161,7 +163,7 @@
preference.setFragment(className);
}
} else if (item.getSubType().equals(SlicesConstants.TYPE_PREFERENCE_CATEGORY)) {
- preference = new PreferenceCategory(contextThemeWrapper);
+ preference = new CustomContentDescriptionPreferenceCategory(contextThemeWrapper);
}
}
@@ -245,18 +247,25 @@
if (infoSummary != null) {
b.putCharSequence(EXTRA_PREFERENCE_INFO_SUMMARY, infoSummary);
fallbackInfoContentDescription +=
- CONTENT_DESCRIPTION_SEPARATOR + infoSummary.toString();
+ CONTENT_DESCRIPTION_SEPARATOR + infoSummary;
}
- if (infoText != null || infoSummary != null) {
- if (preference instanceof SlicePreference) {
- ((SlicePreference) preference).setContentDescription(
- getInfoContentDescription(item, fallbackInfoContentDescription));
- } else if (preference instanceof SliceSwitchPreference) {
- ((SliceSwitchPreference) preference).setContentDescription(
- getInfoContentDescription(item, fallbackInfoContentDescription));
- } else if (preference instanceof CustomContentDescriptionPreference) {
- ((CustomContentDescriptionPreference) preference).setContentDescription(
- getInfoContentDescription(item, fallbackInfoContentDescription));
+ String contentDescription = getInfoContentDescription(item);
+ // Respect the content description values provided by slice.
+ // If not provided, for SlicePreference, SliceSwitchPreference,
+ // CustomContentDescriptionPreference, use the fallback value.
+ // Otherwise, do not set the contentDescription for preference. Rely on the talkback
+ // framework to generate the value itself.
+ if (!TextUtils.isEmpty(contentDescription)) {
+ if (preference instanceof HasCustomContentDescription) {
+ ((HasCustomContentDescription) preference).setContentDescription(
+ contentDescription);
+ }
+ } else {
+ if ((preference instanceof SlicePreference)
+ || (preference instanceof SliceSwitchPreference)
+ || (preference instanceof CustomContentDescriptionPreference)) {
+ ((HasCustomContentDescription) preference).setContentDescription(
+ fallbackInfoContentDescription);
}
}
if (infoImage != null || infoText != null || infoSummary != null) {
@@ -276,6 +285,7 @@
SliceItem mRadioGroupItem;
SliceItem mIntentItem;
SliceItem mFollowupIntentItem;
+ SliceItem mHasEndIconItem;
List<SliceItem> mEndItems = new ArrayList<>();
List<SliceItem> mInfoItems = new ArrayList<>();
}
@@ -314,6 +324,9 @@
case SlicesConstants.TAG_TARGET_URI :
data.mTargetSliceItem = item;
break;
+ case SlicesConstants.EXTRA_HAS_END_ICON:
+ data.mHasEndIconItem = item;
+ break;
}
} else if (FORMAT_TEXT.equals(item.getFormat()) && (item.getSubType() == null)) {
if ((data.mTitleItem == null || !data.mTitleItem.hasHint(HINT_TITLE))
@@ -500,6 +513,29 @@
return true;
}
+ private static boolean hasEndIcon(SliceItem item) {
+ return item != null && item.getInt() > 0;
+ }
+
+ /**
+ * Checks if custom content description should be forced to be used if provided. This function
+ * can be extended with more cases if needed.
+ *
+ * @param item The {@link SliceItem} containing the necessary information.
+ * @return <code>true</code> if custom content description should be used.
+ */
+ private static boolean shouldForceContentDescription(SliceItem sliceItem) {
+ List<SliceItem> items = sliceItem.getSlice().getItems();
+ for (SliceItem item : items) {
+ // Checks if an end icon has been set.
+ if (item.getSubType() != null
+ && item.getSubType().equals(SlicesConstants.EXTRA_HAS_END_ICON)) {
+ return hasEndIcon(item);
+ }
+ }
+ return false;
+ }
+
/**
* Get the text from the SliceItem.
*/
@@ -566,7 +602,7 @@
* Get the content description from SliceItem if available
*/
private static String getInfoContentDescription(
- SliceItem sliceItem, String contentDescription) {
+ SliceItem sliceItem) {
List<SliceItem> items = sliceItem.getSlice().getItems();
for (SliceItem item : items) {
if (item.getSubType() != null
@@ -574,6 +610,6 @@
return item.getText().toString();
}
}
- return contentDescription;
+ return null;
}
}
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceRadioPreference.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceRadioPreference.java
index ed86f0d..2192bf0 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceRadioPreference.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceRadioPreference.java
@@ -17,17 +17,22 @@
package com.android.tv.twopanelsettings.slices;
import android.content.Context;
+import android.text.TextUtils;
+import android.view.View;
+import androidx.preference.PreferenceViewHolder;
import androidx.slice.core.SliceActionImpl;
/**
* Slice version of RadioPreference.
*/
-public class SliceRadioPreference extends RadioPreference implements HasSliceAction, HasSliceUri {
+public class SliceRadioPreference extends RadioPreference implements HasSliceAction, HasSliceUri,
+ HasCustomContentDescription {
private int mActionId;
private SliceActionImpl mSliceAction;
private String mUri;
private SliceActionImpl mFollowupSliceAction;
+ private String mContentDescription;
public SliceRadioPreference(Context context, SliceActionImpl action) {
super(context);
@@ -36,6 +41,15 @@
}
@Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+ if (!TextUtils.isEmpty(mContentDescription)) {
+ holder.itemView.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
+ holder.itemView.setContentDescription(mContentDescription);
+ }
+ }
+
+ @Override
public int getActionId() {
return mActionId;
}
@@ -78,4 +92,18 @@
public String getUri() {
return mUri;
}
+
+ /**
+ * Sets the accessibility content description that will be read to the TalkBack users when they
+ * select this preference.
+ */
+ @Override
+ public void setContentDescription(String contentDescription) {
+ this.mContentDescription = contentDescription;
+ }
+
+ @Override
+ public String getContentDescription() {
+ return mContentDescription;
+ }
}
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SlicesConstants.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SlicesConstants.java
index c545f03..accf3b2 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SlicesConstants.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SlicesConstants.java
@@ -29,6 +29,8 @@
public static final String TYPE_PREFERENCE_CATEGORY = "TYPE_PREFERENCE_CATEGORY";
public static final String TYPE_PREFERENCE_SCREEN_TITLE = "TYPE_PREFERENCE_SCREEN_TITLE";
public static final String TYPE_PREFERENCE_EMBEDDED = "TYPE_PREFERENCE_EMBEDDED";
+ public static final String TYPE_PREFERENCE_EMBEDDED_PLACEHOLDER =
+ "TYPE_PREFERENCE_EMBEDDED_PLACEHOLDER";
public static final String TYPE_FOCUSED_PREFERENCE = "TYPE_FOCUSED_PREFERENCE";
public static final String TYPE_REDIRECTED_SLICE_URI = "TYPE_REDIRECTED_SLICE_URI";
public static final String TAG_TARGET_URI = "TAG_TARGET_URI";
@@ -64,6 +66,7 @@
public static final String EXTRA_ACTION_ID = "extra_action_id";
public static final String EXTRA_PAGE_ID = "extra_page_id";
public static final String EXTRA_SLICE_FOLLOWUP = "extra_slice_followup";
+ public static final String EXTRA_HAS_END_ICON = "extra_has_end_icon";
public static final int SWITCH = 0;
public static final int CHECKMARK = 1;
public static final int RADIO = 2;
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/builders/PreferenceSliceBuilder.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/builders/PreferenceSliceBuilder.java
index 2494329..2b6498f 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/builders/PreferenceSliceBuilder.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/builders/PreferenceSliceBuilder.java
@@ -19,8 +19,8 @@
import static com.android.tv.twopanelsettings.slices.SlicesConstants.BUTTONSTYLE;
import static com.android.tv.twopanelsettings.slices.SlicesConstants.CHECKMARK;
import static com.android.tv.twopanelsettings.slices.SlicesConstants.RADIO;
-import static com.android.tv.twopanelsettings.slices.SlicesConstants.SWITCH;
import static com.android.tv.twopanelsettings.slices.SlicesConstants.SEEKBAR;
+import static com.android.tv.twopanelsettings.slices.SlicesConstants.SWITCH;
import android.app.PendingIntent;
import android.content.Context;
@@ -158,6 +158,15 @@
}
/**
+ * Add an embedded preference placeholder where another slice can control the properties via
+ * setEmbeddedPreference.
+ */
+ public PreferenceSliceBuilder addEmbeddedPreference(RowBuilder builder) {
+ mImpl.addEmbeddedPreference(builder);
+ return this;
+ }
+
+ /**
* Set the focused preference for slice.
* @param key key of the focused preference.
*/
@@ -195,6 +204,7 @@
private boolean mHasEndActionOrToggle;
private boolean mHasEndImage;
private boolean mHasDefaultToggle;
+ private boolean mHasEndIcon;
private boolean mTitleItemLoading;
private IconCompat mTitleIcon;
private SliceAction mTitleAction;
@@ -338,10 +348,30 @@
}
/**
- * Sets the icon for the preference builder.
+ * Sets the icon for the preference builder. There can only be one icon,
+ * this will replace any other icon that may have been set.
+ * This means that you should only provide an icon using one of the two functions
+ * {@link #setIcon(IconCompat)} or {@link #setEndIcon(IconCompat)}.
+ *
+ * @param icon the image to display.
*/
@NonNull
public RowBuilder setIcon(@NonNull IconCompat icon) {
+ mHasEndIcon = false;
+ return setTitleItem(icon);
+ }
+
+ /**
+ * Sets the icon to the end for the preference builder. There can only be one icon,
+ * this will replace any other icon that may have been set.
+ * This means that you should only provide an icon using one of the two functions
+ * {@link #setIcon(IconCompat)} or {@link #setEndIcon(IconCompat)}.
+ *
+ * @param icon the image to display.
+ */
+ @NonNull
+ public RowBuilder setEndIcon(@NonNull IconCompat icon) {
+ mHasEndIcon = true;
return setTitleItem(icon);
}
@@ -854,6 +884,13 @@
return mHasDefaultToggle;
}
+ /**
+ * Checks if item has an end icon.
+ */
+ public boolean hasEndIcon() {
+ return mHasEndIcon;
+ }
+
public CharSequence getRadioGroup() {
return mRadioGroup;
}
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/builders/PreferenceSliceBuilderImpl.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/builders/PreferenceSliceBuilderImpl.java
index 0246cff..346a1ad 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/builders/PreferenceSliceBuilderImpl.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/builders/PreferenceSliceBuilderImpl.java
@@ -41,11 +41,13 @@
import static com.android.tv.twopanelsettings.slices.SlicesConstants.BUTTONSTYLE;
import static com.android.tv.twopanelsettings.slices.SlicesConstants.EXTRA_ACTION_ID;
import static com.android.tv.twopanelsettings.slices.SlicesConstants.EXTRA_ADD_INFO_STATUS;
+import static com.android.tv.twopanelsettings.slices.SlicesConstants.EXTRA_HAS_END_ICON;
import static com.android.tv.twopanelsettings.slices.SlicesConstants.EXTRA_PAGE_ID;
import static com.android.tv.twopanelsettings.slices.SlicesConstants.EXTRA_PREFERENCE_INFO_IMAGE;
import static com.android.tv.twopanelsettings.slices.SlicesConstants.EXTRA_PREFERENCE_INFO_SUMMARY;
import static com.android.tv.twopanelsettings.slices.SlicesConstants.EXTRA_PREFERENCE_INFO_TEXT;
import static com.android.tv.twopanelsettings.slices.SlicesConstants.EXTRA_PREFERENCE_INFO_TITLE_ICON;
+import static com.android.tv.twopanelsettings.slices.SlicesConstants.TYPE_PREFERENCE_EMBEDDED_PLACEHOLDER;
import android.net.Uri;
@@ -150,6 +152,14 @@
}
/**
+ * Add an embedded preference placeholder where another slice can control the properties via
+ * setEmbeddedPreference.
+ */
+ public void addEmbeddedPreference(@NonNull RowBuilder builder) {
+ addRow(builder, TYPE_PREFERENCE_EMBEDDED_PLACEHOLDER);
+ }
+
+ /**
* Set the focused preference for the slice
*/
@NonNull
@@ -256,6 +266,7 @@
private SliceItem mInfoImageItem;
private SliceItem mInfoTitleIconItem;
private SliceItem mInfoSummaryItem;
+ private SliceItem mHasEndIconItem;
/**
*
@@ -339,6 +350,7 @@
if (builder.getInfoImage() != null) {
setInfoImage(builder.getInfoImage());
}
+ setHasEndIcon(builder.hasEndIcon());
setButtonStyle(builder.getButtonStyle());
setSeekbarMin(builder.getSeekbarMin());
setSeekbarMax(builder.getSeekbarMax());
@@ -477,6 +489,11 @@
needed ? 1 : 0, FORMAT_INT, SUBTYPE_ICON_NEED_TO_BE_PROCESSED, new String[]{});
}
+ public void setHasEndIcon(boolean hasEndIcon) {
+ mHasEndIconItem = new SliceItem(
+ hasEndIcon ? 1 : 0, FORMAT_INT, EXTRA_HAS_END_ICON, new String[]{});
+ }
+
/**
*
*/
@@ -700,6 +717,9 @@
if (mSeekbarValueItem != null) {
b.addItem(mSeekbarValueItem);
}
+ if (mHasEndIconItem != null) {
+ b.addItem(mHasEndIconItem);
+ }
for (int i = 0; i < mEndItems.size(); i++) {
Slice item = mEndItems.get(i);
b.addSubSlice(item);
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
new file mode 100644
index 0000000..04f7dcc
--- /dev/null
+++ b/color-check-baseline.xml
@@ -0,0 +1,3416 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="4">
+
+ <issue
+ id="LintError"
+ severity="Error"
+ message="No `.class` files were found in project "Settings", so none of the classfile based checks could be run. Does the project need to be built first?"
+ category="Lint"
+ priority="10"
+ summary="Lint Failure"
+ explanation="This issue type represents a problem running lint itself. Examples include failure to find bytecode for source files (which means certain detectors could not be run), parsing errors in lint configuration files, etc.
These errors are not errors in your own code, but they are shown to make it clear that some checks were not completed.">
+ <location
+ file="Settings"/>
+ </issue>
+
+ <issue
+ id="LintError"
+ severity="Error"
+ message="No `.class` files were found in project "SettingsAPI", so none of the classfile based checks could be run. Does the project need to be built first?"
+ category="Lint"
+ priority="10"
+ summary="Lint Failure"
+ explanation="This issue type represents a problem running lint itself. Examples include failure to find bytecode for source files (which means certain detectors could not be run), parsing errors in lint configuration files, etc.
These errors are not errors in your own code, but they are shown to make it clear that some checks were not completed.">
+ <location
+ file="SettingsAPI"/>
+ </issue>
+
+ <issue
+ id="LintError"
+ severity="Error"
+ message="No `.class` files were found in project "TwoPanelSettingsLib", so none of the classfile based checks could be run. Does the project need to be built first?"
+ category="Lint"
+ priority="10"
+ summary="Lint Failure"
+ explanation="This issue type represents a problem running lint itself. Examples include failure to find bytecode for source files (which means certain detectors could not be run), parsing errors in lint configuration files, etc.
These errors are not errors in your own code, but they are shown to make it clear that some checks were not completed.">
+ <location
+ file="TwoPanelSettingsLib"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="normal">#FFFFFFFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="18"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="background">#FF707070</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="19"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="legacy_app_item_background">#1a000000</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="20"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="settings_background">#FF1F292E</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="21"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_fragment_container_background_color">#FF1E232C</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="21"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="lb_preference_decor_list_background">#FF202124</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preview_panel_background_color">#FF222730</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="storage_avail">#333333</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="23"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_panel_background_color">#FF1E232C</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="23"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="storage_apps_usage">#77831A</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="24"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="storage_downloads">#476093</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="25"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_item_primary_text_focused_color">#FF0E0E0F</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="25"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="storage_dcim">#793A7F</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_item_primary_text_disabled_color">#FF9AA0A6</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="storage_music">#8E562A</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="27"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_item_primary_text_default_color">#FFE8EAED</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="27"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="storage_cache">#479392</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="28"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="storage_misc">#7C3030</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="29"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_item_secondary_text_focused_color">#990E0E0F</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="29"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_item_secondary_text_disabled_color">#FF9AA0A6</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="30"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="icon_background">#FF4A4F51</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="31"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_item_secondary_text_default_color">#99E8EAED</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="31"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="add_accessory_hint_text_color">#FFE0E0E0</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="32"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FFFFFF">#FFFFFFFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="33"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_category_text_color">#FF9AA0A6</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="33"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_000000">#FF000000</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="34"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_decor_title_text_color">#FFE8EAED</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="34"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FF0000">#FFFF0000</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="35"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FFFF00">#FFFFFF00</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="36"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_item_icon_focused_background_color">#FFD3E0F5</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="36"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_00FF00">#FF00FF00</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="37"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_item_icon_default_background_color">#FF263041</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="37"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_00FFFF">#FF00FFFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="38"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_0000FF">#FF0000FF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="39"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_switch_thumb_on_default_color">#FF3B78E7</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="39"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FF00FF">#FFFF00FF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="40"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_switch_thumb_off_default_color">#FFFAFAFA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="40"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_000055">#FF000055</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="41"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_switch_track_on_default_color">#FF87ADF1</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="41"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_0000AA">#FF0000AA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="42"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_switch_track_off_default_color">#FF9CA8BA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="42"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_005500">#FF005500</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="43"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_005555">#FF005555</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="44"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_switch_thumb_disabled_color">#FFBDBDBD</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="44"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_0055AA">#FF0055AA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="45"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_switch_track_disabled_color">#FFBDC1C6</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="45"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_0055FF">#FF0055FF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="46"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_00AA00">#FF00AA00</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="47"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_wifi_signal_lock_focused">#5F6368</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="47"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_00AA55">#FF00AA55</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="48"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tp_preference_wifi_signal_lock_unfocused">#F8F9FA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="48"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_00AAAA">#FF00AAAA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="49"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_00AAFF">#FF00AAFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="50"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="info_separator">#FF323232</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="50"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_00FF55">#FF00FF55</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="51"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="info_title_text_color">#FFFFFFFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="51"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_00FFAA">#FF00FFAA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="52"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="info_status_on">#FF5BB974</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="52"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_550000">#FF550000</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="53"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="info_status_off">#FFEE675C</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/values/colors.xml"
+ line="53"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_550055">#FF550055</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="54"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_5500AA">#FF5500AA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="55"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_5500FF">#FF5500FF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="56"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_555500">#FF555500</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="57"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_555555">#FF555555</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="58"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_5555AA">#FF5555AA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="59"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_5555FF">#FF5555FF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="60"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_55AA00">#FF55AA00</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="61"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_55AA55">#FF55AA55</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="62"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_55AAAA">#FF55AAAA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="63"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_55AAFF">#FF55AAFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="64"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_55FF00">#FF55FF00</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="65"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_55FF55">#FF55FF55</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="66"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_55FFAA">#FF55FFAA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="67"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_55FFFF">#FF55FFFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="68"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AA0000">#FFAA0000</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="69"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AA0055">#FFAA0055</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="70"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AA00AA">#FFAA00AA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="71"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AA00FF">#FFAA00FF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="72"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AA5500">#FFAA5500</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="73"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AA5555">#FFAA5555</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="74"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AA55AA">#FFAA55AA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="75"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AA55FF">#FFAA55FF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="76"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AAAA00">#FFAAAA00</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="77"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AAAA55">#FFAAAA55</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="78"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AAAAAA">#FFAAAAAA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="79"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AAAAFF">#FFAAAAFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="80"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AAFF00">#FFAAFF00</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="81"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AAFF55">#FFAAFF55</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="82"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AAFFAA">#FFAAFFAA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="83"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_AAFFFF">#FFAAFFFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="84"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FF0055">#FFFF0055</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="85"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FF00AA">#FFFF00AA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="86"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FF5500">#FFFF5500</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="87"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FF5555">#FFFF5555</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="88"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FF55AA">#FFFF55AA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="89"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FF55FF">#FFFF55FF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="90"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FFAA00">#FFFFAA00</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="91"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FFAA55">#FFFFAA55</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="92"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FFAAAA">#FFFFAAAA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="93"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FFAAFF">#FFFFAAFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="94"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FFFF55">#FFFFFF55</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="95"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="captioning_color_FFFFAA">#FFFFFFAA</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="96"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="overlay_blended_light_primary">#ffeeeeee</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="98"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="overlay_blended_light_secondary">#ff878787</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="99"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="lb_dialog_activity_background">#77000000</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="100"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="lb_dialog_list_item_unselected_text_color">#FFF1F1F1</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="101"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="lb_dialog_list_item_divider_color">#18FFFFFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="102"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="lb_content_title_text_color">#FFF1F1F1</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="103"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="lb_content_breadcrumb_text_color">#88F1F1F1</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="104"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="lb_content_description_text_color">#88F1F1F1</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="105"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="lb_action_fragment_background">#FF111111</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="106"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="lb_dialog_selector_color">#0DFFFFFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="107"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="lb_tv_white">#FFCCCCCC</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="109"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="indigo_500">#FF3F51B5</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="119"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="pin_dialog_background">#384248</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="122"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="pin_dialog_text_color_enabled">#FFEEEEEE</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="123"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="pin_dialog_text_color_disabled">#4DEEEEEE</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="124"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="pin_number_picker_focused_background">#4B5459</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="125"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="content_breadcrumb_text_color">#88F1F1F1</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="128"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="content_description_text_color">#88F1F1F1</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="129"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="content_fragment_default_icon_color">#33F1F1F1</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="130"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="content_title_text_color">#FFF1F1F1</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="131"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="dialog_activity_background">#77000000</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="132"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="list_item_unselected_text_color">#FFF1F1F1</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="133"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="selector_color">#0DFFFFFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="134"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="toast_notification_background">#881F1F1F</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="135"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="toast_notification_text_color">#FFF0F0F0</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="136"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="tv_white">#FFCCCCCC</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="137"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="setup_list_item_background_focused">#FFFFFFFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="152"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="setup_list_item_background_focused_blue">#FF3E82F7</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="153"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="setup_list_item_focused">#FF444444</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="155"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="setup_list_item">#FFEEEEEE</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="156"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="setup_list_item_icon_focused">#FF555555</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="157"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="setup_primary_text_color">#FFEEEEEE</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="159"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="activity_progress_text">#FFEEEEEE</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="161"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <color name="guided_step_text_input_item_background_focused">#FFFFFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/values/colors.xml"
+ line="166"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/tp_preference_item_icon_focused_background_color"></solid>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/drawable/compound_icon_background_focused.xml"
+ line="21"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/tp_preference_item_icon_default_background_color"></solid>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/drawable/compound_icon_background_unfocused.xml"
+ line="20"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/content_fragment_default_icon_color" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/content_fragment_default_icon.xml"
+ line="23"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/guided_step_text_input_item_background_focused" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/guided_step_text_input_background.xml"
+ line="20"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/indigo_500" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/ic_avatar_default.xml"
+ line="20"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:textColor="@color/tp_preference_item_secondary_text_disabled_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/info_preference_item.xml"
+ line="28"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:textColor="@color/tp_preference_item_secondary_text_disabled_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/info_preference_item.xml"
+ line="35"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/info_separator"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/drawable/info_separator_bg.xml"
+ line="22"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/lb_action_fragment_background""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/layout/lb_dialog_fragment.xml"
+ line="34"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/tv_white" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/list_item_checkmark.xml"
+ line="23"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:buttonTint="@color/setup_list_item_background_focused""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/layout/password_checkbox.xml"
+ line="28"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/pin_dialog_background"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/pin_dialog_background.xml"
+ line="17"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/pin_number_picker_focused_background"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/pin_number_picker_focused_background.xml"
+ line="17"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/selector_color" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/layout/settings_list.xml"
+ line="28"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:indeterminateTint="@color/setup_list_item_background_focused" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/layout/setup_message.xml"
+ line="50"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:indeterminateTint="@color/setup_list_item_background_focused""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/layout/setup_qr_code.xml"
+ line="46"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:textColor="#E8EAED""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/layout/setup_qr_code.xml"
+ line="65"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:textColor="#9AA0A6""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/layout/setup_qr_code.xml"
+ line="74"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:textColor="#5F6368""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/layout/setup_qr_code.xml"
+ line="81"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/setup_list_item_background_focused" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/setup_text_input_background.xml"
+ line="18"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/setup_list_item_focused" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/setup_text_input_cursor.xml"
+ line="24"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/setup_list_item_focused""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/setup_text_input_underline.xml"
+ line="23"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/storage_apps_usage" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/storage_indicator_apps.xml"
+ line="23"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/storage_avail" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/storage_indicator_available.xml"
+ line="23"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/storage_cache" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/storage_indicator_cache.xml"
+ line="23"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/storage_dcim" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/storage_indicator_dcim.xml"
+ line="23"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/storage_downloads" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/storage_indicator_downloads.xml"
+ line="23"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/storage_misc" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/storage_indicator_misc.xml"
+ line="23"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="@color/storage_music" />"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="Settings/res/drawable/storage_indicator_music.xml"
+ line="23"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/tp_preference_decor_title_text_color</item>"
+ errorLine2=" ^">
+ <location
+ file="TwoPanelSettingsLib/res/values/styles.xml"
+ line="22"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/tp_preference_decor_title_text_color</item>"
+ errorLine2=" ^">
+ <location
+ file="TwoPanelSettingsLib/res/values/styles.xml"
+ line="28"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/tp_preference_category_text_color</item>"
+ errorLine2=" ^">
+ <location
+ file="TwoPanelSettingsLib/res/values/styles.xml"
+ line="33"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:windowBackground">@color/settings_background</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="46"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="wps_color">@color/normal</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="53"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/info_title_text_color</item>"
+ errorLine2=" ^">
+ <location
+ file="TwoPanelSettingsLib/res/values/styles.xml"
+ line="57"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/info_title_text_color</item>"
+ errorLine2=" ^">
+ <location
+ file="TwoPanelSettingsLib/res/values/styles.xml"
+ line="63"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:windowBackground">@color/settings_background</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="68"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="wifi_signal_color">@color/setup_list_item</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="72"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="wps_color">@color/setup_list_item</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="73"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/add_accessory_hint_text_color</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="111"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/content_title_text_color</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="132"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/content_breadcrumb_text_color</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="138"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/content_description_text_color</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="145"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/list_item_unselected_text_color</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="162"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/list_item_unselected_text_color</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="169"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/setup_list_item</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="216"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/setup_list_item_focused</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="224"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/activity_progress_text</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="230"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/setup_list_item</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="281"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:textColor">@color/setup_primary_text_color</item>"
+ errorLine2=" ^">
+ <location
+ file="Settings/res/values/styles.xml"
+ line="298"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/tp_preference_switch_thumb_on_default_color"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/drawable/switch_thumb.xml"
+ line="22"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/tp_preference_switch_thumb_disabled_color"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/drawable/switch_thumb.xml"
+ line="26"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/tp_preference_switch_thumb_off_default_color"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/drawable/switch_thumb.xml"
+ line="30"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/tp_preference_switch_thumb_disabled_color"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/drawable/switch_thumb.xml"
+ line="34"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/tp_preference_switch_track_on_default_color"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/drawable/switch_track.xml"
+ line="22"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/tp_preference_switch_track_disabled_color"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/drawable/switch_track.xml"
+ line="26"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/tp_preference_switch_track_off_default_color"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/drawable/switch_track.xml"
+ line="30"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="@color/tp_preference_switch_track_disabled_color"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/drawable/switch_track.xml"
+ line="34"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <item name="android:colorControlNormal">#FF808080</item>"
+ errorLine2=" ^">
+ <location
+ file="TwoPanelSettingsLib/res/values/themes.xml"
+ line="28"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" <solid android:color="#ffe8eaed"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/drawable/two_panel_preference_focused.xml"
+ line="3"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:color="#ffe8eaed"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/drawable/two_panel_preference_focused.xml"
+ line="6"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/tp_fragment_container_background_color">"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml"
+ line="50"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/tp_preference_panel_background_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml"
+ line="67"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/tp_preference_panel_background_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml"
+ line="73"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/tp_preference_panel_background_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml"
+ line="84"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/tp_preference_panel_background_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml"
+ line="95"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/tp_preference_panel_background_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml"
+ line="106"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/tp_preference_panel_background_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml"
+ line="117"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/tp_preference_panel_background_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml"
+ line="128"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/tp_preference_panel_background_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml"
+ line="139"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/tp_preference_panel_background_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml"
+ line="150"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/tp_preference_panel_background_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml"
+ line="161"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/tp_preference_panel_background_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml"
+ line="172"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="HardCodedColor"
+ severity="Error"
+ message="Avoid using hardcoded color"
+ category="Correctness"
+ priority="4"
+ summary="Using hardcoded color"
+ explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
+ errorLine1=" android:background="@color/tp_preference_panel_background_color""
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="TwoPanelSettingsLib/res/layout/two_panel_settings_fragment.xml"
+ line="183"
+ column="17"/>
+ </issue>
+
+</issues>