[automerger skipped] Update the summary when Wi-Fi calling ready am: bfb4086689 -s ours
am skip reason: Merged-In Ida94fd0a86f2130b9f0dded82fe18efd3ffc0c27 with SHA-1 d48cf866d8 is already in history
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/26576528
Change-Id: I1d8b918b0c997071e0fa93c1ba033afbe2531f0e
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/aconfig/settings_threadnetwork_flag_declarations.aconfig b/aconfig/settings_threadnetwork_flag_declarations.aconfig
new file mode 100644
index 0000000..70945d3
--- /dev/null
+++ b/aconfig/settings_threadnetwork_flag_declarations.aconfig
@@ -0,0 +1,8 @@
+package: "com.android.settings.flags"
+
+flag {
+ name: "thread_settings_enabled"
+ namespace: "thread_network"
+ description: "Controls whether the Thread Settings UX is displayed"
+ bug: "329384658"
+}
diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index 5a0e98e..ecc795e 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -653,7 +653,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/layout/battery_tips_card.xml"
- line="57"
+ line="58"
column="13"/>
</issue>
@@ -669,7 +669,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/layout/battery_tips_card.xml"
- line="57"
+ line="58"
column="13"/>
</issue>
@@ -1577,11 +1577,11 @@
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="screen_flash_color_button_outer_circle_stroke_color">#FFFFFF</color>"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" <color name="battery_good_color_light">#43a047</color> <!-- Material Green 600 -->"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="res/values-night/colors.xml"
- line="74"
+ file="res/values/colors.xml"
+ line="75"
column="5"/>
</issue>
@@ -1593,11 +1593,11 @@
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="battery_good_color_light">#43a047</color> <!-- Material Green 600 -->"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" <color name="screen_flash_color_button_outer_circle_stroke_color">#FFFFFF</color>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="res/values/colors.xml"
- line="75"
+ file="res/values-night/colors.xml"
+ line="76"
column="5"/>
</issue>
@@ -1629,7 +1629,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values-night/colors.xml"
- line="77"
+ line="79"
column="5"/>
</issue>
@@ -2269,7 +2269,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="141"
+ line="143"
column="5"/>
</issue>
@@ -2285,7 +2285,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="142"
+ line="144"
column="5"/>
</issue>
@@ -2301,7 +2301,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="143"
+ line="145"
column="5"/>
</issue>
@@ -2317,7 +2317,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="144"
+ line="146"
column="5"/>
</issue>
@@ -2333,7 +2333,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="146"
+ line="148"
column="5"/>
</issue>
@@ -2349,7 +2349,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="148"
+ line="150"
column="5"/>
</issue>
@@ -2365,7 +2365,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="151"
+ line="153"
column="5"/>
</issue>
@@ -2381,7 +2381,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="154"
+ line="156"
column="5"/>
</issue>
@@ -2397,7 +2397,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="155"
+ line="157"
column="5"/>
</issue>
@@ -2413,7 +2413,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="156"
+ line="158"
column="5"/>
</issue>
@@ -2429,7 +2429,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="157"
+ line="159"
column="5"/>
</issue>
@@ -2445,7 +2445,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="158"
+ line="160"
column="5"/>
</issue>
@@ -2461,7 +2461,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="173"
+ line="175"
column="5"/>
</issue>
@@ -2477,7 +2477,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="174"
+ line="176"
column="5"/>
</issue>
@@ -2493,7 +2493,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="177"
+ line="179"
column="5"/>
</issue>
@@ -2509,7 +2509,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="178"
+ line="180"
column="5"/>
</issue>
@@ -2525,7 +2525,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="180"
+ line="182"
column="5"/>
</issue>
@@ -2541,7 +2541,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="181"
+ line="183"
column="5"/>
</issue>
@@ -2557,7 +2557,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="182"
+ line="184"
column="5"/>
</issue>
@@ -2573,7 +2573,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="183"
+ line="185"
column="5"/>
</issue>
@@ -2589,7 +2589,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="187"
+ line="189"
column="5"/>
</issue>
@@ -2605,7 +2605,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="188"
+ line="190"
column="5"/>
</issue>
@@ -2621,7 +2621,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="191"
+ line="193"
column="5"/>
</issue>
@@ -2637,7 +2637,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="192"
+ line="194"
column="5"/>
</issue>
@@ -2653,7 +2653,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="193"
+ line="195"
column="5"/>
</issue>
@@ -2669,7 +2669,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="194"
+ line="196"
column="5"/>
</issue>
@@ -2685,7 +2685,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="195"
+ line="197"
column="5"/>
</issue>
@@ -2701,7 +2701,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="196"
+ line="198"
column="5"/>
</issue>
@@ -2717,7 +2717,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="197"
+ line="199"
column="5"/>
</issue>
@@ -2733,7 +2733,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="198"
+ line="200"
column="5"/>
</issue>
@@ -2749,7 +2749,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="199"
+ line="201"
column="5"/>
</issue>
@@ -2765,7 +2765,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="200"
+ line="202"
column="5"/>
</issue>
@@ -2781,7 +2781,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="201"
+ line="203"
column="5"/>
</issue>
@@ -2797,7 +2797,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="202"
+ line="204"
column="5"/>
</issue>
@@ -2813,7 +2813,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="205"
+ line="207"
column="5"/>
</issue>
@@ -2829,7 +2829,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="206"
+ line="208"
column="5"/>
</issue>
@@ -2845,7 +2845,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="207"
+ line="209"
column="5"/>
</issue>
@@ -2861,7 +2861,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="208"
+ line="210"
column="5"/>
</issue>
@@ -2877,7 +2877,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="209"
+ line="211"
column="5"/>
</issue>
@@ -2893,7 +2893,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="210"
+ line="212"
column="5"/>
</issue>
@@ -2909,7 +2909,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="211"
+ line="213"
column="5"/>
</issue>
@@ -2925,7 +2925,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="212"
+ line="214"
column="5"/>
</issue>
@@ -2941,7 +2941,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="213"
+ line="215"
column="5"/>
</issue>
@@ -2957,7 +2957,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="214"
+ line="216"
column="5"/>
</issue>
@@ -2973,7 +2973,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="215"
+ line="217"
column="5"/>
</issue>
@@ -2989,7 +2989,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="216"
+ line="218"
column="5"/>
</issue>
@@ -3005,7 +3005,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="res/values/colors.xml"
- line="219"
+ line="221"
column="5"/>
</issue>
@@ -3945,6 +3945,22 @@
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/accessibility_feature_background"/>"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="res/drawable/ic_color_contrast.xml"
+ line="22"
+ 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:color="@color/accessibility_color_inversion_background"/>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@@ -6125,7 +6141,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="944"
+ line="943"
column="43"/>
</issue>
@@ -6141,7 +6157,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="944"
+ line="943"
column="43"/>
</issue>
@@ -6157,7 +6173,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="945"
+ line="944"
column="49"/>
</issue>
@@ -6173,7 +6189,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="945"
+ line="944"
column="49"/>
</issue>
@@ -6189,7 +6205,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="946"
+ line="945"
column="54"/>
</issue>
@@ -6205,7 +6221,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="946"
+ line="945"
column="54"/>
</issue>
@@ -6221,7 +6237,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="947"
+ line="946"
column="47"/>
</issue>
@@ -6237,7 +6253,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="947"
+ line="946"
column="47"/>
</issue>
@@ -6253,7 +6269,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="948"
+ line="947"
column="51"/>
</issue>
@@ -6269,7 +6285,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="948"
+ line="947"
column="51"/>
</issue>
@@ -6285,7 +6301,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="949"
+ line="948"
column="63"/>
</issue>
@@ -6301,7 +6317,7 @@
errorLine2=" ^">
<location
file="res/values/styles.xml"
- line="949"
+ line="948"
column="63"/>
</issue>
diff --git a/res-product/values-fr-feminine/strings.xml b/res-product/values-fr-feminine/strings.xml
new file mode 100644
index 0000000..4027cbd
--- /dev/null
+++ b/res-product/values-fr-feminine/strings.xml
@@ -0,0 +1,24 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="main_clear_accounts" product="default" msgid="3604029744509330786">\n\n"Vous êtes actuellement connectée aux comptes suivants :\n"</string>
+ <string name="install_all_warning" product="tablet" msgid="1732116924846572063">"Votre tablette et vos données personnelles sont très vulnérables aux attaques provenant d\'applications inconnues. En installant des applications provenant de cette source, vous acceptez d\'être la seule responsable de tout dommage causé à votre tablette ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
+ <string name="install_all_warning" product="default" msgid="4597256179485325694">"Votre téléphone et vos données personnelles sont plus vulnérables aux attaques d\'applis inconnues. En installant des applis depuis cette source, vous reconnaissez être responsable de tout dommage causé à votre téléphone ou de toute perte de données pouvant découler de leur utilisation."</string>
+ <string name="install_all_warning" product="device" msgid="6293002353591632851">"Votre appareil et vos données personnelles sont très vulnérables aux attaques provenant d\'applications inconnues. En installant des applications provenant de cette source, vous acceptez d\'être la seule responsable de tout dommage causé à votre appareil ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
+</resources>
diff --git a/res-product/values-fr-masculine/strings.xml b/res-product/values-fr-masculine/strings.xml
new file mode 100644
index 0000000..0bca528
--- /dev/null
+++ b/res-product/values-fr-masculine/strings.xml
@@ -0,0 +1,24 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="main_clear_accounts" product="default" msgid="3604029744509330786">\n\n"Vous êtes actuellement connecté aux comptes suivants :\n"</string>
+ <string name="install_all_warning" product="tablet" msgid="1732116924846572063">"Votre tablette et vos données personnelles sont très vulnérables aux attaques provenant d\'applications inconnues. En installant des applications provenant de cette source, vous acceptez d\'être le seul responsable de tout dommage causé à votre tablette ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
+ <string name="install_all_warning" product="default" msgid="4597256179485325694">"Votre téléphone et vos données personnelles sont plus vulnérables aux attaques d\'applis inconnues. En installant des applis depuis cette source, vous reconnaissez être responsable de tout dommage causé à votre téléphone ou de toute perte de données pouvant découler de leur utilisation."</string>
+ <string name="install_all_warning" product="device" msgid="6293002353591632851">"Votre appareil et vos données personnelles sont très vulnérables aux attaques provenant d\'applications inconnues. En installant des applications provenant de cette source, vous acceptez d\'être le seul responsable de tout dommage causé à votre appareil ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
+</resources>
diff --git a/res-product/values-fr-neuter/strings.xml b/res-product/values-fr-neuter/strings.xml
new file mode 100644
index 0000000..8777756
--- /dev/null
+++ b/res-product/values-fr-neuter/strings.xml
@@ -0,0 +1,24 @@
+<?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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="main_clear_accounts" product="default" msgid="3604029744509330786">\n\n"Vous êtes actuellement connecté·e aux comptes suivants :\n"</string>
+ <string name="install_all_warning" product="tablet" msgid="1732116924846572063">"Votre tablette et vos données personnelles sont très vulnérables aux attaques provenant d\'applications inconnues. En installant des applications provenant de cette source, vous acceptez d\'être l\'unique responsable de tout dommage causé à votre tablette ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
+ <string name="install_all_warning" product="default" msgid="4597256179485325694">"Votre téléphone et vos données personnelles sont plus vulnérables aux attaques d\'applis inconnues. En installant des applis depuis cette source, vous reconnaissez être responsable de tout dommage causé à votre téléphone ou de toute perte de données pouvant découler de leur utilisation."</string>
+ <string name="install_all_warning" product="device" msgid="6293002353591632851">"Votre appareil et vos données personnelles sont très vulnérables aux attaques provenant d\'applications inconnues. En installant des applications provenant de cette source, vous acceptez d\'être l\'unique responsable de tout dommage causé à votre appareil ou de toute perte de données pouvant découler de l\'utilisation de telles applications."</string>
+</resources>
diff --git a/res-product/values/drawables.xml b/res-product/values/drawables.xml
index a2d66e7..9353030 100644
--- a/res-product/values/drawables.xml
+++ b/res-product/values/drawables.xml
@@ -29,6 +29,8 @@
<drawable name="a11y_captioning_banner" product="default">@drawable/accessibility_captioning_banner</drawable>
<drawable name="a11y_captioning_banner" product="tablet">@drawable/accessibility_captioning_banner_tablet</drawable>
+ <drawable name="a11y_shortcut_type_quick_settings" product="default">@drawable/accessibility_shortcut_type_quick_settings</drawable>
+
<drawable name="a11y_shortcut_type_hardware" product="default">@drawable/accessibility_shortcut_type_hardware</drawable>
<drawable name="a11y_shortcut_type_hardware" product="tablet">@drawable/accessibility_shortcut_type_hardware_tablet</drawable>
diff --git a/res/drawable/accessibility_shortcut_type_quick_settings.xml b/res/drawable/accessibility_shortcut_type_quick_settings.xml
new file mode 100644
index 0000000..a801347
--- /dev/null
+++ b/res/drawable/accessibility_shortcut_type_quick_settings.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~
+ ~ Copyright 2024 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ https://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT 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="312dp"
+ android:height="130dp"
+ android:viewportWidth="312"
+ android:viewportHeight="130">
+ <group>
+ <clip-path
+ android:pathData="M24,0L288,0A24,24 0,0 1,312 24L312,106A24,24 0,0 1,288 130L24,130A24,24 0,0 1,0 106L0,24A24,24 0,0 1,24 0z"/>
+ <path
+ android:pathData="M24,0L288,0A24,24 0,0 1,312 24L312,106A24,24 0,0 1,288 130L24,130A24,24 0,0 1,0 106L0,24A24,24 0,0 1,24 0z"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M209,139.62H210V138.62V32C210,24.82 204.18,19 197,19H115C107.82,19 102,24.82 102,32V138.62V139.62H103H209Z"
+ android:strokeWidth="2"
+ android:fillColor="#00000000"
+ android:strokeColor="#6D6D6D"/>
+ <path
+ android:pathData="M103,32C103,25.37 108.37,20 115,20H197C203.63,20 209,25.37 209,32V91.93H103V32Z"
+ android:fillColor="#484848"/>
+ <path
+ android:pathData="M113.31,38.93L149.48,38.93A4,4 0,0 1,153.48 42.93L153.48,52.6A4,4 0,0 1,149.48 56.6L113.31,56.6A4,4 0,0 1,109.31 52.6L109.31,42.93A4,4 0,0 1,113.31 38.93z"
+ android:fillColor="#69B2C9"/>
+ <path
+ android:pathData="M113.31,61.64L149.48,61.64A4,4 0,0 1,153.48 65.64L153.48,75.31A4,4 0,0 1,149.48 79.31L113.31,79.31A4,4 0,0 1,109.31 75.31L109.31,65.64A4,4 0,0 1,113.31 61.64z"
+ android:fillColor="#646464"/>
+ <path
+ android:pathData="M162.52,38.93L198.69,38.93A4,4 0,0 1,202.69 42.93L202.69,52.6A4,4 0,0 1,198.69 56.6L162.52,56.6A4,4 0,0 1,158.52 52.6L158.52,42.93A4,4 0,0 1,162.52 38.93z"
+ android:fillColor="#646464"/>
+ <path
+ android:pathData="M162.52,61.64L198.69,61.64A4,4 0,0 1,202.69 65.64L202.69,75.31A4,4 0,0 1,198.69 79.31L162.52,79.31A4,4 0,0 1,158.52 75.31L158.52,65.64A4,4 0,0 1,162.52 61.64z"
+ android:fillColor="#646464"/>
+ </group>
+</vector>
+
+
+
diff --git a/res/drawable/ic_bubble_all.xml b/res/drawable/ic_bubble_all.xml
deleted file mode 100644
index fdcf6dc..0000000
--- a/res/drawable/ic_bubble_all.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- ~ Copyright (C) 2020 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z"
- android:fillColor="#000000"/>
-</vector>
diff --git a/res/drawable/ic_bubble_none.xml b/res/drawable/ic_bubble_none.xml
deleted file mode 100644
index e8fd7df..0000000
--- a/res/drawable/ic_bubble_none.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- ~ Copyright (C) 2020 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10 10,-4.5 10,-10S17.5,2 12,2zM4,12c0,-4.4 3.6,-8 8,-8 1.8,0 3.5,0.6 4.9,1.7L5.7,16.9C4.6,15.5 4,13.8 4,12zM12,20c-1.8,0 -3.5,-0.6 -4.9,-1.7L18.3,7.1C19.4,8.5 20,10.2 20,12c0,4.4 -3.6,8 -8,8z"
- android:fillColor="#000000"/>
-</vector>
diff --git a/res/drawable/ic_bubble_selected.xml b/res/drawable/ic_bubble_selected.xml
deleted file mode 100644
index f953328..0000000
--- a/res/drawable/ic_bubble_selected.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- ~ Copyright (C) 2020 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:pathData="M15,8c0,-1.42 -0.5,-2.73 -1.33,-3.76 0.42,-0.14 0.86,-0.24 1.33,-0.24 2.21,0 4,1.79 4,4s-1.79,4 -4,4c-0.43,0 -0.84,-0.09 -1.23,-0.21 -0.03,-0.01 -0.06,-0.02 -0.1,-0.03C14.5,10.73 15,9.42 15,8zM16.66,13.13C18.03,14.06 19,15.32 19,17v3h4v-3c0,-2.18 -3.58,-3.47 -6.34,-3.87zM9,6c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2m0,9c-2.7,0 -5.8,1.29 -6,2.01L3,18h12v-1c-0.2,-0.71 -3.3,-2 -6,-2M9,4c2.21,0 4,1.79 4,4s-1.79,4 -4,4 -4,-1.79 -4,-4 1.79,-4 4,-4zM9,13c2.67,0 8,1.34 8,4v3L1,20v-3c0,-2.66 5.33,-4 8,-4z"
- android:fillColor="#000000"/>
-</vector>
diff --git a/res/drawable/ic_trackpad_bottom_right_click.xml b/res/drawable/ic_trackpad_bottom_right_click.xml
deleted file mode 100644
index ec85830..0000000
--- a/res/drawable/ic_trackpad_bottom_right_click.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- Copyright (C) 2023 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT 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="960"
- android:viewportHeight="960"
- android:tint="?android:attr/colorControlNormal">
- <path
- android:fillColor="@android:color/white"
- android:pathData="M120,840L120,780L780,780Q780,780 780,780Q780,780 780,780L780,120L840,120L840,780Q840,804.75 822.38,822.38Q804.75,840 780,840L120,840ZM599.91,670Q571,670 550.5,649.41Q530,628.82 530,599.91Q530,571 550.59,550.5Q571.18,530 600.09,530Q629,530 649.5,550.59Q670,571.18 670,600.09Q670,629 649.41,649.5Q628.82,670 599.91,670ZM220,480L220,420L378,420L119,161L161,119L420,378L420,220L480,220L480,480L220,480Z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_trackpad_pointer_speed.xml b/res/drawable/ic_trackpad_pointer_speed.xml
deleted file mode 100644
index 128282f..0000000
--- a/res/drawable/ic_trackpad_pointer_speed.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- Copyright (C) 2022 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="960"
- android:viewportHeight="960"
- android:tint="?android:attr/colorControlNormal">
- <path
- android:fillColor="@android:color/white"
- android:pathData="M407,635Q430,658 473.5,656.5Q517,655 537,624L753,285L418,504Q388,524 386,568Q384,612 407,635ZM478,161Q535,161 597,179.5Q659,198 716,243L664,280Q619,250 567.5,235.5Q516,221 477.98,221Q337.51,221 238.75,321.21Q140,421.43 140,563.98Q140,609 152.5,655Q165,701 188,740L767,740Q789,704 802,656Q815,608 815,562Q815,520 802.5,471.5Q790,423 758,382L797,330Q835,386 854,442.5Q873,499 875,556Q877,616 863,669Q849,722 822,767Q810,790 796.5,795Q783,800 763,800L192,800Q175,800 158.5,791.5Q142,783 134,767Q108,719 94,669.5Q80,620 80,564Q80,481 111.5,407.5Q143,334 197,279.5Q251,225 323.68,193Q396.36,161 478,161ZM469,492L469,492Q469,492 469,492Q469,492 469,492Q469,492 469,492Q469,492 469,492Q469,492 469,492Q469,492 469,492L469,492L469,492L469,492Q469,492 469,492Q469,492 469,492Q469,492 469,492Q469,492 469,492Z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_trackpad_reverse_scrolling.xml b/res/drawable/ic_trackpad_reverse_scrolling.xml
deleted file mode 100644
index a62f904..0000000
--- a/res/drawable/ic_trackpad_reverse_scrolling.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- Copyright (C) 2022 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24.0dp"
- android:height="24.0dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0"
- android:tint="?android:attr/colorControlNormal">
- <path
- android:fillColor="@android:color/white"
- android:pathData="M16.1,25.5V9.7L10.1,15.7L8,13.6L17.65,3.95L27.3,13.6L25.2,15.7L19.1,9.65V25.5ZM30.35,43.95 L20.7,34.25 22.8,32.2 28.8,38.2V22.4H31.8V38.25L37.9,32.2L40,34.3Z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_trackpad_tap_to_click.xml b/res/drawable/ic_trackpad_tap_to_click.xml
deleted file mode 100644
index 7db0454..0000000
--- a/res/drawable/ic_trackpad_tap_to_click.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- Copyright (C) 2022 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24.0dp"
- android:height="24.0dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0"
- android:tint="?android:attr/colorControlNormal">
- <path
- android:fillColor="@android:color/white"
- android:pathData="M23.25,2Q27.8,2 31.025,5.175Q34.25,8.35 34.25,12.9Q34.25,15.5 33.125,17.8Q32,20.1 29.95,21.7H28.25V19.2Q29.7,18.05 30.475,16.4Q31.25,14.75 31.25,12.9Q31.25,9.6 28.9,7.3Q26.55,5 23.25,5Q19.95,5 17.6,7.3Q15.25,9.6 15.25,12.9Q15.25,14.75 16.025,16.4Q16.8,18.05 18.25,19.2V22.8Q15.45,21.35 13.85,18.7Q12.25,16.05 12.25,12.9Q12.25,8.35 15.475,5.175Q18.7,2 23.25,2ZM21.35,44Q20.5,44 19.75,43.675Q19,43.35 18.45,42.8L8.15,32.5L10.95,29.6Q11.65,28.9 12.525,28.525Q13.4,28.15 14.35,28.4L18.25,29.3V13Q18.25,10.9 19.7,9.45Q21.15,8 23.25,8Q25.35,8 26.8,9.45Q28.25,10.9 28.25,13V21.6H29.55Q29.8,21.6 30,21.7Q30.2,21.8 30.45,21.9L37.85,25.5Q39.05,26.05 39.625,27.275Q40.2,28.5 39.95,29.8L38.15,40.7Q37.9,42.15 36.75,43.075Q35.6,44 34.15,44ZM20.95,41H35L37.15,28.55Q37.15,28.55 37.15,28.55Q37.15,28.55 37.15,28.55L28,24H25.25V13Q25.25,12.1 24.7,11.55Q24.15,11 23.25,11Q22.35,11 21.8,11.55Q21.25,12.1 21.25,13V32.95L13.55,31.3L12.4,32.45ZM35,41H20.95H21.25Q21.25,41 21.8,41Q22.35,41 23.25,41Q24.15,41 24.7,41Q25.25,41 25.25,41H28H35Q35,41 35,41Q35,41 35,41Z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_trackpad_touch_gestures_normal.xml b/res/drawable/ic_trackpad_touch_gestures_normal.xml
deleted file mode 100644
index 34619c8..0000000
--- a/res/drawable/ic_trackpad_touch_gestures_normal.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-Copyright (C) 2022 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="48"
- android:viewportHeight="48"
- android:tint="?android:attr/colorControlNormal">
- <path
- android:fillColor="@android:color/white"
- android:pathData="M40.15,47 L38.2,43.1 34.3,41.15 38.2,39.3 40.15,35.3 42,39.3 46,41.15 42,43.1ZM28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4Q28.5,31.4 28.5,31.4ZM23.05,48H30.4L29.75,45H23.05Q22,45 20.975,44.8Q19.95,44.6 19.25,43.9L6.5,30.65L7.85,29.4L19.75,35.85V9.15Q19.75,8.6 20.1,8.25Q20.45,7.9 21,7.9Q21.55,7.9 21.9,8.25Q22.25,8.6 22.25,9.15V24H26V4.25Q26,3.7 26.35,3.35Q26.7,3 27.25,3Q27.8,3 28.15,3.35Q28.5,3.7 28.5,4.25V24H32.25V6.1Q32.25,5.55 32.6,5.2Q32.95,4.85 33.5,4.85Q34.05,4.85 34.4,5.2Q34.75,5.55 34.75,6.1V24H38.5V12.45Q38.5,11.9 38.85,11.55Q39.2,11.2 39.75,11.2Q40.3,11.2 40.65,11.55Q41,11.9 41,12.45V31.4H44V12.45Q44,10.7 42.75,9.45Q41.5,8.2 39.75,8.2Q39.2,8.2 38.675,8.3Q38.15,8.4 37.75,8.75V6.45Q37.75,4.55 36.525,3.2Q35.3,1.85 33.5,1.85Q32.85,1.85 32.25,2.025Q31.65,2.2 31.1,2.6Q30.65,1.4 29.625,0.7Q28.6,0 27.3,0Q25.55,0 24.275,1.25Q23,2.5 23,4.25V5.55Q22.6,5.2 22.075,5.05Q21.55,4.9 21,4.9Q19.25,4.9 18,6.15Q16.75,7.4 16.75,9.15V30.95L8.85,26.5Q8,26.05 7.1,26.325Q6.2,26.6 5.5,27.25L2,30.3L16.85,45.7Q18.05,46.95 19.675,47.475Q21.3,48 23.05,48ZM6.85,14.8 L5.15,11.15 1.5,9.45 5.15,7.75 6.85,4.1 8.55,7.7 12.2,9.6 8.6,11.15Z"/>
-</vector>
\ No newline at end of file
diff --git a/res/layout/bubble_preference.xml b/res/layout/bubble_preference.xml
index eb9a8f1..7c2dbbc 100644
--- a/res/layout/bubble_preference.xml
+++ b/res/layout/bubble_preference.xml
@@ -15,13 +15,12 @@
~ limitations under the License.
-->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
- android:padding="@dimen/notification_importance_toggle_marginTop"
- android:orientation="vertical">
+ android:orientation="vertical"
+ android:padding="@dimen/notification_importance_toggle_marginTop">
<!-- If bubbles is managed by the admin this is used to inform the user. -->
<TextView
@@ -30,102 +29,45 @@
android:layout_height="wrap_content"
android:padding="@dimen/notification_importance_button_padding"
android:textAppearance="@style/TextAppearance.Small"
- android:visibility="gone"
- />
+ android:visibility="gone" />
- <com.android.settings.notification.NotificationButtonRelativeLayout
- android:id="@+id/bubble_all"
+ <RadioGroup
+ android:id="@+id/radio_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:padding="@dimen/notification_importance_button_padding"
- android:clickable="true"
- android:focusable="true">
- <ImageView
- android:id="@+id/bubble_all_icon"
- android:src="@drawable/ic_bubble_all"
- android:background="@android:color/transparent"
- android:layout_centerVertical="true"
+ android:checkedButton="@+id/redact_sensitive">
+
+ <RadioButton
+ android:id="@+id/bubble_all"
+ style="@style/SudRadioButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:clickable="false"
- android:focusable="false"/>
- <TextView
- android:id="@+id/bubble_all_label"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:ellipsize="end"
- android:maxLines="3"
- android:clickable="false"
- android:focusable="false"
- android:layout_toEndOf="@id/bubble_all_icon"
- android:layout_marginStart="@dimen/notification_importance_drawable_padding"
- android:textAppearance="@style/TextAppearance.NotificationImportanceButton.Unselected"
- android:text="@string/bubble_app_setting_all"/>
- </com.android.settings.notification.NotificationButtonRelativeLayout>
+ android:layout_marginVertical="0dp"
+ android:fontFamily="@*android:string/config_headlineFontFamily"
+ android:minHeight="56dp"
+ android:text="@string/bubble_app_setting_all"
+ android:textColor="?android:attr/textColorSecondary" />
- <com.android.settings.notification.NotificationButtonRelativeLayout
- android:id="@+id/bubble_selected"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="@dimen/notification_importance_button_padding"
- android:layout_marginTop="@dimen/notification_importance_button_separation"
- android:clickable="true"
- android:focusable="true">
- <ImageView
- android:id="@+id/bubble_selected_icon"
- android:src="@drawable/ic_bubble_selected"
- android:background="@android:color/transparent"
- android:layout_centerVertical="true"
+ <RadioButton
+ android:id="@+id/bubble_selected"
+ style="@style/SudRadioButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:clickable="false"
- android:focusable="false"/>
- <TextView
- android:id="@+id/bubble_selected_label"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:ellipsize="end"
- android:maxLines="3"
- android:clickable="false"
- android:focusable="false"
- android:layout_toEndOf="@id/bubble_selected_icon"
- android:layout_marginStart="@dimen/notification_importance_drawable_padding"
- android:textAppearance="@style/TextAppearance.NotificationImportanceButton.Unselected"
- android:text="@string/bubble_app_setting_selected"/>
- </com.android.settings.notification.NotificationButtonRelativeLayout>
+ android:layout_marginVertical="0dp"
+ android:fontFamily="@*android:string/config_headlineFontFamily"
+ android:minHeight="56dp"
+ android:text="@string/bubble_app_setting_selected"
+ android:textColor="?android:attr/textColorSecondary" />
- <com.android.settings.notification.NotificationButtonRelativeLayout
- android:id="@+id/bubble_none"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="@dimen/notification_importance_button_padding"
- android:layout_marginTop="@dimen/notification_importance_button_separation"
- android:clickable="true"
- android:focusable="true">
- <ImageView
- android:id="@+id/bubble_none_icon"
- android:src="@drawable/ic_bubble_none"
- android:background="@android:color/transparent"
- android:layout_centerVertical="true"
+ <RadioButton
+ android:id="@+id/bubble_none"
+ style="@style/SudRadioButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:clickable="false"
- android:focusable="false"/>
- <TextView
- android:id="@+id/bubble_none_label"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:ellipsize="end"
- android:maxLines="3"
- android:clickable="false"
- android:focusable="false"
- android:layout_toEndOf="@id/bubble_none_icon"
- android:layout_marginStart="@dimen/notification_importance_drawable_padding"
- android:textAppearance="@style/TextAppearance.NotificationImportanceButton.Unselected"
- android:text="@string/bubble_app_setting_none"/>
- </com.android.settings.notification.NotificationButtonRelativeLayout>
-
+ android:layout_marginVertical="0dp"
+ android:fontFamily="@*android:string/config_headlineFontFamily"
+ android:minHeight="56dp"
+ android:text="@string/bubble_app_setting_none"
+ android:textColor="?android:attr/textColorSecondary" />
+ </RadioGroup>
</LinearLayout>
diff --git a/res/layout/homepage_preference.xml b/res/layout/homepage_preference.xml
index f0b1b71..38cb491 100644
--- a/res/layout/homepage_preference.xml
+++ b/res/layout/homepage_preference.xml
@@ -17,6 +17,7 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -77,7 +78,7 @@
android:layout_gravity="start"
android:textAlignment="viewStart"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorSecondary"
+ android:textColor="?androidprv:attr/materialColorOnSurfaceVariant"
android:maxLines="4"
android:hyphenationFrequency="normalFast"
android:lineBreakWordStyle="phrase"
diff --git a/res/layout/search_bar.xml b/res/layout/search_bar.xml
index 1e83e22..5f6f9c5 100644
--- a/res/layout/search_bar.xml
+++ b/res/layout/search_bar.xml
@@ -34,8 +34,7 @@
android:paddingStart="@dimen/search_bar_padding_start"
android:paddingEnd="@dimen/search_bar_padding_end"
android:background="@drawable/search_bar_selected_background"
- android:focusable="true"
- android:focusableInTouchMode="true"
+ android:touchscreenBlocksFocus="false"
android:nextFocusForward="@+id/homepage_container"
android:contentInsetStartWithNavigation="@dimen/search_bar_content_inset"
android:navigationIcon="@drawable/ic_homepage_search">
diff --git a/res/layout/search_bar_two_pane_version.xml b/res/layout/search_bar_two_pane_version.xml
index 337294e..dec1c45 100644
--- a/res/layout/search_bar_two_pane_version.xml
+++ b/res/layout/search_bar_two_pane_version.xml
@@ -29,8 +29,7 @@
android:paddingStart="@dimen/search_bar_padding_start_two_pane"
android:paddingEnd="@dimen/search_bar_padding_end_two_pane"
android:background="@drawable/search_bar_selected_background"
- android:focusable="true"
- android:focusableInTouchMode="true"
+ android:touchscreenBlocksFocus="false"
android:nextFocusForward="@+id/homepage_container"
android:contentInsetStartWithNavigation="@dimen/search_bar_content_inset"
android:navigationIcon="@drawable/ic_homepage_search">
diff --git a/res/layout/wifi_network_config.xml b/res/layout/wifi_network_config.xml
index 3de1a38..dbd3e67 100644
--- a/res/layout/wifi_network_config.xml
+++ b/res/layout/wifi_network_config.xml
@@ -708,6 +708,13 @@
style="@style/wifi_item_spinner"
android:prompt="@string/wifi_privacy_settings"
android:entries="@array/wifi_privacy_entries"/>
+
+ <Spinner android:id="@+id/dhcp_settings"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ style="@style/wifi_item_spinner"
+ android:prompt="@string/wifi_privacy_device_name_settings"
+ android:entries="@array/wifi_dhcp_entries"/>
</LinearLayout>
<LinearLayout
diff --git a/res/values-af/arrays.xml b/res/values-af/arrays.xml
index 44a2d54..425a9ff0 100644
--- a/res/values-af/arrays.xml
+++ b/res/values-af/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Hanteer as beperk"</item>
<item msgid="2047166446768045816">"Hanteer as onbeperk"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Gebruik ewekansige MAC (verstek)"</item>
- <item msgid="741680937828608749">"Gebruik toestel-MAC"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Nee"</item>
<item msgid="2163015208097377388">"Ja"</item>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 4317d69..d3b9429 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Gebruik <xliff:g id="NEW_APP">%s</xliff:g> om jou netwerkverbindings te bestuur?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Onlangse liggingversoeke"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Ligging vir werkprofiel"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Programliggingtoestemmings"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Ligging is af"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# van {total} apps het toegang tot ligging}other{# van {total} apps het toegang tot ligging}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Stel terug"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Kies wysigersleutel"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Kies ’n nuwe sleutel vir <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Verstek"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Spraak"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Wyserspoed"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Speletjiekontroleerder"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Gaan in elk geval voort"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Kanselleer"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Vergrotinginstellings"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Vergroot met kortpad"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Vergroot met kortpad en trippeltik"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Meer oor <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"SMS’e"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Outomatiese datawisseling"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Gebruik data vanaf enige SIM na gelang van dekking en beskikbaarheid"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Net data"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Stel op"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Volgende"</string>
diff --git a/res/values-am/arrays.xml b/res/values-am/arrays.xml
index 54af56f..b4f3214 100644
--- a/res/values-am/arrays.xml
+++ b/res/values-am/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"እንደ ተለካ አስተናግድ"</item>
<item msgid="2047166446768045816">"እንደ ያልተለካ አስተናግድ"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"የዘፈቀደ ማክ ይጠቀሙ (ነባሪ)"</item>
- <item msgid="741680937828608749">"የመሣሪያ ማክ ይጠቀሙ"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"አይ"</item>
<item msgid="2163015208097377388">"አዎ"</item>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index e849c5c..353f17d 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"የአውታረ መረብ ግንኙነቶችዎን ለማቀናበር <xliff:g id="NEW_APP">%s</xliff:g>ን ይጠቀሙ?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"የቅርብ ጊዜ የአካባቢ ጥያቄዎች"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"የስራ መገለጫ አካባቢ"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"የመተግበሪያ አካባቢ ፈቃዶች"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"መገኛ አካባቢ ጠፍቷል"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{ከ{total} መተግበሪያዎች # የአካባቢ መዳረሻ አለው}one{ከ{total} መተግበሪያዎች # የአካባቢ መዳረሻ አለው}other{ከ{total} መተግበሪያዎች # የአካባቢ መዳረሻ አላቸው}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"ዳግም አስጀምር"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"አሻሻይ ቁልፍ ይምረጡ"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"ለ<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> አዲስ ቁልፍ ይምረጡ፦"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"ነባሪ"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"ንግግር"</string>
<string name="pointer_speed" msgid="7398649279282675718">"የጠቋሚ ፍጥነት"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"የጨዋታ መቆጣጠሪያ"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"ለማንኛውም ቀጥል"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"ይቅር"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"የማጉያ ቅንብሮች"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"በአቋራጭ ያጉሉ"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"በአቋራጭ እና ሦስቴ መታ በማድረግ ያጉሉ"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"ስለ<xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"ጽሑፎች"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"ራስ-ሰር የውሂብ መቀየር"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"በሽፋን እና በተገኝነት ላይ በመመስረት ከሁለቱም የሲም ውሂብ ይጠቀሙ"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"ውሂብ-ብቻ"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"ያዋቅሩ"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"ቀጣይ"</string>
diff --git a/res/values-ar/arrays.xml b/res/values-ar/arrays.xml
index 81a2d93..26e22ef 100644
--- a/res/values-ar/arrays.xml
+++ b/res/values-ar/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"معاملة الشبكة باعتبارها تفرض تكلفة استخدام"</item>
<item msgid="2047166446768045816">"معاملة الشبكة باعتبارها لا تفرض تكلفة استخدام"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"استخدام عنوان MAC عشوائي (الإعداد التلقائي)"</item>
- <item msgid="741680937828608749">"استخدام عنوان MAC للجهاز"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"لا"</item>
<item msgid="2163015208097377388">"نعم"</item>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index a8a06ab..8c4305c 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"هل تريد استخدام <xliff:g id="NEW_APP">%s</xliff:g> لإدارة اتصالات الشبكة لديك؟"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"طلبات الموقع الجغرافي الأخيرة"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"الموقع الجغرافي للملف الشخصي للعمل"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"أذونات التطبيقات لتحديد الموقع الجغرافي"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"خدمة الموقع الجغرافي غير مفعّلة"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{يملك تطبيق واحد من إجمالي {total} تطبيق إذن الوصول إلى بيانات الموقع الجغرافي.}zero{يملك # تطبيق من إجمالي {total} تطبيق إذن الوصول إلى بيانات الموقع الجغرافي.}two{يملك تطبيقان من إجمالي {total} تطبيق إذن الوصول إلى بيانات الموقع الجغرافي.}few{يملك # تطبيقات من إجمالي {total} تطبيق إذن الوصول إلى بيانات الموقع الجغرافي.}many{يملك # تطبيقًا من إجمالي {total} تطبيق إذن الوصول إلى بيانات الموقع الجغرافي.}other{يملك # تطبيق من إجمالي {total} تطبيق إذن الوصول إلى بيانات الموقع الجغرافي.}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"إعادة الضبط"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"اختيار مفتاح التعديل"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"اختيار مفتاح جديد لـ \"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>\":"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"تلقائي"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"الكلام"</string>
<string name="pointer_speed" msgid="7398649279282675718">"سرعة المؤشر"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"وحدة التحكم في الألعاب"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"المتابعة على أيّ حال"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"إلغاء"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"إعدادات التكبير"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"التكبير باستخدام الاختصار"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"التكبير باستخدام الزر والنقر الثلاثي"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"لمحة عن <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"الرسائل النصية"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"التبديل التلقائي لبيانات SIM"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"استخدِم البيانات المستمدة من شريحة SIM اعتمادًا على مدى التغطية أو التوفّر."</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"البيانات فقط"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"إعداد"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"التالي"</string>
diff --git a/res/values-as/arrays.xml b/res/values-as/arrays.xml
index 40eb7d7..432af5e 100644
--- a/res/values-as/arrays.xml
+++ b/res/values-as/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"নিৰিখ-নিৰ্দিষ্ট হিচাপে ব্যৱহাৰ কৰক"</item>
<item msgid="2047166446768045816">"নিৰিখ অনিৰ্দিষ্ট বুলি গণ্য কৰক"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"যাদৃচ্ছিক MAC ব্যৱহাৰ কৰক (ডিফ’ল্ট)"</item>
- <item msgid="741680937828608749">"ডিভাইচৰ MAC ব্যৱহাৰ কৰক"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"নহয়"</item>
<item msgid="2163015208097377388">"হয়"</item>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 81dd6a7..eea204a 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"আপোনাৰ নেটৱৰ্কৰ সংযোগসমূহ পৰিচালনা কৰিবলৈ <xliff:g id="NEW_APP">%s</xliff:g>ক ব্যৱহাৰ কৰিবনে?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"শেহতীয়া অৱস্থানৰ অনুৰোধ"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"কৰ্মস্থানৰ প্ৰ’ফাইলৰ বাবে অৱস্থান"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"এপৰ অৱস্থানৰ অনুমতি"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"অৱস্থান সুবিধা অফ আছে"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total} টাৰ ভিতৰত # টা এপে অৱস্থান এক্সেছ কৰিব পাৰে}one{{total} টাৰ ভিতৰত # টা এপে অৱস্থান এক্সেছ কৰিব পাৰে}other{{total} টাৰ ভিতৰত # টা এপে অৱস্থান এক্সেছ কৰিব পাৰে}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"ৰিছেট কৰক"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"সংশোধক চাবি বাছনি কৰক"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>ৰ বাবে এটা নতুন চাবি বাছনি কৰক:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"ডিফ\'ল্ট"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"কথন"</string>
<string name="pointer_speed" msgid="7398649279282675718">"পইণ্টাৰৰ বেগ"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"গেইম নিয়ন্ত্ৰক"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"যি হ’লেও অব্যাহত ৰাখক"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"বাতিল কৰক"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"বিবৰ্ধন কৰাৰ ছেটিং"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"শ্বৰ্টকাটৰ দ্বাৰা বিৱৰ্ধিত কৰক"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"শ্বৰ্টকাটৰ দ্বাৰা আৰু তিনিবাৰ টিপি বিৱৰ্ধিত কৰক"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g>ৰ বিষয়ে"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"পাঠ"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"স্বয়ংক্ৰিয় ডেটা সলনি কৰা"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"ক’ভাৰেজ আৰু উপলব্ধতাৰ ওপৰত নিৰ্ভৰ কৰি যিকোনো এখন ছিমৰ পৰা ডেটা ব্যৱহাৰ কৰক"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"কেৱল ডেটা"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"ছেট আপ কৰক"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"পৰৱৰ্তী"</string>
diff --git a/res/values-az/arrays.xml b/res/values-az/arrays.xml
index c7c30cc..dde911d 100644
--- a/res/values-az/arrays.xml
+++ b/res/values-az/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Tarifikasiya ilə işlədin"</item>
<item msgid="2047166446768045816">"Tarifikasiyasız işlədin"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"İxtiyari MAC (defolt) istifadə edin"</item>
- <item msgid="741680937828608749">"Cihazın MAC-ünvanını istifadə edin"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Xeyr"</item>
<item msgid="2163015208097377388">"Bəli"</item>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 14dd183..d010e8f 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Şəbəkə bağlantılarını idarə edilmək üçün <xliff:g id="NEW_APP">%s</xliff:g> istifadə edilsin?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Son məkan sorğuları"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"İş profili üçün yer"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Tətbiq məkanı icazələri"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Məkan deaktivdir"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{#/{total} tətbiqin məkana giriş icazəsi var}other{#/{total} tətbiqin məkana giriş icazəsi var}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Sıfırlayın"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Dəyişdirici açarı seçin"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> üçün yeni açar seçin:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Defolt"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Nitq"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Kursor sürəti"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Oyun Kontrolleri"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Yenə də davam edin"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Ləğv edin"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Böyütmə ayarları"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Qısayol ilə böyüdün"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Qısayol & üç toxunuşla böyüdün"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> haqqında"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Mətn mesajları"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Avtomatik data keçirmə"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Əhatə dairəsi və əlçatanlıqdan asılı olaraq istənilən SIM-in datasından istifadə edin"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Yalnız data"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Ayarlayın"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Növbəti"</string>
diff --git a/res/values-b+sr+Latn/arrays.xml b/res/values-b+sr+Latn/arrays.xml
index a5fe9e7..81d4c3d 100644
--- a/res/values-b+sr+Latn/arrays.xml
+++ b/res/values-b+sr+Latn/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Tretiraj kao mrežu sa ograničenjem"</item>
<item msgid="2047166446768045816">"Tretiraj kao mrežu bez ograničenja"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Koristi nasumičnu MAC adresu (podrazumevano)"</item>
- <item msgid="741680937828608749">"Koristi MAC adresu uređaja"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Ne"</item>
<item msgid="2163015208097377388">"Da"</item>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 3650ff2..79ae8fd 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Želite li da koristite aplikaciju <xliff:g id="NEW_APP">%s</xliff:g> za upravljanje mrežnim vezama?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Nedavni zahtevi za lokaciju"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Lokacija za poslovni profil"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Dozvole za lokaciju aplikacije"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Lokacija je isključena"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{Pristup lokaciji ima # aplikacija od {total}}one{Pristup lokaciji ima # aplikacija od {total}}few{Pristup lokaciji imaju # aplikacije od {total}}other{Pristup lokaciji ima # aplikacija od {total}}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Resetuj"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Odaberite modifikujući taster"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Odaberite novi taster za <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Raspored <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Podrazumevano"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatski: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Izabrao je korisnik: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Govor"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Brzina pokazivača"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Kontroler za igre"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Ipak nastavi"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Otkaži"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Podešavanja uvećanja"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Uvećavajte pomoću prečice"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Uvećavajte pomoću prečice i trostrukog dodira"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"O usluzi <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"SMS poruke"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Auto. zamena prenosa podataka"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Koristi prenos podataka sa bilo kog SIM-a u zavisnosti od pokrivenosti i dostupnosti"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Samo prenos podataka"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Podesi"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Dalje"</string>
diff --git a/res/values-be/arrays.xml b/res/values-be/arrays.xml
index bb2c26f..5f7fa0f 100644
--- a/res/values-be/arrays.xml
+++ b/res/values-be/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"З падлікам трафіка"</item>
<item msgid="2047166446768045816">"Без падліку трафіка"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Выпадковы MAC-адрас (стандартна)"</item>
- <item msgid="741680937828608749">"Выкарыстоўваць MAC-адрас прылады"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Не"</item>
<item msgid="2163015208097377388">"Так"</item>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 9fe116d..0d6e154 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Выкарыстоўваць <xliff:g id="NEW_APP">%s</xliff:g> для кіравання вашымі падлучэннямі да сеткі?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Апошнія запыты геаданых"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Месца для рабочага профілю"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Дазволы на доступ да геаданых"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Вызначэнне месцазнаходжання адключана"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{З {total} праграм # мае доступ да даных месцазнаходжання}one{З {total} праграм # мае доступ да даных месцазнаходжання}few{З {total} праграм # маюць доступ да даных месцазнаходжання}many{З {total} праграм # маюць доступ да даных месцазнаходжання}other{З {total} праграм # маюць доступ да даных месцазнаходжання}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Скінуць"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Выберыце клавішу-мадыфікатар"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Выберыце новы ключ для \"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>\":"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Стандартная"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Маўленне"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Хуткасць указальніка"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Прылада кiравання гульнёй"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Усё роўна працягнуць"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Скасаваць"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Налады павелічэння"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Павялічваць спалучэннем клавіш"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Павялічваць спалучэннем клавіш і трайным дотыкам"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Інфармацыя пра службу \"<xliff:g id="SERVICE">%1$s</xliff:g>\""</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Тэкставыя паведамленні"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Аўтапераключэнне SIM-карт"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Выкарыстоўвайце для перадачы даных любую з SIM-карт у залежнасці ад пакрыцця і даступнасці"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Толькі перадача даных"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Наладзіць"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Далей"</string>
diff --git a/res/values-bg/arrays.xml b/res/values-bg/arrays.xml
index 9ea9033..c13bc49 100644
--- a/res/values-bg/arrays.xml
+++ b/res/values-bg/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Третиране като мрежа с отчитане"</item>
<item msgid="2047166446768045816">"Третиране като мрежа без отчитане"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Рандомиз. MAC адрес (станд.)"</item>
- <item msgid="741680937828608749">"Използване на MAC адреса на устройството"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Не"</item>
<item msgid="2163015208097377388">"Да"</item>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index ee438f8..326b5fc 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Да се използва ли <xliff:g id="NEW_APP">%s</xliff:g> за управление на мрежовите ви връзки?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Скорошни заявки за местопол."</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Местоп. за служ. потр. профил"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Разрешения на приложенията за достъп до местоп."</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Функцията за местоположението е изключена"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# от {total} приложения има достъп до местоположението}other{# от {total} приложения имат достъп до местоположението}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Нулиране"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Избиране на модифициращ клавиш"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Изберете нов ключ за <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Подредба: <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"По подразбиране"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Автоматично: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Избрано от потребителя: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Говор"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Скорост на курсора"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Контролер за игри"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Напред въпреки това"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Отказ"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Настройки за увеличението"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Увеличаване на мащаба с пряк път"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Увелич. на мащаба с пряк път и трикратно докосване"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Всичко за „<xliff:g id="SERVICE">%1$s</xliff:g>“"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Текстови съобщения"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Авт. превключване на данните"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Използване на данни от която и да е от двете SIM карти в зависимост от покритието и наличността"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Само за данни"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Настройване"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Напред"</string>
diff --git a/res/values-bn/arrays.xml b/res/values-bn/arrays.xml
index 5e50ea8..82e3651 100644
--- a/res/values-bn/arrays.xml
+++ b/res/values-bn/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"সীমিত ইন্টারনেট ডেটা"</item>
<item msgid="2047166446768045816">"অসীমিত ইন্টারনেট ডেটা"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"র্যান্ডমাইজ করা MAC ব্যবহার করুন (ডিফল্ট)"</item>
- <item msgid="741680937828608749">"ডিভাইসের MAC ব্যবহার করুন"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"না"</item>
<item msgid="2163015208097377388">"হ্যাঁ"</item>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index a37ed91..8c253d6 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"আপনার নেটওয়ার্ক কানেকশন পরিচালনা করার জন্য <xliff:g id="NEW_APP">%s</xliff:g> ব্যবহার করবেন?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"সাম্প্রতিক লোকেশন অনুরোধগুলি"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"অফিস প্রোফাইলের জন্য লোকেশন"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"অ্যাপের ক্ষেত্রে লোকেশনের অনুমতি"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"লোকেশন বন্ধ করা আছে"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total}টি অ্যাপের মধ্যে #টি লোকেশন অ্যাক্সেস করতে পারবে}one{{total}টি অ্যাপের মধ্যে #টি লোকেশন অ্যাক্সেস করতে পারবে}other{{total}টি অ্যাপের মধ্যে #টি লোকেশন অ্যাক্সেস করতে পারবে}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"রিসেট করুন"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"\'মডিফায়ার কী\' বেছে নেওয়া"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>-এর জন্য নতুন \'কী\' বেছে নিন:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"ডিফল্ট"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"স্পিচ"</string>
<string name="pointer_speed" msgid="7398649279282675718">"পয়েন্টারের গতি"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"গেম নিয়ন্ত্রক"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"তা সত্ত্বেও চালিয়ে যান"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"বাতিল করুন"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"বড় করে দেখার সেটিংস"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"শর্টকাটের সাহায্যে বড় করে দেখা"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"শর্টকাটের মাধ্যমে ও তিনবার ট্যাপ করে বড় করুন"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"\'<xliff:g id="SERVICE">%1$s</xliff:g>\' সম্পর্কে"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"টেক্সট"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"অটোমেটিক ডেটা পরিবর্তন করা"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"কভারেজ ও উপলভ্যতার উপর নির্ভর করে কোনও একটি সিমের ডেটা ব্যবহার করুন"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"শুধু ডেটা"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"সেট-আপ করুন"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"পরবর্তী"</string>
diff --git a/res/values-bs/arrays.xml b/res/values-bs/arrays.xml
index a774197..d2ebf45 100644
--- a/res/values-bs/arrays.xml
+++ b/res/values-bs/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Tretiraj kao vezu s naplatom"</item>
<item msgid="2047166446768045816">"Tretiraj kao vezu bez naplate"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Koristi nasumičnu MAC adresu (zadano)"</item>
- <item msgid="741680937828608749">"Koristi MAC adresu uređaja"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Ne"</item>
<item msgid="2163015208097377388">"Da"</item>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index d7b6e0f..79a28cc 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Koristiti <xliff:g id="NEW_APP">%s</xliff:g> za upravljanje vašim mrežnim vezama?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Nedavni zahtjevi za lokaciju"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Lokacija za radni profil"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Odobrenja lokacije za aplikacije"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Lokacija je isključena"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# od {total} aplik. ima pristup lokaciji}one{# od {total} aplik. imaju pristup lokaciji}few{# od {total} aplik. imaju pristup lokaciji}other{# od {total} aplik. imaju pristup lokaciji}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Poništi"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Odaberite modifikacijsku tipku"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Odaberite novu tipku za \"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>\":"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Izgled: <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Zadano"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatski: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Izgled koji je odabrao korisnik: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Govor"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Brzina pokazivača"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Kontroler za igre"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Ipak nastavi"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Otkaži"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Postavke uvećavanja"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Uvećavanje pomoću prečice"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Uvećajte pomoću prečice i trostrukog dodira"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"O usluzi <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Poruke"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Autom. prebac. na prij. podataka"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Koristite prijenos podataka s bilo kojeg SIM-a ovisno o pokrivenosti i dostupnosti"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Samo prijenos podataka"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Postavi"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Naprijed"</string>
diff --git a/res/values-ca/arrays.xml b/res/values-ca/arrays.xml
index 15671a2..0f4e2ac 100644
--- a/res/values-ca/arrays.xml
+++ b/res/values-ca/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Tracta com a xarxa d\'ús mesurat"</item>
<item msgid="2047166446768045816">"Tracta com a xarxa d\'ús no mesurat"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Utilitza adreça MAC aleatòria (predeterminat)"</item>
- <item msgid="741680937828608749">"Utilitza adreça MAC del dispositiu"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"No"</item>
<item msgid="2163015208097377388">"Sí"</item>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 15a3abb..73fd3dc 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Vols fer servir <xliff:g id="NEW_APP">%s</xliff:g> per gestionar les connexions de la xarxa?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Sol·licituds d\'ubicació recents"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Ubicació per al perfil de treball"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Permisos d\'ubicació d\'aplicacions"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"La ubicació està desactivada"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# de {total} aplicacions té accés a la ubicació}other{# de {total} aplicacions tenen accés a la ubicació}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Restableix"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Tria la tecla modificadora"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Tria una tecla nova per a <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Predeterminat"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Parla"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Velocitat del punter"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Controlador de joc"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continua igualment"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Cancel·la"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Configuració de l\'ampliació"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Amplia amb una drecera"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Amplia amb una drecera i tres tocs"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Sobre <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Missatges de text"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Canvi de dades automàtic"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Utilitza dades de qualsevol de les SIM en funció de la cobertura i la disponibilitat"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Només dades"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Configura"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Següent"</string>
diff --git a/res/values-cs/arrays.xml b/res/values-cs/arrays.xml
index 1625064..b17387d 100644
--- a/res/values-cs/arrays.xml
+++ b/res/values-cs/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Považovat za měřenou síť"</item>
<item msgid="2047166446768045816">"Považovat za neměřenou síť"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Používat náhodnou adresu MAC (výchozí nastavení)"</item>
- <item msgid="741680937828608749">"Používat adresu MAC zařízení"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Ne"</item>
<item msgid="2163015208097377388">"Ano"</item>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 1a252b8..6ca420b 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Chcete spravovat síťová připojení pomocí aplikace <xliff:g id="NEW_APP">%s</xliff:g>?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Nedávné žádosti o určení polohy"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Umístění pracovního profilu"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Oprávnění aplikací pro přístup k poloze"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Určování polohy je vypnuto"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{Přístup k poloze má # z {total} aplikací}few{Přístup k poloze mají # z {total} aplikací}many{Přístup k poloze má # z {total} aplikací}other{Přístup k poloze má # z {total} aplikací}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Resetovat"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Vyberte modifikační klávesu"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Vyberte novou klávesu pro <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Rozvržení <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Výchozí"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatické: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Vybrané uživatelem: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Řeč"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Rychlost kurzoru"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Herní ovladače"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Přesto pokračovat"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Zrušit"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Nastavení zvětšení"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Zvětšení zkratkou"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Zvětšení zkratkou a trojitým klepnutím"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"SMS"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatické přepínání dat"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Používat data z obou SIM karet v závislosti na pokrytí a dostupnosti"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Pouze data"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Nastavit"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Další"</string>
diff --git a/res/values-da/arrays.xml b/res/values-da/arrays.xml
index 0a7b4aa..d86bd08 100644
--- a/res/values-da/arrays.xml
+++ b/res/values-da/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Håndter som forbrugsafregnet netværk"</item>
<item msgid="2047166446768045816">"Håndter som ubegrænset netværk"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Anvend tilfældig MAC (standard)"</item>
- <item msgid="741680937828608749">"Anvend enhedens MAC"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Nej"</item>
<item msgid="2163015208097377388">"Ja"</item>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index eff923c..9f3d20b 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Vil du bruge <xliff:g id="NEW_APP">%s</xliff:g> til at administrere dine netværksforbindelser?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Seneste lokationsanmodninger"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Lokation for arbejdsprofil"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Lokationstilladelse for apps"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Lokation er slået fra"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# ud af {total} apps har adgang til din lokation}one{# ud af {total} apps har adgang til din lokation}other{# ud af {total} apps har adgang til din lokation}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Nulstil"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Vælg ændringstast"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Vælg en ny ændringstast til <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Standard"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Tale"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Markørens hastighed"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Spillekontroller"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Fortsæt alligevel"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Annuller"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Indstillinger for forstørrelse"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Brug en genvej til forstørrelse"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Brug en genvej til forstørrelse med tre tryk"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Om <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Beskeder"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatisk dataskift"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Brug data fra begge SIM-kort afhængigt af dækning og tilgængelighed"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Kun data"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Konfigurer"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Næste"</string>
diff --git a/res/values-de/arrays.xml b/res/values-de/arrays.xml
index 8e9bdc4..7b0c5cc 100644
--- a/res/values-de/arrays.xml
+++ b/res/values-de/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Wie „kostenpflichtig“ behandeln"</item>
<item msgid="2047166446768045816">"Wie „ohne Datenlimit“ behandeln"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Zufällige MAC-Adresse verwenden (Standard)"</item>
- <item msgid="741680937828608749">"MAC-Adresse des Geräts verwenden"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Nein"</item>
<item msgid="2163015208097377388">"Ja"</item>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index d5c5187..7c7730a 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"<xliff:g id="NEW_APP">%s</xliff:g> zur Verwaltung von Netzwerkverbindungen nutzen?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Letzte Standortanfragen"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Standort für Arbeitsprofil"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Berechtigungen zur Standortermittlung"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Standortermittlung ist deaktiviert"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# von {total} Apps hat Zugriff auf den Standort}other{# von {total} Apps haben Zugriff auf den Standort}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Zurücksetzen"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Modifikatortaste wählen"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Wähle eine neue Taste für <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Standard"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Spracheingabe, -erkennung und -ausgabe"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Zeigergeschwindigkeit"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Gamecontroller"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Trotzdem fortfahren"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Abbrechen"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Vergrößerungseinstellungen"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Mit Tastenkombination vergrößern"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Mit Tastenkombination und 3-mal Tippen vergrößern"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Die Bedienungshilfe „<xliff:g id="SERVICE">%1$s</xliff:g>“"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"SMS"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Daten automatisch wechseln"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Du kannst je nach Abdeckung und Verfügbarkeit Daten von beiden SIM-Karten verwenden"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Nur für Daten"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Einrichten"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Weiter"</string>
diff --git a/res/values-el/arrays.xml b/res/values-el/arrays.xml
index 68c9e3b..422deff 100644
--- a/res/values-el/arrays.xml
+++ b/res/values-el/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Δίκτυο με περιορισμούς"</item>
<item msgid="2047166446768045816">"Δίκτυο χωρίς περιορισμούς"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Χρήση τυχαίου MAC (προεπιλογή)"</item>
- <item msgid="741680937828608749">"Χρήση MAC συσκευής"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Όχι"</item>
<item msgid="2163015208097377388">"Ναι"</item>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index afbe982..8183a3c 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Χρήση της εφαρμογής <xliff:g id="NEW_APP">%s</xliff:g> για τη διαχείριση των συνδέσεων δικτύου σας;"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Πρόσφατα αιτήματα τοποθεσίας"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Τοποθεσία για προφίλ εργασίας"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Άδειες τοποθεσίας εφαρμογών"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Η τοποθεσία είναι ανενεργή"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# από {total} εφαρμογές έχει πρόσβαση στην τοποθεσία σας.}other{# από {total} εφαρμογές έχουν πρόσβαση στην τοποθεσία σας.}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Επαναφορά"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Επιλέξτε πλήκτρο τροποποίησης"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Επιλέξτε ένα νέο κλειδί για <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Προεπιλογή"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Ομιλία"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Ταχύτητα δείκτη"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Χειριστήριο παιχνιδιού"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Συνέχεια ούτως ή άλλως"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Ακύρωση"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Ρυθμίσεις μεγέθυνσης"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Συντόμ. μεγέθυνσης"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Μεγέθυνση με συντόμευση και τριπλό πάτημα"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Σχετικά με <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Μηνύματα"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Αυτόματη εναλλαγή δεδομένων"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Χρήση είτε της μίας είτε της άλλης SIM, ανάλογα με την κάλυψη και τη διαθεσιμότητα"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Μόνο δεδομένα"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Ρύθμιση"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Επόμενο"</string>
diff --git a/res/values-en-rAU/arrays.xml b/res/values-en-rAU/arrays.xml
index 8eb51ad..77db6a7 100644
--- a/res/values-en-rAU/arrays.xml
+++ b/res/values-en-rAU/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Treat as metered"</item>
<item msgid="2047166446768045816">"Treat as unmetered"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Use randomised MAC (default)"</item>
- <item msgid="741680937828608749">"Use device MAC"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"No"</item>
<item msgid="2163015208097377388">"Yes"</item>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 3d47d12..372ef9d 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Use <xliff:g id="NEW_APP">%s</xliff:g> to manage your network connections?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Recent location requests"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Location for work profile"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"App location permissions"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Location is off"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# of {total} apps has access to location}other{# of {total} apps have access to location}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Reset"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Choose modifier key"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Choose a new key for <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> layout"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Default"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatic: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"User selected: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Speech"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Pointer speed"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Game Controller"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continue anyway"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Cancel"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Magnification settings"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Magnify with shortcut"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Magnify with shortcut & triple-tap"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"About <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Texts"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatic data switching"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Use data from either SIM depending on coverage and availability"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Data only"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Set up"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Next"</string>
diff --git a/res/values-en-rCA/arrays.xml b/res/values-en-rCA/arrays.xml
index a69d633..be0db1f 100644
--- a/res/values-en-rCA/arrays.xml
+++ b/res/values-en-rCA/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Treat as metered"</item>
<item msgid="2047166446768045816">"Treat as unmetered"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Use randomized MAC (default)"</item>
- <item msgid="741680937828608749">"Use device MAC"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"No"</item>
<item msgid="2163015208097377388">"Yes"</item>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 18a8d71..7e2ca45 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -1540,6 +1540,7 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Use <xliff:g id="NEW_APP">%s</xliff:g> to manage your network connections?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Recent location requests"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Location for work profile"</string>
+ <string name="private_profile_location_switch_title" msgid="4127119143109855789">"Location for private space"</string>
<string name="location_app_level_permissions" msgid="907206607664629759">"App location permissions"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Location is off"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# of {total} apps has access to location}other{# of {total} apps have access to location}}"</string>
@@ -1931,7 +1932,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Reset"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Choose modifier key"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Choose a new key for <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> layout"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Default"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatic: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"User selected: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Speech"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Pointer speed"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Game Controller"</string>
@@ -2053,6 +2057,9 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continue anyway"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Cancel"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Magnification settings"</string>
+ <string name="accessibility_magnification_one_finger_panning_title" msgid="4503949739883092989">"One-finger panning"</string>
+ <string name="accessibility_magnification_one_finger_panning_summary_on" msgid="9133125894310777539">"Move the magnification area by dragging one finger."</string>
+ <string name="accessibility_magnification_one_finger_panning_summary_off" msgid="8979146350396559805">"Move the magnification area by dragging two fingers."</string>
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Magnify with shortcut"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Magnify with shortcut & triple-tap"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"About <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4637,9 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Texts"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatic data switching"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Use data from either SIM depending on coverage and availability"</string>
+ <string name="sim_action_restart_dialog_title" msgid="3507413479633430120">"Restart to use 2 SIMs"</string>
+ <string name="sim_action_restart_dialog_msg" msgid="4737611046767629774">"To use 2 SIMs at once, restart your device, then turn on both SIMs"</string>
+ <string name="sim_action_restart_dialog_cancel" msgid="665560106686565624">"Use <xliff:g id="CARRIER_NAME">%1$s</xliff:g> only"</string>
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Data only"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Set up"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Next"</string>
diff --git a/res/values-en-rGB/arrays.xml b/res/values-en-rGB/arrays.xml
index 8eb51ad..77db6a7 100644
--- a/res/values-en-rGB/arrays.xml
+++ b/res/values-en-rGB/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Treat as metered"</item>
<item msgid="2047166446768045816">"Treat as unmetered"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Use randomised MAC (default)"</item>
- <item msgid="741680937828608749">"Use device MAC"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"No"</item>
<item msgid="2163015208097377388">"Yes"</item>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 28ac29f..a1538a9 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Use <xliff:g id="NEW_APP">%s</xliff:g> to manage your network connections?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Recent location requests"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Location for work profile"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"App location permissions"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Location is off"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# of {total} apps has access to location}other{# of {total} apps have access to location}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Reset"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Choose modifier key"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Choose a new key for <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> layout"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Default"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatic: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"User selected: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Speech"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Pointer speed"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Game Controller"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continue anyway"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Cancel"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Magnification settings"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Magnify with shortcut"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Magnify with shortcut & triple-tap"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"About <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Texts"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatic data switching"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Use data from either SIM depending on coverage and availability"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Data only"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Set up"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Next"</string>
diff --git a/res/values-en-rIN/arrays.xml b/res/values-en-rIN/arrays.xml
index 8eb51ad..77db6a7 100644
--- a/res/values-en-rIN/arrays.xml
+++ b/res/values-en-rIN/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Treat as metered"</item>
<item msgid="2047166446768045816">"Treat as unmetered"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Use randomised MAC (default)"</item>
- <item msgid="741680937828608749">"Use device MAC"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"No"</item>
<item msgid="2163015208097377388">"Yes"</item>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 675f2bd..3d4a648 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Use <xliff:g id="NEW_APP">%s</xliff:g> to manage your network connections?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Recent location requests"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Location for work profile"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"App location permissions"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Location is off"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# of {total} apps has access to location}other{# of {total} apps have access to location}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Reset"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Choose modifier key"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Choose a new key for <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> layout"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Default"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatic: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"User selected: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Speech"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Pointer speed"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Game Controller"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continue anyway"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Cancel"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Magnification settings"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Magnify with shortcut"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Magnify with shortcut & triple-tap"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"About <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Texts"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatic data switching"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Use data from either SIM depending on coverage and availability"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Data only"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Set up"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Next"</string>
diff --git a/res/values-en-rXC/arrays.xml b/res/values-en-rXC/arrays.xml
index 62da2df..46aa965 100644
--- a/res/values-en-rXC/arrays.xml
+++ b/res/values-en-rXC/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Treat as metered"</item>
<item msgid="2047166446768045816">"Treat as unmetered"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Use randomized MAC (default)"</item>
- <item msgid="741680937828608749">"Use device MAC"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"No"</item>
<item msgid="2163015208097377388">"Yes"</item>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 31334da..6a5bca2 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -1540,6 +1540,7 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Use <xliff:g id="NEW_APP">%s</xliff:g> to manage your network connections?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Recent location requests"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Location for work profile"</string>
+ <string name="private_profile_location_switch_title" msgid="4127119143109855789">"Location for private space"</string>
<string name="location_app_level_permissions" msgid="907206607664629759">"App location permissions"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Location is off"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# of {total} apps has access to location}other{# of {total} apps have access to location}}"</string>
@@ -1931,7 +1932,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Reset"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Choose modifier key"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Choose a new key for <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> layout"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Default"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatic: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"User selected: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Speech"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Pointer speed"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Game Controller"</string>
@@ -2053,6 +2057,9 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continue anyway"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Cancel"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Magnification settings"</string>
+ <string name="accessibility_magnification_one_finger_panning_title" msgid="4503949739883092989">"One-finger panning"</string>
+ <string name="accessibility_magnification_one_finger_panning_summary_on" msgid="9133125894310777539">"Move the magnification area by dragging one finger."</string>
+ <string name="accessibility_magnification_one_finger_panning_summary_off" msgid="8979146350396559805">"Move the magnification area by dragging two fingers."</string>
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Magnify with shortcut"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Magnify with shortcut & triple-tap"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"About <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4637,9 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Texts"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatic data switching"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Use data from either SIM depending on coverage and availability"</string>
+ <string name="sim_action_restart_dialog_title" msgid="3507413479633430120">"Restart to use 2 SIMs"</string>
+ <string name="sim_action_restart_dialog_msg" msgid="4737611046767629774">"To use 2 SIMs at once, restart your device, then turn on both SIMs"</string>
+ <string name="sim_action_restart_dialog_cancel" msgid="665560106686565624">"Use <xliff:g id="CARRIER_NAME">%1$s</xliff:g> only"</string>
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Data only"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Set up"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Next"</string>
diff --git a/res/values-es-rUS/arrays.xml b/res/values-es-rUS/arrays.xml
index a52af72..4bc3c80 100644
--- a/res/values-es-rUS/arrays.xml
+++ b/res/values-es-rUS/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Tratar como red de uso medido"</item>
<item msgid="2047166446768045816">"Tratar como red de uso no medido"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Usar MAC aleatoria (pred.)"</item>
- <item msgid="741680937828608749">"Usar MAC del dispositivo"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"No"</item>
<item msgid="2163015208097377388">"Sí"</item>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 4febef4..e829796 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"¿Deseas usar <xliff:g id="NEW_APP">%s</xliff:g> para administrar tus conexiones de red?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Solicitudes de ubicaciones recientes"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Ubicación de perfil de trabajo"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Permisos de ubicación de apps"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"La ubicación está desactivada"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# de {total} apps tiene acceso a la ubicación}other{# de {total} apps tienen acceso a la ubicación}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Restablecer"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Elegir tecla modificadora"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Elige una nueva tecla para <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Predeterminadas"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Voz"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Velocidad del puntero"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Controlador de juegos"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continuar de todos modos"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Cancelar"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Configuración de ampliación"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Ampliar con gesto"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Ampliar con acceso directo y presionar tres veces"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Información sobre <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Mensajes de texto"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Cambio de datos automático"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Usa datos de cualquier SIM según la cobertura y la disponibilidad"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Solo datos"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Configuración"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Siguiente"</string>
diff --git a/res/values-es/arrays.xml b/res/values-es/arrays.xml
index 703bb51..2fd55e0 100644
--- a/res/values-es/arrays.xml
+++ b/res/values-es/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Tratar como red de uso medido"</item>
<item msgid="2047166446768045816">"Tratar como red de uso no medido"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Usar MAC aleatoria (predeterminado)"</item>
- <item msgid="741680937828608749">"Usar MAC del dispositivo"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"No"</item>
<item msgid="2163015208097377388">"Sí"</item>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index fec5d09..e87950c 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"¿Usar <xliff:g id="NEW_APP">%s</xliff:g> para administrar tus conexiones de red?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Solicitudes de ubicación recientes"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Ubicación para el perfil de trabajo"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Permisos de ubicación de aplicaciones"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"La ubicación está desactivada"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# de {total} aplicaciones tiene acceso a la ubicación}other{# de {total} aplicaciones tienen acceso a la ubicación}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Restablecer"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Elige una tecla modificadora"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Elige una nueva tecla para <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Predeterminado"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Voz"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Velocidad del puntero del ratón"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Mandos de videojuegos"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continuar de todos modos"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Cancelar"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Ajustes de ampliación"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Ampliación con acceso directo"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Amplía con un acceso directo y tres toques"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Información de <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Mensajes de texto"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Cambio automático de datos"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Usa los datos de cualquiera de las dos SIMs en función de la cobertura y la disponibilidad"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Solo datos"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Configurar"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Siguiente"</string>
diff --git a/res/values-et/arrays.xml b/res/values-et/arrays.xml
index 6ae2cb1..27496e9 100644
--- a/res/values-et/arrays.xml
+++ b/res/values-et/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Käsitle mahupõhisena"</item>
<item msgid="2047166446768045816">"Käsitle mittemahupõhisena"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Kasuta juhuslikustatud MAC-aadr. (vaikeseade)"</item>
- <item msgid="741680937828608749">"Kasuta seadme MAC-aadressi"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Ei"</item>
<item msgid="2163015208097377388">"Jah"</item>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 746c215..09f3d0a 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Kas kasutada võrguühenduste haldamiseks rakendust <xliff:g id="NEW_APP">%s</xliff:g>?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Hiljutised asukohapäringud"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Tööprofiili asukohaluba"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Asukohale juurdepääsu load"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Asukoht on välja lülitatud"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# rakendusel {total}-st on asukohale juurdepääs}other{# rakendusel {total}-st on asukohale juurdepääs}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Lähtesta"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Muuteklahvi valimine"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Valige muuteklahvi <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> jaoks uus klahv:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Vaikeseade"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Kõne"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Kursori kiirus"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Mängukontroller"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Jätka ikkagi"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Tühista"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Suurendamisseaded"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Otsetee abil suurendamine"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Otsetee ja kolmikpuudutusega suurendamine"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Teave funktsiooni <xliff:g id="SERVICE">%1$s</xliff:g> kohta"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Tekstsõnumid"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automaatne andmeside vahetamine"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Levialast ja saadavusest olenevalt kasutage mõlema SIM-i andmesidet"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Ainult andmeside"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Seadistamine"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Järgmine"</string>
diff --git a/res/values-eu/arrays.xml b/res/values-eu/arrays.xml
index cf4a036..b3df98f 100644
--- a/res/values-eu/arrays.xml
+++ b/res/values-eu/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Tratatu sare neurtu gisa"</item>
<item msgid="2047166446768045816">"Tratatu neurtu gabeko sare gisa"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Erabili ausazko MAC helbide bat (lehenetsia)"</item>
- <item msgid="741680937828608749">"Erabili gailuaren MAC helbidea"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Ez"</item>
<item msgid="2163015208097377388">"Bai"</item>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 6ea0a3d..3110f31 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"<xliff:g id="NEW_APP">%s</xliff:g> erabili nahi duzu sareko konexioak kudeatzeko?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Azken kokapen-eskaerak"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Laneko profilaren kokapena"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Aplikazioen kokapen-baimenak"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Kokapena desaktibatuta dago"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{#/{total} aplikaziok kokapena atzi dezake}other{#/{total} aplikaziok kokapena atzi dezakete}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Berrezarri"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Aukeratu tekla aldatzailea"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Aukeratu <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> teklarako beste tekla bat:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Lehenetsia"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Hizketa"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Erakuslearen abiadura"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Bideo-jokoen kontrolagailua"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Egin aurrera, halere"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Utzi"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Luparen ezarpenak"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Handitu pantaila lasterbidearekin"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Handitu pantaila lasterbide eta hiru ukitutxorekin"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> aplikazioari buruz"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Testu-mezuak"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Datuak automatikoki aldatzea"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Erabili SIMetako baten datuak, estalduraren eta erabilgarritasunaren arabera"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Datuak soilik"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Konfiguratu"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Hurrengoa"</string>
diff --git a/res/values-fa/arrays.xml b/res/values-fa/arrays.xml
index 313dba4..6a31eba 100644
--- a/res/values-fa/arrays.xml
+++ b/res/values-fa/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"محدودشده حساب شود"</item>
<item msgid="2047166446768045816">"محدودنشده حساب شود"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"استفاده از MAC تصادفی (پیشفرض)"</item>
- <item msgid="741680937828608749">"استفاده از MAC دستگاه"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"نه"</item>
<item msgid="2163015208097377388">"بله"</item>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index facbd3f..441f28d 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"برای مدیریت ارتباطات شبکهتان از <xliff:g id="NEW_APP">%s</xliff:g> استفاده میکنید؟"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"درخواستهای اخیر موقعیت مکانی"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"محل نمایه کارتان"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"اجازههای مکان برنامه"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"مکان خاموش است"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# برنامه از {total} برنامه به مکان دسترسی دارد}one{# برنامه از {total} برنامه به مکان دسترسی دارد}other{# برنامه از {total} برنامه به مکان دسترسی دارد}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"بازنشانی"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"کلید توصیفگر را انتخاب کنید"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"کلید جدیدی برای <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> انتخاب کنید:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"پیشفرض"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"گفتار"</string>
<string name="pointer_speed" msgid="7398649279282675718">"سرعت اشارهگر"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"دسته کنترل بازی"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"درهرصورت ادامه داده شود"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"لغو"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"تنظیمات درشتنمایی"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"درشتنمایی بااستفاده از میانبر"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"درشتنمایی بااستفاده از میانبر و سه ضربه"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"درباره <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"پیامکها"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"عوض کردن خودکار داده"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"بسته به پوشش و دردسترس بودن، از داده یکی از سیمکارتها استفاده میشود"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"فقط داده"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"راهاندازی"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"بعدی"</string>
diff --git a/res/values-fi/arrays.xml b/res/values-fi/arrays.xml
index e68580b..1ba84ee 100644
--- a/res/values-fi/arrays.xml
+++ b/res/values-fi/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Merkitse maksulliseksi"</item>
<item msgid="2047166446768045816">"Merkitse maksuttomaksi"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Käytä satunnaistettua MACia (oletus)"</item>
- <item msgid="741680937828608749">"Käytä laitteen MAC-osoitetta"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Ei"</item>
<item msgid="2163015208097377388">"Kyllä"</item>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index e13bacb..ea78779 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Hallinnoidaanko verkkoyhteyksiä sovelluksella <xliff:g id="NEW_APP">%s</xliff:g>?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Viimeisimmät sijaintipyynnöt"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Työprofiilin sijainti"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Sovellusten sijaintiluvat"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Sijainti ei ole käytössä"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{#/{total} sovelluksella on pääsyoikeus sijaintiin}other{#/{total} sovelluksella on pääsyoikeus sijaintiin}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Nollaa"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Valitse muokkausnäppäin"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Valitse uusi näppäin (<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>):"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Oletus"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Puhe"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Osoittimen nopeus"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Peliohjaimet"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Jatka silti"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Peru"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Suurennusasetukset"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Suurenna pikanäppäimellä"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Suurenna pikanäppäimellä ja kolmoisnapautuksella."</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Tietoja: <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Tekstiviestit"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automaattinen datan vaihto"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Käytä kumman tahansa SIMin dataa kattavuudesta ja saatavuudesta riippuen"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Vain data"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Ota käyttöön"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Seuraava"</string>
diff --git a/res/values-fr-feminine/strings.xml b/res/values-fr-feminine/strings.xml
new file mode 100644
index 0000000..d3f7c6a
--- /dev/null
+++ b/res/values-fr-feminine/strings.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="show_dev_countdown" msgid="2936506773086395069">"{count,plural, =1{Plus que # étape pour être développeuse.}one{Plus que # étapes pour être développeuse.}other{Plus que # étapes pour être développeuse.}}"</string>
+ <string name="show_dev_on" msgid="2840850085134853754">"Vous êtes désormais développeuse !"</string>
+ <string name="show_dev_already" msgid="7041756429707644630">"Inutile, vous êtes déjà développeuse."</string>
+ <string name="no_internet_access_text" msgid="3611993143350310936">"Ce réseau ne dispose d\'aucun accès à Internet. Rester connectée ?"</string>
+ <string name="language_empty_list_user_restricted" msgid="8050367405839231863">"Vous n\'êtes pas autorisée à modifier la langue de l\'appareil."</string>
+ <string name="vibrate_input_devices_summary" msgid="8791680891376689823">"Rediriger le vibreur vers la manette de jeu lorsque vous êtes connectée"</string>
+ <string name="data_usage_auto_sync_off_dialog" msgid="6523112583569674837">"Cela limitera la consommation de données et l\'utilisation de la batterie, mais vous devrez synchroniser manuellement chaque compte pour récupérer les infos récentes. Et en cas de changement, vous n\'en serez pas avertie."</string>
+ <string name="vpn_replace_always_on_vpn_disable_message" msgid="4299175336198481106">"Vous êtes déjà connectée à un VPN permanent. Si vous vous connectez à un autre VPN, le VPN actuel sera remplacé et le mode permanent sera désactivé."</string>
+ <string name="vpn_replace_vpn_message" msgid="1094297700371463386">"Vous êtes déjà connectée à un VPN. Si vous vous connectez à un autre VPN, le VPN actuel sera remplacé."</string>
+ <string name="vpn_lockdown_summary" msgid="4700625960550559029">"Sélectionnez un profil VPN auquel rester connectée en permanence. Le trafic réseau ne sera autorisé que lorsque vous serez connectée à ce VPN."</string>
+ <string name="guest_category_title" msgid="5562663588315329152">"Invitée (Vous)"</string>
+ <string name="users_summary" msgid="8473589474976307510">"Connectée en tant que \"<xliff:g id="USER_NAME">%1$s</xliff:g>\""</string>
+ <string name="zen_suggestion_summary" msgid="1984990920503217">"Suspendre les notifications pour rester concentrée"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="959658135522249170">"Un appareil Bluetooth, <xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>, souhaite accéder à vos contacts et à votre journal d\'appels. Ceci inclut des données concernant les appels entrants et sortants.\n\nVous ne vous êtes jamais connectée à <xliff:g id="DEVICE_NAME_1">%2$s</xliff:g> auparavant."</string>
+</resources>
diff --git a/res/values-fr-masculine/strings.xml b/res/values-fr-masculine/strings.xml
new file mode 100644
index 0000000..fc6e172
--- /dev/null
+++ b/res/values-fr-masculine/strings.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="show_dev_countdown" msgid="2936506773086395069">"{count,plural, =1{Plus que # étape pour être développeur.}one{Plus que # étapes pour être développeur.}other{Plus que # étapes pour être développeur.}}"</string>
+ <string name="show_dev_on" msgid="2840850085134853754">"Vous êtes désormais développeur !"</string>
+ <string name="show_dev_already" msgid="7041756429707644630">"Inutile, vous êtes déjà développeur."</string>
+ <string name="no_internet_access_text" msgid="3611993143350310936">"Ce réseau ne dispose d\'aucun accès à Internet. Rester connecté ?"</string>
+ <string name="language_empty_list_user_restricted" msgid="8050367405839231863">"Vous n\'êtes pas autorisé à modifier la langue de l\'appareil."</string>
+ <string name="vibrate_input_devices_summary" msgid="8791680891376689823">"Rediriger le vibreur vers la manette de jeu lorsque vous êtes connecté"</string>
+ <string name="data_usage_auto_sync_off_dialog" msgid="6523112583569674837">"Cela limitera la consommation de données et l\'utilisation de la batterie, mais vous devrez synchroniser manuellement chaque compte pour récupérer les infos récentes. Et en cas de changement, vous n\'en serez pas averti."</string>
+ <string name="vpn_replace_always_on_vpn_disable_message" msgid="4299175336198481106">"Vous êtes déjà connecté à un VPN permanent. Si vous vous connectez à un autre VPN, le VPN actuel sera remplacé et le mode permanent sera désactivé."</string>
+ <string name="vpn_replace_vpn_message" msgid="1094297700371463386">"Vous êtes déjà connecté à un VPN. Si vous vous connectez à un autre VPN, le VPN actuel sera remplacé."</string>
+ <string name="vpn_lockdown_summary" msgid="4700625960550559029">"Sélectionnez un profil VPN auquel rester connecté en permanence. Le trafic réseau ne sera autorisé que lorsque vous serez connecté à ce VPN."</string>
+ <string name="guest_category_title" msgid="5562663588315329152">"Invité (Vous)"</string>
+ <string name="users_summary" msgid="8473589474976307510">"Connecté en tant que \"<xliff:g id="USER_NAME">%1$s</xliff:g>\""</string>
+ <string name="zen_suggestion_summary" msgid="1984990920503217">"Suspendre les notifications pour rester concentré"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="959658135522249170">"Un appareil Bluetooth, <xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>, souhaite accéder à vos contacts et à votre journal d\'appels. Ceci inclut des données concernant les appels entrants et sortants.\n\nVous ne vous êtes jamais connecté à <xliff:g id="DEVICE_NAME_1">%2$s</xliff:g> auparavant."</string>
+</resources>
diff --git a/res/values-fr-neuter/strings.xml b/res/values-fr-neuter/strings.xml
new file mode 100644
index 0000000..7fca6a9
--- /dev/null
+++ b/res/values-fr-neuter/strings.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2007 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="show_dev_countdown" msgid="2936506773086395069">"{count,plural, =1{Plus que # étape pour être développeur·euse.}one{Plus que # étapes pour être développeur·euse.}other{Plus que # étapes pour être développeur·euse.}}"</string>
+ <string name="show_dev_on" msgid="2840850085134853754">"Vous êtes désormais développeur·euse !"</string>
+ <string name="show_dev_already" msgid="7041756429707644630">"Inutile, vous êtes déjà développeur·euse."</string>
+ <string name="no_internet_access_text" msgid="3611993143350310936">"Ce réseau ne dispose d\'aucun accès à Internet. Rester connecté·e ?"</string>
+ <string name="language_empty_list_user_restricted" msgid="8050367405839231863">"Vous n\'êtes pas autorisé·e à modifier la langue de l\'appareil."</string>
+ <string name="vibrate_input_devices_summary" msgid="8791680891376689823">"Rediriger le vibreur vers la manette de jeu lorsque vous êtes connecté·e"</string>
+ <string name="data_usage_auto_sync_off_dialog" msgid="6523112583569674837">"Cela limitera la consommation de données et l\'utilisation de la batterie, mais vous devrez synchroniser manuellement chaque compte pour récupérer les infos récentes. Et en cas de changement, vous n\'en serez pas averti·e."</string>
+ <string name="vpn_replace_always_on_vpn_disable_message" msgid="4299175336198481106">"Vous êtes déjà connecté·e à un VPN permanent. Si vous vous connectez à un autre VPN, le VPN actuel sera remplacé et le mode permanent sera désactivé."</string>
+ <string name="vpn_replace_vpn_message" msgid="1094297700371463386">"Vous êtes déjà connecté·e à un VPN. Si vous vous connectez à un autre VPN, le VPN actuel sera remplacé."</string>
+ <string name="vpn_lockdown_summary" msgid="4700625960550559029">"Sélectionnez un profil VPN auquel rester connecté·e en permanence. Le trafic réseau ne sera autorisé que lorsque vous serez connecté·e à ce VPN."</string>
+ <string name="guest_category_title" msgid="5562663588315329152">"Invité·e (Vous)"</string>
+ <string name="users_summary" msgid="8473589474976307510">"Connecté·e en tant que \"<xliff:g id="USER_NAME">%1$s</xliff:g>\""</string>
+ <string name="zen_suggestion_summary" msgid="1984990920503217">"Suspendre les notifications pour garder votre concentration"</string>
+ <string name="bluetooth_phonebook_access_dialog_content" msgid="959658135522249170">"Un appareil Bluetooth, <xliff:g id="DEVICE_NAME_0">%1$s</xliff:g>, souhaite accéder à vos contacts et à votre journal d\'appels. Ceci inclut des données concernant les appels entrants et sortants.\n\nVous ne vous êtes jamais connecté·e à <xliff:g id="DEVICE_NAME_1">%2$s</xliff:g> auparavant."</string>
+</resources>
diff --git a/res/values-fr-rCA/arrays.xml b/res/values-fr-rCA/arrays.xml
index 63b1ded..aef11d4 100644
--- a/res/values-fr-rCA/arrays.xml
+++ b/res/values-fr-rCA/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Considérer comme facturé à l\'usage"</item>
<item msgid="2047166446768045816">"Considérer comme non facturé à l\'usage"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Utiliser une adresse MAC aléatoire (par défaut)"</item>
- <item msgid="741680937828608749">"Utiliser l\'adresse MAC de l\'appareil"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Non"</item>
<item msgid="2163015208097377388">"Oui"</item>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 1c29467..a576cf4 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Utiliser <xliff:g id="NEW_APP">%s</xliff:g> pour gérer vos connexions réseau?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Demandes de localisation récentes"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Position pour profil profess."</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Autor. localisation de l\'appli"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Le signalement de position est désactivé"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# application sur {total} a accès à la position}one{# application sur {total} a accès à la position}other{# applications sur {total} ont accès à la position}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Réinitialiser"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Choisir la touche de modification"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Choisir une nouvelle touche pour <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> :"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Par défaut"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Parole"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Vitesse du pointeur"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Manette de jeu"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continuer quand même"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Annuler"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Paramètres d\'agrandissement"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Agrandir avec un raccourci"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Agrandir avec le raccourci et en touchant trois fois"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"À propos de <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Messages texte"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Commutation auto. de données"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Utiliser les données de l\'une ou l\'autre carte SIM en fonction de la couverture et de la disponibilité"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Données uniquement"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Configuration"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Suivant"</string>
diff --git a/res/values-fr/arrays.xml b/res/values-fr/arrays.xml
index 38252ae..348a740 100644
--- a/res/values-fr/arrays.xml
+++ b/res/values-fr/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Traiter comme limitée"</item>
<item msgid="2047166446768045816">"Traiter comme illimitée"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Utiliser une adresse MAC aléatoire (par défaut)"</item>
- <item msgid="741680937828608749">"Utiliser MAC de l\'appareil"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Non"</item>
<item msgid="2163015208097377388">"Oui"</item>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 3bd92b3..a6d1a0a 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Utiliser <xliff:g id="NEW_APP">%s</xliff:g> pour gérer vos connexions réseau ?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Demandes de localisation récentes"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Position du profil pro"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Accès des applis à la position"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"La localisation est désactivée"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# appli sur {total} a accès à la position}one{# appli sur {total} a accès à la position}other{# applis sur {total} ont accès à la position}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Réinitialiser"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Choisir une touche de modification"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Choisir une nouvelle touche pour <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> :"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Mise en page <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Par défaut"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatique : <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Utilisateur sélectionné : <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Voix"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Vitesse du pointeur"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Manette de jeu"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continuer"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Annuler"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Paramètres d\'agrandissement"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Agrandir avec un raccourci"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Agrandir avec un raccourci et trois tapotements"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"À propos de <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"SMS"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Migration automatique des données"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Utiliser les données de l\'une ou l\'autre des cartes SIM en fonction de la couverture et de la disponibilité"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Données uniquement"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Configuration"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Suivant"</string>
diff --git a/res/values-gl/arrays.xml b/res/values-gl/arrays.xml
index dd63ce2..8592c23 100644
--- a/res/values-gl/arrays.xml
+++ b/res/values-gl/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Tratar como rede sen tarifa plana"</item>
<item msgid="2047166446768045816">"Tratar como rede con tarifa plana"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Usar MAC aleatorio (predefinido)"</item>
- <item msgid="741680937828608749">"Usar MAC do dispositivo"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Non"</item>
<item msgid="2163015208097377388">"Si"</item>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 6be810e..ba5b172 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Queres utilizar <xliff:g id="NEW_APP">%s</xliff:g> para xestionar as túas conexións de rede?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Solicitudes de localización recentes"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Localización do perfil de traballo"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Permisos de localización das aplicacións"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"A localización está desactivada"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# de {total} aplicacións ten acceso á localización}other{# de {total} aplicacións teñen acceso á localización}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Restablecer"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Escoller unha tecla modificadora"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Escolle unha nova tecla para <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Predeterminado"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Voz"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Velocidade do punteiro"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Mando do xogo"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continuar igualmente"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Cancelar"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Configuración da ampliación"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Ampliar con atallo"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Ampliar con atallo e tres toques"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Acerca de: <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Mensaxes de texto"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Cambio automático de datos"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Usa os datos de calquera das SIM en función da cobertura e a dispoñibilidade"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Só datos"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Configurar"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Seguinte"</string>
diff --git a/res/values-gu/arrays.xml b/res/values-gu/arrays.xml
index 08a002d..dfa5804 100644
--- a/res/values-gu/arrays.xml
+++ b/res/values-gu/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"મીટર કરેલું તરીકે ગણો"</item>
<item msgid="2047166446768045816">"મીટર ન કરેલું તરીકે ગણો"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"રેન્ડમ કરેલા MACનો ઉપયોગ કરો (ડિફૉલ્ટ)"</item>
- <item msgid="741680937828608749">"MAC ડિવાઇસનો ઉપયોગ કરો"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"ના"</item>
<item msgid="2163015208097377388">"હા"</item>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 2c33766..b53214f 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"તમારા નેટવર્ક કનેક્શન્સનું સંચાલન કરવા માટે <xliff:g id="NEW_APP">%s</xliff:g> નો ઉપયોગ કરો?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"તાજેતરની સ્થાન વિનંતિ"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"ઑફિસની પ્રોફાઇલ માટે સ્થાન"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"ઍપ માટે લોકેશનની પરવાનગીઓ"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"સ્થાન બંધ છે"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total}માંથી # ઍપ લોકેશનનો ઍક્સેસ ધરાવે છે}one{{total}માંથી # ઍપ લોકેશનનો ઍક્સેસ ધરાવે છે}other{{total}માંથી # ઍપ લોકેશનનો ઍક્સેસ ધરાવે છે}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"રીસેટ કરો"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"મૉડિફાયર કી પસંદ કરો"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> માટે નવી કી પસંદ કરો:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"ડિફૉલ્ટ"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"સ્પીચ"</string>
<string name="pointer_speed" msgid="7398649279282675718">"પૉઇન્ટરની ગતિ"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"રમત નિયંત્રક"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"તેમ છતાં ચાલુ રાખો"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"રદ કરો"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"સ્ક્રીન મોટી કરવાનું સેટિંગ"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"શૉર્ટકટ વડે વિસ્તૃત કરો"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"શૉર્ટકટ વડે વિસ્તૃત કરો અને ત્રણ વાર ટૅપ કરો"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> વિશે"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"ટેક્સ્ટ"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"ઑટોમૅટિક રીતે ડેટા સ્વિચ કરવો"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"કવરેજ અને ઉપલબ્ધતાના આધારે કોઈપણ સિમ કાર્ડમાંથી ડેટાનો ઉપયોગ કરો"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"ફક્ત ડેટા"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"સેટઅપ કરો"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"આગળ"</string>
diff --git a/res/values-hi/arrays.xml b/res/values-hi/arrays.xml
index 9cc1a65..0b126bb 100644
--- a/res/values-hi/arrays.xml
+++ b/res/values-hi/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"सीमित डेटा वाले नेटवर्क के तौर पर मानें"</item>
<item msgid="2047166446768045816">"सीमित डेटा वाले नेटवर्क के तौर पर न मानें"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"किसी भी MAC पते का इस्तेमाल करें (डिफ़ॉल्ट सेटिंग)"</item>
- <item msgid="741680937828608749">"डिवाइस MAC का इस्तेमाल करें"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"नहीं"</item>
<item msgid="2163015208097377388">"हां"</item>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 053c6e8..7e02fe7 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"आपके नेटवर्क कनेक्शन प्रबंधित करने के लिए <xliff:g id="NEW_APP">%s</xliff:g> का उपयोग करें?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"हाल में किए गए जगह के अनुरोध"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"वर्क प्रोफ़ाइल की जगह"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"ऐप्लिकेशन के लिए जगह की जानकारी की अनुमतियां"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"जगह की जानकारी बंद है"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total} में से # ऐप्लिकेशन के पास, जगह की जानकारी का ऐक्सेस है}one{{total} में से # ऐप्लिकेशन के पास, जगह की जानकारी का ऐक्सेस है}other{{total} में से # ऐप्लिकेशन के पास, जगह की जानकारी का ऐक्सेस है}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"रीसेट करें"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"कार्रवाई बदलने वाली कुंजी चुनें"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> के लिए, कोई नई कुंजी चुनें:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> का लेआउट"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"डिफ़ॉल्ट"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"अपने-आप चुना गया: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"उपयोगकर्ता का चुना गया: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"बोली"</string>
<string name="pointer_speed" msgid="7398649279282675718">"पॉइंटर स्पीड"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"गेमनियंत्रक"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"जारी रखें"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"अभी नहीं"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"ज़ूम करने की सुविधा की सेटिंग"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"शॉर्टकट की मदद से बड़ा करके देखें"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"तीन बार टैप और शॉर्टकट की मदद से बड़ा करके देखें"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> के बारे में जानकारी"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"मैसेज"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"अपने-आप डेटा स्विच होना"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"नेटवर्क कवरेज या उसकी उपलब्धता के आधार पर डेटा का इस्तेमाल करें"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"सिर्फ़ डेटा"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"सेट अप करें"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"अगले पेज पर जाएं"</string>
diff --git a/res/values-hr/arrays.xml b/res/values-hr/arrays.xml
index 426408a..45ca84c 100644
--- a/res/values-hr/arrays.xml
+++ b/res/values-hr/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Mreža s ograničenim prometom"</item>
<item msgid="2047166446768045816">"Mreža bez ograničenja prometa"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Koristi nasumičnu MAC adresu (zadano)"</item>
- <item msgid="741680937828608749">"Koristi MAC adresu uređaja"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Ne"</item>
<item msgid="2163015208097377388">"Da"</item>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 129d11d..14aaffa 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Želite li upotrebljavati aplikaciju <xliff:g id="NEW_APP">%s</xliff:g> za upravljanje mrežnim vezama?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Nedavni zahtjevi za lokaciju"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Lokacija za poslovni profil"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Dopuštenja za pristup lokaciji"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Lokacija je isključena"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# od {total} aplikacije ima pristup lokaciji}one{# od {total} aplikacije imaju pristup lokaciji}few{# od {total} aplikacije imaju pristup lokaciji}other{# od {total} aplikacija imaju pristup lokaciji}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Poništi"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Odaberi modifikatorsku tipku"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Odaberite novu tipku za <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Izgled: <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Zadano"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatski: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Izgled koji je odabrao korisnik: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Govor"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Brzina pokazivača"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Upravljač igrama"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Ipak nastavi"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Odustani"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Postavke povećavanja"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Povećanje pomoću prečaca"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Povećanje pomoću prečaca i trostrukog dodira"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"O usluzi <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Tekstne poruke"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Autom. prebacivanje podataka"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Upotrijebite podatke s jedne od SIM kartica ovisno o pokrivenosti i dostupnosti"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Samo podatkovna veza"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Postavi"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Dalje"</string>
diff --git a/res/values-hu/arrays.xml b/res/values-hu/arrays.xml
index 5b31c91..10d3a02 100644
--- a/res/values-hu/arrays.xml
+++ b/res/values-hu/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Kezelje forgalomkorlátosként"</item>
<item msgid="2047166446768045816">"Kezelje nem forgalomkorlátosként"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Véletlenszerű MAC-cím (alapért.)"</item>
- <item msgid="741680937828608749">"Az eszköz MAC-címének használata"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Nem"</item>
<item msgid="2163015208097377388">"Igen"</item>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 96c2a55..88c8efa 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Szeretné a(z) <xliff:g id="NEW_APP">%s</xliff:g> alkalmazást használni a hálózati kapcsolatok kezelésére?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Legutóbbi helylekérdezések"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"A munkahelyi profil helye"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Appok helyelérési engedélyei"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"A helyadatok ki vannak kapcsolva"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total}/# alkalmazás hozzáfér a helyadatokhoz}other{{total}/# alkalmazás hozzáfér a helyadatokhoz}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Alaphelyzet"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Módosító billentyű választása"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Válasszon új billentyűt a(z) <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> számára:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Alapértelmezett"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Beszéd"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Mutató sebessége"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Játékvezérlő"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Folytatás mégis"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Mégse"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Nagyítási beállítások"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Nagyítás gyorsparanccsal"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Nagyítás gyorsparanccsal és három koppintással"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"SMS-ek"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatikus adatváltás"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Adatok használata bármelyik SIM-ről a lefedettségtől és a rendelkezésre állástól függően"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Csak adatkapcsolat"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Beállítás"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Következő"</string>
diff --git a/res/values-hy/arrays.xml b/res/values-hy/arrays.xml
index cb568c3..15b6ca5 100644
--- a/res/values-hy/arrays.xml
+++ b/res/values-hy/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Սահմանափակ"</item>
<item msgid="2047166446768045816">"Անսահմանափակ"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Օգտագործել պատահական MAC հասցե (կանխադրված)"</item>
- <item msgid="741680937828608749">"Օգտագործել սարքի MAC հասցեն"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Ոչ"</item>
<item msgid="2163015208097377388">"Այո"</item>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 5b89cba..bd2d9ca 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Օգտագործե՞լ <xliff:g id="NEW_APP">%s</xliff:g> ծրագիրը՝ ձեր ցանցային կապերը կառավարելու համար:"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Տեղորոշման վերջին հարցումները"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Տեղ աշխատանքային պրոֆիլի համար"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Տեղորոշման թույլտվություններ"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Տեղորոշումն անջատված է"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{Տեղադրության տվյալները հասանելի են # հավելվածի՝ {total}-ից}one{Տեղադրության տվյալները հասանելի են # հավելվածի՝ {total}-ից}other{Տեղադրության տվյալները հասանելի են # հավելվածի՝ {total}-ից}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Վերականգնել"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Ընտրեք կերպափոխիչ ստեղնը"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Ընտրել նոր ստեղն <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> ստեղնի փոխարեն՝"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Կանխադրված"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Խոսք"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Նշորդի արագությունը"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Խաղերի կարգավորիչ"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Շարունակել"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Չեղարկել"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Խոշորացման կարգավորումներ"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Խոշորացում դյուրանցման միջոցով"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Խոշորացնել դյուրանցման կամ եռակի հպելու օգնությամբ"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"«<xliff:g id="SERVICE">%1$s</xliff:g>» ծառայության մասին"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"SMS-ներ"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Ավտոմատ անցում բջջ․ ինտերնետին"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Օգտագործեք բջջային ինտերնետ ցանկացած SIM քարտից՝ կախված ծածկույթից և հասանելիությունից"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Միայն բջջային ինտերնետ"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Կարգավորել"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Հաջորդը"</string>
diff --git a/res/values-in/arrays.xml b/res/values-in/arrays.xml
index 15ec935..7cac682 100644
--- a/res/values-in/arrays.xml
+++ b/res/values-in/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Perlakukan sebagai berkuota"</item>
<item msgid="2047166446768045816">"Perlakukan sebagai tanpa kuota"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Gunakan MAC acak (default)"</item>
- <item msgid="741680937828608749">"Gunakan MAC perangkat"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Tidak"</item>
<item msgid="2163015208097377388">"Ya"</item>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index dafeded..b2ea1b0 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Gunakan <xliff:g id="NEW_APP">%s</xliff:g> untuk mengelola koneksi jaringan?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Permintaan lokasi terbaru"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Lokasi untuk profil kerja"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Izin akses lokasi aplikasi"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Lokasi nonaktif"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# dari {total} aplikasi memiliki akses ke lokasi}other{# dari {total} aplikasi memiliki akses ke lokasi}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Reset"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Pilih tombol pengubah"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Pilih tombol baru untuk <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Tata letak <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Default"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Otomatis: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Dipilih pengguna: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Ucapan"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Kecepatan kursor"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Pengendali Game"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Tetap lanjutkan"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Batal"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Setelan pembesaran"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Perbesar dengan pintasan"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Perbesar dengan pintasan & ketuk tiga kali"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Tentang <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Pesan teks"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Pengalihan data otomatis"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Gunakan data dari salah satu SIM tergantung pada cakupan dan ketersediaan"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Khusus data"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Siapkan"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Berikutnya"</string>
diff --git a/res/values-is/arrays.xml b/res/values-is/arrays.xml
index 7919fe8..fab4ca9 100644
--- a/res/values-is/arrays.xml
+++ b/res/values-is/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Meðhöndla sem mælt"</item>
<item msgid="2047166446768045816">"Meðhöndla sem ótakmarkað"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Nota MAC-vistfang af handahófi (sjálfgefið)"</item>
- <item msgid="741680937828608749">"Nota MAC-vistfang tækis"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Nei"</item>
<item msgid="2163015208097377388">"Já"</item>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 030aaf6..e480c03 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Nota <xliff:g id="NEW_APP">%s</xliff:g> til að stjórna nettengingunum þínum?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Nýlegar staðsetningarbeiðnir"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Staðsetning vinnusniðs"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Staðsetningarheimildir forrits"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Slökkt á staðsetningu"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# af {total} forritum hefur aðgang að staðsetningu}one{# af {total} forritum hefur aðgang að staðsetningu}other{# af {total} forritum hafa aðgang að staðsetningu}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Endurstilla"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Velja breytilykil"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Veldu nýjan lykil fyrir <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Útlit: <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Sjálfgefið"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Sjálfvirkt: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Valið af notanda: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Tal"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Hraði bendils"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Leikjafjarstýring"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Halda samt áfram"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Hætta við"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Stillingar stækkunar"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Stækka með flýtilykli"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Stækka með flýtilykli og með því að ýta þrisvar"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Um þjónustuna „<xliff:g id="SERVICE">%1$s</xliff:g>“"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"SMS-skilaboð"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Sjálfvirk gagnaskipting"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Nota gögn af öðru hvoru SIM-korti byggt á umfangi og tiltækileika"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Aðeins gögn"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Setja upp"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Áfram"</string>
diff --git a/res/values-it/arrays.xml b/res/values-it/arrays.xml
index 9679ba4..733de52 100644
--- a/res/values-it/arrays.xml
+++ b/res/values-it/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Considera a consumo"</item>
<item msgid="2047166446768045816">"Considera non a consumo"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Usa MAC casuale (opzione predefinita)"</item>
- <item msgid="741680937828608749">"Usa MAC del dispositivo"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"No"</item>
<item msgid="2163015208097377388">"Sì"</item>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 0a8f42c..588d6dd 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Utilizzare <xliff:g id="NEW_APP">%s</xliff:g> per gestire le connessioni di rete?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Richieste di posizione recenti"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Posizione per profilo di lavoro"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Autorizzazioni per la posizione"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"La geolocalizzazione non è attiva"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# app su {total} ha accesso alla posizione}other{# app su {total} hanno accesso alla posizione}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Reimposta"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Scegli un tasto di modifica"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Scegli un nuovo tasto per <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Predefinito"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Voce"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Velocità del puntatore"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Controller di gioco"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continua comunque"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Annulla"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Impostazioni ingrandimento"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Ingrandisci con scorciatoia"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Ingrandisci con scorciatoia e triplo tocco"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Informazioni su <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"SMS"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Passaggio dati automatico"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Utilizza i dati di entrambe le SIM in base alla copertura e alla disponibilità"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Solo dati"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Configura"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Avanti"</string>
diff --git a/res/values-iw/arrays.xml b/res/values-iw/arrays.xml
index 3419f7f..814f1f6 100644
--- a/res/values-iw/arrays.xml
+++ b/res/values-iw/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"יש להתייחס כרשת עם חיוב לפי שימוש בנתונים"</item>
<item msgid="2047166446768045816">"יש להתייחס כרשת שבה החיוב הוא לא לפי שימוש בנתונים"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"שימוש בכתובת MAC אקראית (ברירת מחדל)"</item>
- <item msgid="741680937828608749">"שימוש בכתובת ה-MAC של המכשיר"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"לא"</item>
<item msgid="2163015208097377388">"כן"</item>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 5bc55b6..754d560 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"האם להשתמש ב-<xliff:g id="NEW_APP">%s</xliff:g> כדי לנהל את חיבורי הרשת שלך?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"בקשות של מיקומים אחרונים"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"מיקום עבור פרופיל עבודה"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"הרשאות מיקום של אפליקציות"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"תכונת המיקום כבויה"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{לאחת (#) מתוך {total} אפליקציות יש גישה למיקום}one{ל-# מתוך {total} אפליקציות יש גישה למיקום}two{ל-# מתוך {total} אפליקציות יש גישה למיקום}other{ל-# מתוך {total} אפליקציות יש גישה למיקום}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"איפוס"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"בחירת מקש צירוף"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"יש לבחור מפתח חדש עבור <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"פריסה של <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"ברירת מחדל"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"אוטומטי: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"המשתמש שנבחר: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"דיבור"</string>
<string name="pointer_speed" msgid="7398649279282675718">"מהירות המצביע"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"בקר משחק"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"אני רוצה להמשיך בכל זאת"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"ביטול"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"הגדרות ההגדלה"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"הגדלה בעזרת קיצור דרך"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"הגדלה בעזרת קיצור דרך והקשה שלוש פעמים"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"מידע על <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"הודעות טקסט"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"מעבר אוטומטי בין חבילות גלישה"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"שימוש בחבילת הגלישה של אחד מכרטיסי ה-SIM, תלוי בכיסוי ובזמינות"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"נתונים בלבד"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"הגדרה"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"הבא"</string>
diff --git a/res/values-ja/arrays.xml b/res/values-ja/arrays.xml
index b81c77b..20f4229 100644
--- a/res/values-ja/arrays.xml
+++ b/res/values-ja/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"従量制として扱う"</item>
<item msgid="2047166446768045816">"定額制として扱う"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"ランダム MAC を使用(デフォルト)"</item>
- <item msgid="741680937828608749">"デバイスの MAC を使用"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"いいえ"</item>
<item msgid="2163015208097377388">"はい"</item>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 47838c0..158e7a2 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -1540,6 +1540,7 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"ネットワーク接続の管理に<xliff:g id="NEW_APP">%s</xliff:g>を使用しますか?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"最近の位置情報リクエスト"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"仕事用プロファイルで位置情報を使用"</string>
+ <string name="private_profile_location_switch_title" msgid="4127119143109855789">"プライベート スペースの場所"</string>
<string name="location_app_level_permissions" msgid="907206607664629759">"アプリへの位置情報の利用許可"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"位置情報は OFF です"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total} 個中 # 個のアプリに位置情報へのアクセスを許可しています}other{{total} 個中 # 個のアプリに位置情報へのアクセスを許可しています}}"</string>
@@ -1931,7 +1932,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"リセット"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"修飾キーを選択"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> の新しいキーを選択してください"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"レイアウト: <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"デフォルト"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"自動: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"ユーザーによる選択: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"読み上げ"</string>
<string name="pointer_speed" msgid="7398649279282675718">"ポインタの速度"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"ゲーム用コントローラ"</string>
@@ -2053,6 +2057,9 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"無視して続行"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"キャンセル"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"画面の拡大設定"</string>
+ <string name="accessibility_magnification_one_finger_panning_title" msgid="4503949739883092989">"指 1 本でのパン操作"</string>
+ <string name="accessibility_magnification_one_finger_panning_summary_on" msgid="9133125894310777539">"1 本の指でドラッグして拡大領域を移動します。"</string>
+ <string name="accessibility_magnification_one_finger_panning_summary_off" msgid="8979146350396559805">"2 本の指でドラッグして拡大領域を移動します。"</string>
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"ショートカットで拡大"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"ショートカットとトリプルタップで拡大"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g>について"</string>
@@ -4630,6 +4637,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"テキスト メッセージ"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"自動データ切り替え"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"サービスの対象エリアや提供状況に応じて、いずれかの SIM のデータを使用します"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"データのみ"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"設定"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"次へ"</string>
diff --git a/res/values-ka/arrays.xml b/res/values-ka/arrays.xml
index 1030cc0..234b65d 100644
--- a/res/values-ka/arrays.xml
+++ b/res/values-ka/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"ლიმიტირებულად ჩათვლა"</item>
<item msgid="2047166446768045816">"არალიმიტირებულად ჩათვლა"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"შემთხვევითი MAC-ის გამოყენება (ნაგულ.)"</item>
- <item msgid="741680937828608749">"მოწყობილობის MAC-მისამართის გამოყენება"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"არა"</item>
<item msgid="2163015208097377388">"დიახ"</item>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index b38339d..aed91cc 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"გსურთ ქსელის კავშირების სამართავად <xliff:g id="NEW_APP">%s</xliff:g>-ის გამოყენება?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"მდებარეობის ბოლო მოთხოვნები"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"ადგილმდებარეობა სამუშაო პროფილისათვის"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"აპის მდებარეობის ნებართვები"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"მდებარეობა გამორთულია"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{მდებარეობაზე წვდომა აქვს {total}-დან # აპს}other{მდებარეობაზე წვდომა აქვს {total}-დან # აპს}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"გადაყენება"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"აირჩიეთ მოდიფიკატორი კლავიში"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"აირჩიეთ ახალი კლავიში <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>-ისთვის:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> განლაგება"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"ნაგულისხმევი"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"ავტომატური: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"მომხმარებლის მიერ არჩეული: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"მეტყველება"</string>
<string name="pointer_speed" msgid="7398649279282675718">"მანიშნებლის სიჩქარე"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"თამაშის მეთვალყურე"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"მაინც გაგრძელება"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"გაუქმება"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"გადიდების პარამეტრები"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"გადიდება მალსახმობით"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"გადიდება მალსახმობითა და სამმაგი შეხებით"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g>-ის შესახებ"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"ტექსტი"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"მონაცემთა ავტომატური გადართვა"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"დაფარვისა და ხელმისაწვდომობის მიხედვით მონაცემების გამოყენება ნებისმიერი SIM-იდან"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"მხოლოდ ინტერნეტისთვის"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"კონფიგურაცია"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"შემდეგი"</string>
diff --git a/res/values-kk/arrays.xml b/res/values-kk/arrays.xml
index 84a063c..54d6e5d 100644
--- a/res/values-kk/arrays.xml
+++ b/res/values-kk/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Трафик саналады"</item>
<item msgid="2047166446768045816">"Трафик саналмайды"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Кездейсоқ MAC мекенжайын пайдалану (әдепкі)"</item>
- <item msgid="741680937828608749">"Құрылғының MAC мекенжайын пайдалану"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Жоқ"</item>
<item msgid="2163015208097377388">"Иә"</item>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 9f5e6a5..e30d628 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Желілік байланыстарды басқару үшін <xliff:g id="NEW_APP">%s</xliff:g> қолданбасын пайдалану керек пе?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Соңғы орынды анықтау сұраулары"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Жұмыс профиліндегі локация"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Қолданбалардың локацияны пайдалануы"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Локация өшірулі"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{#/{total} қолданба локацияны пайдалана алады.}other{#/{total} қолданба локацияны пайдалана алады.}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Қайта орнату"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Өзгерткіш перне таңдау"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> жаңа пернесін таңдау:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> форматы"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Әдепкі"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Автоматты: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Пайдаланушы таңдаған: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Сөз"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Меңзер жылдамдығы"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Ойын бақылаушы"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Бәрібір жалғастыру"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Бас тарту"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Ұлғайту параметрлері"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Таңбашамен үлкейту"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Таңбашамен және үш рет түртіп үлкейту"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> туралы ақпарат"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Мәтіндік хабарлар"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Деректерді автоматты ауыстыру"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Қызмет аясына және байланыста болуына қарай қажетті SIM картасының деректерін пайдаланыңыз."</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Тек деректер"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Реттеу"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Келесі"</string>
diff --git a/res/values-km/arrays.xml b/res/values-km/arrays.xml
index cdf25f7..7c58cc3 100644
--- a/res/values-km/arrays.xml
+++ b/res/values-km/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"ចាត់ទុកថាផ្អែកតាមទិន្នន័យដែលប្រើ"</item>
<item msgid="2047166446768045816">"ចាត់ទុកថាមិនផ្អែកតាមទិន្នន័យដែលប្រើ"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"ប្រើ MAC ចៃដន្យ (លំនាំដើម)"</item>
- <item msgid="741680937828608749">"ប្រើ MAC ឧបករណ៍"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"ទេ"</item>
<item msgid="2163015208097377388">"បាទ/ចាស"</item>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 4388e93..8e71d7b 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"ប្រើ <xliff:g id="NEW_APP">%s</xliff:g> ដើម្បីគ្រប់គ្រងការភ្ជាប់បណ្ដាញរបស់អ្នក?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"សំណើទីតាំងថ្មី"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"ទីតាំងសម្រាប់កម្រងព័ត៌មានការងារ"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"ការអនុញ្ញាតទីតាំងកម្មវិធី"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"ទីតាំងបានបិទ"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{កម្មវិធី # នៃ {total} មានសិទ្ធិចូលប្រើទីតាំង}other{កម្មវិធី # នៃ {total} មានសិទ្ធិចូលប្រើទីតាំង}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"កំណត់ឡើងវិញ"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"ជ្រើសរើសប៊ូតុងឧបករណ៍កែសម្រួល"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"ជ្រើសរើសប៊ូតុងថ្មីសម្រាប់ <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>៖"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"លំនាំដើម"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"ការនិយាយ"</string>
<string name="pointer_speed" msgid="7398649279282675718">"ល្បឿនព្រួញ"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"កម្មវិធីពិនិត្យល្បែង"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"មិនអីទេ បន្តចុះ"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"បោះបង់"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"ការកំណត់ការពង្រីក"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"ពង្រីកដោយប្រើផ្លូវកាត់"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"ពង្រីកដោយប្រើផ្លូវកាត់ និងចុចបីដង"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"អំពី <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"សារជាអក្សរ"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"ការប្ដូរទិន្នន័យស្វ័យប្រវត្តិ"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"ប្រើទិន្នន័យពីស៊ីមណាមួយដោយផ្អែកលើដែនសេវា និងភាពអាចប្រើប្រាស់បាន"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"ទិន្នន័យតែប៉ុណ្ណោះ"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"រៀបចំ"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"បន្ទាប់"</string>
diff --git a/res/values-kn/arrays.xml b/res/values-kn/arrays.xml
index 8991e0f..a762ed7 100644
--- a/res/values-kn/arrays.xml
+++ b/res/values-kn/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"ಮೀಟರ್ ಮಾಡಿದೆ ಎಂದು ಪರಿಗಣಿಸಿ"</item>
<item msgid="2047166446768045816">"ಮೀಟರ್ ಮಾಡಲಾಗಿಲ್ಲ ಎಂದು ಪರಿಗಣಿಸಿ"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"ಯಾದೃಚ್ಛಿಕವಾದ MAC (ಡೀಫಾಲ್ಟ್) ಅನ್ನು ಬಳಸಿ"</item>
- <item msgid="741680937828608749">"ಸಾಧನದ MAC ಬಳಸಿ"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"ಇಲ್ಲ"</item>
<item msgid="2163015208097377388">"ಹೌದು"</item>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index d9d802e..f4ac6bb 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಲು <xliff:g id="NEW_APP">%s</xliff:g> ಬಳಸುವುದೇ?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"ಇತ್ತೀಚಿನ ಸ್ಥಳ ವಿನಂತಿಗಳು"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್ನ ಸ್ಥಳ"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"ಆ್ಯಪ್ ಸ್ಥಳದ ಅನುಮತಿಗಳು"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"ಸ್ಥಳ ಆಫ್ ಆಗಿದೆ"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total} ರಲ್ಲಿ # ಆ್ಯಪ್ಗಳು ಸ್ಥಳಕ್ಕೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿವೆ}one{{total} ರಲ್ಲಿ # ಆ್ಯಪ್ಗಳು ಸ್ಥಳಕ್ಕೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿವೆ}other{{total} ರಲ್ಲಿ # ಆ್ಯಪ್ಗಳು ಸ್ಥಳಕ್ಕೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೊಂದಿವೆ}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"ರೀಸೆಟ್ ಮಾಡಿ"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"ಮಾರ್ಪಡಿಸುವ ಕೀ ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> ಗಾಗಿ ಹೊಸ ಕೀ ಆಯ್ಕೆಮಾಡಿ:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"ಡಿಫಾಲ್ಟ್"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"ಧ್ವನಿ"</string>
<string name="pointer_speed" msgid="7398649279282675718">"ಪಾಯಿಂಟರ್ ವೇಗ"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"ಆಟ ನಿಯಂತ್ರಕ"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"ಹೇಗಾದರೂ ಮುಂದುವರಿಸಿ"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"ರದ್ದುಮಾಡಿ"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"ಹಿಗ್ಗಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"ಶಾರ್ಟ್ಕಟ್ ಮೂಲಕ ಹಿಗ್ಗಿಸಿ"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"ಶಾರ್ಟ್ಕಟ್ ಮತ್ತು ಮೂರು-ಟ್ಯಾಪ್ ಮೂಲಕ ಹಿಗ್ಗಿಸಿ"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> ಕುರಿತು"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"ಪಠ್ಯ ಸಂದೇಶಗಳು"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"ಸ್ವಯಂಚಾಲಿತ ಡೇಟಾ ಬದಲಿಸುವಿಕೆ"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"ಕವರೇಜ್ ಮತ್ತು ಲಭ್ಯತೆಯನ್ನು ಆಧರಿಸಿ ಎರಡರಲ್ಲಿ ಒಂದು SIM ನಲ್ಲಿನ ಡೇಟಾ ಬಳಸಿ"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"ಡೇಟಾ ಮಾತ್ರ"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"ಸೆಟಪ್ ಮಾಡಿ"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"ಮುಂದಿನದು"</string>
diff --git a/res/values-ko/arrays.xml b/res/values-ko/arrays.xml
index 8602611..ee51e4c 100644
--- a/res/values-ko/arrays.xml
+++ b/res/values-ko/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"제한이 있는 Wi-Fi로 취급"</item>
<item msgid="2047166446768045816">"무제한 Wi-Fi로 취급"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"무작위 MAC 사용(기본값)"</item>
- <item msgid="741680937828608749">"기기 MAC 사용"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"아니요"</item>
<item msgid="2163015208097377388">"예"</item>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 578b1b8..a3f680b 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"<xliff:g id="NEW_APP">%s</xliff:g>을(를) 사용하여 네트워크 연결을 관리하시겠습니까?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"최근 위치 요청"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"직장 프로필 위치"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"앱 위치 정보 액세스 권한"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"위치 서비스 사용 안함"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total}개 중 #개의 앱이 위치에 액세스할 수 있음}other{{total}개 중 #개의 앱이 위치에 액세스할 수 있음}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"초기화"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"특수키 선택"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>의 새 키 선택:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> 레이아웃"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"기본"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"자동: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"사용자 선택: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"음성"</string>
<string name="pointer_speed" msgid="7398649279282675718">"포인터 속도"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"게임 컨트롤러"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"무시하고 계속하기"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"취소"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"확대 설정"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"바로가기를 사용하여 확대"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"바로가기 및 세 번 탭으로 확대"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> 정보"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"문자 메시지"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"자동 데이터 전환"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"서비스 범위 및 지원 여부에 따라 SIM 중 하나의 데이터를 사용하세요."</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"데이터 전용"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"설정"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"다음"</string>
diff --git a/res/values-ky/arrays.xml b/res/values-ky/arrays.xml
index a0bca87..bfbc0cd 100644
--- a/res/values-ky/arrays.xml
+++ b/res/values-ky/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Ченелет"</item>
<item msgid="2047166446768045816">"Ченелбейт"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Туш келди MAC дарек колдонулат (демейки)"</item>
- <item msgid="741680937828608749">"MAC түзмөгү колдонулат"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Жок"</item>
<item msgid="2163015208097377388">"Ооба"</item>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 79893e1..40130e0 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Тармактык туташууларыңызды башкаруу үчүн <xliff:g id="NEW_APP">%s</xliff:g> колдоносузбу?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Жакында изделген жерлер"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Жумуш профилинин жери"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Жайгашкан жерди көргөн колдонмолор"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Жайгашкан жерди аныктоо өчүрүлгөн"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total} ичинен # колдонмо жайгашкан жерди көрө алат}other{{total} ичинен # колдонмо жайгашкан жерди көрө алат}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Кайра коюу"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Өзгөртүүчү баскычты тандаңыз"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> үчүн жаңы ачкыч тандаңыз:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> калыбы"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Демейки"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Автоматтык: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Колдонуучу тандаган: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Кеп"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Көрсөткүчтүн ылдамдыгы"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Оюн контроллери"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Баары бир улантуу"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Жок"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Чоңойтуу параметрлери"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Ыкчам баскыч менен чоңойтуу"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Ыкчам баскыч жана үч жолу таптоо менен чоңойтуу"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> жөнүндө"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"SMS жөнөтүү"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Дайындарды автоматтык түрдө которуу"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Иштөө аймагы жана жеткиликтүүлүгүнө жараша каалаган SIM картанын дайындарын колдонуңуз"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Дайындар гана"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Тууралоо"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Кийинки"</string>
diff --git a/res/values-lo/arrays.xml b/res/values-lo/arrays.xml
index 09f0bb1..fe9a151 100644
--- a/res/values-lo/arrays.xml
+++ b/res/values-lo/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"ໃຊ້ແບບວັດແທກປະລິມານ"</item>
<item msgid="2047166446768045816">"ໃຊ້ແບບບໍ່ວັດແທກປະລິມານ"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"ໃຊ້ MAC ແບບສຸ່ມ (ຄ່າເລີ່ມຕົ້ນ)"</item>
- <item msgid="741680937828608749">"ໃຊ້ MAC ອຸປະກອນ"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"ບໍ່"</item>
<item msgid="2163015208097377388">"ແມ່ນ"</item>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index c00d61d..3623073 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"ໃຊ້ <xliff:g id="NEW_APP">%s</xliff:g> ເພື່ອຈັດການການເຊື່ອມຕໍ່ເຄືອຂ່າຍຂອງທ່ານບໍ?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"ການຮ້ອງຂໍຂໍ້ມູນສະຖານທີ່ຫຼ້າສຸດ"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"ສະຖານທີ່ສຳລັບໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"ການອະນຸຍາດສະຖານທີ່ແອັບ"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"ປິດສະຖານທີ່ແລ້ວ"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# ຈາກທັງໝົດ {total} ແອັບມີສິດເຂົ້າເຖິງສະຖານທີ່}other{# ຈາກທັງໝົດ {total} ແອັບມີສິດເຂົ້າເຖິງສະຖານທີ່}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"ຣີເຊັດ"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"ເລືອກປຸ່ມຕົວດັດແປງ"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"ເລືອກປຸ່ມໃໝ່ສຳລັບ <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"ໂຄງຮ່າງ <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"ຄ່າເລີ່ມຕົ້ນ"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"ອັດຕະໂນມັດ: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"ຜູ້ໃຊ້ໄດ້ເລືອກ: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"ສຽງເວົ້າ"</string>
<string name="pointer_speed" msgid="7398649279282675718">"ຄວາມໄວລູກສອນ"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"ມືເກມ"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"ຢືນຢັນດຳເນີນການຕໍ່"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"ຍົກເລີກ"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"ການຕັ້ງຄ່າການຂະຫຍາຍ"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"ຂະຫຍາຍດ້ວຍທາງລັດ"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"ຂະຫຍາຍດ້ວຍທາງລັດ ແລະ ການແຕະສາມເທື່ອ"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"ກ່ຽວກັບ <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"ຂໍ້ຄວາມ"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"ການສະຫຼັບການເຊື່ອມຕໍ່ອິນເຕີເນັດອັດຕະໂນມັດ"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"ໃຊ້ການເຊື່ອມຕໍ່ອິນເຕີເນັດຈາກຊິມໃດກໍໄດ້ໂດຍຂຶ້ນຢູ່ກັບພື້ນທີ່ຄອບຄຸມ ແລະ ຄວາມພ້ອມໃຫ້ນຳໃຊ້"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"ໃຊ້ເຊື່ອມຕໍ່ອິນເຕີເນັດເທົ່ານັ້ນ"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"ຕັ້ງຄ່າ"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"ຕໍ່ໄປ"</string>
diff --git a/res/values-lt/arrays.xml b/res/values-lt/arrays.xml
index 450a3f7..d0c396d 100644
--- a/res/values-lt/arrays.xml
+++ b/res/values-lt/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Laikyti matuojamu"</item>
<item msgid="2047166446768045816">"Laikyti nematuojamu"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Atsitiktinai parinktas MAC (numatyta)"</item>
- <item msgid="741680937828608749">"Naudoti įrenginio MAC"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Ne"</item>
<item msgid="2163015208097377388">"Taip"</item>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index f4c4a3a..e13d83a 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Naudoti <xliff:g id="NEW_APP">%s</xliff:g> tinklo ryšiams tvarkyti?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Pastarosios vietovės užklausos"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Darbo profilio vieta"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Programų leidimai pasiekti vietovės duomenis"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Vietovė išjungta"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{Vietovę gali pasiekti # programa iš {total}}one{Vietovę gali pasiekti # programa iš {total}}few{Vietovę gali pasiekti # programos iš {total}}many{Vietovę gali pasiekti # programos iš {total}}other{Vietovę gali pasiekti # programų iš {total}}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Nust. iš naujo"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Pasirinkite modifikavimo klavišą"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Pasirinkite naują „<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>“ slaptažodį:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"„<xliff:g id="IME_LABEL">%s</xliff:g>“ išdėstymas"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Numatytasis"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatinis: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Pasirinktas naudotojo: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Kalba"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Žymiklio greitis"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Žaidimų valdiklis"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Vis tiek tęsti"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Atšaukti"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Didinimo nustatymai"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Didinimas naudojant spart. klavišą"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Didinti naud. spart. klav. ir palietus tris kartus"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Apie „<xliff:g id="SERVICE">%1$s</xliff:g>“"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Teksto pranešimai"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatinis duomenų perjungimas"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Naudoti duomenis iš bet kurios SIM kortelės, atsižvelgiant į aprėptį ir pasiekiamumą"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Tik duomenys"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Nustatyti"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Kitas"</string>
diff --git a/res/values-lv/arrays.xml b/res/values-lv/arrays.xml
index 3d9322f..a050ce4 100644
--- a/res/values-lv/arrays.xml
+++ b/res/values-lv/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Maksas"</item>
<item msgid="2047166446768045816">"Bezmaksas"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Nejauša MAC adrese (noklusējums)"</item>
- <item msgid="741680937828608749">"Izmantot ierīces MAC adresi"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Nē"</item>
<item msgid="2163015208097377388">"Jā"</item>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index b1a266d..4ee68e5 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Vai tīkla savienojumu pārvaldībai izmantot lietotni <xliff:g id="NEW_APP">%s</xliff:g>?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Neseni vietu pieprasījumi"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Darba profila atrašanās vieta"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Lietotņu atraš. vietu atļaujas"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Atrašanās vieta ir izslēgta"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# lietotnei no {total} ir piekļuve atrašanās vietai}zero{# lietotnēm no {total} ir piekļuve atrašanās vietai}one{# lietotnei no {total} ir piekļuve atrašanās vietai}other{# lietotnēm no {total} ir piekļuve atrašanās vietai}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Atiestatīt"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Modificētājtaustiņa izvēle"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Izvēlieties jaunu taustiņu — <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Noklusējums"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Runa"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Rādītāja ātrums"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Spēļu vadība"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Tomēr turpināt"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Atcelt"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Palielināšanas iestatījumi"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Palielināšana ar saīsni"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Palieliniet, lietojot saīsni un trīskāršu skārienu"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Par pakalpojumu <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Īsziņas"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automātiska datu pārslēgšana"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Izmantojiet jebkuras SIM kartes nodrošinātos datus — atkarībā no pārklājuma un pieejamības."</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Tikai dati"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Iestatīt"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Tālāk"</string>
diff --git a/res/values-mk/arrays.xml b/res/values-mk/arrays.xml
index 4e01fd7..f732a31 100644
--- a/res/values-mk/arrays.xml
+++ b/res/values-mk/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Сметај како ограничена мрежа"</item>
<item msgid="2047166446768045816">"Сметај како неограничена мрежа"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Користи рандомизирана MAC-адреса (стандардно)"</item>
- <item msgid="741680937828608749">"Користи ја MAC-адресата на уредот"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Не"</item>
<item msgid="2163015208097377388">"Да"</item>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index bc22769..47d89d7 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Да се користи <xliff:g id="NEW_APP">%s</xliff:g> за управување на вашите мрежни врски?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Последни барања за локација"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Локација за работен профил"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Дозволи за локација за апликации"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Локацијата е исклучена"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# од {total} апликации има пристап до локацијата}one{# од {total} апликации имаат пристап до локацијата}other{# од {total} апликации имаат пристап до локацијата}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Ресетирај"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Изберете го копчето модификатор"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Изберете ново копче за <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Стандардно"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Говор"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Брзина на покажувач"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Контролор на игра"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Сепак продолжи"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Откажи"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Поставки за зголемување"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Зголемување со кратенка"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Зголемете со кратенка и троен допир"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"За <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Пораки"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Автоматско префрлање интернет"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Користете интернет од која било SIM-картичка зависно од покриеноста и достапноста"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Само за интернет"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Поставете"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Следно"</string>
diff --git a/res/values-ml/arrays.xml b/res/values-ml/arrays.xml
index b858617..a857fd9 100644
--- a/res/values-ml/arrays.xml
+++ b/res/values-ml/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"മീറ്റർ ചെയ്തതായി കണക്കാക്കുക"</item>
<item msgid="2047166446768045816">"മീറ്റർ ചെയ്യാത്തതായി കണക്കാക്കുക"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"ക്രമരഹിതമാക്കിയ MAC (ഡിഫോൾട്ട്)"</item>
- <item msgid="741680937828608749">"ഉപകരണ MAC ഉപയോഗിക്കുക"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"ഇല്ല"</item>
<item msgid="2163015208097377388">"ഉണ്ട്"</item>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 077f5d5..a8515b3 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"നിങ്ങളുടെ നെറ്റ്വർക്ക് കണക്ഷനുകൾ നിയന്ത്രിക്കാൻ <xliff:g id="NEW_APP">%s</xliff:g> ആണോ ഉപയോഗിക്കുന്നത്?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"പുതിയ ലൊക്കേഷൻ അഭ്യർത്ഥനകൾ"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"ഔദ്യോഗിക പ്രൊഫൈലിനായുള്ള ലൊക്കേഷൻ"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"ആപ്പ് ലൊക്കേഷൻ അനുമതികൾ"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"ലൊക്കേഷൻ ഓഫാണ്"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total} ആപ്പുകളിൽ # എണ്ണത്തിന് ലൊക്കേഷനിലേക്ക് ആക്സസ് ഉണ്ട്}other{{total} ആപ്പുകളിൽ # എണ്ണത്തിന് ലൊക്കേഷനിലേക്ക് ആക്സസ് ഉണ്ട്}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"റീസെറ്റ് ചെയ്യൂ"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"മോഡിഫയർ കീ തിരഞ്ഞെടുക്കുക"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> എന്നതിനായി പുതിയ കീ തിരഞ്ഞെടുക്കൂ:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> ലേഔട്ട്"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"ഡിഫോൾട്ട്"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"സ്വയമേവ: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"തിരഞ്ഞെടുത്ത ഉപയോക്താവ്: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"സംഭാഷണം"</string>
<string name="pointer_speed" msgid="7398649279282675718">"പോയിന്റർ വേഗത"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"ഗെയിം കൺട്രോളർ"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"എന്തായാലും തുടരുക"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"റദ്ദാക്കുക"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"മാഗ്നിഫിക്കേഷൻ ക്രമീകരണം"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"കുറുക്കുവഴിയിലൂടെ മാഗ്നിഫൈ ചെയ്യൂ"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"കുറുക്കുവഴി, മൂന്ന് തവണ ടാപ്പ് എന്നിവയിലൂടെ മാഗ്നിഫൈ ചെയ്യൂ"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> എന്നതിനെ കുറിച്ച്"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"ടെക്സ്റ്റുകൾ"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"സ്വയമേവയുള്ള ഡാറ്റാ മാറ്റം"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"കവറേജും ലഭ്യതയും അനുസരിച്ച് ഏതെങ്കിലും സിമ്മിൽ നിന്നുള്ള ഡാറ്റ ഉപയോഗിക്കുക"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"ഡാറ്റ മാത്രം"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"സജ്ജീകരിക്കുക"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"അടുത്തത്"</string>
diff --git a/res/values-mn/arrays.xml b/res/values-mn/arrays.xml
index 62e884d..007d8d0 100644
--- a/res/values-mn/arrays.xml
+++ b/res/values-mn/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Хязгаартайгаар тохируулах"</item>
<item msgid="2047166446768045816">"Хязгааргүйгээр тохируулах"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Санамсаргүй үүссэн MAC-г ашиглах (өгөгдмөл)"</item>
- <item msgid="741680937828608749">"Төхөөрөмжийн MAC-г ашиглах"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Үгүй"</item>
<item msgid="2163015208097377388">"Тийм"</item>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 9aa407f..863ca24 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Сүлжээний холболтуудыг удирдахад <xliff:g id="NEW_APP">%s</xliff:g>-г ашиглах уу?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Саяхны байршлын хүсэлтүүд"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Ажлын профайлын байршил"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Аппын байршлын зөвшөөрлүүд"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Байршил унтраалттай байна"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total} аппын # нь байршилд хандах боломжтой}other{{total} аппын # нь байршилд хандах боломжтой}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Шинэчлэх"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Тохируулагч товч сонгох"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>-н шинэ товч сонгоно уу:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> бүдүүвч"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Өгөгдмөл"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Автомат: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Хэрэглэгчийн сонгосон: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Яриа"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Заагчийн хурд"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Тоглоом Контроллер"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Ямартай ч үргэлжлүүлэх"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Цуцлах"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Томруулах тохиргоо"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Товчлолоор томруулах"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Товчлол болон гурав товшилтоор томруулах"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g>-н тухай"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Мессежүүд"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Автоматаар дата сэлгэх"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Хамрах хүрээ болон боломжтой байдлаас хамааран аль нэг SIM-н датаг ашиглана уу"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Зөвхөн дата"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Тохируулах"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Дараах"</string>
diff --git a/res/values-mr/arrays.xml b/res/values-mr/arrays.xml
index ce2af9d..120f250 100644
--- a/res/values-mr/arrays.xml
+++ b/res/values-mr/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"मर्यादित डेटा वापराचे नेटवर्क"</item>
<item msgid="2047166446768045816">"अमर्याद डेटा वापराचे नेटवर्क"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"रँडमाइझ केलेले MAC वापरा (डीफॉल्ट)"</item>
- <item msgid="741680937828608749">"डिव्हाइस MAC वापरा"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"नाही"</item>
<item msgid="2163015208097377388">"होय"</item>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 6e9ede6..f75bf27 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"तुमची नेटवर्क कनेक्शन व्यवस्थापित करण्यासाठी <xliff:g id="NEW_APP">%s</xliff:g> वापरायचा?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"अलीकडील स्थान विनंत्या"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"कार्य प्रोफाइलसाठी स्थान"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"ॲपसाठी स्थानाच्या परवानग्या"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"स्थान बंद आहे"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total} पैकी # अॅपला स्थानाचा अॅक्सेस आहे}other{{total} पैकी # अॅप्सना स्थानाचा अॅक्सेस आहे}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"रीसेट करा"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"मॉडिफायर की निवडा"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> साठी नवीन की निवडा:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"डीफॉल्ट"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"भाषण"</string>
<string name="pointer_speed" msgid="7398649279282675718">"पॉइंटर वेग"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"गेम नियंत्रक"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"तरीही पुढे सुरू ठेवा"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"रद्द करा"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"मॅग्निफिकेशन सेटिंग्ज"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"शॉर्टकटद्वारे मॅग्निफाय करा"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"शॉर्टकट वापरून आणि तीन वेळा टॅप करून मॅग्निफाय करा"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> बद्दल"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"एसएमएस"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"डेटा आपोआप स्विच करणे"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"कव्हरेज आणि उपलब्धतेनुसार कोणत्याही एका सिममधील डेटा वापरा"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"फक्त डेटा"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"सेट करा"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"पुढील"</string>
diff --git a/res/values-ms/arrays.xml b/res/values-ms/arrays.xml
index dfd367e..4ee924f 100644
--- a/res/values-ms/arrays.xml
+++ b/res/values-ms/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Anggap sebagai bermeter"</item>
<item msgid="2047166446768045816">"Anggap sebagai tidak bermeter"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Gunakan MAC terawak (lalai)"</item>
- <item msgid="741680937828608749">"Gunakan MAC peranti"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Tidak"</item>
<item msgid="2163015208097377388">"Ya"</item>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 3c4f483..c4440a9 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Gunakan <xliff:g id="NEW_APP">%s</xliff:g> untuk mengurus sambungan rangkaian anda?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Permintaan lokasi terbaharu"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Lokasi untuk profil kerja"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Kebenaran lokasi apl"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Lokasi dimatikan"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# daripada {total} apl mempunyai akses kepada lokasi}other{# daripada {total} apl mempunyai akses kepada lokasi}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Tetapkan semula"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Pilih kunci pengubah suai"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Pilih kunci baharu untuk <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Reka letak <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Lalai"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatik: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Pengguna dipilih: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Pertuturan"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Kelajuan penuding"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Pengawal Permainan"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Teruskan juga"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Batal"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Tetapan pembesaran"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Besarkan menggunakan pintasan"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Besarkan menggunakan pintasan & tiga ketikan"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Perihal <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Teks"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Penukaran data automatik"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Penggunaan data daripada mana-mana SIM bergantung pada liputan dan ketersediaan"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Data sahaja"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Sediakan"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Seterusnya"</string>
diff --git a/res/values-my/arrays.xml b/res/values-my/arrays.xml
index 882b637..c16fdbb 100644
--- a/res/values-my/arrays.xml
+++ b/res/values-my/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"အခမဲ့မဟုတ်အဖြစ် သတ်မှတ်ရန်"</item>
<item msgid="2047166446768045816">"အခမဲ့အဖြစ် သတ်မှတ်ရန်"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"ကျပန်း MAC ကို အသုံးပြုရန် (မူရင်း)"</item>
- <item msgid="741680937828608749">"စက်၏ MAC သုံးရန်"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"မရှိ"</item>
<item msgid="2163015208097377388">"Yes"</item>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index c11172a..17b54fa 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"သင်၏ ကွန်ရက် ချိတ်ဆက်မှုများကို စီမံကွပ်ကဲရန် <xliff:g id="NEW_APP">%s</xliff:g>ကို သုံးရမလား?{"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"လတ်တလောတည်နေရာ တောင်းခံမှုများ"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"အလုပ်ပရိုဖိုင်အတွက် တည်နေရာ"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"အက်ပ်တည်နေရာ ခွင့်ပြုချက်များ"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"တည်နေရာကို ပိတ်ထားသည်"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{အက်ပ် {total} ခုအနက် # ခုက တည်နေရာကို သုံးခွင့်ရှိသည်}other{အက်ပ် {total} ခုအနက် # ခုက တည်နေရာကို သုံးခွင့်ရှိသည်}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"ပြန်သတ်မှတ်ရန်"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"မွမ်းမံပေးရေးကီးကို ရွေးပါ"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> အတွက် ကီးအသစ်ရွေးပါ-"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> အပြင်အဆင်"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"မူရင်း"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"အလိုအလျောက်- <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"အသုံးပြုသူ၏ ရွေးချယ်မှု- <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"စကားသံ"</string>
<string name="pointer_speed" msgid="7398649279282675718">"မြားရွေ့နှုန်း"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"ဂိမ်းထိန်းချုပ်ခြင်း"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"မည်သို့ပင်ဖြစ်စေ ရှေ့ဆက်ရန်"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"မလုပ်တော့"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"ပုံကြီးချဲ့ခြင်း ဆက်တင်များ"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"ဖြတ်လမ်းလင့်ခ်ဖြင့် ချဲ့ခြင်း"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"ဖြတ်လမ်းလင့်ခ်ဖြင့် သုံးချက်တို့ပြီး ချဲ့ပါ"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> အကြောင်း"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"စာတိုများ"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"အလိုအလျောက် ဒေတာပြောင်းခြင်း"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"လိုင်းဆွဲအားနှင့် ရနိုင်မှုပေါ်မူတည်၍ ဆင်းမ်ကတ်တစ်ခုခုမှ ဒေတာကို သုံးပါ"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"ဒေတာသီးသန့်"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"စနစ်ထည့်သွင်းရန်"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"ရှေ့သို့"</string>
diff --git a/res/values-nb/arrays.xml b/res/values-nb/arrays.xml
index 8ad9385..7a4ae0a 100644
--- a/res/values-nb/arrays.xml
+++ b/res/values-nb/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Behandle som med datamåling"</item>
<item msgid="2047166446768045816">"Behandle som uten datamåling"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Bruk tilfeldig MAC-adresse (standard)"</item>
- <item msgid="741680937828608749">"Bruk enhetens MAC-adresse"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Nei"</item>
<item msgid="2163015208097377388">"Ja"</item>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 4cabf8c..81e50c3 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Vil du bruke <xliff:g id="NEW_APP">%s</xliff:g> til å administrere nettverkstilkoblingene?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Nylige posisjonsforespørsler"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Sted for jobbprofil"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Apper med posisjonstillatelse"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Posisjon er slått av"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# av {total} apper har tilgang til posisjon}other{# av {total} apper har tilgang til posisjon}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Tilbakestill"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Velg modifikatortast"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Velg en ny tast for <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Standard"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Tale"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Pekerhastighet"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Spillkontroller"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Fortsett likevel"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Avbryt"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Innstillinger for forstørring"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Forstørr med snarvei"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Forstørr med snarvei og trippeltrykk"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Om <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Tekstmeldinger"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatisk databytte"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Bruk data fra hvilket som helst SIM-kort, avhengig av dekning og tilgjengelighet"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Bare data"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Konfigurer"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Neste"</string>
diff --git a/res/values-ne/arrays.xml b/res/values-ne/arrays.xml
index ce124da..0ac6e52 100644
--- a/res/values-ne/arrays.xml
+++ b/res/values-ne/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"सशुल्क Wi-Fi का रूपमा लिइयोस्"</item>
<item msgid="2047166446768045816">"नि:शुल्क Wi-Fi का रूपमा लिइयोस्"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"क्रमरहित MAC प्रयोग गरियोस् (डिफल्ट)"</item>
- <item msgid="741680937828608749">"डिभाइसको MAC प्रयोग गरियोस्"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"छैन"</item>
<item msgid="2163015208097377388">"हो"</item>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index b3f2bf1..eca106a 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"तपाईँको सञ्जाल जडानहरू व्यवस्थापन गर्न <xliff:g id="NEW_APP">%s</xliff:g> प्रयोग गर्ने?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"हालका स्थान अनुरोधहरू"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"काम प्रोफाइलका लागि स्थान"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"एपलाई दिइएको लोकेसन प्रयोग गर्ने अनुमति"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"लोकेसन अफ छ"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total} मध्ये # एपलाई लोकेसन प्रयोग गर्ने अनुमति दिइएको छ}other{{total} मध्ये # वटा एपलाई लोकेसन प्रयोग गर्ने अनुमति दिइएको छ}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"रिसेट गर्नुहोस्"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"मोडिफायर की छान्नुहोस्"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> को नयाँ की छनौट गर्नुहोस्:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"डिफल्ट"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"बोली"</string>
<string name="pointer_speed" msgid="7398649279282675718">"पोइन्टरको गति"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"खेल नियन्त्रक"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"जे भए पनि जारी राख्नुहोस्"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"रद्द गर्नु…"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"म्याग्निफिकेसनसम्बन्धी सेटिङ"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"सर्टकट प्रयोग गरी म्याग्निफाइ गर्नुहोस्"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"सर्टकट र तीन पटक ट्याप गरेर म्याग्निफाइ गर्नुहोस्"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g>का बारेमा"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"टेक्स्टहरू"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"मोबाइल डेटा स्वतः स्विच हुने सुविधा"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"कभरेज तथा उपलब्धताका आधारमा कुनै एउटा SIM मार्फत मोबाइल डेटा प्रयोग गर्नुहोस्"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"मोबाइल डेटा मात्र"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"सेटअप गर्नुहोस्"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"अर्को"</string>
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
index a572841..a27fbaa 100644
--- a/res/values-night/colors.xml
+++ b/res/values-night/colors.xml
@@ -19,7 +19,7 @@
<color name="homepage_accessibility_background">#783BE5</color>
<color name="homepage_support_background">#3F5FBD</color>
<color name="contextual_card_background">@*android:color/material_grey_900</color>
- <color name="search_bar_background">?androidprv:attr/materialColorSurfaceContainerHigh</color>
+ <color name="search_bar_background">?androidprv:attr/materialColorSurfaceBright</color>
<color name="notification_importance_button_unselected">#5F6368</color>
<!-- Palette list preference colors. -->
diff --git a/res/values-nl/arrays.xml b/res/values-nl/arrays.xml
index dbf12b1..f2171e2 100644
--- a/res/values-nl/arrays.xml
+++ b/res/values-nl/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Behandelen als wifi met datalimiet"</item>
<item msgid="2047166446768045816">"Behandelen als wifi zonder datalimiet"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Gebruik een willekeurig MAC-adres (standaard)"</item>
- <item msgid="741680937828608749">"Gebruik MAC-adres van apparaat"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Nee"</item>
<item msgid="2163015208097377388">"Ja"</item>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index e8f6ac9..3d496cd 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"<xliff:g id="NEW_APP">%s</xliff:g> gebruiken om je netwerkverbindingen te beheren?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Recente locatieverzoeken"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Locatie voor werkprofiel"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Locatierechten voor apps"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Locatie staat uit"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# van {total} apps heeft toegang tot de locatie}other{# van {total} apps hebben toegang tot de locatie}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Resetten"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Functietoets kiezen"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Kies een nieuwe toets voor <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Indeling: <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Standaard"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatisch: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Door de gebruiker geselecteerd: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Spraak"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Snelheid van aanwijzer"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Gamecontroller"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Toch doorgaan"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Annuleren"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Instellingen voor vergroting"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Vergroten met sneltoets"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Vergroten met sneltoets en drie keer tikken"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Over <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Tekstberichten"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatische dataschakeling"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Gebruik data van beide sims, afhankelijk van dekking en beschikbaarheid"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Alleen data"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Instellen"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Volgende"</string>
diff --git a/res/values-or/arrays.xml b/res/values-or/arrays.xml
index a893d93..3ee9806 100644
--- a/res/values-or/arrays.xml
+++ b/res/values-or/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"ମିଟର୍ ହୋଇଥିବା ରୂପେ ବିବେଚନା କରନ୍ତୁ"</item>
<item msgid="2047166446768045816">"ମିଟର୍ ହୋଇନଥିବା ରୂପେ ବିବେଚନା କରନ୍ତୁ"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"ରେଣ୍ଡମାଇଜ୍ଡ MAC ବ୍ୟବହାର କରନ୍ତୁ (ଡିଫଲ୍ଟ)"</item>
- <item msgid="741680937828608749">"MAC ଡିଭାଇସ ବ୍ୟବହାର କରନ୍ତୁ"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"ନା"</item>
<item msgid="2163015208097377388">"ହଁ"</item>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 4e1c843..793e62f 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"ନିଜର ନେଟ୍ୱର୍କ ସଂଯୋଗ ପରିଚାଳନା କରିବା ପାଇଁ <xliff:g id="NEW_APP">%s</xliff:g>ର ବ୍ୟବହାର କରିବେ?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"ବର୍ତ୍ତମାନର ଲୋକେସନ୍ ଅନୁରୋଧ"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ପାଇଁ ଲୋକେସନ୍"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"ଆପର ଲୋକେସନ ଅନୁମତିଗୁଡ଼ିକ"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"ଲୋକେସନ୍ ବନ୍ଦ ଅଛି"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total}ଟିରୁ #ଟି ଆପ୍ସର ଲୋକେସନକୁ ଆକ୍ସେସ ଅଛି}other{{total}ଟିରୁ #ଟି ଆପ୍ସର ଲୋକେସନକୁ ଆକ୍ସେସ ଅଛି}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"ରିସେଟ କରନ୍ତୁ"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"ମୋଡିଫାୟର କୀ ବାଛନ୍ତୁ"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> ପାଇଁ ଏକ ନୂଆ କୀ ବାଛନ୍ତୁ:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"ସ୍ପିଚ"</string>
<string name="pointer_speed" msgid="7398649279282675718">"ପଏଣ୍ଟର୍ର ବେଗ"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"ଗେମ କଣ୍ଟ୍ରୋଲର"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"ଯେ କୌଣସି ମତେ ଜାରି ରଖନ୍ତୁ"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"ବାତିଲ କର"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"ମାଗ୍ନିଫିକେସନ ସେଟିଂସ"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"ସର୍ଟକଟ୍ ସାହାଯ୍ୟରେ ମାଗ୍ନିଫାଏ କରନ୍ତୁ"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"ତିନି ଥର ଟାପ୍ ଓ ସର୍ଟକଟ୍ ସାହାଯ୍ୟରେ ମାଗ୍ନିଫାଏ କରନ୍ତୁ"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> ବିଷୟରେ"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"ଟେକ୍ସଟଗୁଡ଼ିକ"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"ସ୍ୱତଃ ଡାଟା ସୁଇଚିଂ"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"କଭରେଜ ଏବଂ ଉପଲବ୍ଧତା ଉପରେ ନିର୍ଭର କରି ଯେ କୌଣସି SIMରୁ ଡାଟା ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"କେବଳ ଡାଟା"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"ସେଟ ଅପ କରନ୍ତୁ"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"ପରବର୍ତ୍ତୀ"</string>
diff --git a/res/values-pa/arrays.xml b/res/values-pa/arrays.xml
index 998b096..c90412f 100644
--- a/res/values-pa/arrays.xml
+++ b/res/values-pa/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"ਮੀਟਰਬੱਧ ਮੰਨੋ"</item>
<item msgid="2047166446768045816">"ਗੈਰ-ਮੀਟਰਬੱਧ ਮੰਨੋ"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"ਬੇਤਰਤੀਬਵਾਰ MAC (ਪੂਰਵ-ਨਿਰਧਾਰਿਤ) ਵਰਤੋ"</item>
- <item msgid="741680937828608749">"ਡੀਵਾਈਸ MAC ਵਰਤੋ"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"ਨਹੀਂ"</item>
<item msgid="2163015208097377388">"ਹਾਂ"</item>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 36dd82e..73bdcdb 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -1540,6 +1540,7 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"ਕੀ ਆਪਣੇ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰਨ ਲਈ <xliff:g id="NEW_APP">%s</xliff:g> ਵਰਤਣਾ ਹੈ?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"ਹਾਲੀਆ ਟਿਕਾਣਾ ਬੇਨਤੀਆਂ"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਲਈ ਟਿਕਾਣਾ"</string>
+ <string name="private_profile_location_switch_title" msgid="4127119143109855789">"ਪ੍ਰਾਈਵੇਟ ਸਪੇਸ ਦਾ ਟਿਕਾਣਾ"</string>
<string name="location_app_level_permissions" msgid="907206607664629759">"ਐਪ ਦੀਆਂ ਟਿਕਾਣੇ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤਾਂ"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"ਟਿਕਾਣਾ ਬੰਦ ਹੈ"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total} ਵਿੱਚੋਂ # ਐਪ ਕੋਲ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਹੈ}one{{total} ਵਿੱਚੋਂ # ਐਪ ਕੋਲ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਹੈ}other{{total} ਵਿੱਚੋਂ # ਐਪਾਂ ਕੋਲ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਹੈ}}"</string>
@@ -1931,7 +1932,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"ਰੀਸੈੱਟ ਕਰੋ"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"ਸੋਧਕ ਕੁੰਜੀ ਚੁਣੋ"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> ਲਈ ਨਵੀਂ ਕੁੰਜੀ ਚੁਣੋ:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"ਪੂਰਵ-ਨਿਰਧਾਰਿਤ"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"ਬੋਲੀ"</string>
<string name="pointer_speed" msgid="7398649279282675718">"ਪੁਆਇੰਟਰ ਸਪੀਡ"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"ਗੇਮ ਕੰਟ੍ਰੋਲਰ"</string>
@@ -2053,6 +2060,9 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"ਫਿਰ ਵੀ ਜਾਰੀ ਰੱਖੋ"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"ਰੱਦ ਕਰੋ"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"ਵੱਡਦਰਸ਼ੀਕਰਨ ਸੈਟਿੰਗਾਂ"</string>
+ <string name="accessibility_magnification_one_finger_panning_title" msgid="4503949739883092989">"ਇੱਕ ਉਂਗਲ ਨਾਲ ਪੈਨਿੰਗ"</string>
+ <string name="accessibility_magnification_one_finger_panning_summary_on" msgid="9133125894310777539">"ਇੱਕ ਉਂਗਲ ਨਾਲ ਘਸੀਟ ਕੇ ਵੱਡਦਰਸ਼ੀਕਰਨ ਖੇਤਰ ਨੂੰ ਹਿਲਾਓ।"</string>
+ <string name="accessibility_magnification_one_finger_panning_summary_off" msgid="8979146350396559805">"ਦੋ ਉਂਗਲਾਂ ਨਾਲ ਘਸੀਟ ਕੇ ਵੱਡਦਰਸ਼ੀਕਰਨ ਖੇਤਰ ਨੂੰ ਹਿਲਾਓ।"</string>
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"ਸ਼ਾਰਟਕੱਟ ਨਾਲ ਵੱਡਾ ਕਰੋ"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"ਸ਼ਾਰਟਕੱਟ ਅਤੇ ਤਿੰਨ-ਟੈਪ ਨਾਲ ਵੱਡਾ ਕਰੋ"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> ਬਾਰੇ"</string>
@@ -4630,6 +4640,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"ਲਿਖਤ ਸੁਨੇਹੇ"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"ਆਪਣੇ ਆਪ ਡਾਟਾ ਸਵਿੱਚ ਹੋਣਾ"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"ਕਵਰੇਜ ਅਤੇ ਉਪਲਬਧਤਾ ਦੇ ਆਧਾਰ \'ਤੇ ਕਿਸੇ ਵੀ ਸਿਮ ਤੋਂ ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"ਸਿਰਫ਼ ਡਾਟਾ"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"ਸੈੱਟਅੱਪ ਕਰੋ"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"ਅੱਗੇ"</string>
diff --git a/res/values-pl/arrays.xml b/res/values-pl/arrays.xml
index 04202aa..76eea67 100644
--- a/res/values-pl/arrays.xml
+++ b/res/values-pl/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Traktuj jako sieć z pomiarem użycia danych"</item>
<item msgid="2047166446768045816">"Traktuj jako sieć bez pomiaru użycia danych"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Randomizowany MAC (domyślnie)"</item>
- <item msgid="741680937828608749">"Używaj adresu MAC urządzenia"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Nie"</item>
<item msgid="2163015208097377388">"Tak"</item>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 3fa5dcc..211a1d2 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Używać <xliff:g id="NEW_APP">%s</xliff:g> do zarządzania połączeniami sieciowymi?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Ostatnie prośby o lokalizację"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Lokalizacja dla profilu służbowego"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Dostęp do lokalizacji"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Lokalizacja jest wyłączona"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# z {total} aplikacji ma dostęp do lokalizacji}few{# z {total} aplikacji mają dostęp do lokalizacji}many{# z {total} aplikacji ma dostęp do lokalizacji}other{# z {total} aplikacji ma dostęp do lokalizacji}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Resetuj"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Wybierz klawisz modyfikujący"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Wybierz nowy klawisz jako <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Układ <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Domyślny"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automatyczny: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Wybrany przez użytkownika: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Mowa"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Szybkość wskaźnika"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Kontroler gier"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Kontynuuj mimo to"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Anuluj"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Ustawienia powiększenia"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Powiększanie skrótem"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Powiększanie skrótem i trzykrotnym kliknięciem"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> – informacje"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"SMS-y"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatyczne przełączanie danych"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Użyj mobilnej transmisji danych z dowolnej karty SIM w zależności od zasięgu i dostępności"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Tylko dane"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Skonfiguruj"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Dalej"</string>
diff --git a/res/values-pt-rBR/arrays.xml b/res/values-pt-rBR/arrays.xml
index 302e554..d3af579 100644
--- a/res/values-pt-rBR/arrays.xml
+++ b/res/values-pt-rBR/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Tratar como limitada"</item>
<item msgid="2047166446768045816">"Tratar como ilimitada"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Usar MAC aleatório (padrão)"</item>
- <item msgid="741680937828608749">"Usar MAC do dispositivo"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Não"</item>
<item msgid="2163015208097377388">"Sim"</item>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index 8271edc..1b75ea2 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Usar <xliff:g id="NEW_APP">%s</xliff:g> para gerenciar suas conexões de rede?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Solicitações recentes"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Local do perfil de trabalho"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Permissões de acesso ao local"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Localização desativada"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# app de {total} tem acesso à localização}one{# app de {total} tem acesso à localização}other{# apps de {total} têm acesso à localização}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Redefinir"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Escolher a tecla modificadora"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Escolha uma nova tecla para <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Layout do <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Padrão"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automático: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Usuário selecionado: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Fala"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Velocidade do cursor"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Controlador de jogos"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continuar mesmo assim"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Cancelar"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Configurações de ampliação"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Ampliar com atalho"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Ampliar com atalho e toque triplo"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Sobre <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Mensagens de texto"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Troca de dados automática"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Usar dados de qualquer chip dependendo da cobertura e disponibilidade"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Somente dados"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Configurar"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Próxima"</string>
diff --git a/res/values-pt-rPT/arrays.xml b/res/values-pt-rPT/arrays.xml
index d2606cb..b5efffe 100644
--- a/res/values-pt-rPT/arrays.xml
+++ b/res/values-pt-rPT/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Tratar como acesso limitado"</item>
<item msgid="2047166446768045816">"Tratar como acesso ilimitado"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Usar MAC aleatório (predefinição)"</item>
- <item msgid="741680937828608749">"Usar MAC do dispositivo"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Não"</item>
<item msgid="2163015208097377388">"Sim"</item>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 319716b..edb3101 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Usar <xliff:g id="NEW_APP">%s</xliff:g> para gerir as ligações de rede?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Pedidos de localização recentes"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Local. para perfil de trabalho"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Autorizações de localização das apps"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"A localização está desativada"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# de {total} apps tem acesso à localização}other{# de {total} apps têm acesso à localização}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Repor"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Escolha uma tecla de modificação"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Escolha uma nova tecla para <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Predefinição"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Voz"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Velocidade do ponteiro"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Controlador de Jogos"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continuar mesmo assim"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Cancelar"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Definições de ampliação"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Amplie com um atalho"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Amplie com um atalho e três toques"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Acerca de <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Mensagens de texto"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Comutação automática de dados"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Use dados de qualquer um dos SIMs, consoante a cobertura e a disponibilidade"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Apenas de dados"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Configurar"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Seguinte"</string>
diff --git a/res/values-pt/arrays.xml b/res/values-pt/arrays.xml
index 302e554..d3af579 100644
--- a/res/values-pt/arrays.xml
+++ b/res/values-pt/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Tratar como limitada"</item>
<item msgid="2047166446768045816">"Tratar como ilimitada"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Usar MAC aleatório (padrão)"</item>
- <item msgid="741680937828608749">"Usar MAC do dispositivo"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Não"</item>
<item msgid="2163015208097377388">"Sim"</item>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 8271edc..1b75ea2 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Usar <xliff:g id="NEW_APP">%s</xliff:g> para gerenciar suas conexões de rede?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Solicitações recentes"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Local do perfil de trabalho"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Permissões de acesso ao local"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Localização desativada"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# app de {total} tem acesso à localização}one{# app de {total} tem acesso à localização}other{# apps de {total} têm acesso à localização}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Redefinir"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Escolher a tecla modificadora"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Escolha uma nova tecla para <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Layout do <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Padrão"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Automático: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Usuário selecionado: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Fala"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Velocidade do cursor"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Controlador de jogos"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continuar mesmo assim"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Cancelar"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Configurações de ampliação"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Ampliar com atalho"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Ampliar com atalho e toque triplo"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Sobre <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Mensagens de texto"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Troca de dados automática"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Usar dados de qualquer chip dependendo da cobertura e disponibilidade"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Somente dados"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Configurar"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Próxima"</string>
diff --git a/res/values-ro/arrays.xml b/res/values-ro/arrays.xml
index b44dfcd..a9b90a2 100644
--- a/res/values-ro/arrays.xml
+++ b/res/values-ro/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Tratează ca fiind contorizată"</item>
<item msgid="2047166446768045816">"Tratează ca fiind necontorizată"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Folosește o adresă MAC aleatorie (prestabilit)"</item>
- <item msgid="741680937828608749">"Folosește adresa MAC a dispozitivului"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Nu"</item>
<item msgid="2163015208097377388">"Da"</item>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 2be0c0b..ac08c73 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Folosești <xliff:g id="NEW_APP">%s</xliff:g> pentru a gestiona conexiunile la rețea?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Solicitări recente ale locației"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Locație pt. profil de serviciu"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Permisiuni pentru locație"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Locația este dezactivată"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# din {total} aplicații are acces la locație}few{# din {total} aplicații au acces la locație}other{# din {total} de aplicații au acces la locație}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Resetează"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Alege tasta de modificare"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Alege o nouă tastă pentru <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Prestabilit"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Voce"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Viteza indicatorului"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Controler de joc"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Continuă oricum"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Anulează"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Setări pentru mărire"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Mărește folosind scurtătura"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Mărește folosind scurtătura și atingând de trei ori"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Despre <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Mesaje text"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Comutarea automată a datelor"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Folosește date de pe orice card SIM, în funcție de acoperire și de disponibilitate"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Numai pentru date"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Configurează"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Înainte"</string>
diff --git a/res/values-ru/arrays.xml b/res/values-ru/arrays.xml
index 869ce51..dd79b82 100644
--- a/res/values-ru/arrays.xml
+++ b/res/values-ru/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"С тарификацией"</item>
<item msgid="2047166446768045816">"Без тарификации"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Случайный MAC-адрес (по умолчанию)"</item>
- <item msgid="741680937828608749">"MAC-адрес устройства"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Нет"</item>
<item msgid="2163015208097377388">"Да"</item>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 713143c..2fcb7b6 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Использовать приложение \"<xliff:g id="NEW_APP">%s</xliff:g>\" для управления сетевыми подключениями?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Последние запросы местоположения"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Геоданные для рабочего профиля"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Доступ приложений к геоданным"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Доступ к геоданным отключен"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# приложение из {total} имеет доступ к данным о местоположении}one{# приложение из {total} имеет доступ к данным о местоположении}few{# приложения из {total} имеют доступ к данным о местоположении}many{# приложений из {total} имеют доступ к данным о местоположении}other{# приложения из {total} имеют доступ к данным о местоположении}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Сбросить"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Выбор клавиши-модификатора"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Выберите новую клавишу для <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"По умолчанию"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Речь"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Скорость указателя"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Игровые контроллеры"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Продолжить"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Отмена"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Настройки увеличения"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Увеличение с помощью кнопки"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Увеличение с помощью кнопки и по тройному нажатию"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"О функции \"<xliff:g id="SERVICE">%1$s</xliff:g>\""</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Текстовые сообщения"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Автопереключение моб. трафика"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Используйте мобильный трафик любой SIM-карты в зависимости от покрытия и доступности."</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Только доступ к интернету"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Настроить"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Далее"</string>
diff --git a/res/values-si/arrays.xml b/res/values-si/arrays.xml
index 7601af6..39feb72 100644
--- a/res/values-si/arrays.xml
+++ b/res/values-si/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"මනින ලද ලෙස සලකන්න"</item>
<item msgid="2047166446768045816">"නොමනින ලද ලෙස සලකන්න"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"අහඹු කළ MAC භාවිත කරන්න (පෙරනිමි)"</item>
- <item msgid="741680937828608749">"MAC උපාංගය භාවිත කරන්න"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"නැත"</item>
<item msgid="2163015208097377388">"ඔව්"</item>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index e527259..9980963 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"ඔබගේ ජාල සම්බන්ධතා කළමනාකරණය කිරීමට <xliff:g id="NEW_APP">%s</xliff:g> භාවිතා කරන්නද?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"මෑත කාලීන ස්ථාන ඉල්ලීම්"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"කාර්යාල පැතිකඩ සඳහා ස්ථානය"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"යෙදුම් ස්ථාන අවසර"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"ස්ථානය ක්රියාවිරහිතයි"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{යෙදුම් {total}න් #කට ස්ථානයට ප්රවේශය ඇත}one{යෙදුම් {total}න් #කට ස්ථානයට ප්රවේශය ඇත}other{යෙදුම් {total}න් #කට ස්ථානයට ප්රවේශය ඇත}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"යළි සකසන්න"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"සංස්කාරක යතුර තෝරා ගන්න"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> සඳහා නව යතුරක් තෝරා ගන්න:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"පෙරනිමි"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"කථනය"</string>
<string name="pointer_speed" msgid="7398649279282675718">"දර්ශක වේගය"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"ක්රීඩා පාලකය"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"කෙසේ වෙතත් ඉදිරියට යන්න"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"අවලංගු කරන්න"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"විශාලන සැකසීම්"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"කෙටිමඟ සමඟ විශාලන කරන්න"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"කෙටිමඟ සහ තට්ටු කිරීම් තුනක් සමඟ විශාලන කරන්න"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> පිළිබඳ"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"පෙළ"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"ස්වයංක්රීය දත්ත මාරු කිරීම"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"ආවරණය සහ ලබා ගැනීමේ හැකියාව මත පදනම්ව කිනම් හෝ SIM එකකින් දත්ත භාවිතා කරන්න"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"දත්ත පමණි"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"පිහිටුවන්න"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"මීළඟ"</string>
diff --git a/res/values-sk/arrays.xml b/res/values-sk/arrays.xml
index cfd3db8..48e13d6 100644
--- a/res/values-sk/arrays.xml
+++ b/res/values-sk/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Považovať za meranú sieť"</item>
<item msgid="2047166446768045816">"Považovať za nemeranú sieť"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Náhodná adresa MAC (predvol.)"</item>
- <item msgid="741680937828608749">"Používať adresu MAC zariadenia"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Nie"</item>
<item msgid="2163015208097377388">"Áno"</item>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 0817c9b..6dc0e22 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Chcete spravovať sieťové pripojenia pomocou aplikácie <xliff:g id="NEW_APP">%s</xliff:g>?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Nedávne žiadosti o polohu"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Poloha pre pracovný profil"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Prístup aplikácií k polohe"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Poloha je vypnutá"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{Prístup k polohe má # z {total} aplikácií}few{Prístup k polohe majú # z {total} aplikácií}many{# of {total} apps have access to location}other{Prístup k polohe má # z {total} aplikácií}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Resetovať"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Vyberte modifikačný kláves"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Vyberte pre <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> nový kláves:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Predvolené"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Reč"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Rýchlosť kurzora"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Herné ovládače"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Aj tak pokračovať"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Zrušiť"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Nastavenia priblíženia"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Priblíženie skratkou"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Priblíženie skratkou a trojitým klepnutím"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Textové správy"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatické prepínanie dát"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"V závislosti od pokrytia a dostupnosti môžete používať dáta oboch SIM kariet"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Iba dáta"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Nastaviť"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Ďalej"</string>
diff --git a/res/values-sl/arrays.xml b/res/values-sl/arrays.xml
index 17a3c79..7efa5e1 100644
--- a/res/values-sl/arrays.xml
+++ b/res/values-sl/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Obravnavaj kot: omejen prenos podatkov"</item>
<item msgid="2047166446768045816">"Obravnavaj kot: neomejen prenos podatkov"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Uporabi naključni MAC (privzeto)"</item>
- <item msgid="741680937828608749">"Uporabi naslov MAC naprave"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Ne"</item>
<item msgid="2163015208097377388">"Da"</item>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 11292bb..1536cba 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Želite za upravljanje omrežnih povezav uporabljati aplikacijo <xliff:g id="NEW_APP">%s</xliff:g>?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Nedavne zahteve za lokacijo"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Lokacija za delovni profil"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Dovoljenja aplikacij za lokacijo"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Zaznavanje lokacije je izklopljeno."</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{Dostop do lokacije ima # aplikacija od {total}.}one{Dostop do lokacije ima # aplikacija od {total}.}two{Dostop do lokacije imata # aplikaciji od {total}.}few{Dostop do lokacije imajo # aplikacije od {total}.}other{Dostop do lokacije ima # aplikacij od {total}.}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Ponastavi"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Izbira modifikatorske tipke"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Izberite novo tipko za »<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>«:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Postavitev <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Privzeto"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Samodejno: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Uporabniško izbrano: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Govor"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Hitrost kazalca"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Krmilnik za igre"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Vseeno nadaljuj"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Prekliči"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Nastavitve povečave"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Povečanje z bližnjico"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Povečanje z bližnjico in trikratnim dotikom"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"O funkciji »<xliff:g id="SERVICE">%1$s</xliff:g>«"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Sporočila SMS"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Samodejni preklop prenosa podatkov"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Uporaba prenosa podatkov prek ene ali druge kartice SIM, odvisno od pokritosti in razpoložljivosti"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Samo prenos podatkov"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Nastavi"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Naprej"</string>
diff --git a/res/values-sq/arrays.xml b/res/values-sq/arrays.xml
index 0fd29d9..ed2f984 100644
--- a/res/values-sq/arrays.xml
+++ b/res/values-sq/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Trajto si me matje"</item>
<item msgid="2047166446768045816">"Trajto si pa matje"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Përdor adresë MAC të rastësishme (parazgjedhje)"</item>
- <item msgid="741680937828608749">"Përdor adresën MAC të pajisjes"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Jo"</item>
<item msgid="2163015208097377388">"Po"</item>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index ea5d9b8..80ab818 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Të përdoret <xliff:g id="NEW_APP">%s</xliff:g> për të menaxhuar lidhjet e rrjetit?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Kërkesat e vendndodhjeve të fundit"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Vend. për profilin e punës"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Lejet e vendndodhjes për aplikacionet"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Vendndodhja është joaktive"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# nga {total} aplikacione ka qasje te vendndodhja}other{# nga {total} aplikacione kanë qasje te vendndodhja}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Rivendos"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Zgjidh tastin modifikues"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Zgjidh një çelës të ri për <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"E parazgjedhur"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Ligjërimi"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Shpejtësia e treguesit"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Kontrolluesi i lojës"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Vazhdo gjithsesi"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Anulo"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Cilësimet e zmadhimit"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Zmadho me shkurtore"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Zmadho me shkurtore dhe tri trokitje"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Rreth \"<xliff:g id="SERVICE">%1$s</xliff:g>\""</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Mesazhet me tekst"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Ndërrimi automatik për të dhënat"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Përdor të dhënat nga cilado kartë SIM në varësi të mbulimit dhe disponueshmërisë"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Vetëm për të dhënat"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Konfiguro"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Para"</string>
diff --git a/res/values-sr/arrays.xml b/res/values-sr/arrays.xml
index 4ecb26d..9884e06 100644
--- a/res/values-sr/arrays.xml
+++ b/res/values-sr/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Третирај као мрежу са ограничењем"</item>
<item msgid="2047166446768045816">"Третирај као мрежу без ограничења"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Користи насумичну MAC адресу (подразумевано)"</item>
- <item msgid="741680937828608749">"Користи MAC адресу уређаја"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Не"</item>
<item msgid="2163015208097377388">"Да"</item>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 731f3f0..b12e29c 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Желите ли да користите апликацију <xliff:g id="NEW_APP">%s</xliff:g> за управљање мрежним везама?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Недавни захтеви за локацију"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Локација за пословни профил"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Дозволе за локацију апликације"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Локација је искључена"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{Приступ локацији има # апликација од {total}}one{Приступ локацији има # апликација од {total}}few{Приступ локацији имају # апликације од {total}}other{Приступ локацији има # апликација од {total}}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Ресетуј"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Одаберите модификујући тастер"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Одаберите нови тастер за <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Распоред <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Подразумевано"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Аутоматски: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Изабрао је корисник: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Говор"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Брзина показивача"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Контролер за игре"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Ипак настави"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Откажи"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Подешавања увећања"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Увећавајте помоћу пречице"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Увећавајте помоћу пречице и троструког додира"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"О услузи <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"SMS поруке"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Ауто. замена преноса података"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Користи пренос података са било ког SIM-а у зависности од покривености и доступности"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Само пренос података"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Подеси"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Даље"</string>
diff --git a/res/values-sv/arrays.xml b/res/values-sv/arrays.xml
index b311e99..5c30761 100644
--- a/res/values-sv/arrays.xml
+++ b/res/values-sv/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Behandla som nätverk med datapriser"</item>
<item msgid="2047166446768045816">"Behandla som nätverk utan datapriser"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Slumpgenererad MAC-adress (standard)"</item>
- <item msgid="741680937828608749">"Använd enhetens MAC-adress"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Nej"</item>
<item msgid="2163015208097377388">"Ja"</item>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index bf5d10f..4951ead 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Vill du hantera nätverksanslutningarna med <xliff:g id="NEW_APP">%s</xliff:g>?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Nya platsförfrågningar"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Plats för jobbprofil"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Appars platsbehörighet"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Plats har inaktiverats"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# av {total} appar har platsåtkomst}other{# av {total} appar har platsåtkomst}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Återställ"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Välj specialtangent"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Välj en ny tangent för <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Standard"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Tal"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Markörens hastighet"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Spelkontroller"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Fortsätt ändå"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Avbryt"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Inställningar för förstoring"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Förstora med genväg"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Förstora med genväg och tryck snabbt tre gånger"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Om <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Sms"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Automatiskt databyte"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Använd data från båda SIM-korten beroende på täckning och tillgänglighet"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Endast data"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Ställ in"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Nästa"</string>
diff --git a/res/values-sw/arrays.xml b/res/values-sw/arrays.xml
index 947c928..d0e6cf1 100644
--- a/res/values-sw/arrays.xml
+++ b/res/values-sw/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Tumia kama mtandao unaopima data"</item>
<item msgid="2047166446768045816">"Tumia kama mtandao usiopima data"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Anwani ya MAC ya nasibu (chaguomsingi)"</item>
- <item msgid="741680937828608749">"Tumia anwani ya MAC ya kifaa"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Hapana"</item>
<item msgid="2163015208097377388">"Ndiyo"</item>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 666d19f..4d36f3d 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Ungependa kutumia <xliff:g id="NEW_APP">%s</xliff:g> kusimamia miunganisho yako ya mtandao?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Maombi ya hivi karibuni ya kutambua mahali"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Wasifu wa kazi kutambua mahali"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Ruhusa za programu kufikia mahali"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Utambuzi wa mahali umezimwa"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{Programu # kati ya {total} ina idhini ya kufikia data ya mahali}other{Programu # kati ya {total} zina idhini ya kufikia data ya mahali}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Weka upya"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Chagua kitufe cha kurekebisha"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Chagua kitufe kipya cha kurekebisha cha <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Muundo wa <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Chaguomsingi"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Otomatiki: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Uliochaguliwa na mtumiaji: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Kutamka"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Kasi ya kiashiria"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Kidhibiti cha Mchezo"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Endelea tu"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Ghairi"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Mipangilio ya ukuzaji"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Kuza kwa njia ya mkato"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Kuza ukitumia njia ya mkato na kugonga mara tatu"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Kuhusu <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Ujumbe"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Kubadilisha muunganisho wa data kiotomatiki"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Tumia muunganisho wa data wa SIM yoyote kulingana na ufikiaji na upatikanaji"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Data pekee"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Weka mipangilio"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Endelea"</string>
diff --git a/res/values-ta/arrays.xml b/res/values-ta/arrays.xml
index 0419f0d..a2d119c 100644
--- a/res/values-ta/arrays.xml
+++ b/res/values-ta/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"டேட்டா அளவிடப்பட்டது"</item>
<item msgid="2047166446768045816">"டேட்டா அளவிடப்படாதது"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"ரேண்டம் MACகைப் பயன்படுத்து (இயல்புநிலை)"</item>
- <item msgid="741680937828608749">"சாதன MACகைப் பயன்படுத்து"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"இல்லை"</item>
<item msgid="2163015208097377388">"ஆம்"</item>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index e240e09..1847871 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"நெட்வொர்க் இணைப்புகளை நிர்வகிக்க <xliff:g id="NEW_APP">%s</xliff:g>ஐப் பயன்படுத்தவா?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"சமீபத்திய இருப்பிடக் கோரிக்கைகள்"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"பணி சுயவிவரத்திற்கான இருப்பிடம்"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"ஆப்ஸுக்கான இருப்பிட அனுமதிகள்"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"இருப்பிடம் ஆஃப் செய்யப்பட்டுள்ளது"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total} ஆப்ஸில் # ஆப்ஸ் இருப்பிட அணுகலைப் பெற்றுள்ளது}other{{total} ஆப்ஸில் # ஆப்ஸ் இருப்பிட அணுகலைப் பெற்றுள்ளன}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"ரீசெட்"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"மாற்றி விசையைத் தேர்வுசெய்தல்"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>க்கு புதிய விசையை தேர்வுசெய்யலாம்:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> தளவமைப்பு"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"இயல்பு"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"தானியங்கு: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"பயனர் தேர்ந்தெடுத்தது: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"பேச்சு"</string>
<string name="pointer_speed" msgid="7398649279282675718">"குறிப்பான் வேகம்"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"கேம் கன்ட்ரோலர்"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"பரவாயில்லை, தொடர்க"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"ரத்துசெய்"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"பெரிதாக்கல் அமைப்புகள்"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"ஷார்ட்கட் மூலம் பெரிதாக்குதல்"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"ஷார்ட்கட் & 3 முறை தட்டுவதன் மூலம் பெரிதாக்கலாம்"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> பற்றிய அறிமுகம்"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"மெசேஜ்கள்"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"தானியங்கு டேட்டா மாற்றம்"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"கவரேஜ் மற்றும் கிடைக்கும் நிலையைப் பொறுத்து சிம்மில் இருந்து டேட்டாவைப் பயன்படுத்தும்"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"டேட்டா மட்டும்"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"அமை"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"அடுத்து"</string>
diff --git a/res/values-te/arrays.xml b/res/values-te/arrays.xml
index a8ff15b..fd6ec91 100644
--- a/res/values-te/arrays.xml
+++ b/res/values-te/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"లెక్కించబడేదానిగా పరిగణించండి"</item>
<item msgid="2047166446768045816">"లెక్కించబడనిదిగా పరిగణించండి"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"ర్యాండమ్గా రూపొందించిన MAC అడ్రస్ను ఉపయోగించండి (ఆటోమేటిక్)"</item>
- <item msgid="741680937828608749">"పరికర MAC అడ్రస్ని ఉపయోగించండి"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"లేదు"</item>
<item msgid="2163015208097377388">"అవును"</item>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 0b19b55..0b0665c 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"మీ నెట్వర్క్ కనెక్షన్లను మేనేజ్ చేయడానికి <xliff:g id="NEW_APP">%s</xliff:g>ని ఉపయోగించాలా?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"లొకేషన్ను ఇటీవల రిక్వెస్ట్ చేసినవి"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"ఆఫీస్ ప్రొఫైల్ కోసం లొకేషన్"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"యాప్ లొకేషన్ అనుమతులు"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"లొకేషన్ ఆఫ్లో ఉంది"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total} యాప్లలో # యాప్నకు లొకేషన్కు యాక్సెస్ ఉంది}other{{total} యాప్లలో # యాప్లకు లొకేషన్కు యాక్సెస్ ఉంది}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"రీసెట్ చేయండి"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"మోడిఫయర్ కీని ఎంచుకోండి"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> కొసం కొత్త కీని ఎంచుకోండి:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"ఆటోమేటిక్"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"స్పీచ్"</string>
<string name="pointer_speed" msgid="7398649279282675718">"పాయింటర్ వేగం"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"గేమ్ కంట్రోలర్"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"ఏదేమైనా కొనసాగించండి"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"రద్దు చేయండి"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"మ్యాగ్నిఫికేషన్ సెట్టింగ్లు"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"షార్ట్కట్తో మ్యాగ్నిఫై చేయండి"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"షార్ట్కట్తో, మూడుసార్లు నొక్కి మ్యాగ్నిఫై చేయండి"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"\'<xliff:g id="SERVICE">%1$s</xliff:g>\' పరిచయం"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"టెక్స్ట్లు"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"ఆటోమేటిక్గా డేటాను మార్చడం"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"కవరేజ్, లభ్యత ఆధారంగా ఏదైనా SIM నుండి డేటాను ఉపయోగించండి"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"డేటా మాత్రమే"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"సెటప్ చేయండి"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"తర్వాత"</string>
diff --git a/res/values-th/arrays.xml b/res/values-th/arrays.xml
index b152cc0..c5d5457 100644
--- a/res/values-th/arrays.xml
+++ b/res/values-th/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"ถือว่ามีการจำกัดปริมาณอินเทอร์เน็ต"</item>
<item msgid="2047166446768045816">"ถือว่าไม่มีการจำกัดปริมาณอินเทอร์เน็ต"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"ใช้ที่อยู่ MAC แบบสุ่ม (ค่าเริ่มต้น)"</item>
- <item msgid="741680937828608749">"ใช้ที่อยู่ MAC ของอุปกรณ์"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"ไม่"</item>
<item msgid="2163015208097377388">"ใช่"</item>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 75231d0..7244d70 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"ใช้ <xliff:g id="NEW_APP">%s</xliff:g> ในการจัดการการเชื่อมต่อเครือข่ายใช่ไหม"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"คำขอตำแหน่งล่าสุด"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"ตำแหน่งสำหรับโปรไฟล์งาน"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"สิทธิ์เข้าถึงตำแหน่งสำหรับแอป"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"ตำแหน่งปิดอยู่"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# จาก {total} แอปมีสิทธิ์เข้าถึงตำแหน่ง}other{# จาก {total} แอปมีสิทธิ์เข้าถึงตำแหน่ง}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"รีเซ็ต"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"เลือกแป้นกดร่วม"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"เลือกคีย์ใหม่สำหรับ <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"เลย์เอาต์ <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"ค่าเริ่มต้น"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"อัตโนมัติ: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"ผู้ใช้เลือก: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"เสียงพูด"</string>
<string name="pointer_speed" msgid="7398649279282675718">"ความเร็วของตัวชี้"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"อุปกรณ์ควบคุมเกม"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"ดำเนินการต่อ"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"ยกเลิก"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"การตั้งค่าการขยาย"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"ขยายโดยใช้ทางลัด"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"ขยายโดยใช้ทางลัดและการแตะ 3 ครั้ง"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"เกี่ยวกับ \"<xliff:g id="SERVICE">%1$s</xliff:g>\""</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"ข้อความ"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"การเปลี่ยนการเชื่อมต่ออินเทอร์เน็ตอัตโนมัติ"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"ใช้การเชื่อมต่ออินเทอร์เน็ตจากซิมใดก็ได้โดยขึ้นอยู่กับการครอบคลุมและความพร้อมใช้งาน"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"ใช้เชื่อมต่ออินเทอร์เน็ตเท่านั้น"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"ตั้งค่า"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"ถัดไป"</string>
diff --git a/res/values-tl/arrays.xml b/res/values-tl/arrays.xml
index 65183a2..cca3a6b 100644
--- a/res/values-tl/arrays.xml
+++ b/res/values-tl/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Ituring bilang nakametro"</item>
<item msgid="2047166446768045816">"Ituring bilang hindi nakametro"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Gamitin ang na-randomize na MAC (default)"</item>
- <item msgid="741680937828608749">"Gamitin ang device MAC"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Hindi"</item>
<item msgid="2163015208097377388">"Oo"</item>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 835496d..41c6587 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Gamitin ang <xliff:g id="NEW_APP">%s</xliff:g> upang pamahalaan ang iyong mga koneksyon sa network?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Kamakailang hiling sa lokasyon"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Lokayon ng profile sa trabaho"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Pahintulot sa lokasyon ng app"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Naka-off ang lokasyon"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# sa {total} app ang may access sa lokasyon}one{# sa {total} app ang may access sa lokasyon}other{# sa {total} na app ang may access sa lokasyon}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"I-reset"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Pumili ng modifier key"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Pumili ng bagong key para sa <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Layout na <xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Default"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Awtomatiko: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Napiling user: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Pagsasalita"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Bilis ng pointer"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Game Controller"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Magpatuloy pa rin"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Kanselahin"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Mga setting ng pag-magnify"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Mag-magnify gamit ang shortcut"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Mag-magnify gamit ang shortcut at pag-triple tap"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Tungkol sa <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Mga Text"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Awtomatikong paglipat ng data"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Gumamit ng data mula sa alinmang SIM depende sa sakop at availability"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Data lang"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"I-set up"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Susunod"</string>
diff --git a/res/values-tr/arrays.xml b/res/values-tr/arrays.xml
index aadd3bb..8545083 100644
--- a/res/values-tr/arrays.xml
+++ b/res/values-tr/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Sayaçlı gibi kullan"</item>
<item msgid="2047166446768045816">"Sayaçsız gibi kullan"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Rastgele MAC adresi kullan (varsayılan)"</item>
- <item msgid="741680937828608749">"Cihazın MAC adresini kullan"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Hayır"</item>
<item msgid="2163015208097377388">"Evet"</item>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 718ffb3..883c940 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Ağ bağlantılarınızı yönetmek için <xliff:g id="NEW_APP">%s</xliff:g> kullanılsın mı?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Son konum istekleri"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"İş profili konumu"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Uygulama konum izinleri"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Konum özelliği kapalı"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{#/{total} uygulamanın konuma erişimi var}other{#/{total} uygulamanın konuma erişimi var}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Sıfırla"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Değiştirici tuşu seçin"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> için yeni bir tuş seçin:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> düzeni"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Varsayılan"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Otomatik: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Kullanıcı tarafından <xliff:g id="LAYOUT_LABEL">%s</xliff:g> seçildi"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Konuşma"</string>
<string name="pointer_speed" msgid="7398649279282675718">"İşaretçi hızı"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Oyun Denetleyici"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Yine de devam et"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"İptal"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Büyütme ayarları"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Kısayolla büyütme"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Kısayolla ve üç kez dokunarak büyütme"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> hakkında"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Kısa mesajlar"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Otomatik veri geçişi"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Kapsam alanına ve kullanılabilirliğe bağlı olarak iki SIM\'den birindeki verileri kullanın"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Yalnızca veri"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Ayarla"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Sonraki"</string>
diff --git a/res/values-uk/arrays.xml b/res/values-uk/arrays.xml
index 3e3d152..cfbf474 100644
--- a/res/values-uk/arrays.xml
+++ b/res/values-uk/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Вважати тарифікованою"</item>
<item msgid="2047166446768045816">"Вважати нетарифікованою"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Довільна MAC-адреса (за умовчанням)"</item>
- <item msgid="741680937828608749">"MAC-адреса пристрою"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Ні"</item>
<item msgid="2163015208097377388">"Так"</item>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 4beac47..cee25b2 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Використовувати <xliff:g id="NEW_APP">%s</xliff:g> для керування з’єднаннями?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Останні запити на геодані"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Геодані для робочого профілю"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Доступ додатків до геоданих"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Передавання геоданих вимкнено"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# додаток із {total} має доступ до геоданих}one{# додаток із {total} має доступ до геоданих}few{# додатки із {total} мають доступ до геоданих}many{# додатків із {total} мають доступ до геоданих}other{# додатка із {total} мають доступ до геоданих}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Скинути"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Вибрати клавішу-модифікатор"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Виберіть нову клавішу для <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"За умовчанням"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Мовлення"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Швидкість курсора"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Ігровий контролер"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Усе одно продовжити"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Скасувати"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Налаштування збільшення"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Збільшувати кнопкою/жестом"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Збільшувати кнопкою й потрійним дотиком"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Про сервіс <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"SMS"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Автом. перемикання моб. даних"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Використовувати мобільний трафік із будь-якої SIM-карти залежно від покриття й доступності"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Лише мобільний Інтернет"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Налаштувати"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Далі"</string>
diff --git a/res/values-ur/arrays.xml b/res/values-ur/arrays.xml
index f7d90a7..89358e2 100644
--- a/res/values-ur/arrays.xml
+++ b/res/values-ur/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"میٹر شدہ کے بطور خیال کریں"</item>
<item msgid="2047166446768045816">"غیر میٹر شدہ کے بطور خیال کریں"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"بے ترتیب MAC کا استعمال کریں (ڈیفالٹ)"</item>
- <item msgid="741680937828608749">"آلہ کا MAC استعمال کریں"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"نہیں"</item>
<item msgid="2163015208097377388">"ہاں"</item>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 2321dd8..6bcde0c 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"اپنے نیٹ ورک کنکشنز کا نظم کرنے کیلئے <xliff:g id="NEW_APP">%s</xliff:g> کا استعمال کریں؟"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"حالیہ مقام کی درخواستیں"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"دفتری پروفائل کیلئے مقام"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"ایپ کے لیے مقام کی اجازتیں"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"مقام آف ہے"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{{total} میں سے # ایپس کو مقام تک رسائی حاصل ہے}other{{total} میں سے # ایپس کو مقام تک رسائی حاصل ہے}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"ری سیٹ کریں"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"موڈیفائر کلید منتخب کریں"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> کے لیے نئی کلید منتخب کریں:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"ڈیفالٹ"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"اسپیچ"</string>
<string name="pointer_speed" msgid="7398649279282675718">"پوائنٹر کی رفتار"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"گیم کنٹرولر"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"بہر حال جاری رکھیں"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"منسوخ کریں"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"میگنیفکیشن کی ترتیبات"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"شارٹ کٹ سے بڑا کریں"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"شارٹ کٹ اور تین بار تھپتھپانے سے بڑا کریں"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> کے بارے میں"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"ٹیکسٹس"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"خودکار طور پر ڈیٹا سوئچ کرنا"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"کوریج اور دستیابی کے لحاظ سے کسی بھی SIM سے ڈیٹا کا استعمال کریں"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"صرف ڈیٹا"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"سیٹ اپ کریں"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"آگے جائیں"</string>
diff --git a/res/values-uz/arrays.xml b/res/values-uz/arrays.xml
index c39f5d9..34855cf 100644
--- a/res/values-uz/arrays.xml
+++ b/res/values-uz/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Bu – pulli tarmoq"</item>
<item msgid="2047166446768045816">"Bu – bepul tarmoq"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Tasodifiy MAC manzil (standart)"</item>
- <item msgid="741680937828608749">"Qurilmaning MAC manzili"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Yo‘q"</item>
<item msgid="2163015208097377388">"Ha"</item>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 29196bc..c00be2b 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Tarmoq ulanishlarini boshqarish uchun “<xliff:g id="NEW_APP">%s</xliff:g>” ilovasidan foydalanilsinmi?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Joylashuv axboroti so‘rovlari"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Ish profili uchun geolokatsiya"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Ilovalar uchun joylashuv ruxsati"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Joylashuv xizmati yoqilmagan"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{#/{total} ta ilova joylashuvdan foydalanmoqda}other{#/{total} ta ilova joylashuvdan foydalanmoqda}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Yangilash"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Modifikator tugmasini tanlang"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g> uchun yangi tugma tanlang:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> sxemasi"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Standart"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Avtomatik: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Foydalanuvchi tanlagan: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Nutq"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Kursor tezligi"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"O‘yin qurilmasi"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Baribir davom ettirilsin"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Bekor qilish"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Kattalashtirish sozlamalari"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Tugma yordamida kattalashtirish"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Tugma va uch marta bosish bilan kattalashtirish"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g> haqida"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Matnlar"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Mobil internetni avtoalmashtirish"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Qamrovi va mavjudligiga qarab istalgan SIM kartaning mobil internetidan foydalaning"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Faqat internet"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Sozlash"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Keyingisi"</string>
diff --git a/res/values-vi/arrays.xml b/res/values-vi/arrays.xml
index 4383d1f..8cb4a95 100644
--- a/res/values-vi/arrays.xml
+++ b/res/values-vi/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Coi như có đo lượng dữ liệu"</item>
<item msgid="2047166446768045816">"Coi như không đo lượng dữ liệu"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Dùng MAC ngẫu nhiên (mặc định)"</item>
- <item msgid="741680937828608749">"Dùng MAC của thiết bị"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Không"</item>
<item msgid="2163015208097377388">"Có"</item>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index f9eedab..9bf1609 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Sử dụng <xliff:g id="NEW_APP">%s</xliff:g> để quản lý các kết nối mạng của bạn?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Các yêu cầu gần đây về vị trí"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Vị trí của hồ sơ công việc"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Quyền truy cập thông tin vị trí cho ứng dụng"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Dịch vụ vị trí hiện đang tắt"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{#/{total} ứng dụng có quyền truy cập vào thông tin vị trí}other{#/{total} ứng dụng có quyền truy cập vào thông tin vị trí}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Đặt lại"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Chọn phím bổ trợ"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Chọn một phím mới cho <xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"Mặc định"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"Lời nói"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Tốc độ con trỏ"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Trình điều khiển trò chơi"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Vẫn tiếp tục"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Huỷ"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Cài đặt phóng to"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Phóng to bằng phím tắt"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Phóng to bằng phím tắt và nhấn 3 lần"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Giới thiệu về <xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Tin nhắn văn bản"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Tự động chuyển đổi dữ liệu"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Dùng dữ liệu từ 1 trong 2 SIM tuỳ theo phạm vi phủ sóng và tình trạng mạng"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Chỉ dữ liệu"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Thiết lập"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Tiếp theo"</string>
diff --git a/res/values-zh-rCN/arrays.xml b/res/values-zh-rCN/arrays.xml
index dd3be23..12b574a 100644
--- a/res/values-zh-rCN/arrays.xml
+++ b/res/values-zh-rCN/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"视为按流量计费"</item>
<item msgid="2047166446768045816">"视为不按流量计费"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"使用随机 MAC(默认)"</item>
- <item msgid="741680937828608749">"使用设备 MAC"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"否"</item>
<item msgid="2163015208097377388">"是"</item>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 83e822e..195b417 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"要使用<xliff:g id="NEW_APP">%s</xliff:g>管理您的网络连接吗?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"近期位置信息请求"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"工作资料位置信息"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"应用位置信息权限"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"位置信息服务已关闭"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{# 个应用(共 {total} 个应用)有权获取位置信息}other{# 个应用(共 {total} 个应用)有权获取位置信息}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"重置"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"选择辅助键"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"为<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>选择新的辅助键:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"“<xliff:g id="IME_LABEL">%s</xliff:g>”布局"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"默认"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"自动选择的布局:<xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"用户选择的布局:<xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"语音"</string>
<string name="pointer_speed" msgid="7398649279282675718">"指针速度"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"游戏控制器"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"仍然继续"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"取消"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"放大设置"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"使用快捷手势进行放大"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"通过“快捷手势”和“点按屏幕三次”进行放大"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"<xliff:g id="SERVICE">%1$s</xliff:g>简介"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"短信"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"自动切换数据网络"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"根据信号覆盖率和可用性,选择要使用哪张 SIM 卡的移动网络"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"上网专用"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"设置"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"继续"</string>
diff --git a/res/values-zh-rHK/arrays.xml b/res/values-zh-rHK/arrays.xml
index 19426bf..0de2253 100644
--- a/res/values-zh-rHK/arrays.xml
+++ b/res/values-zh-rHK/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"視為按用量收費"</item>
<item msgid="2047166446768045816">"視為非按用量收費"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"使用隨機 MAC (預設)"</item>
- <item msgid="741680937828608749">"使用裝置 MAC"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"否"</item>
<item msgid="2163015208097377388">"是"</item>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index a952eb9..ccf774c 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"使用「<xliff:g id="NEW_APP">%s</xliff:g>」管理你的網絡連線?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"最近的位置資訊要求"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"工作設定檔的位置"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"應用程式位置權限"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"位置設定已關閉"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{在 {total} 個應用程式中,有 # 個已取得位置資訊存取權}other{在 {total} 個應用程式中,有 # 個已取得位置資訊存取權}}"</string>
@@ -1931,7 +1933,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"重設"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"選擇輔助鍵"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"為「<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>」選擇新的輔助鍵:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"<xliff:g id="IME_LABEL">%s</xliff:g> 版面配置"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"預設"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"自動:<xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"已選取使用者:<xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"語音"</string>
<string name="pointer_speed" msgid="7398649279282675718">"游標速度"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"遊戲控制器"</string>
@@ -2053,6 +2058,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"仍要繼續"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"取消"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"放大設定"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"使用快速鍵來放大"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"使用快速鍵和輕按三下來放大"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"關於「<xliff:g id="SERVICE">%1$s</xliff:g>」"</string>
@@ -4630,6 +4641,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"短訊"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"自動切換數據"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"按流動網絡的覆蓋範圍和適用範圍,選擇要使用哪張 SIM 卡的數據"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"數據專用"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"設定"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"下一頁"</string>
diff --git a/res/values-zh-rTW/arrays.xml b/res/values-zh-rTW/arrays.xml
index ef0cceb..4b390d7 100644
--- a/res/values-zh-rTW/arrays.xml
+++ b/res/values-zh-rTW/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"視為計量付費"</item>
<item msgid="2047166446768045816">"視為非計量付費"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"使用隨機化 MAC (預設)"</item>
- <item msgid="741680937828608749">"使用裝置 MAC"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"否"</item>
<item msgid="2163015208097377388">"是"</item>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 8d98afb..8b7c4de 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -1540,6 +1540,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"使用「<xliff:g id="NEW_APP">%s</xliff:g>」管理你的網路連線?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"最近的定位要求"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"工作資料夾位置資訊"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"應用程式位置存取權"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"定位功能已關閉"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{有 # 個應用程式 (共 {total} 個) 已取得位置存取權}other{有 # 個應用程式 (共 {total} 個) 已取得位置存取權}}"</string>
@@ -1931,7 +1933,13 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"重設"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"選擇輔助鍵"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"為「<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>」選擇新的輔助鍵:"</string>
+ <!-- no translation found for ime_label_title (8994569521516807168) -->
+ <skip />
<string name="default_keyboard_layout" msgid="8690689331289452201">"預設"</string>
+ <!-- no translation found for automatic_keyboard_layout_label (9138088156046198913) -->
+ <skip />
+ <!-- no translation found for user_selected_keyboard_layout_label (154742505924555156) -->
+ <skip />
<string name="speech_category_title" msgid="5995161659186229742">"語音"</string>
<string name="pointer_speed" msgid="7398649279282675718">"游標速度"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"遊戲控制器"</string>
@@ -2053,6 +2061,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"仍要繼續"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"取消"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"放大功能設定"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"使用快速手勢放大畫面"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"使用快速手勢並輕觸三下即可放大畫面"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"關於「<xliff:g id="SERVICE">%1$s</xliff:g>」"</string>
@@ -4630,6 +4644,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"訊息"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"自動切換行動數據"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"依據行動網路的涵蓋率和可用性,選擇要使用哪張 SIM 卡的數據"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"數據傳輸專用"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"設定"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"繼續"</string>
diff --git a/res/values-zu/arrays.xml b/res/values-zu/arrays.xml
index dd1c090..ebd7184 100644
--- a/res/values-zu/arrays.xml
+++ b/res/values-zu/arrays.xml
@@ -408,10 +408,7 @@
<item msgid="3779092145391320375">"Phatha njengokulinganisiwe"</item>
<item msgid="2047166446768045816">"Phatha njengokungalinganisiwe"</item>
</string-array>
- <string-array name="wifi_privacy_entries">
- <item msgid="3485945604919292489">"Sebenzisa i-MAC engahleliwe (okuzenzakalelayo)"</item>
- <item msgid="741680937828608749">"Sebenzisa i-MAC yedivayisi"</item>
- </string-array>
+ <!-- no translation found for wifi_privacy_entries:0 (91222619458919148) -->
<string-array name="wifi_hidden_entries">
<item msgid="342232116597649254">"Cha"</item>
<item msgid="2163015208097377388">"Yebo"</item>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index c35729a..e1fe95e 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -1541,6 +1541,8 @@
<string name="network_scorer_change_active_no_previous_dialog_text" msgid="680685773455072321">"Sebenzisa i-<xliff:g id="NEW_APP">%s</xliff:g> ukuze uphathe uxhumo lwakho lenethiwekhi?"</string>
<string name="location_category_recent_location_requests" msgid="2205900488782832082">"Izicelo zendawo zakamuva"</string>
<string name="managed_profile_location_switch_title" msgid="1265007506385460066">"Indawo yephrofayela yokusebenza"</string>
+ <!-- no translation found for private_profile_location_switch_title (4127119143109855789) -->
+ <skip />
<string name="location_app_level_permissions" msgid="907206607664629759">"Izimvume zendawo ye-app"</string>
<string name="location_app_permission_summary_location_off" msgid="2711822936853500335">"Indawo ivaliwe"</string>
<string name="location_app_permission_summary_location_on" msgid="7552095451731948984">"{count,plural, =1{U-# ku-app e-{total} enokufinyelela kundawo}one{U-# kuma-app angu-{total} anokufinyelela kundawo}other{U-# kuma-app angu-{total} anokufinyelela kundawo}}"</string>
@@ -1932,7 +1934,10 @@
<string name="modifier_keys_reset" msgid="551170906710422041">"Setha kabusha"</string>
<string name="modifier_keys_picker_title" msgid="244545904150587851">"Khetha ukhiye wokushintsha"</string>
<string name="modifier_keys_picker_summary" msgid="739397232249560785">"Khetha ukhiye omusha we-<xliff:g id="MODIFIER_KEY_DEFAULT_NAME">%1$s</xliff:g>:"</string>
+ <string name="ime_label_title" msgid="8994569521516807168">"Isakhiwo se-<xliff:g id="IME_LABEL">%s</xliff:g>"</string>
<string name="default_keyboard_layout" msgid="8690689331289452201">"Okuzenzakalelayo"</string>
+ <string name="automatic_keyboard_layout_label" msgid="9138088156046198913">"Okuzenzekelayo: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
+ <string name="user_selected_keyboard_layout_label" msgid="154742505924555156">"Umsebenzisi ukhethiwe: <xliff:g id="LAYOUT_LABEL">%s</xliff:g>"</string>
<string name="speech_category_title" msgid="5995161659186229742">"Inkulumo"</string>
<string name="pointer_speed" msgid="7398649279282675718">"Ijubane lesikhombi"</string>
<string name="game_controller_settings_category" msgid="8557472715034961918">"Isilawuli somdlalo"</string>
@@ -2054,6 +2059,12 @@
<string name="accessibility_magnification_triple_tap_warning_positive_button" msgid="8712304035901450010">"Qhubeka noma kunjalo"</string>
<string name="accessibility_magnification_triple_tap_warning_negative_button" msgid="2028849736366584733">"Khansela"</string>
<string name="accessibility_magnification_service_settings_title" msgid="3531350704632316017">"Izilungiselelo zokukhuliswa"</string>
+ <!-- no translation found for accessibility_magnification_one_finger_panning_title (4503949739883092989) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_on (9133125894310777539) -->
+ <skip />
+ <!-- no translation found for accessibility_magnification_one_finger_panning_summary_off (8979146350396559805) -->
+ <skip />
<string name="accessibility_screen_magnification_navbar_title" msgid="480853328665484528">"Khulisa ngesinqamuleli"</string>
<string name="accessibility_screen_magnification_state_navbar_gesture" msgid="8067042663897802231">"Khulisa ngenkinobho futhi uthephe kathathu"</string>
<string name="accessibility_introduction_title" msgid="8834950581512452348">"Mayelana ne-<xliff:g id="SERVICE">%1$s</xliff:g>"</string>
@@ -4631,6 +4642,12 @@
<string name="primary_sim_texts_title" msgid="1287584042733097749">"Ukuthumela imiyalezo"</string>
<string name="primary_sim_automatic_data_title" msgid="1265528923229642480">"Ukushintsha idatha okuzenzekelayo"</string>
<string name="primary_sim_automatic_data_msg" msgid="1612203837010785203">"Sebenzisa idatha evela kunoma iyiphi i-SIM kuye ngokukhava nokutholakala"</string>
+ <!-- no translation found for sim_action_restart_dialog_title (3507413479633430120) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_msg (4737611046767629774) -->
+ <skip />
+ <!-- no translation found for sim_action_restart_dialog_cancel (665560106686565624) -->
+ <skip />
<string name="sim_onboarding_phoneNumber_data_only" msgid="8158409121949373662">"Idatha kuphela"</string>
<string name="sim_onboarding_setup" msgid="5750393553605388463">"Setha"</string>
<string name="sim_onboarding_next" msgid="6415025179929475355">"Okulandelayo"</string>
diff --git a/res/values/accessibility_shortcut_keys.xml b/res/values/accessibility_shortcut_keys.xml
index 4992a54..fcf62bc 100644
--- a/res/values/accessibility_shortcut_keys.xml
+++ b/res/values/accessibility_shortcut_keys.xml
@@ -22,6 +22,7 @@
<string name="accessibility_shortcut_nav_button_pref" translatable="false">shortcut_nav_button_pref</string>
<string name="accessibility_shortcut_fab_pref" translatable="false">shortcut_fab_pref</string>
<string name="accessibility_shortcut_triple_tap_pref" translatable="false">shortcut_triple_tap_pref</string>
- <string name="accessibility_shortcut_two_fingers_double_tap_pref" translatable="false">shortcut_two_fingers_double_tap_pref</string>
+ <string name="accessibility_shortcut_two_finger_double_tap_pref" translatable="false">shortcut_two_finger_double_tap_pref</string>
+ <string name="accessibility_shortcut_quick_settings_pref" translatable="false">shortcut_quick_settings_pref</string>
<string name="accessibility_shortcuts_advanced_collapsed" translatable="false">advanced_shortcuts_collapsed</string>
</resources>
\ No newline at end of file
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 0e35fed..6122e0d 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -232,6 +232,23 @@
<!-- Bluetooth Settings -->
+ <!-- Titles for Bluetooth Stack Logging -->
+ <string-array name="bt_stack_log_level_entries">
+ <item>Verbose</item>
+ <item>Debug</item>
+ <item>Info</item>
+ <item>Warn</item>
+ <item>Error</item>
+ </string-array>
+
+ <!-- Values for Bluetooth Stack Logging -->
+ <string-array name="bt_stack_log_level_values" translatable="false">
+ <item>verbose</item>
+ <item>debug</item>
+ <item>info</item>
+ <item>warn</item>
+ <item>error</item>
+ </string-array>
<!-- Bluetooth developer settings: Bluetooth LE Audio modes -->
<string-array name="bluetooth_leaudio_mode">
@@ -1074,10 +1091,15 @@
</string-array>
<string-array name="wifi_privacy_entries">
- <item>Use randomized MAC (default)</item>
+ <item>Use randomized MAC</item>
<item>Use device MAC</item>
</string-array>
+ <string-array name="wifi_dhcp_entries">
+ <item>Send device name to network</item>
+ <item>Don\u0027t send device name to network</item>
+ </string-array>
+
<string-array name="wifi_hidden_entries">
<item>No</item>
<item>Yes</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 55c48af..5c98fac 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -150,14 +150,14 @@
<string name="bluetooth_pair_other_ear_dialog_right_ear_positive_button">Pair right ear</string>
<!-- Connected devices settings. Positive button of the dialog to help user to pair left ear of the hearing aid device. Dialog shows when only one of the hearing aid device set is connected. [CHAR LIMIT=20] -->
<string name="bluetooth_pair_other_ear_dialog_left_ear_positive_button">Pair left ear</string>
- <!-- Title for all hearing devices related controls section. [CHAR LIMIT=60] -->
- <string name="bluetooth_device_controls_general">For all available hearing devices</string>
- <!-- Connected devices settings. Title of the preference to show the entrance of the hearing device settings related page. [CHAR LIMIT=65] -->
- <string name="bluetooth_device_controls_title">More hearing device settings</string>
- <!-- Connected devices settings. Summary of the preference to show the item in the hearing device settings related page. [CHAR LIMIT=120] -->
- <string name="bluetooth_device_controls_summary">Change cross-device settings like shortcut, and telecoil controls</string>
- <!-- Title for this device specific controls section. [CHAR LIMIT=30] -->
- <string name="bluetooth_device_controls_specific">For this device</string>
+ <!-- Connected devices settings. Title of the preference to show the entrance of the hearing device settings page. [CHAR LIMIT=65 BACKUP_MESSAGE_ID=1895676556354697234] -->
+ <string name="bluetooth_hearing_device_settings_title">Hearing device settings</string>
+ <!-- Connected devices settings. Summary of the preference to show the entrance of the hearing device settings page. [CHAR LIMIT=65 BACKUP_MESSAGE_ID=8115767735418425663] -->
+ <string name="bluetooth_hearing_device_settings_summary">Shortcut, hearing aid compatibility</string>
+ <!-- Connected devices settings. Title for hearing aids presets. A preset is a set of hearing aid settings. User can apply different settings in different environments (e.g. Outdoor, Restaurant, Home) [CHAR LIMIT=60] -->
+ <string name="bluetooth_hearing_aids_presets">Presets</string>
+ <!-- Message when selecting hearing aids presets failed. [CHAR LIMIT=NONE] -->
+ <string name="bluetooth_hearing_aids_presets_error">Couldn\u2019t update preset</string>
<!-- Connected devices settings. Title of the preference to show the entrance of the audio output page. It can change different types of audio are played on phone or other bluetooth devices. [CHAR LIMIT=35] -->
<string name="bluetooth_audio_routing_title">Audio output</string>
<!-- Title for bluetooth audio routing page footer. [CHAR LIMIT=30] -->
@@ -1263,6 +1263,12 @@
<string name="privatespace_hide_off_summary">Off</string>
<!-- Used to describe the off state of Private space hidden [CHAR LIMIT=30] -->
<string name="privatespace_hide_on_summary">On</string>
+ <!-- Title for the dialog shown when Private space hidden setting is turned on. [CHAR LIMIT=60] -->
+ <string name="private_space_hide_dialog_title">Private space will hide when you lock it next</string>
+ <!-- Text message in the dialog shown when Private space hidden setting is turned on. [CHAR LIMIT=90] -->
+ <string name="private_space_hide_dialog_message">To access your space when it’s hidden, enter \“private space\” in the search bar on your apps list</string>
+ <!-- Label for the dialog shown when Private space hidden setting is turned on. [CHAR LIMIT=90] -->
+ <string name="private_space_hide_dialog_button">Got it</string>
<!-- System category for the Private Space page. [CHAR LIMIT=30] -->
<string name="private_space_category_system">System</string>
<!-- Title for the preference to delete Private Space. [CHAR LIMIT=40] -->
@@ -1847,11 +1853,6 @@
<!-- Bluetooth developer settings: Maximum number of connected audio devices -->
<string name="bluetooth_max_connected_audio_devices_dialog_title">Select maximum number of connected Bluetooth audio devices</string>
- <!-- Nfc developer settings: The title of the setting. [CHAR LIMIT=60] -->
- <string name="nfc_stack_debuglog_title">NFC stack debug log</string>
- <!-- Nfc developer settings: The description of the setting. -->
- <string name="nfc_stack_debuglog_summary">Increase NFC stack logging level</string>
-
<!-- Nfc developer settings: The title of the setting to enable nfc verbose vendor log. [CHAR LIMIT=60] -->
<string name="nfc_verbose_vendor_log_title">NFC verbose vendor debug log</string>
<!-- Nfc developer settings: The description of the setting to enable nfc verbose vendor log. [CHAR_LIMIT=NONE] -->
@@ -3562,6 +3563,8 @@
<!-- [CHAR LIMIT=30] Title for managed profile location switch -->
<string name="managed_profile_location_switch_title">Location for work profile</string>
+ <!-- [CHAR LIMIT=60] Title for private profile location switch -->
+ <string name="private_profile_location_switch_title">Location for private space</string>
<!-- [CHAR LIMIT=30] Location settings screen. It's a link that directs the user to a page that
shows the location permission setting for each installed app -->
<string name="location_app_level_permissions">App location permissions</string>
@@ -4375,6 +4378,8 @@
<!-- Title text for 'Tap to click'. [CHAR LIMIT=35] -->
<string name="trackpad_tap_to_click">Tap to click</string>
+ <!-- TODO(b/321978150): mark as translatable once we have finalized text from UX. -->
+ <string name="trackpad_tap_dragging" translatable="false">Tap dragging</string>
<!-- Title text for 'Touchpad gestures' [CHAR LIMIT=35] -->
<string name="trackpad_touchpad_gesture_title">Touchpad gestures</string>
<!-- Summary text for 'Touchpad gestures' [CHAR LIMIT=60] -->
@@ -4478,8 +4483,14 @@
<!-- Summary for the modifier key picker dialog page [CHAR LIMIT=35] -->
<string name="modifier_keys_picker_summary">Choose a new key for <xliff:g id="modifier_key_default_name">%1$s</xliff:g>:</string>
+ <!-- Title text for per IME subtype keyboard layout. [CHAR LIMIT=35] -->
+ <string name="ime_label_title"><xliff:g id="ime_label" example="Gboard">%s</xliff:g> layout</string>
<!-- Summary text for keyboards when no layout has been selected. [CHAR LIMIT=35] -->
<string name="default_keyboard_layout">Default</string>
+ <!-- Summary text for keyboards when a layout is automatically selected. [CHAR LIMIT=35] -->
+ <string name="automatic_keyboard_layout_label">Automatic: <xliff:g id="layout_label" example="English(US)">%s</xliff:g></string>
+ <!-- Summary text for keyboards when a layout is user selected. [CHAR LIMIT=35] -->
+ <string name="user_selected_keyboard_layout_label">User selected: <xliff:g id="layout_label" example="English(US)">%s</xliff:g></string>
<!-- Title for the 'Speech' preference category. [CHAR LIMIT=45] -->
<string name="speech_category_title">Speech</string>
@@ -4666,6 +4677,10 @@
<string name="experimental_category_title">Experimental</string>
<!-- Title for feature flags dashboard where developers can turn on experimental features [CHAR LIMIT=50] -->
<string name="feature_flags_dashboard_title">Feature flags</string>
+ <!-- Setting Checkbox title whether to enable Bluetooth stack log -->
+ <string name="bt_stack_log_level">Enable Bluetooth stack log</string>
+ <!-- setting Checkbox summary to set log level [CHAR_LIMIT=100] -->
+ <string name="bt_stack_log_level_summary">Change log level of Bluetooth Stack Logging (Toggle Bluetooth after changing this setting)</string>
<!-- Title for snoop logger filters dashboard where developers can turn on filters [CHAR LIMIT=100] -->
<string name="bt_hci_snoop_log_filters_dashboard_title">Bluetooth HCI snoop log filtering</string>
<!-- Summary for the snoop logger filters [CHAR LIMIT=100] -->
@@ -4750,6 +4765,14 @@
<string name="accessibility_magnification_triple_tap_warning_negative_button">Cancel</string>
<!-- Title for the accessibility preference screen to enable screen magnification settings. [CHAR LIMIT=35] -->
<string name="accessibility_magnification_service_settings_title">Magnification settings</string>
+ <!-- Title for accessibility magnification preference where user can move the magnification area by dragging one finger instead of two. [CHAR LIMIT=60] -->
+ <string name="accessibility_magnification_one_finger_panning_title">One-finger panning</string>
+ <!-- Summary for accessibility magnification preference when one finger panning feature is turned on.
+ The feature when enabled allows user to move the magnification area by dragging one finger instead of two. [CHAR LIMIT=60] -->
+ <string name="accessibility_magnification_one_finger_panning_summary_on">Move the magnification area by dragging one finger.</string>
+ <!-- Summary for accessibility magnification preference when one finger panning feature is turned off.
+ The feature when disabled, allows user to move the magnification area by dragging two fingers instead of one. [CHAR LIMIT=60] -->
+ <string name="accessibility_magnification_one_finger_panning_summary_off">Move the magnification area by dragging two fingers.</string>
<!-- Title for the accessibility preference screen to enable navigation bar screen magnification. [CHAR LIMIT=35] -->
<string name="accessibility_screen_magnification_navbar_title">Magnify with shortcut</string>
<!-- Summary for the accessibility magnification setting indicating both "Magnify with button" and "Magnify with triple-tap" are enabled [CHAR LIMIT=50] -->
@@ -4817,6 +4840,8 @@
<string name="accessibility_tutorial_dialog_title_triple">Triple tap screen to open</string>
<!-- Title for the accessibility tutorial dialog in accessibility service with two finger double tap. [CHAR LIMIT=100] -->
<string name="accessibility_tutorial_dialog_title_two_finger_double">Two finger double tap screen to open</string>
+ <!-- Title for the accessibility tutorial dialog in accessibility service with quick setting shortcut. [CHAR LIMIT=100] -->
+ <string name="accessibility_tutorial_dialog_title_quick_setting">Quick Settings shortcut</string>
<!-- Title for the accessibility tutorial dialog in accessibility service with gesture. [CHAR LIMIT=50] -->
<string name="accessibility_tutorial_dialog_title_gesture">Use gesture to open</string>
<!-- Title for the accessibility tutorial dialog in gesture navigation settings. [CHAR LIMIT=50] -->
@@ -4831,6 +4856,8 @@
<string name="accessibility_tutorial_dialog_message_triple">To start and stop magnification, triple-tap anywhere on your screen.</string>
<!-- Instruction for the accessibility tutorial dialog in accessibility service with two finger double tap. [CHAR LIMIT=100] -->
<string name="accessibility_tutorial_dialog_message_two_finger_triple">To start and stop magnification, double-tap anywhere on your screen with two fingers.</string>
+ <!-- Instruction for the accessibility tutorial dialog in accessibility service with triple tap. [CHAR LIMIT=NONE]-->
+ <string name="accessibility_tutorial_dialog_message_quick_setting">To use this feature, swipe down from the top of your screen.</string>
<!-- Message for the accessibility tutorial dialog when user enables an accessibility service while using gesture navigation and touch exploration is not enabled. [CHAR LIMIT=NONE] -->
<string name="accessibility_tutorial_dialog_message_gesture">To use this feature, swipe up from the bottom of the screen with 2 fingers.\n\nTo switch between features, swipe up with 2 fingers and hold.</string>
<!-- Message for the accessibility tutorial dialog when user enables an accessibility service while using gesture navigation and touch exploration is enabled. [CHAR LIMIT=NONE] -->
@@ -4845,10 +4872,10 @@
<string name="accessibility_tutorial_dialog_link_button">Button settings</string>
<!-- Title for accessibility shortcut preference for accessibility apps. [CHAR LIMIT=40] -->
<string name="accessibility_shortcut_title"><xliff:g id="service" example="Select to Speak">%1$s</xliff:g> shortcut</string>
- <!-- Title for software shortcut in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
- <string name="accessibility_shortcut_edit_summary_software">Accessibility button</string>
- <!-- Title for software shortcut gesture in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
- <string name="accessibility_shortcut_edit_summary_software_gesture">Accessibility gesture</string>
+ <!-- Shown as one of the item in the chosen accessibility shortcut types list presented as a label next to the shortcut toggle. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_shortcut_edit_summary_software">accessibility button</string>
+ <!-- Shown as one of the item in the chosen accessibility shortcut types list presented as a label next to the shortcut toggle. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_shortcut_edit_summary_software_gesture">accessibility gesture</string>
<!-- Title for software shortcut in gesture mode in accessibility edit shortcut dialog while using gesture navigation is enabled. [CHAR LIMIT=NONE] -->
<string name="accessibility_shortcut_edit_dialog_title_software_gesture">Swipe up with 2 fingers</string>
<!-- Title for software shortcut in gesture mode in accessibility edit shortcut dialog while using gesture navigation and touch exploration are enabled. [CHAR LIMIT=NONE] -->
@@ -4867,6 +4894,12 @@
<string name="accessibility_shortcut_edit_dialog_summary_software_floating"><annotation id="link">More options</annotation></string>
<!-- Footer to show help link content description. [CHAR LIMIT=NONE] -->
<string name="footer_learn_more_content_description">Learn more about <xliff:g id="service" example="Select to Speak">%1$s</xliff:g></string>
+ <!-- Title for quick settings shortcut option in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_shortcut_edit_dialog_title_quick_settings">Quick Settings</string>
+ <!-- Summary for quick settings shortcut option in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_shortcut_edit_dialog_summary_quick_settings">Swipe down from the top of your screen</string>
+ <!-- Shown as one of the item in the chosen accessibility shortcut types list presented as a label next to the shortcut toggle. [CHAR LIMIT=NONE] -->
+ <string name="accessibility_feature_shortcut_setting_summary_quick_settings">Quick Settings</string>
<!-- Title for hardware shortcut in accessibility edit shortcut dialog. [CHAR LIMIT=NONE] -->
<string name="accessibility_shortcut_edit_dialog_title_hardware">Hold volume keys</string>
<!-- Part of list to compose user's accessibility shortcut list. [CHAR LIMIT=NONE] -->
@@ -10446,6 +10479,9 @@
<!-- Summary text for 3-button navigation [CHAR LIMIT=NONE] -->
<string name="legacy_navigation_summary">Go back, Home, and switch apps with buttons at the bottom of your screen.</string>
+ <!-- Accessibility string for gesture nav tutorial button [CHAR_LIMIT=NONE] -->
+ <string name="nav_tutorial_button_description">Start gesture navigation tutorial</string>
+
<!-- Search keywords for System Navigation settings. [CHAR_LIMIT=NONE]-->
<string name="keywords_system_navigation">system navigation, 2 button navigation, 3 button navigation, gesture navigation, swipe</string>
@@ -11667,6 +11703,13 @@
<!-- Body text of automatic data switching at dual sim onboarding's primary sim page or SIMs page. [CHAR LIMIT=NONE] -->
<string name="primary_sim_automatic_data_msg">Use data from either SIM depending on coverage and availability</string>
+ <!-- Title of asking the user whether to restart device after enabling DSDS. [CHAR LIMIT=NONE] -->
+ <string name="sim_action_restart_dialog_title">Restart to use 2 SIMs</string>
+ <!-- Body text of asking the user whether to restart device after enabling DSDS. [CHAR LIMIT=NONE] -->
+ <string name="sim_action_restart_dialog_msg">To use 2 SIMs at once, restart your device, then turn on both SIMs</string>
+ <!-- Button text to cancel dialog and then enable the sim -->
+ <string name="sim_action_restart_dialog_cancel">Use <xliff:g id="carrier_name" example="Google Fi">%1$s</xliff:g> only</string>
+
<!-- Text of phone number item when the sim is data only. [CHAR LIMIT=NONE] -->
<string name="sim_onboarding_phoneNumber_data_only">Data only</string>
@@ -11952,6 +11995,15 @@
<!-- Toast message when 16k OTA update fails -->
<string name="toast_16k_update_failed_text">Failed to update kernel to 16KB pages compatible kernel.</string>
<string name="progress_16k_ota_title">Applying change</string>
+ <!-- Confirmation dialog title and text to reformat data to ext4 -->
+ <string name="confirm_format_ext4_title">Reformat device to ext4?</string>
+ <string name="confirm_format_ext4_text">16K developer option is supported with ext4 filesystem. Device will be wiped and filesystem will be changed to ext4 after confirmation.</string>
+ <!-- Toast on failure to reformat data to ext4 -->
+ <string name="format_ext4_failure_toast">Failed to reformat and wipe the data partiton to ext4.</string>
+ <!-- Dialog to OEM unlock the device before using 16K developer option -->
+ <string name="confirm_oem_unlock_for_16k_title">OEM unlock required</string>
+ <string name="confirm_oem_unlock_for_16k_text">Device needs to be OEM unlocked before using 16K developer option. OEM unlock will also require formatting userdata. Please OEM unlock the device and try again.</string>
+
<!-- DSU Loader. Do not translate. -->
<string name="dsu_loader_title" translatable="false">DSU Loader</string>
@@ -12984,11 +13036,6 @@
<!-- Developer settings: select Grammatical gender dialog title [CHAR LIMIT=50]-->
<string name="grammatical_gender_dialog_title">Select Grammatical gender</string>
- <!-- Do not translate. Developer settings: Title for the screen allowing user to control Quarantined apps [CHAR LIMIT=50] -->
- <string name="quarantined_apps_title" translatable="false">Quarantined Apps</string>
- <!-- Do not translate. Developer settings: Button to unquarantine an app [CHAR LIMIT=20] -->
- <string name="unquarantine_app_button" translatable="false">Unquarantine app</string>
-
<!-- Title of preference to manage content protection settings -->
<string name="content_protection_preference_title">Scanning for deceptive apps</string>
<!-- Summary of the preference to manage content protection settings -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 0a28b01..fe2084f 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -249,7 +249,7 @@
<item name="android:layout_gravity">center</item>
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
<item name="android:textSize">@dimen/search_bar_text_size</item>
- <item name="android:textColor">?android:attr/textColorSecondary</item>
+ <item name="android:textColor">?androidprv:attr/materialColorOnSurfaceVariant</item>
<item name="android:singleLine">true</item>
</style>
diff --git a/res/xml/accessibility_edit_shortcuts.xml b/res/xml/accessibility_edit_shortcuts.xml
index 8be0ee5..37e25af 100644
--- a/res/xml/accessibility_edit_shortcuts.xml
+++ b/res/xml/accessibility_edit_shortcuts.xml
@@ -18,66 +18,76 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto">
- <PreferenceCategory
- android:key="@string/accessibility_shortcut_description_pref">
+ <Preference
+ android:key="@string/accessibility_shortcut_description_pref"
+ android:persistent="false"
+ android:selectable="false"
+ settings:allowDividerAbove="false"
+ settings:allowDividerBelow="false"/>
- <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
- android:key="@string/accessibility_shortcut_fab_pref"
- android:persistent="false"
- android:selectable="true"
- settings:allowDividerAbove="false"
- settings:allowDividerBelow="false"
- settings:controller="com.android.settings.accessibility.shortcuts.FloatingButtonShortcutOptionController" />
+ <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
+ android:key="@string/accessibility_shortcut_quick_settings_pref"
+ android:persistent="false"
+ android:selectable="true"
+ settings:allowDividerAbove="false"
+ settings:allowDividerBelow="false"
+ settings:controller="com.android.settings.accessibility.shortcuts.QuickSettingsShortcutOptionController" />
- <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
- android:key="@string/accessibility_shortcut_gesture_pref"
- android:persistent="false"
- android:selectable="true"
- settings:allowDividerAbove="false"
- settings:allowDividerBelow="false"
- settings:controller="com.android.settings.accessibility.shortcuts.GestureShortcutOptionController" />
+ <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
+ android:key="@string/accessibility_shortcut_fab_pref"
+ android:persistent="false"
+ android:selectable="true"
+ settings:allowDividerAbove="false"
+ settings:allowDividerBelow="false"
+ settings:controller="com.android.settings.accessibility.shortcuts.FloatingButtonShortcutOptionController" />
- <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
- android:key="@string/accessibility_shortcut_nav_button_pref"
- android:persistent="false"
- android:selectable="true"
- settings:allowDividerAbove="false"
- settings:allowDividerBelow="false"
- settings:controller="com.android.settings.accessibility.shortcuts.NavButtonShortcutOptionController" />
+ <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
+ android:key="@string/accessibility_shortcut_gesture_pref"
+ android:persistent="false"
+ android:selectable="true"
+ settings:allowDividerAbove="false"
+ settings:allowDividerBelow="false"
+ settings:controller="com.android.settings.accessibility.shortcuts.GestureShortcutOptionController" />
- <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
- android:key="@string/accessibility_shortcut_volume_keys_pref"
- android:persistent="false"
- android:selectable="true"
- settings:allowDividerAbove="false"
- settings:allowDividerBelow="false"
- settings:controller="com.android.settings.accessibility.shortcuts.VolumeKeysShortcutOptionController" />
+ <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
+ android:key="@string/accessibility_shortcut_nav_button_pref"
+ android:persistent="false"
+ android:selectable="true"
+ settings:allowDividerAbove="false"
+ settings:allowDividerBelow="false"
+ settings:controller="com.android.settings.accessibility.shortcuts.NavButtonShortcutOptionController" />
- <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
- android:key="@string/accessibility_shortcut_two_fingers_double_tap_pref"
- android:persistent="false"
- android:selectable="true"
- settings:allowDividerAbove="false"
- settings:allowDividerBelow="false"
- settings:controller="com.android.settings.accessibility.shortcuts.TwoFingersDoubleTapShortcutOptionController" />
+ <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
+ android:key="@string/accessibility_shortcut_volume_keys_pref"
+ android:persistent="false"
+ android:selectable="true"
+ settings:allowDividerAbove="false"
+ settings:allowDividerBelow="false"
+ settings:controller="com.android.settings.accessibility.shortcuts.VolumeKeysShortcutOptionController" />
- <Preference
- android:icon="@drawable/ic_keyboard_arrow_down"
- android:key="@string/accessibility_shortcuts_advanced_collapsed"
- android:persistent="false"
- android:selectable="true"
- android:title="@string/accessibility_shortcut_edit_dialog_title_advance"
- settings:allowDividerAbove="false"
- settings:allowDividerBelow="false"
- settings:controller="com.android.settings.accessibility.shortcuts.AdvancedShortcutsPreferenceController" />
+ <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
+ android:key="@string/accessibility_shortcut_two_finger_double_tap_pref"
+ android:persistent="false"
+ android:selectable="true"
+ settings:allowDividerAbove="false"
+ settings:allowDividerBelow="false"
+ settings:controller="com.android.settings.accessibility.shortcuts.TwoFingerDoubleTapShortcutOptionController" />
- <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
- android:key="@string/accessibility_shortcut_triple_tap_pref"
- android:persistent="false"
- android:selectable="true"
- settings:allowDividerAbove="false"
- settings:allowDividerBelow="false"
- settings:controller="com.android.settings.accessibility.shortcuts.TripleTapShortcutOptionController" />
- </PreferenceCategory>
+ <Preference
+ android:icon="@drawable/ic_keyboard_arrow_down"
+ android:key="@string/accessibility_shortcuts_advanced_collapsed"
+ android:persistent="false"
+ android:selectable="true"
+ android:title="@string/accessibility_shortcut_edit_dialog_title_advance"
+ settings:allowDividerAbove="false"
+ settings:allowDividerBelow="false"
+ settings:controller="com.android.settings.accessibility.shortcuts.AdvancedShortcutsPreferenceController" />
+ <com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
+ android:key="@string/accessibility_shortcut_triple_tap_pref"
+ android:persistent="false"
+ android:selectable="true"
+ settings:allowDividerAbove="false"
+ settings:allowDividerBelow="false"
+ settings:controller="com.android.settings.accessibility.shortcuts.TripleTapShortcutOptionController" />
</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/bluetooth_device_details_fragment.xml b/res/xml/bluetooth_device_details_fragment.xml
index d260554..91f73a7 100644
--- a/res/xml/bluetooth_device_details_fragment.xml
+++ b/res/xml/bluetooth_device_details_fragment.xml
@@ -69,7 +69,7 @@
android:key="device_companion_apps"/>
<PreferenceCategory
- android:key="device_controls_general" />
+ android:key="hearing_device_group" />
<PreferenceCategory
android:key="bluetooth_audio_device_type_group"/>
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index c0b6560..23eb1f2 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -75,6 +75,13 @@
android:entryValues="@array/hdcp_checking_values" />
<ListPreference
+ android:key="bt_stack_log_level"
+ android:title="@string/bt_stack_log_level"
+ android:dialogTitle="@string/bt_stack_log_level_summary"
+ android:entries="@array/bt_stack_log_level_entries"
+ android:entryValues="@array/bt_stack_log_level_values" />
+
+ <ListPreference
android:key="bt_hci_snoop_log"
android:title="@string/bt_hci_snoop_log"
android:dialogTitle="@string/bt_hci_snoop_log_summary"
@@ -463,11 +470,6 @@
android:entryValues="@array/bluetooth_max_connected_audio_devices_values" />
<SwitchPreferenceCompat
- android:key="nfc_stack_debuglog_enabled"
- android:title="@string/nfc_stack_debuglog_title"
- android:summary="@string/nfc_stack_debuglog_summary" />
-
- <SwitchPreferenceCompat
android:key="nfc_verbose_vendor_log"
android:title="@string/nfc_verbose_vendor_log_title"
android:summary="@string/nfc_verbose_vendor_log_summary" />
@@ -769,12 +771,6 @@
android:title="@string/enable_notes_role_title"
android:summary="@string/enable_notes_role_summary" />
- <Preference
- android:key="quarantined_apps"
- android:title="@string/quarantined_apps_title"
- settings:controller="com.android.settings.development.quarantine.QuarantinedAppsPreferenceController"
- android:fragment="com.android.settings.development.quarantine.QuarantinedAppsFragment" />
-
</PreferenceCategory>
<PreferenceCategory
diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml
index fe87efd..206cc46 100644
--- a/res/xml/location_settings.xml
+++ b/res/xml/location_settings.xml
@@ -49,6 +49,14 @@
settings:forWork="true"
settings:useAdminDisabledSummary="true"/>
+ <!-- This preference gets removed if there is no private profile -->
+ <com.android.settingslib.RestrictedSwitchPreference
+ android:enabled="false"
+ android:key="private_profile_location_switch"
+ android:selectable="true"
+ android:title="@string/private_profile_location_switch_title"
+ settings:controller="com.android.settings.location.LocationForPrivateProfilePreferenceController"/>
+
<!-- This preference category gets removed if new_recent_location_ui is disabled -->
<Preference
android:key="app_level_permissions"
diff --git a/res/xml/mobile_network_settings.xml b/res/xml/mobile_network_settings.xml
index 1e43ef0..adb84b6 100644
--- a/res/xml/mobile_network_settings.xml
+++ b/res/xml/mobile_network_settings.xml
@@ -18,9 +18,8 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="mobile_network_pref_screen">
- <com.android.settings.widget.SettingsMainSwitchPreference
+ <com.android.settings.spa.preference.ComposePreference
android:key="use_sim_switch"
- android:title="@string/mobile_network_use_sim_on"
settings:controller="com.android.settings.network.telephony.MobileNetworkSwitchController"/>
<PreferenceCategory
diff --git a/res/xml/quarantined_apps.xml b/res/xml/quarantined_apps.xml
deleted file mode 100644
index 69a90d6..0000000
--- a/res/xml/quarantined_apps.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2023 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:settings="http://schemas.android.com/apk/res-auto"
- android:key="quarantined_apps_screen"
- android:title="@string/quarantined_apps_title"
- settings:controller="com.android.settings.development.quarantine.QuarantinedAppsScreenController"
- settings:searchable="true">
-</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/security_lockscreen_settings.xml b/res/xml/security_lockscreen_settings.xml
index cb1ce44..15d5303 100644
--- a/res/xml/security_lockscreen_settings.xml
+++ b/res/xml/security_lockscreen_settings.xml
@@ -69,9 +69,11 @@
android:summary="@string/lockscreen_trivial_controls_summary"
settings:controller="com.android.settings.display.ControlsTrivialPrivacyPreferenceController"/>
+ <!-- Shortcuts -->
<Preference
android:key="customizable_lock_screen_quick_affordances"
android:title="@string/lockscreen_quick_affordances_title"
+ android:summary="@string/summary_placeholder"
settings:controller="com.android.settings.display.CustomizableLockScreenQuickAffordancesPreferenceController" />
<SwitchPreferenceCompat
diff --git a/res/xml/trackpad_settings.xml b/res/xml/trackpad_settings.xml
index cca92a3..6601036 100644
--- a/res/xml/trackpad_settings.xml
+++ b/res/xml/trackpad_settings.xml
@@ -23,7 +23,6 @@
android:key="trackpad_gesture_settings"
android:title="@string/trackpad_touchpad_gesture_title"
android:summary="@string/trackpad_touchpad_gesture_summary"
- android:icon="@drawable/ic_trackpad_touch_gestures_normal"
android:order="-10"
android:fragment="com.android.settings.inputmethod.TrackpadTouchGestureSettings"
settings:controller="com.android.settings.inputmethod.TrackpadTouchGestureSettingsController"/>
@@ -31,7 +30,6 @@
<SwitchPreferenceCompat
android:key="trackpad_tap_to_click"
android:title="@string/trackpad_tap_to_click"
- android:icon="@drawable/ic_trackpad_tap_to_click"
settings:controller="com.android.settings.inputmethod.TrackpadTapToClickPreferenceController"
android:order="10"/>
@@ -39,7 +37,6 @@
android:key="trackpad_reverse_scrolling"
android:title="@string/trackpad_reverse_scrolling_title"
android:summary="@string/trackpad_reverse_scrolling_summary"
- android:icon="@drawable/ic_trackpad_reverse_scrolling"
settings:controller="com.android.settings.inputmethod.TrackpadReverseScrollingPreferenceController"
android:order="20"/>
@@ -47,15 +44,20 @@
android:key="trackpad_bottom_right_tap"
android:title="@string/trackpad_bottom_right_tap_title"
android:summary="@string/trackpad_bottom_right_tap_summary"
- android:icon="@drawable/ic_trackpad_bottom_right_click"
settings:controller="com.android.settings.inputmethod.TrackpadBottomPreferenceController"
android:order="30"
settings:keywords="@string/keywords_trackpad_bottom_right_tap"/>
+ <!-- TODO(b/321978150): add a summary line once we have finalized text from UX. -->
+ <SwitchPreferenceCompat
+ android:key="trackpad_tap_dragging"
+ android:title="@string/trackpad_tap_dragging"
+ settings:controller="com.android.settings.inputmethod.TrackpadTapDraggingPreferenceController"
+ android:order="35"/>
+
<com.android.settings.widget.SeekBarPreference
android:key="trackpad_pointer_speed"
android:title="@string/trackpad_pointer_speed"
- android:icon="@drawable/ic_trackpad_pointer_speed"
android:order="40"
android:selectable="false"
settings:controller="com.android.settings.inputmethod.TrackpadPointerSpeedPreferenceController"/>
@@ -63,6 +65,5 @@
<com.android.settingslib.widget.ButtonPreference
android:key="trackpad_touch_gesture"
android:title="@string/trackpad_touch_gesture"
- android:icon="@drawable/ic_trackpad_touch_gestures_inverse"
settings:controller="com.android.settings.inputmethod.TouchGesturesButtonPreferenceController"/>
</PreferenceScreen>
diff --git a/res/xml/wifi_network_details_fragment2.xml b/res/xml/wifi_network_details_fragment2.xml
index 598f9d8..eacff88 100644
--- a/res/xml/wifi_network_details_fragment2.xml
+++ b/res/xml/wifi_network_details_fragment2.xml
@@ -112,6 +112,10 @@
android:title="@string/wifi_auto_connect_title"
android:summary="@string/wifi_auto_connect_summary"/>
+ <com.android.settings.spa.preference.ComposePreference
+ android:key="certificate_details"
+ settings:controller="com.android.settings.wifi.details2.CertificateDetailsPreferenceController"/>
+
<!-- Add device Preference -->
<Preference
android:key="add_device_to_network"
diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java
index 7b96d42..87b11f7 100644
--- a/src/com/android/settings/MainClear.java
+++ b/src/com/android/settings/MainClear.java
@@ -426,7 +426,7 @@
@VisibleForTesting
protected boolean isEuiccEnabled(Context context) {
EuiccManager euiccManager = (EuiccManager) context.getSystemService(Context.EUICC_SERVICE);
- return euiccManager.isEnabled();
+ return euiccManager != null && euiccManager.isEnabled();
}
@VisibleForTesting
diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java
index c33a4f8..642485a 100644
--- a/src/com/android/settings/ResetNetwork.java
+++ b/src/com/android/settings/ResetNetwork.java
@@ -293,7 +293,7 @@
}
EuiccManager euiccManager =
(EuiccManager) context.getSystemService(Context.EUICC_SERVICE);
- if (!euiccManager.isEnabled()) {
+ if (euiccManager == null || !euiccManager.isEnabled()) {
return false;
}
ContentResolver resolver = context.getContentResolver();
diff --git a/src/com/android/settings/SettingsInitialize.java b/src/com/android/settings/SettingsInitialize.java
index c0c0777..297bad7 100644
--- a/src/com/android/settings/SettingsInitialize.java
+++ b/src/com/android/settings/SettingsInitialize.java
@@ -118,7 +118,8 @@
}
private void privateProfileSetup(Context context, PackageManager pm, UserInfo userInfo) {
- if (Flags.allowPrivateProfile()) {
+ if (Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
if (userInfo == null || !userInfo.isPrivateProfile()) {
return;
}
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 108e331..c38ebfe 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -1228,6 +1228,7 @@
UserProperties userProperties = userManager.getUserProperties(userHandle);
if (userProperties.getShowInSettings() == UserProperties.SHOW_IN_SETTINGS_SEPARATE) {
if (Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
&& userProperties.getShowInQuietMode()
== UserProperties.SHOW_IN_QUIET_MODE_HIDDEN) {
if (!userManager.isQuietModeEnabled(userHandle)) {
@@ -1288,7 +1289,8 @@
*/
@ColorInt
public static int getHomepageIconColor(Context context) {
- return getColorAttrDefaultColor(context, android.R.attr.textColorPrimary);
+ return getColorAttrDefaultColor(
+ context, com.android.internal.R.attr.materialColorOnSurface);
}
/**
diff --git a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
index 1f71ab0..4b394a0 100644
--- a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
+++ b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java
@@ -414,7 +414,7 @@
private static TutorialPage createTwoFingerTripleTapTutorialPage(@NonNull Context context) {
// TODO(b/308088945): Update tutorial string and image when UX provides them
- final int type = UserShortcutType.TWOFINGERTRIPLETAP;
+ final int type = UserShortcutType.TWOFINGER_DOUBLETAP;
final CharSequence title =
context.getText(R.string.accessibility_tutorial_dialog_title_two_finger_double);
final View image =
@@ -429,10 +429,32 @@
return new TutorialPage(type, title, image, indicatorIcon, instruction);
}
+ private static TutorialPage createQuickSettingTutorialPage(@NonNull Context context) {
+ final int type = UserShortcutType.QUICK_SETTINGS;
+ final CharSequence title =
+ context.getText(R.string.accessibility_tutorial_dialog_title_quick_setting);
+ final View image =
+ createIllustrationView(context,
+ R.drawable.a11y_shortcut_type_quick_settings);
+ final CharSequence instruction =
+ context.getText(R.string.accessibility_tutorial_dialog_message_quick_setting);
+ final ImageView indicatorIcon =
+ createImageView(context, R.drawable.ic_accessibility_page_indicator);
+ indicatorIcon.setEnabled(false);
+
+ return new TutorialPage(type, title, image, indicatorIcon, instruction);
+ }
+
@VisibleForTesting
static List<TutorialPage> createShortcutTutorialPages(@NonNull Context context,
int shortcutTypes) {
final List<TutorialPage> tutorialPages = new ArrayList<>();
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ if ((shortcutTypes & UserShortcutType.QUICK_SETTINGS)
+ == UserShortcutType.QUICK_SETTINGS) {
+ tutorialPages.add(createQuickSettingTutorialPage(context));
+ }
+ }
if ((shortcutTypes & UserShortcutType.SOFTWARE) == UserShortcutType.SOFTWARE) {
tutorialPages.add(createSoftwareTutorialPage(context));
}
@@ -446,8 +468,8 @@
}
if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
- if ((shortcutTypes & UserShortcutType.TWOFINGERTRIPLETAP)
- == UserShortcutType.TWOFINGERTRIPLETAP) {
+ if ((shortcutTypes & UserShortcutType.TWOFINGER_DOUBLETAP)
+ == UserShortcutType.TWOFINGER_DOUBLETAP) {
tutorialPages.add(createTwoFingerTripleTapTutorialPage(context));
}
}
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index fe89bf2..35fe6e4 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -175,6 +175,9 @@
// Observe changes from accessibility selection menu
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS);
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE);
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS);
+ }
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_STICKY_KEYS);
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SLOW_KEYS);
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BOUNCE_KEYS);
diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
index 09a691e..41c5d75 100644
--- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
@@ -125,6 +125,9 @@
final List<String> shortcutFeatureKeys = new ArrayList<>();
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS);
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE);
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS);
+ }
mSettingsContentObserver = new AccessibilitySettingsContentObserver(new Handler());
mSettingsContentObserver.registerKeysToObserverCallback(shortcutFeatureKeys, key -> {
updateShortcutPreferenceData();
@@ -452,7 +455,13 @@
getComponentName().flattenToString());
final List<CharSequence> list = new ArrayList<>();
-
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ if (hasShortcutType(shortcutTypes, AccessibilityUtil.UserShortcutType.QUICK_SETTINGS)) {
+ final CharSequence qsTitle = context.getText(
+ R.string.accessibility_feature_shortcut_setting_summary_quick_settings);
+ list.add(qsTitle);
+ }
+ }
if (hasShortcutType(shortcutTypes, AccessibilityUtil.UserShortcutType.SOFTWARE)) {
list.add(getSoftwareShortcutTypeSummary(context));
}
@@ -538,6 +547,10 @@
}
private void showQuickSettingsTooltipIfNeeded() {
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ // Don't show Quick Settings tooltip
+ return;
+ }
final ComponentName tileComponentName = getTileComponentName();
if (tileComponentName == null) {
// Returns if no tile service assigned.
diff --git a/src/com/android/settings/accessibility/AccessibilityUtil.java b/src/com/android/settings/accessibility/AccessibilityUtil.java
index 3b81bdb..afc7b84 100644
--- a/src/com/android/settings/accessibility/AccessibilityUtil.java
+++ b/src/com/android/settings/accessibility/AccessibilityUtil.java
@@ -28,6 +28,7 @@
import android.graphics.Insets;
import android.graphics.Rect;
import android.os.Build;
+import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.TypedValue;
@@ -40,8 +41,11 @@
import androidx.annotation.StringRes;
import androidx.annotation.VisibleForTesting;
+import com.android.internal.accessibility.util.ShortcutUtils;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.Set;
import java.util.StringJoiner;
/** Provides utility methods to accessibility settings only. */
@@ -87,6 +91,10 @@
* choose accessibility shortcut as preferred shortcut.
* {@code TRIPLETAP} for displaying specifying magnification to be toggled via quickly
* tapping screen 3 times as preferred shortcut.
+ * {@code TWOFINGER_DOUBLETAP} for displaying specifying magnification to be toggled via
+ * quickly tapping screen 2 times with two fingers as preferred shortcut.
+ * {@code QUICK_SETTINGS} for displaying specifying the accessibility services or features which
+ * choose Quick Settings as preferred shortcut.
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef({
@@ -94,16 +102,18 @@
UserShortcutType.SOFTWARE,
UserShortcutType.HARDWARE,
UserShortcutType.TRIPLETAP,
- UserShortcutType.TWOFINGERTRIPLETAP,
+ UserShortcutType.TWOFINGER_DOUBLETAP,
+ UserShortcutType.QUICK_SETTINGS,
})
/** Denotes the user shortcut type. */
public @interface UserShortcutType {
int EMPTY = 0;
- int SOFTWARE = 1; // 1 << 0
- int HARDWARE = 2; // 1 << 1
- int TRIPLETAP = 4; // 1 << 2
- int TWOFINGERTRIPLETAP = 8; // 1 << 3
+ int SOFTWARE = 1;
+ int HARDWARE = 1 << 1;
+ int TRIPLETAP = 1 << 2;
+ int TWOFINGER_DOUBLETAP = 1 << 3;
+ int QUICK_SETTINGS = 1 << 4;
}
/**
@@ -200,12 +210,26 @@
* Opts in component name into multiple {@code shortcutTypes} colon-separated string in
* Settings.
*
- * @param context The current context.
- * @param shortcutTypes A combination of {@link UserShortcutType}.
+ * @param context The current context.
+ * @param shortcutTypes A combination of {@link UserShortcutType}.
* @param componentName The component name that need to be opted in Settings.
*/
static void optInAllValuesToSettings(Context context, int shortcutTypes,
@NonNull ComponentName componentName) {
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class);
+ if (a11yManager != null) {
+ a11yManager.enableShortcutsForTargets(
+ /* enable= */ true,
+ shortcutTypes,
+ Set.of(componentName.flattenToString()),
+ UserHandle.myUserId()
+ );
+ }
+
+ return;
+ }
+
if ((shortcutTypes & UserShortcutType.SOFTWARE) == UserShortcutType.SOFTWARE) {
optInValueToSettings(context, UserShortcutType.SOFTWARE, componentName);
}
@@ -217,13 +241,26 @@
/**
* Opts in component name into {@code shortcutType} colon-separated string in Settings.
*
- * @param context The current context.
- * @param shortcutType The preferred shortcut type user selected.
+ * @param context The current context.
+ * @param shortcutType The preferred shortcut type user selected.
* @param componentName The component name that need to be opted in Settings.
*/
@VisibleForTesting
static void optInValueToSettings(Context context, @UserShortcutType int shortcutType,
@NonNull ComponentName componentName) {
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class);
+ if (a11yManager != null) {
+ a11yManager.enableShortcutsForTargets(
+ /* enable= */ true,
+ shortcutType,
+ Set.of(componentName.flattenToString()),
+ UserHandle.myUserId()
+ );
+ }
+ return;
+ }
+
final String targetKey = convertKeyFromSettings(shortcutType);
final String targetString = Settings.Secure.getString(context.getContentResolver(),
targetKey);
@@ -245,12 +282,25 @@
* Opts out component name into multiple {@code shortcutTypes} colon-separated string in
* Settings.
*
- * @param context The current context.
+ * @param context The current context.
* @param shortcutTypes A combination of {@link UserShortcutType}.
* @param componentName The component name that need to be opted out from Settings.
*/
static void optOutAllValuesFromSettings(Context context, int shortcutTypes,
@NonNull ComponentName componentName) {
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class);
+ if (a11yManager != null) {
+ a11yManager.enableShortcutsForTargets(
+ /* enable= */ false,
+ shortcutTypes,
+ Set.of(componentName.flattenToString()),
+ UserHandle.myUserId()
+ );
+ }
+ return;
+ }
+
if ((shortcutTypes & UserShortcutType.SOFTWARE) == UserShortcutType.SOFTWARE) {
optOutValueFromSettings(context, UserShortcutType.SOFTWARE, componentName);
}
@@ -262,13 +312,26 @@
/**
* Opts out component name into {@code shortcutType} colon-separated string in Settings.
*
- * @param context The current context.
- * @param shortcutType The preferred shortcut type user selected.
+ * @param context The current context.
+ * @param shortcutType The preferred shortcut type user selected.
* @param componentName The component name that need to be opted out from Settings.
*/
@VisibleForTesting
static void optOutValueFromSettings(Context context, @UserShortcutType int shortcutType,
@NonNull ComponentName componentName) {
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class);
+ if (a11yManager != null) {
+ a11yManager.enableShortcutsForTargets(
+ /* enable= */ false,
+ shortcutType,
+ Set.of(componentName.flattenToString()),
+ UserHandle.myUserId()
+ );
+ }
+ return;
+ }
+
final StringJoiner joiner = new StringJoiner(String.valueOf(COMPONENT_NAME_SEPARATOR));
final String targetKey = convertKeyFromSettings(shortcutType);
final String targetString = Settings.Secure.getString(context.getContentResolver(),
@@ -307,6 +370,14 @@
if (((shortcutTypes & UserShortcutType.HARDWARE) == UserShortcutType.HARDWARE)) {
exist |= hasValueInSettings(context, UserShortcutType.HARDWARE, componentName);
}
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ if ((shortcutTypes & UserShortcutType.QUICK_SETTINGS)
+ == UserShortcutType.QUICK_SETTINGS) {
+ exist |= hasValueInSettings(context, UserShortcutType.QUICK_SETTINGS,
+ componentName);
+ }
+ }
+
return exist;
}
@@ -321,6 +392,12 @@
@VisibleForTesting
static boolean hasValueInSettings(Context context, @UserShortcutType int shortcutType,
@NonNull ComponentName componentName) {
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ return ShortcutUtils.getShortcutTargetsFromSettings(
+ context, shortcutType, UserHandle.myUserId()
+ ).contains(componentName.flattenToString());
+ }
+
final String targetKey = convertKeyFromSettings(shortcutType);
final String targetString = Settings.Secure.getString(context.getContentResolver(),
targetKey);
@@ -357,6 +434,12 @@
if (hasValuesInSettings(context, UserShortcutType.HARDWARE, componentName)) {
shortcutTypes |= UserShortcutType.HARDWARE;
}
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ if (hasValuesInSettings(context, UserShortcutType.QUICK_SETTINGS, componentName)) {
+ shortcutTypes |= UserShortcutType.QUICK_SETTINGS;
+ }
+ }
+
return shortcutTypes;
}
@@ -367,6 +450,10 @@
* @return Mapping key in Settings.
*/
static String convertKeyFromSettings(@UserShortcutType int shortcutType) {
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ return ShortcutUtils.convertToKey(shortcutType);
+ }
+
switch (shortcutType) {
case UserShortcutType.SOFTWARE:
return Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS;
diff --git a/src/com/android/settings/accessibility/ColorAndMotionFragment.java b/src/com/android/settings/accessibility/ColorAndMotionFragment.java
index 28c5335..4ea2226 100644
--- a/src/com/android/settings/accessibility/ColorAndMotionFragment.java
+++ b/src/com/android/settings/accessibility/ColorAndMotionFragment.java
@@ -74,6 +74,9 @@
mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED);
mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE);
mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS);
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS);
+ }
if (Flags.forceInvertColor()) {
mShortcutFeatureKeys.add(ToggleForceInvertPreferenceController.SETTINGS_KEY);
}
diff --git a/src/com/android/settings/accessibility/HearingDevicePairingFragment.java b/src/com/android/settings/accessibility/HearingDevicePairingFragment.java
index 0b762f3..c797559 100644
--- a/src/com/android/settings/accessibility/HearingDevicePairingFragment.java
+++ b/src/com/android/settings/accessibility/HearingDevicePairingFragment.java
@@ -192,7 +192,7 @@
public void onDeviceBondStateChanged(@NonNull CachedBluetoothDevice cachedDevice,
int bondState) {
if (DEBUG) {
- Log.d(TAG, "onDeviceBondStateChanged: " + cachedDevice.getDevice() + ", state = "
+ Log.d(TAG, "onDeviceBondStateChanged: " + cachedDevice + ", state = "
+ bondState);
}
if (bondState == BluetoothDevice.BOND_BONDED) {
@@ -276,13 +276,13 @@
}
mDevicePreferenceMap.put(cachedDevice, preference);
if (DEBUG) {
- Log.d(TAG, "Add device. device: " + cachedDevice.getDevice());
+ Log.d(TAG, "Add device. device: " + cachedDevice);
}
}
void removeDevice(CachedBluetoothDevice cachedDevice) {
if (DEBUG) {
- Log.d(TAG, "removeDevice: " + cachedDevice.getDevice());
+ Log.d(TAG, "removeDevice: " + cachedDevice);
}
BluetoothDevicePreference preference = mDevicePreferenceMap.remove(cachedDevice);
if (mAvailableHearingDeviceGroup != null && preference != null) {
@@ -331,13 +331,13 @@
cachedDevice = mCachedDeviceManager.addDevice(device);
} else if (cachedDevice.getBondState() == BluetoothDevice.BOND_BONDED) {
if (DEBUG) {
- Log.d(TAG, "Skip this device, already bonded: " + cachedDevice.getDevice());
+ Log.d(TAG, "Skip this device, already bonded: " + cachedDevice);
}
return;
}
if (cachedDevice.getHearingAidInfo() == null) {
if (DEBUG) {
- Log.d(TAG, "Set hearing aid info on device: " + cachedDevice.getDevice());
+ Log.d(TAG, "Set hearing aid info on device: " + cachedDevice);
}
cachedDevice.setHearingAidInfo(new HearingAidInfo.Builder().build());
}
@@ -455,7 +455,7 @@
void discoverServices(CachedBluetoothDevice cachedDevice) {
if (DEBUG) {
- Log.d(TAG, "connectGattToCheckCompatibility, device: " + cachedDevice.getDevice());
+ Log.d(TAG, "connectGattToCheckCompatibility, device: " + cachedDevice);
}
BluetoothGatt gatt = cachedDevice.getDevice().connectGatt(getContext(), false,
new BluetoothGattCallback() {
@@ -465,7 +465,7 @@
super.onConnectionStateChange(gatt, status, newState);
if (DEBUG) {
Log.d(TAG, "onConnectionStateChange, status: " + status + ", newState: "
- + newState + ", device: " + cachedDevice.getDevice());
+ + newState + ", device: " + cachedDevice);
}
if (status == GATT_SUCCESS
&& newState == BluetoothProfile.STATE_CONNECTED) {
@@ -481,14 +481,14 @@
super.onServicesDiscovered(gatt, status);
if (DEBUG) {
Log.d(TAG, "onServicesDiscovered, status: " + status + ", device: "
- + cachedDevice.getDevice());
+ + cachedDevice);
}
if (status == GATT_SUCCESS) {
if (gatt.getService(BluetoothUuid.HEARING_AID.getUuid()) != null
|| gatt.getService(BluetoothUuid.HAS.getUuid()) != null) {
if (DEBUG) {
Log.d(TAG, "compatible with Android, device: "
- + cachedDevice.getDevice());
+ + cachedDevice);
}
addDevice(cachedDevice);
}
diff --git a/src/com/android/settings/accessibility/MagnificationAlwaysOnPreferenceController.java b/src/com/android/settings/accessibility/MagnificationAlwaysOnPreferenceController.java
index e455aa8..f3d8575 100644
--- a/src/com/android/settings/accessibility/MagnificationAlwaysOnPreferenceController.java
+++ b/src/com/android/settings/accessibility/MagnificationAlwaysOnPreferenceController.java
@@ -22,12 +22,6 @@
import android.content.Context;
import android.provider.Settings;
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
-import androidx.preference.PreferenceScreen;
-import androidx.preference.TwoStatePreference;
-
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
@@ -36,15 +30,12 @@
* feature, where the magnifier will not deactivate on Activity transitions; it will only zoom out
* to 100%.
*/
-public class MagnificationAlwaysOnPreferenceController extends TogglePreferenceController
- implements LifecycleObserver {
+public class MagnificationAlwaysOnPreferenceController extends TogglePreferenceController {
private static final String TAG =
MagnificationAlwaysOnPreferenceController.class.getSimpleName();
static final String PREF_KEY = Settings.Secure.ACCESSIBILITY_MAGNIFICATION_ALWAYS_ON_ENABLED;
- private TwoStatePreference mSwitchPreference;
-
public MagnificationAlwaysOnPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
}
@@ -71,24 +62,4 @@
public int getSliceHighlightMenuRes() {
return R.string.menu_key_accessibility;
}
-
- @Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- mSwitchPreference = screen.findPreference(getPreferenceKey());
- }
-
- // TODO(b/186731461): Remove it when this controller is used in DashBoardFragment only.
- @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
- void onResume() {
- updateState();
- }
-
- /**
- * Updates the state of preference components which has been displayed by
- * {@link MagnificationAlwaysOnPreferenceController#displayPreference}.
- */
- void updateState() {
- updateState(mSwitchPreference);
- }
}
diff --git a/src/com/android/settings/accessibility/MagnificationFollowTypingPreferenceController.java b/src/com/android/settings/accessibility/MagnificationFollowTypingPreferenceController.java
index 86983e3..b269a99 100644
--- a/src/com/android/settings/accessibility/MagnificationFollowTypingPreferenceController.java
+++ b/src/com/android/settings/accessibility/MagnificationFollowTypingPreferenceController.java
@@ -22,25 +22,16 @@
import android.content.Context;
import android.provider.Settings;
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
-import androidx.preference.PreferenceScreen;
-import androidx.preference.TwoStatePreference;
-
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
/** Controller that accesses and switches the preference status of following typing feature */
-public class MagnificationFollowTypingPreferenceController extends TogglePreferenceController
- implements LifecycleObserver {
+public class MagnificationFollowTypingPreferenceController extends TogglePreferenceController {
private static final String TAG =
MagnificationFollowTypingPreferenceController.class.getSimpleName();
static final String PREF_KEY = "magnification_follow_typing";
- private TwoStatePreference mFollowTypingPreference;
-
public MagnificationFollowTypingPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
}
@@ -67,24 +58,4 @@
public int getSliceHighlightMenuRes() {
return R.string.menu_key_accessibility;
}
-
- @Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- mFollowTypingPreference = screen.findPreference(getPreferenceKey());
- }
-
- // TODO(b/186731461): Remove it when this controller is used in DashBoardFragment only.
- @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
- void onResume() {
- updateState();
- }
-
- /**
- * Updates the state of preference components which has been displayed by
- * {@link MagnificationFollowTypingPreferenceController#displayPreference}.
- */
- void updateState() {
- updateState(mFollowTypingPreference);
- }
}
diff --git a/src/com/android/settings/accessibility/MagnificationJoystickPreferenceController.java b/src/com/android/settings/accessibility/MagnificationJoystickPreferenceController.java
index 0a24e96..b480a0a 100644
--- a/src/com/android/settings/accessibility/MagnificationJoystickPreferenceController.java
+++ b/src/com/android/settings/accessibility/MagnificationJoystickPreferenceController.java
@@ -22,27 +22,18 @@
import android.content.Context;
import android.provider.Settings;
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
-import androidx.preference.PreferenceScreen;
-import androidx.preference.TwoStatePreference;
-
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
/**
* Controller that accesses and switches the preference status of the magnification joystick feature
*/
-public class MagnificationJoystickPreferenceController extends TogglePreferenceController
- implements LifecycleObserver {
+public class MagnificationJoystickPreferenceController extends TogglePreferenceController {
private static final String TAG =
MagnificationJoystickPreferenceController.class.getSimpleName();
static final String PREF_KEY = Settings.Secure.ACCESSIBILITY_MAGNIFICATION_JOYSTICK_ENABLED;
- private TwoStatePreference mSwitchPreference;
-
public MagnificationJoystickPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
}
@@ -69,24 +60,4 @@
public int getSliceHighlightMenuRes() {
return R.string.menu_key_accessibility;
}
-
- @Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- mSwitchPreference = screen.findPreference(getPreferenceKey());
- }
-
- // TODO(b/186731461): Remove it when this controller is used in DashBoardFragment only.
- @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
- void onResume() {
- updateState();
- }
-
- /**
- * Updates the state of preference components which has been displayed by
- * {@link MagnificationJoystickPreferenceController#displayPreference}.
- */
- void updateState() {
- updateState(mSwitchPreference);
- }
}
diff --git a/src/com/android/settings/accessibility/MagnificationModePreferenceController.java b/src/com/android/settings/accessibility/MagnificationModePreferenceController.java
index 4acf230..a8814ac 100644
--- a/src/com/android/settings/accessibility/MagnificationModePreferenceController.java
+++ b/src/com/android/settings/accessibility/MagnificationModePreferenceController.java
@@ -47,7 +47,6 @@
import com.android.settings.utils.AnnotationSpan;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnCreate;
-import com.android.settingslib.core.lifecycle.events.OnResume;
import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
import java.util.ArrayList;
@@ -55,7 +54,7 @@
/** Controller that shows the magnification area mode summary and the preference click behavior. */
public class MagnificationModePreferenceController extends BasePreferenceController implements
- DialogCreatable, LifecycleObserver, OnCreate, OnResume, OnSaveInstanceState {
+ DialogCreatable, LifecycleObserver, OnCreate, OnSaveInstanceState {
static final String PREF_KEY = "screen_magnification_mode";
private static final int DIALOG_ID_BASE = 10;
@@ -297,12 +296,6 @@
updateCapabilitiesAndSummary(mModeCache);
}
- // TODO(b/186731461): Remove it when this controller is used in DashBoardFragment only.
- @Override
- public void onResume() {
- updateState(mModePreference);
- }
-
/**
* An interface to help the delegate to show the dialog. It will be injected to the delegate.
*/
diff --git a/src/com/android/settings/accessibility/MagnificationOneFingerPanningPreferenceController.java b/src/com/android/settings/accessibility/MagnificationOneFingerPanningPreferenceController.java
new file mode 100644
index 0000000..a2ce948
--- /dev/null
+++ b/src/com/android/settings/accessibility/MagnificationOneFingerPanningPreferenceController.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
+import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.provider.Settings;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.TwoStatePreference;
+
+import com.android.server.accessibility.Flags;
+import com.android.settings.R;
+import com.android.settings.core.TogglePreferenceController;
+
+public class MagnificationOneFingerPanningPreferenceController
+ extends TogglePreferenceController {
+ static final String PREF_KEY = Settings.Secure.ACCESSIBILITY_SINGLE_FINGER_PANNING_ENABLED;
+
+ @Nullable
+ private TwoStatePreference mSwitchPreference;
+
+ @VisibleForTesting
+ final boolean mDefaultValue;
+
+ public MagnificationOneFingerPanningPreferenceController(Context context) {
+ super(context, PREF_KEY);
+ boolean defaultValue;
+ try {
+ defaultValue = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_enable_a11y_magnification_single_panning);
+ } catch (Resources.NotFoundException e) {
+ defaultValue = false;
+ }
+ mDefaultValue = defaultValue;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return (Flags.enableMagnificationOneFingerPanningGesture())
+ ? AVAILABLE : DISABLED_FOR_USER;
+ }
+
+ @Override
+ public boolean isChecked() {
+ return Settings.Secure.getInt(
+ mContext.getContentResolver(),
+ PREF_KEY,
+ (mDefaultValue) ? ON : OFF) == ON;
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ var toReturn = Settings.Secure.putInt(mContext.getContentResolver(),
+ PREF_KEY,
+ (isChecked ? ON : OFF));
+ if (mSwitchPreference != null) {
+ refreshSummary(mSwitchPreference);
+ }
+ return toReturn;
+ }
+
+ @Override
+ public CharSequence getSummary() {
+ return (isChecked())
+ ? mContext.getString(
+ R.string.accessibility_magnification_one_finger_panning_summary_on)
+ : mContext.getString(
+ R.string.accessibility_magnification_one_finger_panning_summary_off);
+ }
+
+ @Override
+ public int getSliceHighlightMenuRes() {
+ return R.string.menu_key_accessibility;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mSwitchPreference = screen.findPreference(getPreferenceKey());
+ refreshSummary(mSwitchPreference);
+ }
+}
diff --git a/src/com/android/settings/accessibility/PreferredShortcuts.java b/src/com/android/settings/accessibility/PreferredShortcuts.java
index e76bc9b..e166f38 100644
--- a/src/com/android/settings/accessibility/PreferredShortcuts.java
+++ b/src/com/android/settings/accessibility/PreferredShortcuts.java
@@ -21,8 +21,10 @@
import android.content.SharedPreferences;
import android.os.UserHandle;
import android.util.ArrayMap;
+import android.view.accessibility.Flags;
import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.internal.accessibility.util.ShortcutUtils;
@@ -98,6 +100,11 @@
@NonNull Context context, @NonNull Set<String> components) {
final Map<Integer, Set<String>> shortcutTypeToTargets = new ArrayMap<>();
for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) {
+ if (!Flags.a11yQsShortcut()
+ && shortcutType == ShortcutConstants.UserShortcutType.QUICK_SETTINGS) {
+ // Skip saving quick setting as preferred shortcut option when flag is not enabled
+ continue;
+ }
shortcutTypeToTargets.put(
shortcutType,
ShortcutUtils.getShortcutTargetsFromSettings(
@@ -138,6 +145,11 @@
return context.getSharedPreferences(ACCESSIBILITY_PERF, Context.MODE_PRIVATE);
}
+ @VisibleForTesting(otherwise = VisibleForTesting.NONE)
+ static void clearPreferredShortcuts(Context context) {
+ getSharedPreferences(context).edit().clear().apply();
+ }
+
/**
* Returns the default shortcut types for the given accessibility feature.
*/
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index e7835f8..ed47007 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -179,6 +179,9 @@
final List<String> shortcutFeatureKeys = new ArrayList<>();
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS);
shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE);
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ shortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_QS_TARGETS);
+ }
return shortcutFeatureKeys;
}
@@ -711,6 +714,13 @@
mComponentName.flattenToString());
final List<CharSequence> list = new ArrayList<>();
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ if (hasShortcutType(shortcutTypes, UserShortcutType.QUICK_SETTINGS)) {
+ final CharSequence qsTitle = context.getText(
+ R.string.accessibility_feature_shortcut_setting_summary_quick_settings);
+ list.add(qsTitle);
+ }
+ }
if (hasShortcutType(shortcutTypes, UserShortcutType.SOFTWARE)) {
list.add(getSoftwareShortcutTypeSummary(context));
}
@@ -906,6 +916,10 @@
}
private void showQuickSettingsTooltipIfNeeded() {
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ // Don't show Quick Settings tooltip
+ return;
+ }
final ComponentName tileComponentName = getTileComponentName();
if (tileComponentName == null) {
// Returns if no tile service assigned.
diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
index 023556c..6ef764e 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java
@@ -33,6 +33,7 @@
import android.icu.text.MessageFormat;
import android.net.Uri;
import android.os.Bundle;
+import android.os.UserHandle;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.text.TextUtils;
@@ -65,6 +66,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
+import java.util.Set;
import java.util.StringJoiner;
/**
@@ -200,28 +202,16 @@
final PreferenceCategory generalCategory = findPreference(KEY_GENERAL_CATEGORY);
generalCategory.addPreference(mSettingsPreference);
+ addOneFingerPanningSetting(generalCategory);
final MagnificationModePreferenceController magnificationModePreferenceController =
new MagnificationModePreferenceController(getContext(),
MagnificationModePreferenceController.PREF_KEY);
magnificationModePreferenceController.setDialogHelper(this);
getSettingsLifecycle().addObserver(magnificationModePreferenceController);
magnificationModePreferenceController.displayPreference(getPreferenceScreen());
+ addPreferenceController(magnificationModePreferenceController);
- mFollowingTypingSwitchPreference = new SwitchPreferenceCompat(getPrefContext());
- mFollowingTypingSwitchPreference.setTitle(
- R.string.accessibility_screen_magnification_follow_typing_title);
- mFollowingTypingSwitchPreference.setSummary(
- R.string.accessibility_screen_magnification_follow_typing_summary);
- mFollowingTypingSwitchPreference.setKey(
- MagnificationFollowTypingPreferenceController.PREF_KEY);
- generalCategory.addPreference(mFollowingTypingSwitchPreference);
-
- mFollowTypingPreferenceController = new MagnificationFollowTypingPreferenceController(
- getContext(), MagnificationFollowTypingPreferenceController.PREF_KEY);
- getSettingsLifecycle().addObserver(mFollowTypingPreferenceController);
- mFollowTypingPreferenceController.displayPreference(getPreferenceScreen());
- addPreferenceController(mFollowTypingPreferenceController);
-
+ addFollowTypingSetting(generalCategory);
addAlwaysOnSetting(generalCategory);
addJoystickSetting(generalCategory);
}
@@ -250,6 +240,22 @@
super.onProcessArguments(arguments);
}
+ private void addFollowTypingSetting(PreferenceCategory generalCategory) {
+ var followTypingSwitchPreference = new SwitchPreferenceCompat(getPrefContext());
+ followTypingSwitchPreference.setTitle(
+ R.string.accessibility_screen_magnification_follow_typing_title);
+ followTypingSwitchPreference.setSummary(
+ R.string.accessibility_screen_magnification_follow_typing_summary);
+ followTypingSwitchPreference.setKey(
+ MagnificationFollowTypingPreferenceController.PREF_KEY);
+ generalCategory.addPreference(followTypingSwitchPreference);
+
+ var followTypingPreferenceController = new MagnificationFollowTypingPreferenceController(
+ getContext(), MagnificationFollowTypingPreferenceController.PREF_KEY);
+ followTypingPreferenceController.displayPreference(getPreferenceScreen());
+ addPreferenceController(followTypingPreferenceController);
+ }
+
private boolean isAlwaysOnSettingEnabled() {
final boolean defaultValue = getContext().getResources().getBoolean(
com.android.internal.R.bool.config_magnification_always_on_enabled);
@@ -276,11 +282,28 @@
var alwaysOnPreferenceController = new MagnificationAlwaysOnPreferenceController(
getContext(), MagnificationAlwaysOnPreferenceController.PREF_KEY);
- getSettingsLifecycle().addObserver(alwaysOnPreferenceController);
alwaysOnPreferenceController.displayPreference(getPreferenceScreen());
addPreferenceController(alwaysOnPreferenceController);
}
+ private void addOneFingerPanningSetting(PreferenceCategory generalCategory) {
+ if (!Flags.enableMagnificationOneFingerPanningGesture()) {
+ return;
+ }
+
+ var oneFingerPanningPreference = new SwitchPreferenceCompat(getPrefContext());
+ oneFingerPanningPreference.setTitle(
+ R.string.accessibility_magnification_one_finger_panning_title);
+ oneFingerPanningPreference.setKey(
+ MagnificationOneFingerPanningPreferenceController.PREF_KEY);
+ generalCategory.addPreference(oneFingerPanningPreference);
+
+ var oneFingerPanningPreferenceController =
+ new MagnificationOneFingerPanningPreferenceController(getContext());
+ oneFingerPanningPreferenceController.displayPreference(getPreferenceScreen());
+ addPreferenceController(oneFingerPanningPreferenceController);
+ }
+
private void addJoystickSetting(PreferenceCategory generalCategory) {
if (!DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_WINDOW_MANAGER,
@@ -304,7 +327,6 @@
getContext(),
MagnificationJoystickPreferenceController.PREF_KEY
);
- getSettingsLifecycle().addObserver(joystickPreferenceController);
joystickPreferenceController.displayPreference(getPreferenceScreen());
addPreferenceController(joystickPreferenceController);
}
@@ -337,7 +359,7 @@
}
if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
if (mTwoFingerTripleTapTypeCheckBox.isChecked()) {
- value |= UserShortcutType.TWOFINGERTRIPLETAP;
+ value |= UserShortcutType.TWOFINGER_DOUBLETAP;
}
}
return value;
@@ -399,7 +421,7 @@
hasShortcutType(value, UserShortcutType.TRIPLETAP));
if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
mTwoFingerTripleTapTypeCheckBox.setChecked(
- hasShortcutType(value, UserShortcutType.TWOFINGERTRIPLETAP));
+ hasShortcutType(value, UserShortcutType.TWOFINGER_DOUBLETAP));
}
}
@@ -463,6 +485,13 @@
MAGNIFICATION_CONTROLLER_NAME);
final List<CharSequence> list = new ArrayList<>();
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ if (hasShortcutType(shortcutTypes, UserShortcutType.QUICK_SETTINGS)) {
+ final CharSequence qsTitle = context.getText(
+ R.string.accessibility_feature_shortcut_setting_summary_quick_settings);
+ list.add(qsTitle);
+ }
+ }
if (hasShortcutType(shortcutTypes, UserShortcutType.SOFTWARE)) {
list.add(getSoftwareShortcutTypeSummary(context));
}
@@ -477,7 +506,7 @@
list.add(tripleTapTitle);
}
if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
- if (hasShortcutType(shortcutTypes, UserShortcutType.TWOFINGERTRIPLETAP)) {
+ if (hasShortcutType(shortcutTypes, UserShortcutType.TWOFINGER_DOUBLETAP)) {
final CharSequence twoFingerTripleTapTitle = context.getText(
R.string.accessibility_shortcut_two_finger_double_tap_keyword);
list.add(twoFingerTripleTapTitle);
@@ -658,15 +687,34 @@
optInMagnificationValueToSettings(context, UserShortcutType.TRIPLETAP);
}
if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
- if (((shortcutTypes & UserShortcutType.TWOFINGERTRIPLETAP)
- == UserShortcutType.TWOFINGERTRIPLETAP)) {
- optInMagnificationValueToSettings(context, UserShortcutType.TWOFINGERTRIPLETAP);
+ if (((shortcutTypes & UserShortcutType.TWOFINGER_DOUBLETAP)
+ == UserShortcutType.TWOFINGER_DOUBLETAP)) {
+ optInMagnificationValueToSettings(context, UserShortcutType.TWOFINGER_DOUBLETAP);
+ }
+ }
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ if (((shortcutTypes & UserShortcutType.QUICK_SETTINGS)
+ == UserShortcutType.QUICK_SETTINGS)) {
+ optInMagnificationValueToSettings(context, UserShortcutType.QUICK_SETTINGS);
}
}
}
- private static void optInMagnificationValueToSettings(Context context,
- @UserShortcutType int shortcutType) {
+ private static void optInMagnificationValueToSettings(
+ Context context, @UserShortcutType int shortcutType) {
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class);
+ if (a11yManager != null) {
+ a11yManager.enableShortcutsForTargets(
+ /* enable= */ true,
+ shortcutType,
+ Set.of(MAGNIFICATION_CONTROLLER_NAME),
+ UserHandle.myUserId()
+ );
+ }
+ return;
+ }
+
if (shortcutType == UserShortcutType.TRIPLETAP) {
Settings.Secure.putInt(context.getContentResolver(),
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, ON);
@@ -674,8 +722,9 @@
}
if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
- if (shortcutType == UserShortcutType.TWOFINGERTRIPLETAP) {
- Settings.Secure.putInt(context.getContentResolver(),
+ if (shortcutType == UserShortcutType.TWOFINGER_DOUBLETAP) {
+ Settings.Secure.putInt(
+ context.getContentResolver(),
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED,
ON);
return;
@@ -723,15 +772,34 @@
optOutMagnificationValueFromSettings(context, UserShortcutType.TRIPLETAP);
}
if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
- if (((shortcutTypes & UserShortcutType.TWOFINGERTRIPLETAP)
- == UserShortcutType.TWOFINGERTRIPLETAP)) {
- optOutMagnificationValueFromSettings(context, UserShortcutType.TWOFINGERTRIPLETAP);
+ if (((shortcutTypes & UserShortcutType.TWOFINGER_DOUBLETAP)
+ == UserShortcutType.TWOFINGER_DOUBLETAP)) {
+ optOutMagnificationValueFromSettings(context, UserShortcutType.TWOFINGER_DOUBLETAP);
+ }
+ }
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ if (((shortcutTypes & UserShortcutType.QUICK_SETTINGS)
+ == UserShortcutType.QUICK_SETTINGS)) {
+ optOutMagnificationValueFromSettings(context, UserShortcutType.QUICK_SETTINGS);
}
}
}
private static void optOutMagnificationValueFromSettings(Context context,
@UserShortcutType int shortcutType) {
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ AccessibilityManager a11yManager = context.getSystemService(AccessibilityManager.class);
+ if (a11yManager != null) {
+ a11yManager.enableShortcutsForTargets(
+ /* enable= */ false,
+ shortcutType,
+ Set.of(MAGNIFICATION_CONTROLLER_NAME),
+ UserHandle.myUserId()
+ );
+ }
+ return;
+ }
+
if (shortcutType == UserShortcutType.TRIPLETAP) {
Settings.Secure.putInt(context.getContentResolver(),
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, OFF);
@@ -739,8 +807,9 @@
}
if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
- if (shortcutType == UserShortcutType.TWOFINGERTRIPLETAP) {
- Settings.Secure.putInt(context.getContentResolver(),
+ if (shortcutType == UserShortcutType.TWOFINGER_DOUBLETAP) {
+ Settings.Secure.putInt(
+ context.getContentResolver(),
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED,
OFF);
return;
@@ -783,10 +852,10 @@
exist |= hasMagnificationValueInSettings(context, UserShortcutType.TRIPLETAP);
}
if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
- if (((shortcutTypes & UserShortcutType.TWOFINGERTRIPLETAP)
- == UserShortcutType.TWOFINGERTRIPLETAP)) {
+ if (((shortcutTypes & UserShortcutType.TWOFINGER_DOUBLETAP)
+ == UserShortcutType.TWOFINGER_DOUBLETAP)) {
exist |= hasMagnificationValueInSettings(context,
- UserShortcutType.TWOFINGERTRIPLETAP);
+ UserShortcutType.TWOFINGER_DOUBLETAP);
}
}
return exist;
@@ -800,7 +869,7 @@
}
if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
- if (shortcutType == UserShortcutType.TWOFINGERTRIPLETAP) {
+ if (shortcutType == UserShortcutType.TWOFINGER_DOUBLETAP) {
return Settings.Secure.getInt(context.getContentResolver(),
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED,
OFF) == ON;
@@ -837,8 +906,8 @@
shortcutTypes |= UserShortcutType.TRIPLETAP;
}
if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
- if (hasMagnificationValuesInSettings(context, UserShortcutType.TWOFINGERTRIPLETAP)) {
- shortcutTypes |= UserShortcutType.TWOFINGERTRIPLETAP;
+ if (hasMagnificationValuesInSettings(context, UserShortcutType.TWOFINGER_DOUBLETAP)) {
+ shortcutTypes |= UserShortcutType.TWOFINGER_DOUBLETAP;
}
}
return shortcutTypes;
diff --git a/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java b/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java
index 5a3b13a..976fffb 100644
--- a/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java
@@ -21,6 +21,7 @@
import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS;
import static android.provider.Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED;
import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED;
+import static android.provider.Settings.Secure.ACCESSIBILITY_QS_TARGETS;
import static android.provider.Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
@@ -98,6 +99,9 @@
private static final Uri TWO_FINGERS_DOUBLE_TAP_SHORTCUT_SETTING =
Settings.Secure.getUriFor(ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED);
+ private static final Uri QUICK_SETTINGS_SHORTCUT_SETTING =
+ Settings.Secure.getUriFor(ACCESSIBILITY_QS_TARGETS);
+
@VisibleForTesting
static final Uri[] SHORTCUT_SETTINGS = {
VOLUME_KEYS_SHORTCUT_SETTING,
@@ -105,6 +109,7 @@
BUTTON_SHORTCUT_SETTING,
TRIPLE_TAP_SHORTCUT_SETTING,
TWO_FINGERS_DOUBLE_TAP_SHORTCUT_SETTING,
+ QUICK_SETTINGS_SHORTCUT_SETTING,
};
private Set<String> mShortcutTargets;
@@ -171,7 +176,9 @@
} else if (TRIPLE_TAP_SHORTCUT_SETTING.equals(uri)) {
refreshPreferenceController(TripleTapShortcutOptionController.class);
} else if (TWO_FINGERS_DOUBLE_TAP_SHORTCUT_SETTING.equals(uri)) {
- refreshPreferenceController(TwoFingersDoubleTapShortcutOptionController.class);
+ refreshPreferenceController(TwoFingerDoubleTapShortcutOptionController.class);
+ } else if (QUICK_SETTINGS_SHORTCUT_SETTING.equals(uri)) {
+ refreshPreferenceController(QuickSettingsShortcutOptionController.class);
}
PreferredShortcuts.updatePreferredShortcutsFromSettings(
@@ -207,9 +214,9 @@
activity.setTitle(titles.first);
- String categoryKey = activity.getResources().getString(
+ String screenDescriptionPrefKey = getString(
R.string.accessibility_shortcut_description_pref);
- findPreference(categoryKey).setTitle(titles.second);
+ findPreference(screenDescriptionPrefKey).setSummary(titles.second);
}
@NonNull
diff --git a/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionController.java b/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionController.java
new file mode 100644
index 0000000..27f6bc9
--- /dev/null
+++ b/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionController.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility.shortcuts;
+
+import static com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType.INVISIBLE_TOGGLE;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.UserHandle;
+import android.service.quicksettings.TileService;
+import android.util.ArraySet;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.Flags;
+
+import androidx.annotation.NonNull;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.internal.accessibility.common.ShortcutConstants;
+import com.android.internal.accessibility.util.AccessibilityUtils;
+import com.android.settings.R;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A controller handles displaying the quick settings shortcut option preference and
+ * configuring the shortcut.
+ */
+public class QuickSettingsShortcutOptionController extends ShortcutOptionPreferenceController {
+ public QuickSettingsShortcutOptionController(
+ @NonNull Context context, @NonNull String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @ShortcutConstants.UserShortcutType
+ @Override
+ protected int getShortcutType() {
+ return ShortcutConstants.UserShortcutType.QUICK_SETTINGS;
+ }
+
+ @Override
+ public void displayPreference(@NonNull PreferenceScreen screen) {
+ super.displayPreference(screen);
+ final Preference preference = screen.findPreference(getPreferenceKey());
+ if (preference instanceof ShortcutOptionPreference shortcutOptionPreference) {
+ shortcutOptionPreference.setTitle(
+ R.string.accessibility_shortcut_edit_dialog_title_quick_settings);
+ shortcutOptionPreference.setSummary(
+ R.string.accessibility_shortcut_edit_dialog_summary_quick_settings);
+ shortcutOptionPreference.setIntroImageResId(
+ R.drawable.a11y_shortcut_type_quick_settings);
+ }
+ }
+
+ @Override
+ protected boolean isShortcutAvailable() {
+ return Flags.a11yQsShortcut()
+ && TileService.isQuickSettingsSupported()
+ && allTargetsHasQsTile()
+ && allTargetsHasValidQsTileUseCase();
+ }
+
+ private boolean allTargetsHasQsTile() {
+ AccessibilityManager accessibilityManager = mContext.getSystemService(
+ AccessibilityManager.class);
+ if (accessibilityManager == null) {
+ return false;
+ }
+
+ Map<ComponentName, ComponentName> a11yFeatureToTileMap =
+ accessibilityManager.getA11yFeatureToTileMap(UserHandle.myUserId());
+ if (a11yFeatureToTileMap.isEmpty()) {
+ return false;
+ }
+ for (String target : getShortcutTargets()) {
+ ComponentName targetComponentName = ComponentName.unflattenFromString(target);
+ if (!a11yFeatureToTileMap.containsKey(targetComponentName)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns true if all targets have valid QS Tile shortcut use case.
+ *
+ * <p>
+ * Note: We don't want to promote the qs option in the edit shortcuts screen for
+ * a standard AccessibilityService, because the Tile is provided by the owner of the
+ * AccessibilityService, and they don't have control to enable the A11yService themselves
+ * which makes the TileService not acting as the other a11y shortcut like FAB where the user
+ * can turn on/off the feature by toggling the shortcut.
+ *
+ * A standard AccessibilityService normally won't create a TileService because the
+ * above mentioned reason. In any case where the standard AccessibilityService provides a tile,
+ * we'll hide it from the Setting's UI.
+ * </p>
+ */
+ private boolean allTargetsHasValidQsTileUseCase() {
+ AccessibilityManager accessibilityManager = mContext.getSystemService(
+ AccessibilityManager.class);
+ if (accessibilityManager == null) {
+ return false;
+ }
+
+ List<AccessibilityServiceInfo> installedServices =
+ accessibilityManager.getInstalledAccessibilityServiceList();
+ final Set<String> standardA11yServices = new ArraySet<>();
+ for (AccessibilityServiceInfo serviceInfo : installedServices) {
+ if (AccessibilityUtils.getAccessibilityServiceFragmentType(serviceInfo)
+ != INVISIBLE_TOGGLE) {
+ standardA11yServices.add(serviceInfo.getComponentName().flattenToString());
+ }
+ }
+
+ for (String target : getShortcutTargets()) {
+ if (standardA11yServices.contains(target)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreferenceController.java b/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreferenceController.java
index 4d35554..defb256 100644
--- a/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreferenceController.java
+++ b/src/com/android/settings/accessibility/shortcuts/ShortcutOptionPreferenceController.java
@@ -18,6 +18,8 @@
import android.content.Context;
import android.os.UserHandle;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.Flags;
import androidx.annotation.NonNull;
import androidx.preference.Preference;
@@ -116,6 +118,16 @@
Set<String> shortcutTargets = getShortcutTargets();
@ShortcutConstants.UserShortcutType int shortcutType = getShortcutType();
+ if (Flags.a11yQsShortcut()) {
+ AccessibilityManager a11yManager = mContext.getSystemService(
+ AccessibilityManager.class);
+ if (a11yManager != null) {
+ a11yManager.enableShortcutsForTargets(enable, shortcutType, shortcutTargets,
+ UserHandle.myUserId());
+ }
+ return;
+ }
+
if (enable) {
for (String target : shortcutTargets) {
ShortcutUtils.optInValueToSettings(mContext, shortcutType, target);
diff --git a/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceController.java b/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceController.java
index 24098c8..861bebd 100644
--- a/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceController.java
+++ b/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceController.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.provider.Settings;
import android.view.View;
+import android.view.accessibility.Flags;
import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.settings.R;
@@ -65,6 +66,9 @@
@Override
protected void enableShortcutForTargets(boolean enable) {
super.enableShortcutForTargets(enable);
+ if (Flags.a11yQsShortcut()) {
+ return;
+ }
if (enable) {
// Update the A11y FAB size to large when the Magnification shortcut is enabled
diff --git a/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionController.java b/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionController.java
index 0eb1ee5..e43aeb2 100644
--- a/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionController.java
+++ b/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionController.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.icu.text.MessageFormat;
import android.provider.Settings;
+import android.view.accessibility.Flags;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -105,6 +106,11 @@
@Override
protected void enableShortcutForTargets(boolean enable) {
+ if (Flags.a11yQsShortcut()) {
+ super.enableShortcutForTargets(enable);
+ return;
+ }
+
Settings.Secure.putInt(
mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
diff --git a/src/com/android/settings/accessibility/shortcuts/TwoFingersDoubleTapShortcutOptionController.java b/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionController.java
similarity index 90%
rename from src/com/android/settings/accessibility/shortcuts/TwoFingersDoubleTapShortcutOptionController.java
rename to src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionController.java
index 64ed7bd..83ba6e4 100644
--- a/src/com/android/settings/accessibility/shortcuts/TwoFingersDoubleTapShortcutOptionController.java
+++ b/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionController.java
@@ -36,17 +36,17 @@
* A controller handles displaying the two fingers double tap shortcut option preference and
* configuring the shortcut.
*/
-public class TwoFingersDoubleTapShortcutOptionController
+public class TwoFingerDoubleTapShortcutOptionController
extends ShortcutOptionPreferenceController {
- public TwoFingersDoubleTapShortcutOptionController(Context context, String preferenceKey) {
+ public TwoFingerDoubleTapShortcutOptionController(Context context, String preferenceKey) {
super(context, preferenceKey);
}
@ShortcutConstants.UserShortcutType
@Override
protected int getShortcutType() {
- return ShortcutConstants.UserShortcutType.TRIPLETAP;
+ return ShortcutConstants.UserShortcutType.TWOFINGER_DOUBLETAP;
}
@Override
@@ -90,6 +90,10 @@
@Override
protected void enableShortcutForTargets(boolean enable) {
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ super.enableShortcutForTargets(enable);
+ return;
+ }
Settings.Secure.putInt(
mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED,
diff --git a/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionController.java b/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionController.java
index 9083e7c..e8e261c 100644
--- a/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionController.java
+++ b/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionController.java
@@ -17,6 +17,7 @@
package com.android.settings.accessibility.shortcuts;
import android.content.Context;
+import android.view.accessibility.Flags;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -64,6 +65,10 @@
@Override
protected void enableShortcutForTargets(boolean enable) {
super.enableShortcutForTargets(enable);
+ if (Flags.a11yQsShortcut()) {
+ return;
+ }
+
if (enable) {
AccessibilityUtil.skipVolumeShortcutDialogTimeoutRestriction(mContext);
}
diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java
index 2d862d6..4f03303 100644
--- a/src/com/android/settings/accounts/AccountPreferenceController.java
+++ b/src/com/android/settings/accounts/AccountPreferenceController.java
@@ -311,11 +311,10 @@
// should be shown or not.
if (((profile.isManagedProfile()
&& (mType & ProfileSelectFragment.ProfileType.WORK) != 0)
- || (Flags.allowPrivateProfile()
- && profile.isPrivateProfile()
+ || (isPrivateProfile(profile)
&& (mType & ProfileSelectFragment.ProfileType.PRIVATE) != 0)
|| (!profile.isManagedProfile()
- && !(Flags.allowPrivateProfile() && profile.isPrivateProfile())
+ && !isPrivateProfile(profile)
&& (mType & ProfileSelectFragment.ProfileType.PERSONAL) != 0))
&& !(mUm.getUserProperties(profile.getUserHandle())
.getShowInQuietMode() == UserProperties.SHOW_IN_QUIET_MODE_HIDDEN
@@ -338,6 +337,12 @@
mFragment.forceUpdatePreferences();
}
+ private static boolean isPrivateProfile(UserInfo profile) {
+ return Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
+ && profile.isPrivateProfile();
+ }
+
private void updateProfileUi(final UserInfo userInfo) {
if (mFragment.getPreferenceManager() == null) {
return;
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
index 4e39070..b2ec589 100644
--- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
@@ -39,7 +39,6 @@
import com.android.settings.SettingsActivity;
import com.android.settings.SubSettings;
import com.android.settings.biometrics.face.FaceEnrollIntroduction;
-import com.android.settings.biometrics.face.FaceEnrollIntroductionInternal;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroductionInternal;
@@ -260,7 +259,6 @@
addActivityFilter(activityFilters, FingerprintEnrollIntroduction.class);
addActivityFilter(activityFilters, FingerprintEnrollIntroductionInternal.class);
addActivityFilter(activityFilters, FingerprintEnrollEnrolling.class);
- addActivityFilter(activityFilters, FaceEnrollIntroductionInternal.class);
addActivityFilter(activityFilters, FaceEnrollIntroduction.class);
addActivityFilter(activityFilters, RemoteAuthActivity.class);
addActivityFilter(activityFilters, RemoteAuthActivityInternal.class);
diff --git a/src/com/android/settings/applications/AppStoreUtil.java b/src/com/android/settings/applications/AppStoreUtil.java
index b73b14a..636669c 100644
--- a/src/com/android/settings/applications/AppStoreUtil.java
+++ b/src/com/android/settings/applications/AppStoreUtil.java
@@ -83,6 +83,7 @@
}
/** Convenience method that looks up the installerPackageName for you. */
+ @Nullable
public static Intent getAppStoreLink(Context context, String packageName) {
String installerPackageName = getInstallerPackageName(context, packageName);
return getAppStoreLink(context, installerPackageName, packageName);
diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPickerPrivate.java b/src/com/android/settings/applications/credentials/DefaultCombinedPickerPrivate.java
index 8d8af0e..52adc4d 100644
--- a/src/com/android/settings/applications/credentials/DefaultCombinedPickerPrivate.java
+++ b/src/com/android/settings/applications/credentials/DefaultCombinedPickerPrivate.java
@@ -17,7 +17,6 @@
package com.android.settings.applications.credentials;
import android.os.UserManager;
-import android.util.Slog;
import com.android.settings.Utils;
import com.android.settings.dashboard.profileselector.ProfileSelectFragment.ProfileType;
@@ -33,13 +32,6 @@
/** Returns whether the user is handled by this fragment. */
public static boolean isUserHandledByFragment(UserManager userManager) {
- try {
- // If there is no private profile then this will throw an exception.
- Utils.getCurrentUserIdOfType(userManager, ProfileType.PRIVATE);
- return true;
- } catch (IllegalStateException e) {
- Slog.e(TAG, "Failed to get private profile user id", e);
- return false;
- }
+ return android.os.Flags.allowPrivateProfile() && userManager.isPrivateProfile();
}
}
diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListPreferenceController.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListPreferenceController.java
index 640f21d..86c11c2 100644
--- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListPreferenceController.java
+++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminListPreferenceController.java
@@ -167,8 +167,9 @@
}
private boolean shouldSkipProfile(UserHandle profile) {
- return android.os.Flags.allowPrivateProfile()
+ return android.os.Flags.allowPrivateProfile()
&& android.multiuser.Flags.handleInterleavedSettingsForPrivateSpace()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
&& mUm.isQuietModeEnabled(profile)
&& mUm.getUserProperties(profile).getShowInQuietMode()
== UserProperties.SHOW_IN_QUIET_MODE_HIDDEN;
diff --git a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java
index faa1b51..81e8439 100644
--- a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java
+++ b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java
@@ -384,20 +384,21 @@
}
private void handleInstallBannerClick() {
- if (mInstallAppIntent == null) {
- logEvent(
- DevicePolicyEnums.CROSS_PROFILE_SETTINGS_PAGE_INSTALL_BANNER_NO_INTENT_CLICKED);
- return;
- }
- if (!mInstalledInWork) {
+ if (mInstallAppIntent != null
+ && !mInstalledInWork
+ && isInstallableInProfile(mInstallAppIntent, mWorkProfile)) {
logEvent(DevicePolicyEnums.CROSS_PROFILE_SETTINGS_PAGE_INSTALL_BANNER_CLICKED);
mContext.startActivityAsUser(mInstallAppIntent, mWorkProfile);
return;
}
- if (!mInstalledInPersonal) {
+ if (mInstallAppIntent != null
+ && !mInstalledInPersonal
+ && isInstallableInProfile(mInstallAppIntent, mPersonalProfile)) {
logEvent(DevicePolicyEnums.CROSS_PROFILE_SETTINGS_PAGE_INSTALL_BANNER_CLICKED);
mContext.startActivityAsUser(mInstallAppIntent, mPersonalProfile);
+ return;
}
+ logEvent(DevicePolicyEnums.CROSS_PROFILE_SETTINGS_PAGE_INSTALL_BANNER_NO_INTENT_CLICKED);
}
/**
@@ -447,7 +448,8 @@
R.string.interact_across_profiles_install_personal_app_title,
mAppLabel),
mAppLabel));
- if (mInstallAppIntent != null) {
+ if (mInstallAppIntent != null
+ && isInstallableInProfile(mInstallAppIntent, mPersonalProfile)) {
mInstallBanner.setSummary(
R.string.interact_across_profiles_install_app_summary);
}
@@ -461,7 +463,8 @@
R.string.interact_across_profiles_install_work_app_title,
mAppLabel),
mAppLabel));
- if (mInstallAppIntent != null) {
+ if (mInstallAppIntent != null
+ && isInstallableInProfile(mInstallAppIntent, mWorkProfile)) {
mInstallBanner.setSummary(
R.string.interact_across_profiles_install_app_summary);
}
@@ -488,6 +491,12 @@
return info != null;
}
+ private boolean isInstallableInProfile(Intent intent, UserHandle profile) {
+ return !mContext.getPackageManager()
+ .queryIntentActivitiesAsUser(intent, /* flags= */ 0, profile)
+ .isEmpty();
+ }
+
private void refreshUiForConfigurableApps() {
mInstallBanner.setVisible(false);
mSwitchPref.setEnabled(true);
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
index f92cfbf..26965fa 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
@@ -340,6 +340,9 @@
final List<FingerprintSensorPropertiesInternal> props =
mFingerprintManager.getSensorPropertiesInternal();
// This will need to be updated for devices with multiple fingerprint sensors
+ if (props == null || props.isEmpty()) {
+ return R.string.fingerprint_intro_error_unknown;
+ }
final int max = props.get(0).maxEnrollmentsPerUser;
final int numEnrolledFingerprints =
mFingerprintManager.getEnrolledFingerprints(mUserId).size();
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHearingAidsPresetsController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHearingAidsPresetsController.java
new file mode 100644
index 0000000..43721f4
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsHearingAidsPresetsController.java
@@ -0,0 +1,308 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import static com.android.settings.bluetooth.BluetoothDetailsHearingDeviceController.KEY_HEARING_DEVICE_GROUP;
+import static com.android.settings.bluetooth.BluetoothDetailsHearingDeviceController.ORDER_HEARING_AIDS_PRESETS;
+
+import android.bluetooth.BluetoothCsipSetCoordinator;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHapClient;
+import android.bluetooth.BluetoothHapPresetInfo;
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.HapClientProfile;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.events.OnPause;
+import com.android.settingslib.core.lifecycle.events.OnResume;
+import com.android.settingslib.utils.ThreadUtils;
+
+import java.util.List;
+
+/**
+ * The controller of the hearing aid presets.
+ */
+public class BluetoothDetailsHearingAidsPresetsController extends
+ BluetoothDetailsController implements Preference.OnPreferenceChangeListener,
+ BluetoothHapClient.Callback, OnResume, OnPause {
+
+ private static final boolean DEBUG = true;
+ private static final String TAG = "BluetoothDetailsHearingAidsPresetsController";
+ static final String KEY_HEARING_AIDS_PRESETS = "hearing_aids_presets";
+
+ private final HapClientProfile mHapClientProfile;
+ @Nullable
+ private ListPreference mPreference;
+
+ public BluetoothDetailsHearingAidsPresetsController(@NonNull Context context,
+ @NonNull PreferenceFragmentCompat fragment,
+ @NonNull LocalBluetoothManager manager,
+ @NonNull CachedBluetoothDevice device,
+ @NonNull Lifecycle lifecycle) {
+ super(context, fragment, device, lifecycle);
+ mHapClientProfile = manager.getProfileManager().getHapClientProfile();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (mHapClientProfile != null) {
+ mHapClientProfile.registerCallback(ThreadUtils.getBackgroundExecutor(), this);
+ }
+ }
+
+ @Override
+ public void onPause() {
+ if (mHapClientProfile != null) {
+ mHapClientProfile.unregisterCallback(this);
+ }
+ super.onPause();
+ }
+
+ @Override
+ public boolean onPreferenceChange(@NonNull Preference preference, @Nullable Object newValue) {
+ if (TextUtils.equals(preference.getKey(), getPreferenceKey())) {
+ if (newValue instanceof final String value
+ && preference instanceof final ListPreference listPreference) {
+ final int index = listPreference.findIndexOfValue(value);
+ final String presetName = listPreference.getEntries()[index].toString();
+ final int presetIndex = Integer.parseInt(
+ listPreference.getEntryValues()[index].toString());
+ listPreference.setSummary(presetName);
+ boolean supportSynchronizedPresets = mHapClientProfile.supportsSynchronizedPresets(
+ mCachedDevice.getDevice());
+ int hapGroupId = mHapClientProfile.getHapGroup(mCachedDevice.getDevice());
+ if (supportSynchronizedPresets
+ && hapGroupId != BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
+ if (DEBUG) {
+ Log.d(TAG, "onPreferenceChange, selectPresetForGroup "
+ + ", presetName: " + presetName
+ + ", presetIndex: " + presetIndex
+ + ", hapGroupId: " + hapGroupId
+ + ", device: " + mCachedDevice.getAddress());
+ }
+ mHapClientProfile.selectPresetForGroup(hapGroupId, presetIndex);
+ } else {
+ if (DEBUG) {
+ Log.d(TAG, "onPreferenceChange, selectPreset "
+ + ", presetName: " + presetName
+ + ", presetIndex: " + presetIndex
+ + ", device: " + mCachedDevice.getAddress());
+ }
+ mHapClientProfile.selectPreset(mCachedDevice.getDevice(), presetIndex);
+ final CachedBluetoothDevice subDevice = mCachedDevice.getSubDevice();
+ if (subDevice != null) {
+ if (DEBUG) {
+ Log.d(TAG, "onPreferenceChange, selectPreset for subDevice"
+ + ", device: " + subDevice.getAddress());
+ }
+ mHapClientProfile.selectPreset(subDevice.getDevice(), presetIndex);
+ }
+ for (final CachedBluetoothDevice memberDevice :
+ mCachedDevice.getMemberDevice()) {
+ if (DEBUG) {
+ Log.d(TAG, "onPreferenceChange, selectPreset for memberDevice"
+ + ", device: " + memberDevice.getAddress());
+ }
+ mHapClientProfile.selectPreset(memberDevice.getDevice(), presetIndex);
+ }
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Nullable
+ @Override
+ public String getPreferenceKey() {
+ return KEY_HEARING_AIDS_PRESETS;
+ }
+
+ @Override
+ protected void init(PreferenceScreen screen) {
+ PreferenceCategory deviceControls = screen.findPreference(KEY_HEARING_DEVICE_GROUP);
+ if (deviceControls != null) {
+ mPreference = createPresetPreference(deviceControls.getContext());
+ deviceControls.addPreference(mPreference);
+ }
+ }
+
+ @Override
+ protected void refresh() {
+ if (!isAvailable() || mPreference == null) {
+ return;
+ }
+ mPreference.setEnabled(mCachedDevice.isConnectedHapClientDevice());
+
+ loadAllPresetInfo();
+ if (mPreference.getEntries().length == 0) {
+ mPreference.setEnabled(false);
+ } else {
+ int activePresetIndex = mHapClientProfile.getActivePresetIndex(
+ mCachedDevice.getDevice());
+ if (activePresetIndex != BluetoothHapClient.PRESET_INDEX_UNAVAILABLE) {
+ mPreference.setValue(Integer.toString(activePresetIndex));
+ mPreference.setSummary(mPreference.getEntry());
+ } else {
+ mPreference.setSummary(null);
+ }
+ }
+ }
+
+ @Override
+ public boolean isAvailable() {
+ if (mHapClientProfile == null) {
+ return false;
+ }
+ return mCachedDevice.getProfiles().stream().anyMatch(
+ profile -> profile instanceof HapClientProfile);
+ }
+
+ @Override
+ public void onPresetSelected(@NonNull BluetoothDevice device, int presetIndex, int reason) {
+ if (device.equals(mCachedDevice.getDevice())) {
+ if (DEBUG) {
+ Log.d(TAG, "onPresetSelected, device: " + device.getAddress()
+ + ", presetIndex: " + presetIndex + ", reason: " + reason);
+ }
+ mContext.getMainExecutor().execute(this::refresh);
+ }
+ }
+
+ @Override
+ public void onPresetSelectionFailed(@NonNull BluetoothDevice device, int reason) {
+ if (device.equals(mCachedDevice.getDevice())) {
+ if (DEBUG) {
+ Log.d(TAG,
+ "onPresetSelectionFailed, device: " + device.getAddress()
+ + ", reason: " + reason);
+ }
+ mContext.getMainExecutor().execute(() -> {
+ refresh();
+ showErrorToast();
+ });
+ }
+ }
+
+ @Override
+ public void onPresetSelectionForGroupFailed(int hapGroupId, int reason) {
+ if (hapGroupId == mHapClientProfile.getHapGroup(mCachedDevice.getDevice())) {
+ if (DEBUG) {
+ Log.d(TAG, "onPresetSelectionForGroupFailed, group: " + hapGroupId
+ + ", reason: " + reason);
+ }
+ mContext.getMainExecutor().execute(() -> {
+ refresh();
+ showErrorToast();
+ });
+ }
+ }
+
+ @Override
+ public void onPresetInfoChanged(@NonNull BluetoothDevice device,
+ @NonNull List<BluetoothHapPresetInfo> presetInfoList, int reason) {
+ if (device.equals(mCachedDevice.getDevice())) {
+ if (DEBUG) {
+ Log.d(TAG, "onPresetInfoChanged, device: " + device.getAddress()
+ + ", reason: " + reason
+ + ", infoList: " + presetInfoList);
+ }
+ mContext.getMainExecutor().execute(this::refresh);
+ }
+ }
+
+ @Override
+ public void onSetPresetNameFailed(@NonNull BluetoothDevice device, int reason) {
+ if (device.equals(mCachedDevice.getDevice())) {
+ if (DEBUG) {
+ Log.d(TAG,
+ "onSetPresetNameFailed, device: " + device.getAddress()
+ + ", reason: " + reason);
+ }
+ mContext.getMainExecutor().execute(() -> {
+ refresh();
+ showErrorToast();
+ });
+ }
+ }
+
+ @Override
+ public void onSetPresetNameForGroupFailed(int hapGroupId, int reason) {
+ if (hapGroupId == mHapClientProfile.getHapGroup(mCachedDevice.getDevice())) {
+ if (DEBUG) {
+ Log.d(TAG, "onSetPresetNameForGroupFailed, group: " + hapGroupId
+ + ", reason: " + reason);
+ }
+ mContext.getMainExecutor().execute(() -> {
+ refresh();
+ showErrorToast();
+ });
+ }
+ }
+
+ private ListPreference createPresetPreference(Context context) {
+ ListPreference preference = new ListPreference(context);
+ preference.setKey(KEY_HEARING_AIDS_PRESETS);
+ preference.setOrder(ORDER_HEARING_AIDS_PRESETS);
+ preference.setTitle(context.getString(R.string.bluetooth_hearing_aids_presets));
+ preference.setOnPreferenceChangeListener(this);
+ return preference;
+ }
+
+ private void loadAllPresetInfo() {
+ if (mPreference == null) {
+ return;
+ }
+ List<BluetoothHapPresetInfo> infoList = mHapClientProfile.getAllPresetInfo(
+ mCachedDevice.getDevice());
+ CharSequence[] presetNames = new CharSequence[infoList.size()];
+ CharSequence[] presetIndexes = new CharSequence[infoList.size()];
+ for (int i = 0; i < infoList.size(); i++) {
+ presetNames[i] = infoList.get(i).getName();
+ presetIndexes[i] = Integer.toString(infoList.get(i).getIndex());
+ }
+ mPreference.setEntries(presetNames);
+ mPreference.setEntryValues(presetIndexes);
+ }
+
+ @VisibleForTesting
+ @Nullable
+ ListPreference getPreference() {
+ return mPreference;
+ }
+
+ void showErrorToast() {
+ Toast.makeText(mContext, R.string.bluetooth_hearing_aids_presets_error,
+ Toast.LENGTH_SHORT).show();
+ }
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceController.java
new file mode 100644
index 0000000..3703b71
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceController.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.accessibility.Flags;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The controller of the hearing device controls.
+ *
+ * <p><b>Note:</b> It is responsible for creating the sub-controllers inside this preference
+ * category controller.
+ */
+public class BluetoothDetailsHearingDeviceController extends BluetoothDetailsController {
+
+ public static final int ORDER_HEARING_DEVICE_SETTINGS = 1;
+ public static final int ORDER_HEARING_AIDS_PRESETS = 2;
+ static final String KEY_HEARING_DEVICE_GROUP = "hearing_device_group";
+
+ private final List<BluetoothDetailsController> mControllers = new ArrayList<>();
+ private Lifecycle mLifecycle;
+ private LocalBluetoothManager mManager;
+
+ public BluetoothDetailsHearingDeviceController(@NonNull Context context,
+ @NonNull PreferenceFragmentCompat fragment,
+ @NonNull LocalBluetoothManager manager,
+ @NonNull CachedBluetoothDevice device,
+ @NonNull Lifecycle lifecycle) {
+ super(context, fragment, device, lifecycle);
+ mManager = manager;
+ mLifecycle = lifecycle;
+ }
+
+ @VisibleForTesting
+ void setSubControllers(
+ BluetoothDetailsHearingDeviceSettingsController hearingDeviceSettingsController,
+ BluetoothDetailsHearingAidsPresetsController presetsController) {
+ mControllers.clear();
+ mControllers.add(hearingDeviceSettingsController);
+ mControllers.add(presetsController);
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mControllers.stream().anyMatch(BluetoothDetailsController::isAvailable);
+ }
+
+ @Override
+ @NonNull
+ public String getPreferenceKey() {
+ return KEY_HEARING_DEVICE_GROUP;
+ }
+
+ @Override
+ protected void init(PreferenceScreen screen) {
+
+ }
+
+ @Override
+ protected void refresh() {
+
+ }
+
+ /**
+ * Initiates the sub controllers controlled by this group controller.
+ *
+ * <p><b>Note:</b> The caller must call this method when creating this class.
+ *
+ * @param isLaunchFromHearingDevicePage a boolean that determines if the caller is launch from
+ * hearing device page
+ */
+ void initSubControllers(boolean isLaunchFromHearingDevicePage) {
+ mControllers.clear();
+ // Don't need to show the entrance to hearing device page when launched from the same page
+ if (!isLaunchFromHearingDevicePage) {
+ mControllers.add(new BluetoothDetailsHearingDeviceSettingsController(mContext,
+ mFragment, mCachedDevice, mLifecycle));
+ }
+ if (Flags.enableHearingAidPresetControl()) {
+ mControllers.add(new BluetoothDetailsHearingAidsPresetsController(mContext, mFragment,
+ mManager, mCachedDevice, mLifecycle));
+ }
+ }
+
+ @NonNull
+ public List<BluetoothDetailsController> getSubControllers() {
+ return mControllers;
+ }
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceSettingsController.java
similarity index 71%
rename from src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java
rename to src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceSettingsController.java
index 162abc7..7e5f3b1 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceSettingsController.java
@@ -16,6 +16,9 @@
package com.android.settings.bluetooth;
+import static com.android.settings.bluetooth.BluetoothDetailsHearingDeviceController.KEY_HEARING_DEVICE_GROUP;
+import static com.android.settings.bluetooth.BluetoothDetailsHearingDeviceController.ORDER_HEARING_DEVICE_SETTINGS;
+
import android.content.Context;
import android.text.TextUtils;
@@ -36,15 +39,13 @@
/**
* The controller of the hearing device settings to launch Hearing device page.
*/
-public class BluetoothDetailsHearingDeviceControlsController extends BluetoothDetailsController
+public class BluetoothDetailsHearingDeviceSettingsController extends BluetoothDetailsController
implements Preference.OnPreferenceClickListener {
@VisibleForTesting
- static final String KEY_DEVICE_CONTROLS_GENERAL_GROUP = "device_controls_general";
- @VisibleForTesting
- static final String KEY_HEARING_DEVICE_CONTROLS = "hearing_device_controls";
+ static final String KEY_HEARING_DEVICE_SETTINGS = "hearing_device_settings";
- public BluetoothDetailsHearingDeviceControlsController(Context context,
+ public BluetoothDetailsHearingDeviceSettingsController(Context context,
PreferenceFragmentCompat fragment, CachedBluetoothDevice device, Lifecycle lifecycle) {
super(context, fragment, device, lifecycle);
lifecycle.addObserver(this);
@@ -57,37 +58,40 @@
@Override
protected void init(PreferenceScreen screen) {
- if (!mCachedDevice.isHearingAidDevice()) {
+ if (!isAvailable()) {
return;
}
-
- final PreferenceCategory prefCategory = screen.findPreference(getPreferenceKey());
- final Preference pref = createHearingDeviceControlsPreference(prefCategory.getContext());
- prefCategory.addPreference(pref);
+ final PreferenceCategory group = screen.findPreference(KEY_HEARING_DEVICE_GROUP);
+ final Preference pref = createHearingDeviceSettingsPreference(group.getContext());
+ group.addPreference(pref);
}
@Override
- protected void refresh() {}
+ protected void refresh() {
+
+ }
@Override
public String getPreferenceKey() {
- return KEY_DEVICE_CONTROLS_GENERAL_GROUP;
+ return KEY_HEARING_DEVICE_SETTINGS;
}
@Override
public boolean onPreferenceClick(Preference preference) {
- if (TextUtils.equals(preference.getKey(), KEY_HEARING_DEVICE_CONTROLS)) {
+ if (TextUtils.equals(preference.getKey(), KEY_HEARING_DEVICE_SETTINGS)) {
launchAccessibilityHearingDeviceSettings();
return true;
}
return false;
}
- private Preference createHearingDeviceControlsPreference(Context context) {
+ private Preference createHearingDeviceSettingsPreference(Context context) {
final ArrowPreference preference = new ArrowPreference(context);
- preference.setKey(KEY_HEARING_DEVICE_CONTROLS);
- preference.setTitle(context.getString(R.string.bluetooth_device_controls_title));
- preference.setSummary(context.getString(R.string.bluetooth_device_controls_summary));
+ preference.setKey(KEY_HEARING_DEVICE_SETTINGS);
+ preference.setOrder(ORDER_HEARING_DEVICE_SETTINGS);
+ preference.setTitle(context.getString(R.string.bluetooth_hearing_device_settings_title));
+ preference.setSummary(
+ context.getString(R.string.bluetooth_hearing_device_settings_summary));
preference.setOnPreferenceClickListener(this);
return preference;
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
index 9c68c9c..87b2c6b 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
@@ -326,16 +326,16 @@
lifecycle));
controllers.add(new BluetoothDetailsPairOtherController(context, this, mCachedDevice,
lifecycle));
- // Don't need to show hearing device again when launched from the same page.
- if (!isLaunchFromHearingDevicePage()) {
- controllers.add(new BluetoothDetailsHearingDeviceControlsController(context, this,
- mCachedDevice, lifecycle));
- }
- controllers.add(new BluetoothDetailsDataSyncController(context, this,
- mCachedDevice, lifecycle));
- controllers.add(
- new BluetoothDetailsExtraOptionsController(
- context, this, mCachedDevice, lifecycle));
+ controllers.add(new BluetoothDetailsDataSyncController(context, this, mCachedDevice,
+ lifecycle));
+ controllers.add(new BluetoothDetailsExtraOptionsController(context, this, mCachedDevice,
+ lifecycle));
+ BluetoothDetailsHearingDeviceController hearingDeviceController =
+ new BluetoothDetailsHearingDeviceController(context, this, mManager,
+ mCachedDevice, lifecycle);
+ controllers.add(hearingDeviceController);
+ hearingDeviceController.initSubControllers(isLaunchFromHearingDevicePage());
+ controllers.addAll(hearingDeviceController.getSubControllers());
}
return controllers;
}
diff --git a/src/com/android/settings/connecteddevice/threadnetwork/ThreadNetworkPreferenceController.kt b/src/com/android/settings/connecteddevice/threadnetwork/ThreadNetworkPreferenceController.kt
index 10e3f84..1c01750 100644
--- a/src/com/android/settings/connecteddevice/threadnetwork/ThreadNetworkPreferenceController.kt
+++ b/src/com/android/settings/connecteddevice/threadnetwork/ThreadNetworkPreferenceController.kt
@@ -34,9 +34,9 @@
import androidx.lifecycle.LifecycleOwner
import androidx.preference.Preference
import androidx.preference.PreferenceScreen
-import com.android.net.thread.platform.flags.Flags
import com.android.settings.R
import com.android.settings.core.TogglePreferenceController
+import com.android.settings.flags.Flags
import java.util.concurrent.Executor
/** Controller for the "Thread" toggle in "Connected devices > Connection preferences". */
@@ -110,7 +110,7 @@
}
override fun getAvailabilityStatus(): Int {
- return if (!Flags.threadEnabledPlatform()) {
+ return if (!Flags.threadSettingsEnabled()) {
CONDITIONALLY_UNAVAILABLE
} else if (!isThreadSupportedOnDevice) {
UNSUPPORTED_ON_DEVICE
@@ -156,7 +156,7 @@
return true
}
- override fun onStateChanged(lifecycleOwner: LifecycleOwner, event: Lifecycle.Event) {
+ override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
if (threadController == null) {
return
}
diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
index 8279588..494ef95 100644
--- a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
+++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
@@ -230,15 +230,23 @@
if (bundle != null) {
final int extraTab = bundle.getInt(SettingsActivity.EXTRA_SHOW_FRAGMENT_TAB, -1);
if (extraTab != -1) {
- return ((ViewPagerAdapter) mViewPager.getAdapter()).getTabForPosition(extraTab);
+ return ((ViewPagerAdapter) mViewPager.getAdapter())
+ .getPositionForProfileTab(extraTab);
}
- final int userId = bundle.getInt(EXTRA_USER_ID, UserHandle.SYSTEM.getIdentifier());
+ final UserManager userManager = getSystemService(UserManager.class);
+ UserHandle mainUser = userManager.getMainUser();
+ if (mainUser == null) {
+ mainUser = UserHandle.SYSTEM;
+ }
+ final int userId = bundle.getInt(EXTRA_USER_ID, mainUser.getIdentifier());
final boolean isWorkProfile = UserManager.get(activity).isManagedProfile(userId);
if (isWorkProfile) {
return WORK_TAB;
}
UserInfo userInfo = UserManager.get(activity).getUserInfo(userId);
- if (Flags.allowPrivateProfile() && userInfo != null && userInfo.isPrivateProfile()) {
+ if (Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
+ && userInfo != null && userInfo.isPrivateProfile()) {
return PRIVATE_TAB;
}
}
@@ -248,7 +256,9 @@
return WORK_TAB;
}
UserInfo userInfo = UserManager.get(activity).getUserInfo(intentUser);
- if (Flags.allowPrivateProfile() && userInfo != null && userInfo.isPrivateProfile()) {
+ if (Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
+ && userInfo != null && userInfo.isPrivateProfile()) {
return PRIVATE_TAB;
}
@@ -259,7 +269,7 @@
final DevicePolicyManager devicePolicyManager =
getContext().getSystemService(DevicePolicyManager.class);
- if (Flags.allowPrivateProfile()) {
+ if (Flags.allowPrivateProfile() && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
int tabForPosition =
((ViewPagerAdapter) mViewPager.getAdapter()).getTabForPosition(position);
@@ -320,7 +330,7 @@
List<UserInfo> userInfos = userManager.getProfiles(UserHandle.myUserId());
for (UserInfo userInfo : userInfos) {
- if (userInfo.getUserHandle().isSystem()) {
+ if (userInfo.isMain()) {
fragments.add(createAndGetFragment(
ProfileType.PERSONAL,
bundle != null ? bundle : new Bundle(),
@@ -330,7 +340,9 @@
ProfileType.WORK,
bundle != null ? bundle.deepCopy() : new Bundle(),
workFragmentConstructor));
- } else if (Flags.allowPrivateProfile() && userInfo.isPrivateProfile()) {
+ } else if (Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
+ && userInfo.isPrivateProfile()) {
if (!privateSpaceInfoProvider.isPrivateSpaceLocked(context)) {
fragments.add(createAndGetFragment(
ProfileType.PRIVATE,
@@ -338,7 +350,7 @@
privateFragmentConstructor));
}
} else {
- Log.d(TAG, "Not showing tab for unsupported user");
+ Log.d(TAG, "Not showing tab for unsupported user " + userInfo);
}
}
@@ -410,7 +422,22 @@
}
@ProfileType
int profileType = mChildFragments[position].getArguments().getInt(EXTRA_PROFILE);
+ return profileTypeToTab(profileType);
+ }
+ private int getPositionForProfileTab(int profileTab) {
+ for (int i = 0; i < mChildFragments.length; ++i) {
+ Bundle arguments = mChildFragments[i].getArguments();
+ if (arguments != null
+ && profileTypeToTab(arguments.getInt(EXTRA_PROFILE)) == profileTab) {
+ return i;
+ }
+ }
+ Log.e(TAG, "position requested for an unknown profile tab " + profileTab);
+ return 0;
+ }
+
+ private int profileTypeToTab(@ProfileType int profileType) {
if (profileType == ProfileType.WORK) {
return WORK_TAB;
}
diff --git a/src/com/android/settings/dashboard/profileselector/UserAdapter.java b/src/com/android/settings/dashboard/profileselector/UserAdapter.java
index c9e49f1..40d1a93 100644
--- a/src/com/android/settings/dashboard/profileselector/UserAdapter.java
+++ b/src/com/android/settings/dashboard/profileselector/UserAdapter.java
@@ -87,6 +87,7 @@
return resources.getString(WORK_CATEGORY_HEADER,
() -> context.getString(com.android.settingslib.R.string.category_work));
} else if (android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
&& mUserManager.getUserInfo(userId).isPrivateProfile()) {
return resources.getString(PRIVATE_CATEGORY_HEADER,
() -> context.getString(com.android.settingslib.R.string.category_private));
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index cfa4a58..3e211de 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -69,6 +69,7 @@
import com.android.settings.development.bluetooth.BluetoothHDAudioPreferenceController;
import com.android.settings.development.bluetooth.BluetoothQualityDialogPreferenceController;
import com.android.settings.development.bluetooth.BluetoothSampleRateDialogPreferenceController;
+import com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController;
import com.android.settings.development.graphicsdriver.GraphicsDriverEnableAngleAsSystemDriverController;
import com.android.settings.development.qstile.DevelopmentTiles;
import com.android.settings.development.storage.SharedDataPreferenceController;
@@ -637,6 +638,7 @@
controllers.add(new StayAwakePreferenceController(context, lifecycle));
controllers.add(new HdcpCheckingPreferenceController(context));
controllers.add(new BluetoothSnoopLogPreferenceController(context, fragment));
+ controllers.add(new BluetoothStackLogPreferenceController(context));
controllers.add(new DefaultLaunchPreferenceController(context,
"snoop_logger_filters_dashboard"));
controllers.add(new BluetoothSnoopLogFilterProfilePbapPreferenceController(context));
diff --git a/src/com/android/settings/development/Enable16KOemUnlockDialog.java b/src/com/android/settings/development/Enable16KOemUnlockDialog.java
new file mode 100644
index 0000000..65690df
--- /dev/null
+++ b/src/com/android/settings/development/Enable16KOemUnlockDialog.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import android.app.Dialog;
+import android.app.settings.SettingsEnums;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+
+import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+
+/** Dialog when user interacts 16K pages developer option and device is not OEM unlocked */
+public class Enable16KOemUnlockDialog extends InstrumentedDialogFragment
+ implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener {
+
+ public static final String TAG = "Enable16KOemUnlockDialog";
+
+ /** This method is used to prompt user to do OEM unlock before using 16k */
+ public static void show(@NonNull Fragment hostFragment) {
+ final FragmentManager manager = hostFragment.getActivity().getSupportFragmentManager();
+ Fragment existingFragment = manager.findFragmentByTag(TAG);
+ if (existingFragment == null) {
+ existingFragment = new Enable16KOemUnlockDialog();
+ }
+
+ if (existingFragment instanceof Enable16KOemUnlockDialog) {
+ existingFragment.setTargetFragment(hostFragment, 0 /* requestCode */);
+ ((Enable16KOemUnlockDialog) existingFragment).show(manager, TAG);
+ }
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.DIALOG_ENABLE_16K_PAGES;
+ }
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ return new AlertDialog.Builder(getActivity())
+ .setTitle(R.string.confirm_oem_unlock_for_16k_title)
+ .setMessage(R.string.confirm_oem_unlock_for_16k_text)
+ .setPositiveButton(android.R.string.ok, this /* onClickListener */)
+ .create();
+ }
+
+ @Override
+ public void onClick(@NonNull DialogInterface dialog, int buttonId) {
+ // Do nothing. OEM unlock has to be done by user
+ }
+
+ @Override
+ public void onDismiss(@NonNull DialogInterface dialog) {
+ super.onDismiss(dialog);
+ }
+}
diff --git a/src/com/android/settings/development/Enable16kPagesPreferenceController.java b/src/com/android/settings/development/Enable16kPagesPreferenceController.java
index 3f9da57..bed5c04 100644
--- a/src/com/android/settings/development/Enable16kPagesPreferenceController.java
+++ b/src/com/android/settings/development/Enable16kPagesPreferenceController.java
@@ -22,19 +22,22 @@
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
import android.os.PowerManager;
+import android.os.RecoverySystem;
import android.os.SystemProperties;
import android.os.SystemUpdateManager;
import android.os.UpdateEngine;
import android.os.UpdateEngineStable;
import android.os.UpdateEngineStableCallback;
+import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.Settings;
+import android.service.oemlock.OemLockManager;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
@@ -54,6 +57,7 @@
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
+import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -68,7 +72,8 @@
public class Enable16kPagesPreferenceController extends DeveloperOptionsPreferenceController
implements Preference.OnPreferenceChangeListener,
PreferenceControllerMixin,
- Enable16kbPagesDialogHost {
+ Enable16kbPagesDialogHost,
+ EnableExt4DialogHost {
private static final String TAG = "Enable16kPages";
private static final String REBOOT_REASON = "toggle16k";
@@ -87,7 +92,7 @@
private static final int OFFSET_TO_FILE_NAME = 30;
public static final String EXPERIMENTAL_UPDATE_TITLE = "Android 16K Kernel Experimental Update";
- private @Nullable DevelopmentSettingsDashboardFragment mFragment = null;
+ private @NonNull DevelopmentSettingsDashboardFragment mFragment;
private boolean mEnable16k;
private final ListeningExecutorService mExecutorService =
@@ -96,9 +101,9 @@
private AlertDialog mProgressDialog;
public Enable16kPagesPreferenceController(
- @NonNull Context context, @Nullable DevelopmentSettingsDashboardFragment fragment) {
+ @NonNull Context context, @NonNull DevelopmentSettingsDashboardFragment fragment) {
super(context);
- mFragment = fragment;
+ this.mFragment = fragment;
}
@Override
@@ -114,6 +119,16 @@
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
mEnable16k = (Boolean) newValue;
+ // Prompt user to do oem unlock first
+ if (!isDeviceOEMUnlocked()) {
+ Enable16KOemUnlockDialog.show(mFragment);
+ return false;
+ }
+
+ if (isDataf2fs()) {
+ EnableExt4WarningDialog.show(mFragment, this);
+ return false;
+ }
Enable16kPagesWarningDialog.show(mFragment, this, mEnable16k);
return true;
}
@@ -162,7 +177,7 @@
}
@Override
- public void onFailure(Throwable t) {
+ public void onFailure(@NonNull Throwable t) {
hideProgressDialog();
Log.e(TAG, "Failed to call applyPayload of UpdateEngineStable!");
displayToast(mContext.getString(R.string.toast_16k_update_failed_text));
@@ -291,6 +306,41 @@
Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
}
+ @Override
+ public void onExt4DialogConfirmed() {
+ // user has confirmed to wipe the device
+ ListenableFuture future = mExecutorService.submit(() -> wipeData());
+ Futures.addCallback(
+ future,
+ new FutureCallback<>() {
+ @Override
+ public void onSuccess(@NonNull Object result) {
+ Log.i(TAG, "Wiping /data with recovery system.");
+ }
+
+ @Override
+ public void onFailure(@NonNull Throwable t) {
+ Log.e(TAG, "Failed to change the /data partition with ext4");
+ displayToast(mContext.getString(R.string.format_ext4_failure_toast));
+ }
+ },
+ ContextCompat.getMainExecutor(mContext));
+ }
+
+ private void wipeData() {
+ RecoverySystem recoveryService = mContext.getSystemService(RecoverySystem.class);
+ try {
+ recoveryService.wipePartitionToExt4();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void onExt4DialogDismissed() {
+ // Do nothing
+ }
+
private class OtaUpdateCallback extends UpdateEngineStableCallback {
UpdateEngineStable mUpdateEngineStable;
@@ -357,4 +407,50 @@
infoBundle.putString(SystemUpdateManager.KEY_TITLE, EXPERIMENTAL_UPDATE_TITLE);
return infoBundle;
}
+
+ private boolean isDataf2fs() {
+ try (BufferedReader br = new BufferedReader(new FileReader("/proc/mounts"))) {
+ String line;
+ while ((line = br.readLine()) != null) {
+ Log.i(TAG, line);
+ final String[] fields = line.split(" ");
+ final String partition = fields[1];
+ final String fsType = fields[2];
+ if (partition.equals("/data") && fsType.equals("f2fs")) {
+ return true;
+ }
+ }
+ } catch (IOException e) {
+ Log.e(TAG, "Failed to read /proc/mounts");
+ displayToast(mContext.getString(R.string.format_ext4_failure_toast));
+ }
+
+ return false;
+ }
+
+ private boolean isDeviceOEMUnlocked() {
+ // OEM unlock is checked for bootloader, carrier and user. Check all three to ensure
+ // that device is unlocked and it is also allowed by user as well as carrier
+ final OemLockManager oemLockManager = mContext.getSystemService(OemLockManager.class);
+ final UserManager userManager = mContext.getSystemService(UserManager.class);
+ if (oemLockManager == null || userManager == null) {
+ Log.e(TAG, "Required services not found on device to check for OEM unlock state.");
+ return false;
+ }
+
+ // If either of device or carrier is not allowed to unlock, return false
+ if (!oemLockManager.isDeviceOemUnlocked()
+ || !oemLockManager.isOemUnlockAllowedByCarrier()) {
+ Log.e(TAG, "Device is not OEM unlocked or it is not allowed by carrier");
+ return false;
+ }
+
+ final UserHandle userHandle = UserHandle.of(UserHandle.myUserId());
+ if (userManager.hasBaseUserRestriction(UserManager.DISALLOW_FACTORY_RESET, userHandle)) {
+ Log.e(TAG, "Factory reset is not allowed for user.");
+ return false;
+ }
+
+ return true;
+ }
}
diff --git a/src/com/android/settings/development/EnableExt4DialogHost.java b/src/com/android/settings/development/EnableExt4DialogHost.java
new file mode 100644
index 0000000..6cbd7e1
--- /dev/null
+++ b/src/com/android/settings/development/EnableExt4DialogHost.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+/** Interface for EnableExt4DialogHost callbacks. */
+public interface EnableExt4DialogHost {
+ /** Callback when the user presses ok the warning dialog. */
+ void onExt4DialogConfirmed();
+
+ /** Callback when the user cancels or dismisses the warning dialog. */
+ void onExt4DialogDismissed();
+}
diff --git a/src/com/android/settings/development/EnableExt4WarningDialog.java b/src/com/android/settings/development/EnableExt4WarningDialog.java
new file mode 100644
index 0000000..c8ba521
--- /dev/null
+++ b/src/com/android/settings/development/EnableExt4WarningDialog.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development;
+
+import android.app.Dialog;
+import android.app.settings.SettingsEnums;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+
+import com.android.internal.annotations.Initializer;
+import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+
+/** Dialog when user interacts 16K pages developer option and data is f2fs */
+public class EnableExt4WarningDialog extends InstrumentedDialogFragment
+ implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener {
+
+ public static final String TAG = "EnableExt4WarningDialog";
+
+ private EnableExt4DialogHost mHost;
+
+ @Initializer
+ private void setHost(@NonNull EnableExt4DialogHost host) {
+ this.mHost = host;
+ }
+
+ /** This method is used to show warning dialog to reformat data to /ext4 */
+ public static void show(
+ @NonNull Fragment hostFragment, @NonNull EnableExt4DialogHost dialogHost) {
+ final FragmentManager manager = hostFragment.getActivity().getSupportFragmentManager();
+ Fragment existingFragment = manager.findFragmentByTag(TAG);
+ if (existingFragment == null) {
+ existingFragment = new EnableExt4WarningDialog();
+ }
+
+ if (existingFragment instanceof EnableExt4WarningDialog) {
+ existingFragment.setTargetFragment(hostFragment, 0 /* requestCode */);
+ ((EnableExt4WarningDialog) existingFragment).setHost(dialogHost);
+ ((EnableExt4WarningDialog) existingFragment).show(manager, TAG);
+ }
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.DIALOG_ENABLE_16K_PAGES;
+ }
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ return new AlertDialog.Builder(getActivity())
+ .setTitle(R.string.confirm_format_ext4_title)
+ .setMessage(R.string.confirm_format_ext4_text)
+ .setPositiveButton(android.R.string.ok, this /* onClickListener */)
+ .setNegativeButton(android.R.string.cancel, this /* onClickListener */)
+ .create();
+ }
+
+ @Override
+ public void onClick(@NonNull DialogInterface dialog, int buttonId) {
+ if (buttonId == DialogInterface.BUTTON_POSITIVE) {
+ mHost.onExt4DialogConfirmed();
+ } else {
+ mHost.onExt4DialogDismissed();
+ }
+ }
+
+ @Override
+ public void onDismiss(@NonNull DialogInterface dialog) {
+ super.onDismiss(dialog);
+ mHost.onExt4DialogDismissed();
+ }
+}
diff --git a/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceController.java b/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceController.java
new file mode 100644
index 0000000..23d4cc6
--- /dev/null
+++ b/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceController.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development.bluetooth;
+
+import android.content.Context;
+import android.os.SystemProperties;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+public class BluetoothStackLogPreferenceController extends DeveloperOptionsPreferenceController
+ implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
+
+ /* Ensure that the indexes match with bt_stack_log_values and bt_stack_log_entries ordering */
+ private static final String PREFERENCE_KEY = "bt_stack_log_level";
+ @VisibleForTesting static final int BTSTACK_LOG_MODE_VERBOSE_INDEX = 0;
+ @VisibleForTesting static final int BTSTACK_LOG_MODE_DEBUG_INDEX = 1;
+ @VisibleForTesting static final int BTSTACK_LOG_MODE_INFO_INDEX = 2;
+ @VisibleForTesting static final int BTSTACK_LOG_MODE_WARN_INDEX = 3;
+ @VisibleForTesting static final int BTSTACK_LOG_MODE_ERROR_INDEX = 4;
+
+ @VisibleForTesting
+ static final String BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST = "persist.log.tag.bluetooth";
+ static final String BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY = "log.tag.bluetooth";
+ static final String BLUETOOTH_STRING_NAME = "bluetooth";
+ static final int DEFAULT_MODE = BTSTACK_LOG_MODE_INFO_INDEX;
+
+ private final String[] mListValues;
+ private final String[] mListEntries;
+
+
+ public BluetoothStackLogPreferenceController(@NonNull Context context) {
+ super(context);
+ mListValues = context.getResources().getStringArray(R.array.bt_stack_log_level_values);
+ mListEntries = context.getResources().getStringArray(R.array.bt_stack_log_level_entries);
+ }
+
+ /** returns default log level index of INFO */
+ public int getDefaultModeIndex() {
+ return DEFAULT_MODE;
+ }
+
+ @Override
+ @Nullable
+ public String getPreferenceKey() {
+ return PREFERENCE_KEY;
+ }
+
+ @Override
+ public boolean onPreferenceChange(@NonNull Preference preference, @NonNull Object newValue) {
+ SystemProperties.set(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST, newValue.toString());
+ SystemProperties.set(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY, newValue.toString());
+ updateState(mPreference);
+ return true;
+ }
+
+ @Override
+ public void updateState(@NonNull Preference preference) {
+ final ListPreference listPreference = (ListPreference) preference;
+ int index = getBluetoothLogLevelIndex();
+ listPreference.setValue(mListValues[index]);
+ listPreference.setSummary(mListEntries[index]);
+ }
+
+ /**
+ * Returns the current log level from Log.isLoggable().
+ */
+ @VisibleForTesting
+ public int getBluetoothLogLevelIndex() {
+ if (Log.isLoggable(BLUETOOTH_STRING_NAME, Log.VERBOSE)) {
+ return BTSTACK_LOG_MODE_VERBOSE_INDEX;
+ } else if (Log.isLoggable(BLUETOOTH_STRING_NAME, Log.DEBUG)) {
+ return BTSTACK_LOG_MODE_DEBUG_INDEX;
+ } else if (Log.isLoggable(BLUETOOTH_STRING_NAME, Log.INFO)) {
+ return BTSTACK_LOG_MODE_INFO_INDEX;
+ } else if (Log.isLoggable(BLUETOOTH_STRING_NAME, Log.WARN)) {
+ return BTSTACK_LOG_MODE_WARN_INDEX;
+ } else if (Log.isLoggable(BLUETOOTH_STRING_NAME, Log.ERROR)) {
+ return BTSTACK_LOG_MODE_ERROR_INDEX;
+ }
+ return BTSTACK_LOG_MODE_INFO_INDEX;
+ }
+
+ @Override
+ protected void onDeveloperOptionsSwitchDisabled() {
+ super.onDeveloperOptionsSwitchDisabled();
+ SystemProperties.set(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST, null);
+ SystemProperties.set(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY, null);
+ ((ListPreference) mPreference).setValue(mListValues[getDefaultModeIndex()]);
+ ((ListPreference) mPreference).setSummary(mListEntries[getDefaultModeIndex()]);
+ }
+}
diff --git a/src/com/android/settings/development/quarantine/OWNERS b/src/com/android/settings/development/quarantine/OWNERS
deleted file mode 100644
index d4de31a..0000000
--- a/src/com/android/settings/development/quarantine/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-# Bug component: 316234
-
-sudheersai@google.com
-yamasani@google.com
\ No newline at end of file
diff --git a/src/com/android/settings/development/quarantine/QuarantinedAppPreference.java b/src/com/android/settings/development/quarantine/QuarantinedAppPreference.java
deleted file mode 100644
index 6ad1f86..0000000
--- a/src/com/android/settings/development/quarantine/QuarantinedAppPreference.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development.quarantine;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-import com.android.settingslib.applications.AppUtils;
-import com.android.settingslib.applications.ApplicationsState.AppEntry;
-import com.android.settingslib.utils.ThreadUtils;
-import com.android.settingslib.widget.AppSwitchPreference;
-
-public class QuarantinedAppPreference extends AppSwitchPreference {
- private final AppEntry mEntry;
- private Drawable mCacheIcon;
-
- public QuarantinedAppPreference(Context context, AppEntry entry) {
- super(context);
- mEntry = entry;
- mCacheIcon = AppUtils.getIconFromCache(mEntry);
-
- mEntry.ensureLabel(context);
- setKey(generateKey(mEntry));
- if (mCacheIcon != null) {
- setIcon(mCacheIcon);
- } else {
- setIcon(R.drawable.empty_icon);
- }
- updateState();
- }
-
- static String generateKey(AppEntry entry) {
- return entry.info.packageName + "|" + entry.info.uid;
- }
-
- public AppEntry getEntry() {
- return mEntry;
- }
-
- @Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
- if (mCacheIcon == null) {
- ThreadUtils.postOnBackgroundThread(() -> {
- final Drawable icon = AppUtils.getIcon(getContext(), mEntry);
- ThreadUtils.postOnMainThread(() -> {
- setIcon(icon);
- mCacheIcon = icon;
- });
- });
- }
- super.onBindViewHolder(holder);
- }
-
- void updateState() {
- setTitle(mEntry.label);
- setChecked((boolean) mEntry.extraInfo);
- notifyChanged();
- }
-}
diff --git a/src/com/android/settings/development/quarantine/QuarantinedAppStateBridge.java b/src/com/android/settings/development/quarantine/QuarantinedAppStateBridge.java
deleted file mode 100644
index 206b922..0000000
--- a/src/com/android/settings/development/quarantine/QuarantinedAppStateBridge.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development.quarantine;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.os.UserHandle;
-
-import com.android.settings.applications.AppStateBaseBridge;
-import com.android.settingslib.applications.ApplicationsState;
-import com.android.settingslib.applications.ApplicationsState.AppEntry;
-
-import java.util.ArrayList;
-
-public class QuarantinedAppStateBridge extends AppStateBaseBridge {
- private Context mContext;
-
- public QuarantinedAppStateBridge(Context context,
- ApplicationsState appState, Callback callback) {
- super(appState, callback);
- mContext = context;
- }
-
- @Override
- protected void loadAllExtraInfo() {
- final ArrayList<AppEntry> apps = mAppSession.getAllApps();
- for (int i = 0; i < apps.size(); i++) {
- final AppEntry app = apps.get(i);
- updateExtraInfo(app, app.info.packageName, app.info.uid);
- }
- }
-
- @Override
- protected void updateExtraInfo(AppEntry app, String pkg, int uid) {
- app.extraInfo = isPackageQuarantined(pkg, uid);
- }
-
- private boolean isPackageQuarantined(String pkg, int uid) {
- final PackageManager pm = mContext.createContextAsUser(
- UserHandle.getUserHandleForUid(uid), 0).getPackageManager();
- try {
- return pm.isPackageQuarantined(pkg);
- } catch (PackageManager.NameNotFoundException e) {
- return false;
- }
- }
-}
diff --git a/src/com/android/settings/development/quarantine/QuarantinedAppsFragment.java b/src/com/android/settings/development/quarantine/QuarantinedAppsFragment.java
deleted file mode 100644
index 985e962..0000000
--- a/src/com/android/settings/development/quarantine/QuarantinedAppsFragment.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development.quarantine;
-
-import static android.view.MenuItem.SHOW_AS_ACTION_ALWAYS;
-import static android.view.MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW;
-
-import android.app.settings.SettingsEnums;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.widget.SearchView;
-
-import com.android.settings.R;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settingslib.applications.AppIconCacheManager;
-import com.android.settingslib.applications.ApplicationsState;
-import com.android.settingslib.applications.ApplicationsState.AppFilter;
-import com.android.settingslib.search.SearchIndexable;
-
-import com.google.android.material.appbar.AppBarLayout;
-
-// TODO: b/297934650 - Update this to use SPA framework
-@SearchIndexable
-public class QuarantinedAppsFragment extends DashboardFragment implements
- SearchView.OnQueryTextListener, SearchView.OnCloseListener,
- MenuItem.OnActionExpandListener {
- private static final String TAG = "QuarantinedApps";
-
- private static final int MENU_SEARCH_APPS = Menu.FIRST + 42;
- private static final int MENU_SHOW_SYSTEM = Menu.FIRST + 43;
- private static final String EXTRA_SHOW_SYSTEM = "show_system";
-
- private boolean mShowSystem;
- private SearchView mSearchView;
- private String mCurQuery;
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- mShowSystem = icicle != null && icicle.getBoolean(EXTRA_SHOW_SYSTEM);
- use(QuarantinedAppsScreenController.class).setFilter(mCustomFilter);
- use(QuarantinedAppsScreenController.class).setSession(getSettingsLifecycle());
- }
-
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- mSearchView = new SearchView(getContext());
- mSearchView.setOnQueryTextListener(this);
- mSearchView.setOnCloseListener(this);
- mSearchView.setIconifiedByDefault(true);
-
- menu.add(Menu.NONE, MENU_SEARCH_APPS, Menu.NONE, R.string.search_settings)
- .setIcon(R.drawable.ic_find_in_page_24px)
- .setActionView(mSearchView)
- .setOnActionExpandListener(this)
- .setShowAsAction(SHOW_AS_ACTION_ALWAYS | SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
- menu.add(Menu.NONE, MENU_SHOW_SYSTEM, Menu.NONE,
- mShowSystem ? R.string.menu_hide_system : R.string.menu_show_system);
- super.onCreateOptionsMenu(menu, inflater);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == MENU_SHOW_SYSTEM) {
- mShowSystem = !mShowSystem;
- item.setTitle(mShowSystem ? R.string.menu_hide_system : R.string.menu_show_system);
- use(QuarantinedAppsScreenController.class).setFilter(mCustomFilter);
- use(QuarantinedAppsScreenController.class).rebuild();
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- public boolean onQueryTextChange(String newText) {
- mCurQuery = !TextUtils.isEmpty(newText) ? newText : null;
- use(QuarantinedAppsScreenController.class).rebuild();
- return true;
- }
-
- @Override
- public boolean onQueryTextSubmit(String query) {
- // Don't care about this.
- return true;
- }
-
- @Override
- public boolean onClose() {
- if (!TextUtils.isEmpty(mSearchView.getQuery())) {
- mSearchView.setQuery(null, true);
- }
- return true;
- }
-
- public final AppFilter mCustomFilter = new AppFilter() {
- @Override
- public void init() {
- }
-
- @Override
- public boolean filterApp(ApplicationsState.AppEntry entry) {
- final AppFilter defaultFilter = mShowSystem ? ApplicationsState.FILTER_ALL_ENABLED
- : ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER;
- return defaultFilter.filterApp(entry) && (mCurQuery == null
- || entry.label.toLowerCase().contains(mCurQuery.toLowerCase()));
- }
- };
-
- @Override
- public boolean onMenuItemActionExpand(MenuItem item) {
- final AppBarLayout mAppBarLayout = getActivity().findViewById(R.id.app_bar);
- // To prevent a large space on tool bar.
- mAppBarLayout.setExpanded(false /*expanded*/, false /*animate*/);
- return true;
- }
-
- @Override
- public boolean onMenuItemActionCollapse(MenuItem item) {
- final AppBarLayout mAppBarLayout = getActivity().findViewById(R.id.app_bar);
- // To prevent a large space on tool bar.
- mAppBarLayout.setExpanded(false /*expanded*/, false /*animate*/);
- return true;
- }
-
- @Override
- public int getPreferenceScreenResId() {
- return R.xml.quarantined_apps;
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putBoolean(EXTRA_SHOW_SYSTEM, mShowSystem);
- }
-
- @Override
- protected String getLogTag() {
- return TAG;
- }
-
- @Override
- public int getMetricsCategory() {
- return SettingsEnums.QUARANTINED_APPS_DEV_CONTROL;
- }
-
- @Override
- public void onDestroyView() {
- super.onDestroyView();
- AppIconCacheManager.getInstance().release();
- }
-
- public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
- new BaseSearchIndexProvider(R.xml.quarantined_apps);
-}
diff --git a/src/com/android/settings/development/quarantine/QuarantinedAppsPreferenceController.java b/src/com/android/settings/development/quarantine/QuarantinedAppsPreferenceController.java
deleted file mode 100644
index de3b18b..0000000
--- a/src/com/android/settings/development/quarantine/QuarantinedAppsPreferenceController.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development.quarantine;
-
-import android.content.Context;
-import android.content.pm.Flags;
-
-import com.android.settings.core.BasePreferenceController;
-
-public class QuarantinedAppsPreferenceController extends BasePreferenceController {
- public QuarantinedAppsPreferenceController(Context context, String preferenceKey) {
- super(context, preferenceKey);
- }
-
- @Override
- public int getAvailabilityStatus() {
- return Flags.quarantinedEnabled() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
- }
-}
diff --git a/src/com/android/settings/development/quarantine/QuarantinedAppsScreenController.java b/src/com/android/settings/development/quarantine/QuarantinedAppsScreenController.java
deleted file mode 100644
index 4d4834b..0000000
--- a/src/com/android/settings/development/quarantine/QuarantinedAppsScreenController.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development.quarantine;
-
-import android.app.Application;
-import android.content.Context;
-import android.content.pm.Flags;
-import android.content.pm.PackageManager;
-import android.content.pm.SuspendDialogInfo;
-import android.os.UserHandle;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settings.applications.AppStateBaseBridge;
-import com.android.settings.core.BasePreferenceController;
-import com.android.settingslib.applications.AppUtils;
-import com.android.settingslib.applications.ApplicationsState;
-import com.android.settingslib.applications.ApplicationsState.AppEntry;
-import com.android.settingslib.applications.ApplicationsState.AppFilter;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnDestroy;
-import com.android.settingslib.core.lifecycle.events.OnStart;
-import com.android.settingslib.core.lifecycle.events.OnStop;
-
-import java.util.ArrayList;
-import java.util.Set;
-import java.util.TreeSet;
-
-public class QuarantinedAppsScreenController extends BasePreferenceController implements
- LifecycleObserver, OnStart, OnStop, OnDestroy,
- ApplicationsState.Callbacks, Preference.OnPreferenceChangeListener,
- AppStateBaseBridge.Callback {
- private final ApplicationsState mApplicationsState;
- private final QuarantinedAppStateBridge mQuarantinedAppStateBridge;
- private ApplicationsState.Session mSession;
- private PreferenceScreen mScreen;
- private AppFilter mFilter;
- private boolean mExtraLoaded;
-
- public QuarantinedAppsScreenController(Context context, String preferenceKey) {
- super(context, preferenceKey);
- mApplicationsState = ApplicationsState.getInstance(
- (Application) context.getApplicationContext());
- mQuarantinedAppStateBridge = new QuarantinedAppStateBridge(context,
- mApplicationsState, this);
- }
-
- @Override
- public void onStart() {
- mQuarantinedAppStateBridge.resume(true /* forceLoadAllApps */);
- }
-
- @Override
- public void onStop() {
- mQuarantinedAppStateBridge.pause();
- }
-
- @Override
- public void onDestroy() {
- mQuarantinedAppStateBridge.release();
- }
-
- @Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- mScreen = screen;
- }
-
- public void setFilter(AppFilter filter) {
- mFilter = filter;
- }
-
- public void setSession(Lifecycle lifecycle) {
- mSession = mApplicationsState.newSession(this, lifecycle);
- }
-
- @Override
- public void onExtraInfoUpdated() {
- mExtraLoaded = true;
- rebuild();
- }
-
- public void rebuild() {
- if (!mExtraLoaded || mSession == null) {
- return;
- }
-
- final ArrayList<AppEntry> apps = mSession.rebuild(mFilter,
- ApplicationsState.ALPHA_COMPARATOR);
- if (apps != null) {
- onRebuildComplete(apps);
- }
- }
-
- @Override
- public void onRebuildComplete(ArrayList<AppEntry> apps) {
- if (apps == null) {
- return;
- }
-
- // Preload top visible icons of app list.
- AppUtils.preloadTopIcons(mContext, apps,
- mContext.getResources().getInteger(R.integer.config_num_visible_app_icons));
-
- // Create apps key set for removing useless preferences
- final Set<String> appsKeySet = new TreeSet<>();
- // Add or update preferences
- final int count = apps.size();
- for (int i = 0; i < count; i++) {
- final AppEntry entry = apps.get(i);
- if (!shouldAddPreference(entry)) {
- continue;
- }
- final String prefkey = QuarantinedAppPreference.generateKey(entry);
- appsKeySet.add(prefkey);
- QuarantinedAppPreference preference = mScreen.findPreference(prefkey);
- if (preference == null) {
- preference = new QuarantinedAppPreference(mScreen.getContext(), entry);
- preference.setOnPreferenceChangeListener(this);
- mScreen.addPreference(preference);
- } else {
- preference.updateState();
- }
- preference.setOrder(i);
- }
-
- // Remove useless preferences
- removeUselessPrefs(appsKeySet);
- }
-
- private void removeUselessPrefs(final Set<String> appsKeySet) {
- final int prefCount = mScreen.getPreferenceCount();
- String prefKey;
- if (prefCount > 0) {
- for (int i = prefCount - 1; i >= 0; i--) {
- final Preference pref = mScreen.getPreference(i);
- prefKey = pref.getKey();
- if (!appsKeySet.isEmpty() && appsKeySet.contains(prefKey)) {
- continue;
- }
- mScreen.removePreference(pref);
- }
- }
- }
-
- @VisibleForTesting
- static boolean shouldAddPreference(AppEntry app) {
- return app != null && UserHandle.isApp(app.info.uid);
- }
-
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- if (preference instanceof QuarantinedAppPreference) {
- final QuarantinedAppPreference quarantinedPreference =
- (QuarantinedAppPreference) preference;
- final boolean quarantined = newValue == Boolean.TRUE;
- setPackageQuarantined(quarantinedPreference.getEntry().info.packageName,
- quarantinedPreference.getEntry().info.uid, quarantined);
- quarantinedPreference.getEntry().extraInfo = quarantined;
- return true;
- }
- return false;
- }
-
- private void setPackageQuarantined(String pkg, int uid, boolean quarantined) {
- final PackageManager pm = mContext.createContextAsUser(
- UserHandle.getUserHandleForUid(uid), 0).getPackageManager();
- final SuspendDialogInfo dialogInfo;
- if (quarantined) {
- dialogInfo = new SuspendDialogInfo.Builder()
- .setNeutralButtonText(R.string.unquarantine_app_button)
- .setNeutralButtonAction(SuspendDialogInfo.BUTTON_ACTION_UNSUSPEND)
- .build();
- } else {
- dialogInfo = null;
- }
- pm.setPackagesSuspended(new String[] {pkg}, quarantined, null /* appExtras */,
- null /* launcherExtras */, dialogInfo,
- PackageManager.FLAG_SUSPEND_QUARANTINED);
- }
-
- @Override
- public int getAvailabilityStatus() {
- return Flags.quarantinedEnabled() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
- }
-
- @Override
- public void onRunningStateChanged(boolean running) {
- }
-
- @Override
- public void onPackageListChanged() {
- }
-
- @Override
- public void onPackageIconChanged() {
- }
-
- @Override
- public void onPackageSizeChanged(String packageName) {
- }
-
- @Override
- public void onAllSizesComputed() {
- }
-
- @Override
- public void onLauncherInfoChanged() {
- }
-
- @Override
- public void onLoadEntriesCompleted() {
- }
-}
diff --git a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
index 887fc32..ef542a3 100644
--- a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
+++ b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java
@@ -257,6 +257,7 @@
private boolean shouldSkipProfile(UserInfo userInfo) {
return android.os.Flags.allowPrivateProfile()
&& android.multiuser.Flags.handleInterleavedSettingsForPrivateSpace()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
&& userInfo.isQuietModeEnabled()
&& mUm.getUserProperties(userInfo.getUserHandle()).getShowInQuietMode()
== UserProperties.SHOW_IN_QUIET_MODE_HIDDEN;
diff --git a/src/com/android/settings/gestures/OneHandedSettingsUtils.java b/src/com/android/settings/gestures/OneHandedSettingsUtils.java
index 04898dc..fe7db4f 100644
--- a/src/com/android/settings/gestures/OneHandedSettingsUtils.java
+++ b/src/com/android/settings/gestures/OneHandedSettingsUtils.java
@@ -50,6 +50,8 @@
Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS);
static final Uri HARDWARE_SHORTCUT_ENABLED_URI =
Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE);
+ static final Uri QS_SHORTCUT_ENABLED_URI =
+ Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_QS_TARGETS);
public enum OneHandedTimeout {
NEVER(0), SHORT(4), MEDIUM(8), LONG(12);
@@ -254,6 +256,16 @@
if (!TextUtils.isEmpty(targetsHW) && targetsHW.contains(ONE_HANDED_MODE_TARGET_NAME)) {
return true;
}
+
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ // Checks QS_SHORTCUT_KEY
+ final String targetsQs = Settings.Secure.getStringForUser(context.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS, sCurrentUserId);
+ if (!TextUtils.isEmpty(targetsQs) && targetsQs.contains(ONE_HANDED_MODE_TARGET_NAME)) {
+ return true;
+ }
+ }
+
return false;
}
@@ -301,6 +313,9 @@
resolver.registerContentObserver(SHOW_NOTIFICATION_ENABLED_URI, true, this);
resolver.registerContentObserver(SOFTWARE_SHORTCUT_ENABLED_URI, true, this);
resolver.registerContentObserver(HARDWARE_SHORTCUT_ENABLED_URI, true, this);
+ if (android.view.accessibility.Flags.a11yQsShortcut()) {
+ resolver.registerContentObserver(QS_SHORTCUT_ENABLED_URI, true, this);
+ }
}
@Override
diff --git a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
index c40212b..c38be94 100644
--- a/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
+++ b/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
@@ -247,6 +247,7 @@
switch (systemNavKey) {
case KEY_SYSTEM_NAV_GESTURAL:
if (isGestureTutorialAvailable()){
+ videoPref.setContentDescription(R.string.nav_tutorial_button_description);
videoPref.setOnPreferenceClickListener(preference -> {
startActivity(mLaunchSandboxIntent);
return true;
diff --git a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
index 05dc5be..2bbb567 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutEnabledLocalesFragment.java
@@ -21,6 +21,7 @@
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager;
import android.hardware.input.KeyboardLayout;
+import android.hardware.input.KeyboardLayoutSelectionResult;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
@@ -180,7 +181,7 @@
mapLanguageWithLayout(info, subtype);
}
}
- updatePreferenceLayout(preferenceScreen, info);
+ updatePreferenceLayout(preferenceScreen, info, infoList.size() > 1);
}
}
@@ -189,14 +190,15 @@
KeyboardLayout[] keyboardLayouts =
NewKeyboardSettingsUtils.getKeyboardLayouts(
mIm, mUserId, mInputDeviceIdentifier, info, subtype);
- String layout = NewKeyboardSettingsUtils.getKeyboardLayout(
+ KeyboardLayoutSelectionResult result = NewKeyboardSettingsUtils.getKeyboardLayout(
mIm, mUserId, mInputDeviceIdentifier, info, subtype);
- if (layout != null) {
+ if (result.getLayoutDescriptor() != null) {
for (int i = 0; i < keyboardLayouts.length; i++) {
- if (keyboardLayouts[i].getDescriptor().equals(layout)) {
+ if (keyboardLayouts[i].getDescriptor().equals(result.getLayoutDescriptor())) {
KeyboardInfo keyboardInfo = new KeyboardInfo(
subtypeLabel,
keyboardLayouts[i].getLabel(),
+ result.getSelectionCriteria(),
info,
subtype);
mKeyboardInfoList.add(keyboardInfo);
@@ -208,18 +210,22 @@
KeyboardInfo keyboardInfo = new KeyboardInfo(
subtypeLabel,
mContext.getString(R.string.keyboard_default_layout),
+ KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_UNSPECIFIED,
info,
subtype);
mKeyboardInfoList.add(keyboardInfo);
}
}
- private void updatePreferenceLayout(PreferenceScreen preferenceScreen, InputMethodInfo info) {
+ private void updatePreferenceLayout(PreferenceScreen preferenceScreen, InputMethodInfo info,
+ boolean hasMultipleImes) {
if (mKeyboardInfoList.isEmpty()) {
return;
}
PreferenceCategory preferenceCategory = new PreferenceCategory(mContext);
- preferenceCategory.setTitle(info.loadLabel(mContext.getPackageManager()));
+ preferenceCategory.setTitle(hasMultipleImes ? mContext.getString(R.string.ime_label_title,
+ info.loadLabel(mContext.getPackageManager()))
+ : mContext.getString(R.string.enabled_locales_keyboard_layout));
preferenceCategory.setKey(info.getPackageName());
preferenceScreen.addPreference(preferenceCategory);
Collections.sort(mKeyboardInfoList, new Comparator<KeyboardInfo>() {
@@ -234,7 +240,7 @@
final Preference pref = new Preference(mContext);
pref.setKey(keyboardInfo.getPrefId());
pref.setTitle(keyboardInfo.getSubtypeLabel());
- pref.setSummary(keyboardInfo.getLayout());
+ pref.setSummary(keyboardInfo.getLayoutSummaryText(mContext));
pref.setOnPreferenceClickListener(
preference -> {
showKeyboardLayoutPicker(
diff --git a/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java b/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java
index ac8037f..ec727e8 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardLayoutPickerController.java
@@ -21,6 +21,7 @@
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager;
import android.hardware.input.KeyboardLayout;
+import android.hardware.input.KeyboardLayoutSelectionResult;
import android.os.Bundle;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;
@@ -201,13 +202,13 @@
private String getSelectedLayoutLabel() {
String label = mContext.getString(R.string.keyboard_default_layout);
- String layout = NewKeyboardSettingsUtils.getKeyboardLayout(
+ KeyboardLayoutSelectionResult result = NewKeyboardSettingsUtils.getKeyboardLayout(
mIm, mUserId, mInputDeviceIdentifier, mInputMethodInfo, mInputMethodSubtype);
KeyboardLayout[] keyboardLayouts = NewKeyboardSettingsUtils.getKeyboardLayouts(
mIm, mUserId, mInputDeviceIdentifier, mInputMethodInfo, mInputMethodSubtype);
- if (layout != null) {
+ if (result.getLayoutDescriptor() != null) {
for (KeyboardLayout keyboardLayout : keyboardLayouts) {
- if (keyboardLayout.getDescriptor().equals(layout)) {
+ if (keyboardLayout.getDescriptor().equals(result.getLayoutDescriptor())) {
label = keyboardLayout.getLabel();
break;
}
diff --git a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
index a927165..8f1e5c8 100644
--- a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
+++ b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java
@@ -16,20 +16,30 @@
package com.android.settings.inputmethod;
+import static android.hardware.input.KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_USER;
+import static android.hardware.input.KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_DEVICE;
+import static android.hardware.input.KeyboardLayoutSelectionResult.LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.annotation.UserIdInt;
import android.content.Context;
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager;
import android.hardware.input.KeyboardLayout;
+import android.hardware.input.KeyboardLayoutSelectionResult;
+import android.hardware.input.KeyboardLayoutSelectionResult.LayoutSelectionCriteria;
import android.os.UserHandle;
import android.view.InputDevice;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;
-import java.util.ArrayList;
+import com.android.settings.R;
+
import java.util.Arrays;
import java.util.Comparator;
-import java.util.List;
/**
* Utilities of keyboard settings
@@ -56,36 +66,47 @@
return false;
}
- static List<String> getSuitableImeLabels(Context context, InputMethodManager imm, int userId) {
- List<String> suitableInputMethodInfoLabels = new ArrayList<>();
- List<InputMethodInfo> infoList = imm.getEnabledInputMethodListAsUser(UserHandle.of(userId));
- for (InputMethodInfo info : infoList) {
- List<InputMethodSubtype> subtypes =
- imm.getEnabledInputMethodSubtypeList(info, true);
- for (InputMethodSubtype subtype : subtypes) {
- if (subtype.isSuitableForPhysicalKeyboardLayoutMapping()) {
- suitableInputMethodInfoLabels.add(
- info.loadLabel(context.getPackageManager()).toString());
- break;
+ @SuppressLint("MissingPermission")
+ @Nullable
+ static String getSelectedKeyboardLayoutLabelForUser(Context context, @UserIdInt int userId,
+ InputDeviceIdentifier inputDeviceIdentifier) {
+ InputMethodManager imm = context.getSystemService(InputMethodManager.class);
+ InputManager im = context.getSystemService(InputManager.class);
+ if (imm == null || im == null) {
+ return null;
+ }
+ InputMethodInfo imeInfo = imm.getCurrentInputMethodInfoAsUser(UserHandle.of(userId));
+ InputMethodSubtype subtype = imm.getCurrentInputMethodSubtype();
+ KeyboardLayout[] keyboardLayouts = getKeyboardLayouts(im, userId, inputDeviceIdentifier,
+ imeInfo, subtype);
+ KeyboardLayoutSelectionResult result = getKeyboardLayout(im, userId, inputDeviceIdentifier,
+ imeInfo, subtype);
+ if (result != null) {
+ for (KeyboardLayout keyboardLayout : keyboardLayouts) {
+ if (keyboardLayout.getDescriptor().equals(result.getLayoutDescriptor())) {
+ return keyboardLayout.getLabel();
}
}
}
- return suitableInputMethodInfoLabels;
+ return null;
}
static class KeyboardInfo {
CharSequence mSubtypeLabel;
String mLayout;
+ @LayoutSelectionCriteria int mSelectionCriteria;
InputMethodInfo mInputMethodInfo;
InputMethodSubtype mInputMethodSubtype;
KeyboardInfo(
CharSequence subtypeLabel,
String layout,
+ @LayoutSelectionCriteria int selectionCriteria,
InputMethodInfo inputMethodInfo,
InputMethodSubtype inputMethodSubtype) {
mSubtypeLabel = subtypeLabel;
mLayout = layout;
+ mSelectionCriteria = selectionCriteria;
mInputMethodInfo = inputMethodInfo;
mInputMethodSubtype = inputMethodSubtype;
}
@@ -102,6 +123,17 @@
return mLayout;
}
+ String getLayoutSummaryText(Context context) {
+ if (isAutomaticSelection(mSelectionCriteria)) {
+ return context.getResources().getString(R.string.automatic_keyboard_layout_label,
+ mLayout);
+ } else if (isUserSelection(mSelectionCriteria)) {
+ return context.getResources().getString(
+ R.string.user_selected_keyboard_layout_label, mLayout);
+ }
+ return mLayout;
+ }
+
InputMethodInfo getInputMethodInfo() {
return mInputMethodInfo;
}
@@ -121,11 +153,21 @@
return inputManager.getKeyboardLayoutListForInputDevice(identifier, userId, info, subtype);
}
- static String getKeyboardLayout(InputManager inputManager, int userId,
+ @NonNull
+ static KeyboardLayoutSelectionResult getKeyboardLayout(InputManager inputManager, int userId,
InputDeviceIdentifier identifier, InputMethodInfo info, InputMethodSubtype subtype) {
return inputManager.getKeyboardLayoutForInputDevice(identifier, userId, info, subtype);
}
+ static boolean isAutomaticSelection(@LayoutSelectionCriteria int criteria) {
+ return criteria == LAYOUT_SELECTION_CRITERIA_DEVICE
+ || criteria == LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD;
+ }
+
+ static boolean isUserSelection(@LayoutSelectionCriteria int criteria) {
+ return criteria == LAYOUT_SELECTION_CRITERIA_USER;
+ }
+
static void sortKeyboardLayoutsByLabel(KeyboardLayout[] keyboardLayouts) {
Arrays.sort(
keyboardLayouts,
diff --git a/src/com/android/settings/inputmethod/OWNERS b/src/com/android/settings/inputmethod/OWNERS
index 7c7d792..8dc4870 100644
--- a/src/com/android/settings/inputmethod/OWNERS
+++ b/src/com/android/settings/inputmethod/OWNERS
@@ -3,6 +3,7 @@
include /OWNERS
# Settings for physical keyboard and game pad are better to be reviewed by the input team
-per-file GameControllerPreferenceController.java = file: platform/frameworks/base:/services/core/java/com/android/server/input/OWNERS
-per-file KeyboardLayoutPicker*.java = file: platform/frameworks/base:/services/core/java/com/android/server/input/OWNERS
-per-file PhysicalKeyboard*.java = file: platform/frameworks/base:/services/core/java/com/android/server/input/OWNERS
+per-file GameControllerPreferenceController.java = file:platform/frameworks/base:/INPUT_OWNERS
+per-file KeyboardLayoutPicker*.java = file:platform/frameworks/base:/INPUT_OWNERS
+per-file PhysicalKeyboard*.java = file:platform/frameworks/base:/INPUT_OWNERS
+per-file Trackpad*.java = file:platform/frameworks/base:/INPUT_OWNERS
diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
index f2ac550..e102241 100644
--- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java
@@ -288,19 +288,11 @@
final Preference pref = new Preference(getPrefContext());
pref.setTitle(hardKeyboardDeviceInfo.mDeviceName);
if (mIsNewKeyboardSettings) {
- List<String> suitableImes = new ArrayList<>();
- suitableImes.addAll(
- NewKeyboardSettingsUtils.getSuitableImeLabels(
- getContext(), mImm, UserHandle.myUserId()));
- if (!suitableImes.isEmpty()) {
- String summary = suitableImes.get(0);
- StringBuilder result = new StringBuilder(summary);
- for (int i = 1; i < suitableImes.size(); i++) {
- result.append(", ").append(suitableImes.get(i));
- }
- pref.setSummary(result.toString());
- } else {
- pref.setSummary(hardKeyboardDeviceInfo.mLayoutLabel);
+ String currentLayout =
+ NewKeyboardSettingsUtils.getSelectedKeyboardLayoutLabelForUser(getContext(),
+ UserHandle.myUserId(), hardKeyboardDeviceInfo.mDeviceIdentifier);
+ if (currentLayout != null) {
+ pref.setSummary(currentLayout);
}
pref.setOnPreferenceClickListener(
preference -> {
diff --git a/src/com/android/settings/inputmethod/TrackpadTapDraggingPreferenceController.java b/src/com/android/settings/inputmethod/TrackpadTapDraggingPreferenceController.java
new file mode 100644
index 0000000..30253a8
--- /dev/null
+++ b/src/com/android/settings/inputmethod/TrackpadTapDraggingPreferenceController.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.inputmethod;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.hardware.input.InputSettings;
+
+import com.android.settings.R;
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
+public class TrackpadTapDraggingPreferenceController extends TogglePreferenceController {
+
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+
+ public TrackpadTapDraggingPreferenceController(Context context, String key) {
+ super(context, key);
+ mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
+ }
+
+ @Override
+ public boolean isChecked() {
+ return InputSettings.useTouchpadTapDragging(mContext);
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ InputSettings.setTouchpadTapDragging(mContext, isChecked);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_GESTURE_TAP_DRAGGING_CHANGED, isChecked);
+ return true;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return InputSettings.isTouchpadTapDraggingFeatureFlagEnabled()
+ ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+ }
+
+ @Override
+ public int getSliceHighlightMenuRes() {
+ return R.string.menu_key_system;
+ }
+}
diff --git a/src/com/android/settings/location/LocationForPrivateProfilePreferenceController.java b/src/com/android/settings/location/LocationForPrivateProfilePreferenceController.java
new file mode 100644
index 0000000..a7be7a5
--- /dev/null
+++ b/src/com/android/settings/location/LocationForPrivateProfilePreferenceController.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.location;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.dashboard.profileselector.ProfileSelectFragment.ProfileType;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedSwitchPreference;
+
+public class LocationForPrivateProfilePreferenceController
+ extends LocationBasePreferenceController {
+ @Nullable private RestrictedSwitchPreference mPreference;
+ @Nullable private final UserHandle mPrivateProfileHandle;
+ public LocationForPrivateProfilePreferenceController(
+ @NonNull Context context, @NonNull String key) {
+ super(context, key);
+ mPrivateProfileHandle = Utils.getProfileOfType(mUserManager, ProfileType.PRIVATE);
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(@NonNull Preference preference) {
+ if (TextUtils.equals(preference.getKey(), getPreferenceKey())) {
+ final boolean switchState = mPreference.isChecked();
+ mUserManager.setUserRestriction(
+ UserManager.DISALLOW_SHARE_LOCATION,
+ !switchState,
+ mPrivateProfileHandle);
+ mPreference.setSummary(switchState
+ ? R.string.switch_on_text : R.string.switch_off_text);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void displayPreference(@NonNull PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+ if (mPreference != null) {
+ mPreference.setEnabled(isPrivateProfileAvailable());
+ }
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ if (!android.os.Flags.allowPrivateProfile()
+ || !android.multiuser.Flags.handleInterleavedSettingsForPrivateSpace()
+ || !isPrivateProfileAvailable()) {
+ return CONDITIONALLY_UNAVAILABLE;
+ }
+ return AVAILABLE;
+ }
+
+ @Override
+ public void onLocationModeChanged(int mode, boolean restricted) {
+ if ((mPreference != null && !mPreference.isVisible())
+ || !isAvailable()
+ || !isPrivateProfileAvailable()) {
+ return;
+ }
+
+ // The profile owner (which is the admin for the child profile) might have added a location
+ // sharing restriction.
+ final RestrictedLockUtils.EnforcedAdmin admin =
+ mLocationEnabler.getShareLocationEnforcedAdmin(
+ mPrivateProfileHandle.getIdentifier());
+ if (admin != null) {
+ mPreference.setDisabledByAdmin(admin);
+ } else {
+ final boolean enabled = mLocationEnabler.isEnabled(mode);
+ mPreference.setEnabled(enabled);
+ int summaryResId;
+
+ final boolean isRestrictedByBase =
+ mLocationEnabler
+ .hasShareLocationRestriction(mPrivateProfileHandle.getIdentifier());
+ if (isRestrictedByBase || !enabled) {
+ mPreference.setChecked(false);
+ summaryResId = enabled ? R.string.switch_off_text
+ : R.string.location_app_permission_summary_location_off;
+ } else {
+ mPreference.setChecked(true);
+ summaryResId = R.string.switch_on_text;
+ }
+ mPreference.setSummary(summaryResId);
+ }
+ }
+
+ private boolean isPrivateProfileAvailable() {
+ return mPrivateProfileHandle != null
+ && !mUserManager.isQuietModeEnabled(mPrivateProfileHandle);
+ }
+}
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index 7bb0228..87e8817 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -119,6 +119,7 @@
use(RecentLocationAccessSeeAllButtonPreferenceController.class).init(this);
use(LocationForWorkPreferenceController.class).init(this);
use(LocationSettingsFooterPreferenceController.class).init(this);
+ use(LocationForPrivateProfilePreferenceController.class).init(this);
}
@Override
diff --git a/src/com/android/settings/network/EraseEuiccDataController.java b/src/com/android/settings/network/EraseEuiccDataController.java
index 9892f0d..782ab7d 100644
--- a/src/com/android/settings/network/EraseEuiccDataController.java
+++ b/src/com/android/settings/network/EraseEuiccDataController.java
@@ -25,7 +25,6 @@
import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController;
-import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.network.telephony.MobileNetworkUtils;
import com.android.settings.system.ResetDashboardFragment;
@@ -51,7 +50,12 @@
if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
return false;
}
- EraseEuiccDataDialogFragment.show(mHostFragment);
+ if (SubscriptionUtil.hasSubscriptionWithRacCarrier(mContext)
+ && !SubscriptionUtil.isConnectedToWifi(mContext)) {
+ EuiccRacConnectivityDialogFragment.show(mHostFragment);
+ } else {
+ EraseEuiccDataDialogFragment.show(mHostFragment);
+ }
return true;
}
diff --git a/src/com/android/settings/network/EuiccRacConnectivityDialogFragment.java b/src/com/android/settings/network/EuiccRacConnectivityDialogFragment.java
new file mode 100644
index 0000000..76a587e
--- /dev/null
+++ b/src/com/android/settings/network/EuiccRacConnectivityDialogFragment.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.settings.SettingsEnums;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+
+import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.system.ResetDashboardFragment;
+
+public class EuiccRacConnectivityDialogFragment extends InstrumentedDialogFragment
+ implements DialogInterface.OnClickListener {
+ public static final String TAG = "EuiccRacConnectivityDlg";
+
+ static void show(ResetDashboardFragment host) {
+ final EuiccRacConnectivityDialogFragment dialog = new EuiccRacConnectivityDialogFragment();
+ dialog.setTargetFragment(host, /* requestCode= */ 0);
+ final FragmentManager manager = host.getActivity().getSupportFragmentManager();
+ dialog.show(manager, TAG);
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.RESET_EUICC;
+ }
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ String title = getString(R.string.wifi_warning_dialog_title);
+ String message = getString(R.string.wifi_warning_dialog_text);
+
+ AlertDialog.Builder builder =
+ new AlertDialog.Builder(getContext())
+ .setOnDismissListener(this)
+ // Return is on the right side
+ .setPositiveButton(R.string.wifi_warning_return_button, null)
+ // Continue is on the left side
+ .setNegativeButton(R.string.wifi_warning_continue_button, this);
+
+ View content =
+ LayoutInflater.from(getContext())
+ .inflate(R.layout.sim_warning_dialog_wifi_connectivity, null);
+
+ // Found the layout resource
+ if (content != null) {
+ TextView dialogTitle = content.findViewById(R.id.title);
+ if (!TextUtils.isEmpty(title) && dialogTitle != null) {
+ dialogTitle.setText(title);
+ dialogTitle.setVisibility(View.VISIBLE);
+ }
+ TextView dialogMessage = content.findViewById(R.id.msg);
+ if (!TextUtils.isEmpty(message) && dialogMessage != null) {
+ dialogMessage.setText(message);
+ dialogMessage.setVisibility(View.VISIBLE);
+ }
+
+ builder.setView(content);
+ } else { // Not found the layout resource, use standard layout
+ if (!TextUtils.isEmpty(title)) {
+ builder.setTitle(title);
+ }
+ if (!TextUtils.isEmpty(message)) {
+ builder.setMessage(message);
+ }
+ }
+
+ AlertDialog dialog = builder.create();
+ dialog.setCanceledOnTouchOutside(false);
+ return dialog;
+ }
+
+ @Override
+ public void onClick(@NonNull DialogInterface dialog, int which) {
+ final Fragment fragment = getTargetFragment();
+ if (!(fragment instanceof ResetDashboardFragment)) {
+ Log.e(TAG, "getTargetFragment return unexpected type");
+ return;
+ }
+
+ // Positions of the buttons have been switch:
+ // negative button = left button = the button to continue
+ if (which == DialogInterface.BUTTON_NEGATIVE) {
+ EraseEuiccDataDialogFragment.show(((ResetDashboardFragment) fragment));
+ }
+ }
+}
diff --git a/src/com/android/settings/network/SimOnboardingActivity.kt b/src/com/android/settings/network/SimOnboardingActivity.kt
index 98bb5d7..350f5b8 100644
--- a/src/com/android/settings/network/SimOnboardingActivity.kt
+++ b/src/com/android/settings/network/SimOnboardingActivity.kt
@@ -21,7 +21,6 @@
import android.os.Bundle
import android.telephony.SubscriptionManager
import android.util.Log
-import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
@@ -45,7 +44,6 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
@@ -67,7 +65,6 @@
import com.android.settingslib.spa.widget.dialog.AlertDialogButton
import com.android.settingslib.spa.widget.dialog.getDialogWidth
import com.android.settingslib.spa.widget.dialog.rememberAlertDialogPresenter
-import com.android.settingslib.spa.widget.editor.SettingsOutlinedTextField
import com.android.settingslib.spa.widget.ui.SettingsTitle
import com.android.settingslib.spaprivileged.framework.common.userManager
import kotlinx.coroutines.CoroutineScope
@@ -83,6 +80,8 @@
lateinit var showBottomSheet: MutableState<Boolean>
lateinit var showError: MutableState<ErrorType>
lateinit var showProgressDialog: MutableState<Boolean>
+ lateinit var showDsdsProgressDialog: MutableState<Boolean>
+ lateinit var showRestartDialog: MutableState<Boolean>
private var switchToEuiccSubscriptionSidecar: SwitchToEuiccSubscriptionSidecar? = null
private var switchToRemovableSlotSidecar: SwitchToRemovableSlotSidecar? = null
@@ -132,6 +131,12 @@
setProgressDialog(false)
}
+ CallbackType.CALLBACK_ENABLE_DSDS-> {
+ scope.launch {
+ onboardingService.startEnableDsds(this@SimOnboardingActivity)
+ }
+ }
+
CallbackType.CALLBACK_ONBOARDING_COMPLETE -> {
showBottomSheet.value = false
setProgressDialog(true)
@@ -179,12 +184,14 @@
showBottomSheet = remember { mutableStateOf(false) }
showError = remember { mutableStateOf(ErrorType.ERROR_NONE) }
showProgressDialog = remember { mutableStateOf(false) }
+ showDsdsProgressDialog = remember { mutableStateOf(false) }
+ showRestartDialog = remember { mutableStateOf(false) }
scope = rememberCoroutineScope()
registerSidecarReceiverFlow()
ErrorDialogImpl()
-
+ RestartDialogImpl()
LaunchedEffect(Unit) {
if (onboardingService.activeSubInfoList.isNotEmpty()) {
showBottomSheet.value = true
@@ -196,29 +203,76 @@
BottomSheetImpl(
sheetState = sheetState,
nextAction = {
- // TODO: if the phone is SS mode and the isDsdsConditionSatisfied is true, then
- // enable the DSDS mode.
- // case#1: the device need the reboot after enabling DSDS. Showing the confirm
- // dialog to user whether reboot device or not.
- // case#2: The device don't need the reboot. Enabling DSDS and then showing
- // the SIM onboarding UI.
-
- // case#2
- val route = getRoute(onboardingService.targetSubId)
- startSpaActivity(route)
+ if (onboardingService.isDsdsConditionSatisfied()) {
+ // TODO: if the phone is SS mode and the isDsdsConditionSatisfied is true,
+ // then enable the DSDS mode.
+ // case#1: the device need the reboot after enabling DSDS. Showing the
+ // confirm dialog to user whether reboot device or not.
+ // case#2: The device don't need the reboot. Enabling DSDS and then showing
+ // the SIM onboarding UI.
+ if (onboardingService.doesSwitchMultiSimConfigTriggerReboot) {
+ // case#1
+ Log.d(TAG, "Device does not support reboot free DSDS.")
+ showRestartDialog.value = true
+ } else {
+ // case#2
+ Log.d(TAG, "Enable DSDS mode")
+ showDsdsProgressDialog.value = true
+ enableMultiSimSidecar?.run(SimOnboardingService.NUM_OF_SIMS_FOR_DSDS)
+ }
+ } else {
+ startSimOnboardingProvider()
+ }
},
cancelAction = { finish() },
)
}
- if(showProgressDialog.value) {
- ProgressDialogImpl()
+ if (showProgressDialog.value) {
+ ProgressDialogImpl(
+ stringResource(
+ R.string.sim_onboarding_progressbar_turning_sim_on,
+ onboardingService.targetSubInfo?.displayName ?: ""
+ )
+ )
+ }
+ if (showDsdsProgressDialog.value) {
+ ProgressDialogImpl(
+ stringResource(R.string.sim_action_enabling_sim_without_carrier_name)
+ )
+ }
+ }
+ @Composable
+ private fun RestartDialogImpl() {
+ val restartDialogPresenter = rememberAlertDialogPresenter(
+ confirmButton = AlertDialogButton(
+ stringResource(R.string.sim_action_reboot)
+ ) {
+ callbackListener(CallbackType.CALLBACK_ENABLE_DSDS)
+ },
+ dismissButton = AlertDialogButton(
+ stringResource(
+ R.string.sim_action_restart_dialog_cancel,
+ onboardingService.targetSubInfo?.displayName ?: "")
+ ) {
+ callbackListener(CallbackType.CALLBACK_ONBOARDING_COMPLETE)
+ },
+ title = stringResource(R.string.sim_action_restart_dialog_title),
+ text = {
+ Text(stringResource(R.string.sim_action_restart_dialog_msg))
+ },
+ )
+
+ if(showRestartDialog.value){
+ LaunchedEffect(Unit) {
+ restartDialogPresenter.open()
+ }
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
- fun ProgressDialogImpl() {
+ fun ProgressDialogImpl(title: String) {
// TODO: Create the SPA's ProgressDialog and using SPA's widget
BasicAlertDialog(
onDismissRequest = {},
@@ -232,19 +286,14 @@
) {
Row(
modifier = Modifier
- .fillMaxWidth()
- .padding(SettingsDimension.itemPaddingStart),
+ .fillMaxWidth()
+ .padding(SettingsDimension.itemPaddingStart),
verticalAlignment = Alignment.CenterVertically
) {
CircularProgressIndicator()
Column(modifier = Modifier
.padding(start = SettingsDimension.itemPaddingStart)) {
- SettingsTitle(
- stringResource(
- R.string.sim_onboarding_progressbar_turning_sim_on,
- onboardingService.targetSubInfo?.displayName ?: ""
- )
- )
+ SettingsTitle(title)
}
}
}
@@ -329,7 +378,7 @@
Log.e(TAG, "Error while sidecarReceiverFlow", e)
}.conflate()
- fun startSimSwitching(){
+ fun startSimSwitching() {
Log.d(TAG, "startSimSwitching:")
var targetSubInfo = onboardingService.targetSubInfo
@@ -376,8 +425,6 @@
switchToEuiccSubscriptionSidecar!!.reset()
showError.value = ErrorType.ERROR_EUICC_SLOT
callbackListener(CallbackType.CALLBACK_ERROR)
- // TODO: showErrorDialog and using privileged_action_disable_fail_title and
- // privileged_action_disable_fail_text
}
}
}
@@ -396,18 +443,19 @@
switchToRemovableSlotSidecar!!.reset()
showError.value = ErrorType.ERROR_REMOVABLE_SLOT
callbackListener(CallbackType.CALLBACK_ERROR)
- // TODO: showErrorDialog and using sim_action_enable_sim_fail_title and
- // sim_action_enable_sim_fail_text
}
}
}
fun handleEnableMultiSimSidecarStateChange() {
+ showDsdsProgressDialog.value = false
when (enableMultiSimSidecar!!.state) {
SidecarFragment.State.SUCCESS -> {
enableMultiSimSidecar!!.reset()
Log.i(TAG, "Successfully switched to DSDS without reboot.")
- handleEnableSubscriptionAfterEnablingDsds()
+ // refresh data
+ initServiceData(this, onboardingService.targetSubId, callbackListener)
+ startSimOnboardingProvider()
}
SidecarFragment.State.ERROR -> {
@@ -415,34 +463,14 @@
Log.i(TAG, "Failed to switch to DSDS without rebooting.")
showError.value = ErrorType.ERROR_ENABLE_DSDS
callbackListener(CallbackType.CALLBACK_ERROR)
- // TODO: showErrorDialog and using dsds_activation_failure_title and
- // dsds_activation_failure_body_msg2
}
}
}
- fun handleEnableSubscriptionAfterEnablingDsds() {
- var targetSubInfo = onboardingService.targetSubInfo
- if (targetSubInfo?.isEmbedded == true) {
- Log.i(TAG,
- "DSDS enabled, start to enable profile: " + targetSubInfo.getSubscriptionId()
- )
- // For eSIM operations, we simply switch to the selected eSIM profile.
- switchToEuiccSubscriptionSidecar!!.run(
- targetSubInfo.subscriptionId,
- UiccSlotUtil.INVALID_PORT_ID,
- null
- )
- return
- }
- Log.i(TAG, "DSDS enabled, start to enable pSIM profile.")
- onboardingService.handleTogglePsimAction()
- callbackListener(CallbackType.CALLBACK_FINISH)
- }
-
@Composable
fun BottomSheetBody(nextAction: () -> Unit) {
- Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.padding(bottom = SettingsDimension.itemPaddingVertical)) {
+ Column(horizontalAlignment = Alignment.CenterHorizontally,
+ modifier = Modifier.padding(bottom = SettingsDimension.itemPaddingVertical)) {
Icon(
imageVector = Icons.Outlined.SignalCellularAlt,
contentDescription = null,
@@ -497,6 +525,11 @@
onboardingService.initData(targetSubId, context,callback)
}
+ private fun startSimOnboardingProvider() {
+ val route = getRoute(onboardingService.targetSubId)
+ startSpaActivity(route)
+ }
+
companion object {
@JvmStatic
fun startSimOnboardingActivity(
@@ -523,9 +556,10 @@
enum class CallbackType(val value:Int){
CALLBACK_ERROR(-1),
CALLBACK_ONBOARDING_COMPLETE(1),
- CALLBACK_SETUP_NAME(2),
- CALLBACK_SETUP_PRIMARY_SIM(3),
- CALLBACK_FINISH(4)
+ CALLBACK_ENABLE_DSDS(2),
+ CALLBACK_SETUP_NAME(3),
+ CALLBACK_SETUP_PRIMARY_SIM(4),
+ CALLBACK_FINISH(5)
}
}
}
\ No newline at end of file
diff --git a/src/com/android/settings/network/SimOnboardingService.kt b/src/com/android/settings/network/SimOnboardingService.kt
index 962741f..2ec1ad3 100644
--- a/src/com/android/settings/network/SimOnboardingService.kt
+++ b/src/com/android/settings/network/SimOnboardingService.kt
@@ -24,6 +24,7 @@
import android.telephony.UiccSlotInfo
import android.util.Log
import com.android.settings.network.SimOnboardingActivity.Companion.CallbackType
+import com.android.settings.sim.SimActivationNotifier
import com.android.settings.spa.network.setAutomaticData
import com.android.settings.spa.network.setDefaultData
import com.android.settings.spa.network.setDefaultSms
@@ -32,9 +33,6 @@
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
-private const val TAG = "SimOnboardingService"
-private const val INVALID = SubscriptionManager.INVALID_SUBSCRIPTION_ID
-
class SimOnboardingService {
var subscriptionManager:SubscriptionManager? = null
var telephonyManager:TelephonyManager? = null
@@ -70,7 +68,7 @@
}
return uiccCardInfoList.any { it.isMultipleEnabledProfilesSupported }
}
- var isRemovableSimEnabled: Boolean = false
+ var isRemovablePsimProfileEnabled: Boolean = false
get() {
if(slotInfoList.isEmpty()) {
Log.w(TAG, "UICC Slot info list is empty.")
@@ -78,7 +76,11 @@
}
return UiccSlotUtil.isRemovableSimEnabled(slotInfoList)
}
-
+ var isEsimProfileEnabled: Boolean = false
+ get() {
+ activeSubInfoList.stream().anyMatch { it.isEmbedded }
+ return false
+ }
var doesTargetSimHaveEsimOperation = false
get() {
return targetSubInfo?.isEmbedded ?: false
@@ -109,6 +111,19 @@
}
return getActiveModemCount != 0 && activeSubInfoList.size == getActiveModemCount
}
+ var isMultiSimEnabled = false
+ get() {
+ return getActiveModemCount > 1
+ }
+ var isMultiSimSupported = false
+ get() {
+ return telephonyManager?.isMultiSimSupported == TelephonyManager.MULTISIM_ALLOWED
+ }
+
+ var doesSwitchMultiSimConfigTriggerReboot = false
+ get() {
+ return telephonyManager?.doesSwitchMultiSimConfigTriggerReboot() ?: false
+ }
fun isValid(): Boolean {
return targetSubId != INVALID
@@ -161,9 +176,10 @@
targetPrimarySimCalls = SubscriptionManager.getDefaultVoiceSubscriptionId()
targetPrimarySimTexts = SubscriptionManager.getDefaultSmsSubscriptionId()
targetPrimarySimMobileData = SubscriptionManager.getDefaultDataSubscriptionId()
+
Log.d(
TAG,"doesTargetSimHaveEsimOperation: $doesTargetSimHaveEsimOperation" +
- ", isRemovableSimEnabled: $isRemovableSimEnabled" +
+ ", isRemovableSimEnabled: $isRemovablePsimProfileEnabled" +
", isMultipleEnabledProfilesSupported: $isMultipleEnabledProfilesSupported" +
", targetPrimarySimCalls: $targetPrimarySimCalls" +
", targetPrimarySimTexts: $targetPrimarySimTexts" +
@@ -261,6 +277,45 @@
}
}
+ fun isDsdsConditionSatisfied(): Boolean {
+ if (isMultiSimEnabled) {
+ Log.d(
+ TAG,
+ "DSDS is already enabled. Condition not satisfied."
+ )
+ return false
+ }
+ if (!isMultiSimSupported) {
+ Log.d(TAG, "Hardware does not support DSDS.")
+ return false
+ }
+ val isActiveSim = activeSubInfoList.isNotEmpty()
+ if (isMultipleEnabledProfilesSupported && isActiveSim) {
+ Log.d(TAG,
+ "Device supports MEP and eSIM operation and eSIM profile is enabled."
+ + " DSDS condition satisfied."
+ )
+ return true
+ }
+
+ if (doesTargetSimHaveEsimOperation && isRemovablePsimProfileEnabled) {
+ Log.d(TAG,
+ "eSIM operation and removable PSIM is enabled. DSDS condition satisfied."
+ )
+ return true
+ }
+
+ if (!doesTargetSimHaveEsimOperation && isEsimProfileEnabled) {
+ Log.d(TAG,
+ "Removable SIM operation and eSIM profile is enabled. DSDS condition"
+ + " satisfied."
+ )
+ return true
+ }
+ Log.d(TAG, "DSDS condition not satisfied.")
+ return false
+ }
+
fun startActivatingSim(){
// TODO: start to activate sim
callback(CallbackType.CALLBACK_FINISH)
@@ -281,30 +336,50 @@
suspend fun startSetupPrimarySim(context: Context) {
withContext(Dispatchers.Default) {
- setDefaultVoice(subscriptionManager,targetPrimarySimCalls)
- setDefaultSms(subscriptionManager,targetPrimarySimTexts)
- setDefaultData(
- context,
- subscriptionManager,
- null,
- targetPrimarySimMobileData
- )
+ if (SubscriptionUtil.getActiveSubscriptions(subscriptionManager).size <= 1) {
+ Log.d(TAG,
+ "startSetupPrimarySim: number of active subscriptionInfo is less than 2"
+ )
+ } else {
+ setDefaultVoice(subscriptionManager, targetPrimarySimCalls)
+ setDefaultSms(subscriptionManager, targetPrimarySimTexts)
+ setDefaultData(
+ context,
+ subscriptionManager,
+ null,
+ targetPrimarySimMobileData
+ )
- var nonDds = targetNonDds
- Log.d(
- TAG,
- "setAutomaticData: targetNonDds: $nonDds," +
- " targetPrimarySimAutoDataSwitch: $targetPrimarySimAutoDataSwitch"
- )
- if (nonDds != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
- val telephonyManagerForNonDds: TelephonyManager? =
- context.getSystemService(TelephonyManager::class.java)
- ?.createForSubscriptionId(nonDds)
- setAutomaticData(telephonyManagerForNonDds, targetPrimarySimAutoDataSwitch)
+ var nonDds = targetNonDds
+ Log.d(
+ TAG,
+ "setAutomaticData: targetNonDds: $nonDds," +
+ " targetPrimarySimAutoDataSwitch: $targetPrimarySimAutoDataSwitch"
+ )
+ if (nonDds != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ val telephonyManagerForNonDds: TelephonyManager? =
+ context.getSystemService(TelephonyManager::class.java)
+ ?.createForSubscriptionId(nonDds)
+ setAutomaticData(telephonyManagerForNonDds, targetPrimarySimAutoDataSwitch)
+ }
}
-
// no next action, send finish
callback(CallbackType.CALLBACK_FINISH)
}
}
+
+ suspend fun startEnableDsds(context: Context) {
+ withContext(Dispatchers.Default) {
+ Log.d(TAG, "User confirmed reboot to enable DSDS.")
+ SimActivationNotifier.setShowSimSettingsNotification(context, true)
+ telephonyManager?.switchMultiSimConfig(NUM_OF_SIMS_FOR_DSDS)
+ callback(CallbackType.CALLBACK_FINISH)
+ }
+ }
+
+ companion object{
+ private const val TAG = "SimOnboardingService"
+ private const val INVALID = SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ const val NUM_OF_SIMS_FOR_DSDS = 2
+ }
}
\ No newline at end of file
diff --git a/src/com/android/settings/network/SubscriptionInfoListViewModel.kt b/src/com/android/settings/network/SubscriptionInfoListViewModel.kt
index f682002..df3b8ba 100644
--- a/src/com/android/settings/network/SubscriptionInfoListViewModel.kt
+++ b/src/com/android/settings/network/SubscriptionInfoListViewModel.kt
@@ -20,6 +20,7 @@
import android.telephony.SubscriptionManager
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
+import com.android.settings.network.telephony.getSelectableSubscriptionInfoList
import com.android.settings.network.telephony.subscriptionsChangedFlow
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.SharingStarted
@@ -41,10 +42,10 @@
}.stateIn(scope, SharingStarted.Eagerly, initialValue = emptyList())
/**
- * Getting the Selectable SubscriptionInfo List from the SubscriptionManager's
+ * Getting the Selectable SubscriptionInfo List from the SubscriptionRepository's
* getAvailableSubscriptionInfoList
*/
val selectableSubscriptionInfoListFlow = application.subscriptionsChangedFlow().map {
- SubscriptionUtil.getSelectableSubscriptionInfoList(application)
+ application.getSelectableSubscriptionInfoList()
}.stateIn(scope, SharingStarted.Eagerly, initialValue = emptyList())
}
diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java
index 83f6c38..6d6f4c5 100644
--- a/src/com/android/settings/network/SubscriptionUtil.java
+++ b/src/com/android/settings/network/SubscriptionUtil.java
@@ -50,12 +50,12 @@
import com.android.settings.network.helper.SubscriptionAnnotation;
import com.android.settings.network.telephony.DeleteEuiccSubscriptionDialogActivity;
import com.android.settings.network.telephony.EuiccRacConnectivityDialogActivity;
+import com.android.settings.network.telephony.SubscriptionRepositoryKt;
import com.android.settings.network.telephony.ToggleSubscriptionDialogActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
@@ -499,40 +499,7 @@
* @return list of user selectable subscriptions.
*/
public static List<SubscriptionInfo> getSelectableSubscriptionInfoList(Context context) {
- SubscriptionManager subManager = context.getSystemService(SubscriptionManager.class);
- List<SubscriptionInfo> availableList = subManager.getAvailableSubscriptionInfoList();
- if (availableList == null) {
- return null;
- } else {
- // Multiple subscriptions in a group should only have one representative.
- // It should be the current active primary subscription if any, or any
- // primary subscription.
- List<SubscriptionInfo> selectableList = new ArrayList<>();
- Map<ParcelUuid, SubscriptionInfo> groupMap = new HashMap<>();
-
- for (SubscriptionInfo info : availableList) {
- // Opportunistic subscriptions are considered invisible
- // to users so they should never be returned.
- if (!isSubscriptionVisible(subManager, context, info)) continue;
-
- ParcelUuid groupUuid = info.getGroupUuid();
- if (groupUuid == null) {
- // Doesn't belong to any group. Add in the list.
- selectableList.add(info);
- } else if (!groupMap.containsKey(groupUuid)
- || (groupMap.get(groupUuid).getSimSlotIndex() == INVALID_SIM_SLOT_INDEX
- && info.getSimSlotIndex() != INVALID_SIM_SLOT_INDEX)) {
- // If it belongs to a group that has never been recorded or it's the current
- // active subscription, add it in the list.
- selectableList.remove(groupMap.get(groupUuid));
- selectableList.add(info);
- groupMap.put(groupUuid, info);
- }
-
- }
- Log.d(TAG, "getSelectableSubscriptionInfoList: " + selectableList);
- return selectableList;
- }
+ return SubscriptionRepositoryKt.getSelectableSubscriptionInfoList(context);
}
/**
@@ -556,20 +523,21 @@
/**
* Starts a dialog activity to handle eSIM deletion.
+ *
* @param context {@code Context}
* @param subId The id of subscription need to be deleted.
+ * @param carrierId The carrier id of the subscription.
*/
- public static void startDeleteEuiccSubscriptionDialogActivity(Context context, int subId,
- int carrierId) {
+ public static void startDeleteEuiccSubscriptionDialogActivity(
+ @NonNull Context context, int subId, int carrierId) {
if (!SubscriptionManager.isUsableSubscriptionId(subId)) {
Log.i(TAG, "Unable to delete subscription due to invalid subscription ID.");
return;
}
- final int[] carriersThatUseRAC = context.getResources().getIntArray(
- R.array.config_carrier_use_rac);
- boolean isCarrierRac = Arrays.stream(carriersThatUseRAC).anyMatch(cid -> cid == carrierId);
- if (isCarrierRac && !isConnectedToWifiOrDifferentSubId(context, subId)) {
+ if (isCarrierRac(context, carrierId)
+ && (!isConnectedToWifi(context)
+ || isConnectedToMobileDataWithDifferentSubId(context, subId))) {
context.startActivity(EuiccRacConnectivityDialogActivity.getIntent(context, subId));
} else {
context.startActivity(DeleteEuiccSubscriptionDialogActivity.getIntent(context, subId));
@@ -847,27 +815,75 @@
}
/**
- * Returns {@code true} if device is connected to Wi-Fi or mobile data provided by a different
- * subId.
+ * Checks if the device is connected to Wi-Fi.
+ *
+ * @param context context
+ * @return {@code true} if connected to Wi-Fi
+ */
+ static boolean isConnectedToWifi(@NonNull Context context) {
+ NetworkCapabilities capabilities = getNetworkCapabilities(context);
+
+ return capabilities != null
+ && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
+ }
+
+ /**
+ * Checks if the device is connected to mobile data provided by a different subId.
*
* @param context context
* @param targetSubId subscription that is going to be deleted
+ * @return {@code true} if connected to mobile data provided by a different subId
*/
@VisibleForTesting
- static boolean isConnectedToWifiOrDifferentSubId(@NonNull Context context, int targetSubId) {
+ static boolean isConnectedToMobileDataWithDifferentSubId(
+ @NonNull Context context, int targetSubId) {
+ NetworkCapabilities capabilities = getNetworkCapabilities(context);
+
+ return capabilities != null
+ && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
+ && targetSubId != SubscriptionManager.getActiveDataSubscriptionId();
+ }
+
+ /**
+ * Checks if any subscription carrier use reusable activation codes.
+ *
+ * @param context The context used to retrieve carriers that uses reusable activation codes.
+ * @return {@code true} if any subscription has a matching carrier that uses reusable activation
+ * codes
+ */
+ static boolean hasSubscriptionWithRacCarrier(@NonNull Context context) {
+ List<SubscriptionInfo> subs = getAvailableSubscriptions(context);
+ final int[] carriersThatUseRac =
+ context.getResources().getIntArray(R.array.config_carrier_use_rac);
+
+ return Arrays.stream(carriersThatUseRac)
+ .anyMatch(cid -> subs.stream().anyMatch(sub -> sub.getCarrierId() == cid));
+ }
+
+ /**
+ * Checks if a carrier use reusable activation codes.
+ *
+ * @param context The context used to retrieve carriers that uses reusable activation codes.
+ * @param carrierId The carrier id to check if it use reusable activation codes.
+ * @return {@code true} if carrier id use reusable activation codes.
+ */
+ @VisibleForTesting
+ static boolean isCarrierRac(@NonNull Context context, int carrierId) {
+ final int[] carriersThatUseRAC =
+ context.getResources().getIntArray(R.array.config_carrier_use_rac);
+
+ return Arrays.stream(carriersThatUseRAC).anyMatch(cid -> cid == carrierId);
+ }
+
+ /**
+ * Retrieves NetworkCapabilities for the active network.
+ *
+ * @param context context
+ * @return NetworkCapabilities or null if not available
+ */
+ private static NetworkCapabilities getNetworkCapabilities(@NonNull Context context) {
ConnectivityManager connectivityManager =
context.getSystemService(ConnectivityManager.class);
- NetworkCapabilities capabilities =
- connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
-
- if (capabilities != null) {
- if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
- // Connected to WiFi
- return true;
- } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
- return targetSubId != SubscriptionManager.getActiveDataSubscriptionId();
- }
- }
- return false;
+ return connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
}
}
diff --git a/src/com/android/settings/network/telephony/CellInfoUtil.kt b/src/com/android/settings/network/telephony/CellInfoUtil.kt
index c7b6b24..51f60e7 100644
--- a/src/com/android/settings/network/telephony/CellInfoUtil.kt
+++ b/src/com/android/settings/network/telephony/CellInfoUtil.kt
@@ -82,7 +82,7 @@
*/
@JvmStatic
fun cellInfoListToString(cellInfos: List<CellInfo>): String =
- cellInfos.joinToString { cellInfo -> cellInfo.readableString() }
+ cellInfos.joinToString(System.lineSeparator()) { cellInfo -> cellInfo.readableString() }
/**
* Convert [CellInfo] to a readable string without sensitive info.
diff --git a/src/com/android/settings/network/telephony/DataUsagePreferenceController.kt b/src/com/android/settings/network/telephony/DataUsagePreferenceController.kt
index 240843d..6d326e0 100644
--- a/src/com/android/settings/network/telephony/DataUsagePreferenceController.kt
+++ b/src/com/android/settings/network/telephony/DataUsagePreferenceController.kt
@@ -33,6 +33,7 @@
import com.android.settings.datausage.lib.DataUsageLib
import com.android.settings.datausage.lib.NetworkCycleDataRepository
import com.android.settings.datausage.lib.NetworkStatsRepository.Companion.AllTimeRange
+import com.android.settingslib.spaprivileged.framework.compose.getPlaceholder
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -63,6 +64,7 @@
}
override fun onViewCreated(viewLifecycleOwner: LifecycleOwner) {
+ preference.summary = mContext.getPlaceholder()
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
update()
@@ -113,7 +115,6 @@
}
val allTimeUsage = repository.queryUsage(AllTimeRange)
- if (allTimeUsage.usage > 0) return allTimeUsage.getDataUsedString(mContext) to true
- return null to false
+ return allTimeUsage.getDataUsedString(mContext) to (allTimeUsage.usage > 0)
}
}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkEidPreferenceController.kt b/src/com/android/settings/network/telephony/MobileNetworkEidPreferenceController.kt
index 907bab1..1e635a5 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkEidPreferenceController.kt
+++ b/src/com/android/settings/network/telephony/MobileNetworkEidPreferenceController.kt
@@ -84,6 +84,13 @@
}
override fun onViewCreated(viewLifecycleOwner: LifecycleOwner) {
+ if (!this::lazyViewModel.isInitialized) {
+ Log.e(
+ this.javaClass.simpleName,
+ "lateinit property lazyViewModel has not been initialized"
+ )
+ return
+ }
preference.isVisible = false
val viewModel by lazyViewModel
diff --git a/src/com/android/settings/network/telephony/MobileNetworkImeiPreferenceController.kt b/src/com/android/settings/network/telephony/MobileNetworkImeiPreferenceController.kt
index 8ec313b..e134681 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkImeiPreferenceController.kt
+++ b/src/com/android/settings/network/telephony/MobileNetworkImeiPreferenceController.kt
@@ -78,6 +78,13 @@
}
override fun onViewCreated(viewLifecycleOwner: LifecycleOwner) {
+ if (!this::lazyViewModel.isInitialized) {
+ Log.e(
+ this.javaClass.simpleName,
+ "lateinit property lazyViewModel has not been initialized"
+ )
+ return
+ }
val viewModel by lazyViewModel
val coroutineScope = viewLifecycleOwner.lifecycleScope
diff --git a/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceController.kt b/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceController.kt
index 65a4b7e..10a8b53 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceController.kt
+++ b/src/com/android/settings/network/telephony/MobileNetworkPhoneNumberPreferenceController.kt
@@ -19,6 +19,7 @@
import android.content.Context
import android.telephony.SubscriptionInfo
import android.telephony.SubscriptionManager
+import android.util.Log
import androidx.annotation.VisibleForTesting
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
@@ -66,6 +67,13 @@
}
override fun onViewCreated(viewLifecycleOwner: LifecycleOwner) {
+ if (!this::lazyViewModel.isInitialized) {
+ Log.e(
+ this.javaClass.simpleName,
+ "lateinit property lazyViewModel has not been initialized"
+ )
+ return
+ }
val viewModel by lazyViewModel
val coroutineScope = viewLifecycleOwner.lifecycleScope
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSpnPreferenceController.kt b/src/com/android/settings/network/telephony/MobileNetworkSpnPreferenceController.kt
index ac055b0..4736eb7 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSpnPreferenceController.kt
+++ b/src/com/android/settings/network/telephony/MobileNetworkSpnPreferenceController.kt
@@ -19,6 +19,7 @@
import android.content.Context
import android.telephony.SubscriptionInfo
import android.telephony.SubscriptionManager
+import android.util.Log
import androidx.annotation.VisibleForTesting
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
@@ -26,6 +27,7 @@
import androidx.preference.Preference
import androidx.preference.PreferenceScreen
import com.android.settings.flags.Flags
+import com.android.settings.network.SimOnboardingActivity
import com.android.settings.network.SubscriptionInfoListViewModel
import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
@@ -57,6 +59,14 @@
}
override fun onViewCreated(viewLifecycleOwner: LifecycleOwner) {
+ if (!this::lazyViewModel.isInitialized) {
+ Log.e(
+ this.javaClass.simpleName,
+ "lateinit property lazyViewModel has not been initialized"
+ )
+ return
+ }
+
val viewModel by lazyViewModel
viewModel.subscriptionInfoListFlow
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java b/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java
deleted file mode 100644
index 20a3d89..0000000
--- a/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import static android.telephony.TelephonyManager.CALL_STATE_IDLE;
-
-import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
-import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
-
-import android.content.Context;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyCallback;
-import android.telephony.TelephonyManager;
-
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.core.BasePreferenceController;
-import com.android.settings.network.SubscriptionUtil;
-import com.android.settings.network.SubscriptionsChangeListener;
-import com.android.settings.widget.SettingsMainSwitchPreference;
-
-/** This controls a switch to allow enabling/disabling a mobile network */
-public class MobileNetworkSwitchController extends BasePreferenceController implements
- SubscriptionsChangeListener.SubscriptionsChangeListenerClient, LifecycleObserver {
- private static final String TAG = "MobileNetworkSwitchCtrl";
- private SettingsMainSwitchPreference mSwitchBar;
- private int mSubId;
- private SubscriptionsChangeListener mChangeListener;
- private SubscriptionManager mSubscriptionManager;
- private TelephonyManager mTelephonyManager;
- private CallStateTelephonyCallback mCallStateCallback;
-
- public MobileNetworkSwitchController(Context context, String preferenceKey) {
- super(context, preferenceKey);
- mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
- mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class);
- mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
- mChangeListener = new SubscriptionsChangeListener(context, this);
- }
-
- void init(int subId) {
- mSubId = subId;
- mTelephonyManager = mTelephonyManager.createForSubscriptionId(mSubId);
- }
-
- @OnLifecycleEvent(ON_RESUME)
- public void onResume() {
- mChangeListener.start();
-
- if (mCallStateCallback == null) {
- mCallStateCallback = new CallStateTelephonyCallback();
- mTelephonyManager.registerTelephonyCallback(
- mContext.getMainExecutor(), mCallStateCallback);
- }
- update();
- }
-
- @OnLifecycleEvent(ON_PAUSE)
- public void onPause() {
- if (mCallStateCallback != null) {
- mTelephonyManager.unregisterTelephonyCallback(mCallStateCallback);
- mCallStateCallback = null;
- }
- mChangeListener.stop();
- }
-
- @Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- mSwitchBar = (SettingsMainSwitchPreference) screen.findPreference(mPreferenceKey);
-
- mSwitchBar.setOnBeforeCheckedChangeListener((isChecked) -> {
- // TODO b/135222940: re-evaluate whether to use
- // mSubscriptionManager#isSubscriptionEnabled
- if (mSubscriptionManager.isActiveSubscriptionId(mSubId) != isChecked) {
- SubscriptionUtil.startToggleSubscriptionDialogActivity(mContext, mSubId, isChecked);
- return true;
- }
- return false;
- });
- update();
- }
-
- private void update() {
- if (mSwitchBar == null) {
- return;
- }
-
- SubscriptionInfo subInfo = null;
- for (SubscriptionInfo info : SubscriptionUtil.getAvailableSubscriptions(mContext)) {
- if (info.getSubscriptionId() == mSubId) {
- subInfo = info;
- break;
- }
- }
-
- // For eSIM, we always want the toggle. If telephony stack support disabling a pSIM
- // directly, we show the toggle.
- if (subInfo == null || (!subInfo.isEmbedded() && !SubscriptionUtil.showToggleForPhysicalSim(
- mSubscriptionManager))) {
- mSwitchBar.hide();
- } else {
- mSwitchBar.show();
- mSwitchBar.setCheckedInternal(mSubscriptionManager.isActiveSubscriptionId(mSubId));
- }
- }
-
- @Override
- public int getAvailabilityStatus() {
- return AVAILABLE_UNSEARCHABLE;
-
- }
-
- @Override
- public void onAirplaneModeChanged(boolean airplaneModeEnabled) {
- }
-
- @Override
- public void onSubscriptionsChanged() {
- update();
- }
-
- private class CallStateTelephonyCallback extends TelephonyCallback implements
- TelephonyCallback.CallStateListener {
- @Override
- public void onCallStateChanged(int state) {
- mSwitchBar.setSwitchBarEnabled(state == CALL_STATE_IDLE);
- }
- }
-}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSwitchController.kt b/src/com/android/settings/network/telephony/MobileNetworkSwitchController.kt
new file mode 100644
index 0000000..dcac74f
--- /dev/null
+++ b/src/com/android/settings/network/telephony/MobileNetworkSwitchController.kt
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network.telephony
+
+import android.content.Context
+import android.telephony.SubscriptionManager
+import android.telephony.TelephonyManager
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.android.settings.R
+import com.android.settings.network.SubscriptionUtil
+import com.android.settings.spa.preference.ComposePreferenceController
+import com.android.settingslib.spa.widget.preference.MainSwitchPreference
+import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
+import kotlinx.coroutines.flow.map
+
+class MobileNetworkSwitchController @JvmOverloads constructor(
+ context: Context,
+ preferenceKey: String,
+ private val subscriptionRepository: SubscriptionRepository = SubscriptionRepository(context),
+) : ComposePreferenceController(context, preferenceKey) {
+
+ private var subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID
+
+ override fun getAvailabilityStatus() = AVAILABLE_UNSEARCHABLE
+
+ fun init(subId: Int) {
+ this.subId = subId
+ }
+
+ @Composable
+ override fun Content() {
+ val context = LocalContext.current
+ if (remember { !context.isVisible() }) return
+ val checked by remember {
+ subscriptionRepository.isSubscriptionEnabledFlow(subId)
+ }.collectAsStateWithLifecycle(initialValue = null)
+ val changeable by remember {
+ context.callStateFlow(subId).map { it == TelephonyManager.CALL_STATE_IDLE }
+ }.collectAsStateWithLifecycle(initialValue = true)
+ MainSwitchPreference(model = object : SwitchPreferenceModel {
+ override val title = stringResource(R.string.mobile_network_use_sim_on)
+ override val changeable = { changeable }
+ override val checked = { checked }
+ override val onCheckedChange = { newChecked: Boolean ->
+ SubscriptionUtil.startToggleSubscriptionDialogActivity(mContext, subId, newChecked)
+ }
+ })
+ }
+
+ private fun Context.isVisible(): Boolean {
+ val subInfo = subscriptionRepository.getSelectableSubscriptionInfoList()
+ .firstOrNull { it.subscriptionId == subId }
+ ?: return false
+ // For eSIM, we always want the toggle. If telephony stack support disabling a pSIM
+ // directly, we show the toggle.
+ return subInfo.isEmbedded || requireSubscriptionManager().canDisablePhysicalSubscription()
+ }
+}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
index 8a63505..0407b6a 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
@@ -308,7 +308,7 @@
public static Boolean showEuiccSettingsDetecting(Context context) {
final EuiccManager euiccManager =
(EuiccManager) context.getSystemService(EuiccManager.class);
- if (!euiccManager.isEnabled()) {
+ if (euiccManager == null || !euiccManager.isEnabled()) {
Log.w(TAG, "EuiccManager is not enabled.");
return false;
}
diff --git a/src/com/android/settings/network/telephony/NetworkScanHelper.java b/src/com/android/settings/network/telephony/NetworkScanHelper.java
deleted file mode 100644
index 1961329..0000000
--- a/src/com/android/settings/network/telephony/NetworkScanHelper.java
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import android.annotation.IntDef;
-import android.content.Context;
-import android.telephony.AccessNetworkConstants.AccessNetworkType;
-import android.telephony.CellInfo;
-import android.telephony.NetworkScan;
-import android.telephony.NetworkScanRequest;
-import android.telephony.PhoneCapability;
-import android.telephony.RadioAccessSpecifier;
-import android.telephony.TelephonyManager;
-import android.telephony.TelephonyScanManager;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.internal.telephony.CellNetworkScanResult;
-
-import com.android.settings.R;
-
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
-import com.google.common.util.concurrent.SettableFuture;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.Executor;
-import java.util.stream.Collectors;
-
-/**
- * A helper class that builds the common interface and performs the network scan for two different
- * network scan APIs.
- */
-public class NetworkScanHelper {
- public static final String TAG = "NetworkScanHelper";
-
- /**
- * Callbacks interface to inform the network scan results.
- */
- public interface NetworkScanCallback {
- /**
- * Called when the results is returned from {@link TelephonyManager}. This method will be
- * called at least one time if there is no error occurred during the network scan.
- *
- * <p> This method can be called multiple times in one network scan, until
- * {@link #onComplete()} or {@link #onError(int)} is called.
- *
- * @param results
- */
- void onResults(List<CellInfo> results);
-
- /**
- * Called when the current network scan process is finished. No more
- * {@link #onResults(List)} will be called for the current network scan after this method is
- * called.
- */
- void onComplete();
-
- /**
- * Called when an error occurred during the network scan process.
- *
- * <p> There is no more result returned from {@link TelephonyManager} if an error occurred.
- *
- * <p> {@link #onComplete()} will not be called if an error occurred.
- *
- * @see {@link NetworkScan.ScanErrorCode}
- */
- void onError(int errorCode);
- }
-
- @Retention(RetentionPolicy.SOURCE)
- @IntDef({NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS, NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS})
- public @interface NetworkQueryType {}
-
- /**
- * Performs the network scan using {@link TelephonyManager#getAvailableNetworks()}. The network
- * scan results won't be returned to the caller until the network scan is completed.
- *
- * <p> This is typically used when the modem doesn't support the new network scan api
- * {@link TelephonyManager#requestNetworkScan(
- * NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)}.
- */
- public static final int NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS = 1;
-
- /**
- * Performs the network scan using {@link TelephonyManager#requestNetworkScan(
- * NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)} The network scan
- * results will be returned to the caller periodically in a small time window until the network
- * scan is completed. The complete results should be returned in the last called of
- * {@link NetworkScanCallback#onResults(List)}.
- *
- * <p> This is recommended to be used if modem supports the new network scan api
- * {@link TelephonyManager#requestNetworkScan(
- * NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)}
- */
- public static final int NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS = 2;
-
- /** The constants below are used in the async network scan. */
- @VisibleForTesting
- static final boolean INCREMENTAL_RESULTS = true;
- @VisibleForTesting
- static final int SEARCH_PERIODICITY_SEC = 5;
- @VisibleForTesting
- static final int MAX_SEARCH_TIME_SEC = 300;
- @VisibleForTesting
- static final int INCREMENTAL_RESULTS_PERIODICITY_SEC = 3;
-
- private final NetworkScanCallback mNetworkScanCallback;
- private final TelephonyManager mTelephonyManager;
- private final TelephonyScanManager.NetworkScanCallback mInternalNetworkScanCallback;
- private final Executor mExecutor;
-
- private int mMaxSearchTimeSec = MAX_SEARCH_TIME_SEC;
- private NetworkScan mNetworkScanRequester;
-
- /** Callbacks for sync network scan */
- private ListenableFuture<List<CellInfo>> mNetworkScanFuture;
-
- public NetworkScanHelper(TelephonyManager tm, NetworkScanCallback callback, Executor executor) {
- mTelephonyManager = tm;
- mNetworkScanCallback = callback;
- mInternalNetworkScanCallback = new NetworkScanCallbackImpl();
- mExecutor = executor;
- }
-
- public NetworkScanHelper(Context context, TelephonyManager tm, NetworkScanCallback callback,
- Executor executor) {
- this(tm, callback, executor);
- mMaxSearchTimeSec = context.getResources().getInteger(
- R.integer.config_network_scan_helper_max_search_time_sec);
- }
-
- @VisibleForTesting
- NetworkScanRequest createNetworkScanForPreferredAccessNetworks() {
- long networkTypeBitmap3gpp = mTelephonyManager.getPreferredNetworkTypeBitmask()
- & TelephonyManager.NETWORK_STANDARDS_FAMILY_BITMASK_3GPP;
-
- List<RadioAccessSpecifier> radioAccessSpecifiers = new ArrayList<>();
- // If the allowed network types are unknown or if they are of the right class, scan for
- // them; otherwise, skip them to save scan time and prevent users from being shown networks
- // that they can't connect to.
- if (networkTypeBitmap3gpp == 0
- || (networkTypeBitmap3gpp & TelephonyManager.NETWORK_CLASS_BITMASK_2G) != 0) {
- radioAccessSpecifiers.add(
- new RadioAccessSpecifier(AccessNetworkType.GERAN, null, null));
- }
- if (networkTypeBitmap3gpp == 0
- || (networkTypeBitmap3gpp & TelephonyManager.NETWORK_CLASS_BITMASK_3G) != 0) {
- radioAccessSpecifiers.add(
- new RadioAccessSpecifier(AccessNetworkType.UTRAN, null, null));
- }
- if (networkTypeBitmap3gpp == 0
- || (networkTypeBitmap3gpp & TelephonyManager.NETWORK_CLASS_BITMASK_4G) != 0) {
- radioAccessSpecifiers.add(
- new RadioAccessSpecifier(AccessNetworkType.EUTRAN, null, null));
- }
- // If a device supports 5G stand-alone then the code below should be re-enabled; however
- // a device supporting only non-standalone mode cannot perform PLMN selection and camp on
- // a 5G network, which means that it shouldn't scan for 5G at the expense of battery as
- // part of the manual network selection process.
- //
- if (networkTypeBitmap3gpp == 0
- || (hasNrSaCapability()
- && (networkTypeBitmap3gpp & TelephonyManager.NETWORK_CLASS_BITMASK_5G) != 0)) {
- radioAccessSpecifiers.add(
- new RadioAccessSpecifier(AccessNetworkType.NGRAN, null, null));
- Log.d(TAG, "radioAccessSpecifiers add NGRAN.");
- }
-
- return new NetworkScanRequest(
- NetworkScanRequest.SCAN_TYPE_ONE_SHOT,
- radioAccessSpecifiers.toArray(
- new RadioAccessSpecifier[radioAccessSpecifiers.size()]),
- SEARCH_PERIODICITY_SEC,
- mMaxSearchTimeSec,
- INCREMENTAL_RESULTS,
- INCREMENTAL_RESULTS_PERIODICITY_SEC,
- null /* List of PLMN ids (MCC-MNC) */);
- }
-
- /**
- * Performs a network scan for the given type {@code type}.
- * {@link #NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS} is recommended if modem supports
- * {@link TelephonyManager#requestNetworkScan(
- * NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)}.
- *
- * @param type used to tell which network scan API should be used.
- */
- public void startNetworkScan(@NetworkQueryType int type) {
- if (type == NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS) {
- mNetworkScanFuture = SettableFuture.create();
- Futures.addCallback(mNetworkScanFuture, new FutureCallback<List<CellInfo>>() {
- @Override
- public void onSuccess(List<CellInfo> result) {
- onResults(result);
- onComplete();
- }
-
- @Override
- public void onFailure(Throwable t) {
- if (t instanceof CancellationException) {
- return;
- }
- int errCode = Integer.parseInt(t.getMessage());
- onError(errCode);
- }
- }, MoreExecutors.directExecutor());
- mExecutor.execute(new NetworkScanSyncTask(
- mTelephonyManager, (SettableFuture) mNetworkScanFuture));
- } else if (type == NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS) {
- if (mNetworkScanRequester != null) {
- return;
- }
- mNetworkScanRequester = mTelephonyManager.requestNetworkScan(
- createNetworkScanForPreferredAccessNetworks(),
- mExecutor,
- mInternalNetworkScanCallback);
- if (mNetworkScanRequester == null) {
- onError(NetworkScan.ERROR_RADIO_INTERFACE_ERROR);
- }
- }
- }
-
- /**
- * The network scan of type {@link #NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS} can't be stopped,
- * however, the result of the current network scan won't be returned to the callback after
- * calling this method.
- */
- public void stopNetworkQuery() {
- if (mNetworkScanRequester != null) {
- mNetworkScanRequester.stopScan();
- mNetworkScanRequester = null;
- }
-
- if (mNetworkScanFuture != null) {
- mNetworkScanFuture.cancel(true /* mayInterruptIfRunning */);
- mNetworkScanFuture = null;
- }
- }
-
- private void onResults(List<CellInfo> cellInfos) {
- mNetworkScanCallback.onResults(cellInfos);
- }
-
- private void onComplete() {
- mNetworkScanCallback.onComplete();
- }
-
- private void onError(int errCode) {
- mNetworkScanCallback.onError(errCode);
- }
-
- private boolean hasNrSaCapability() {
- return Arrays.stream(
- mTelephonyManager.getPhoneCapability().getDeviceNrCapabilities())
- .anyMatch(i -> i == PhoneCapability.DEVICE_NR_CAPABILITY_SA);
- }
-
- /**
- * Converts the status code of {@link CellNetworkScanResult} to one of the
- * {@link NetworkScan.ScanErrorCode}.
- * @param errCode status code from {@link CellNetworkScanResult}.
- *
- * @return one of the scan error code from {@link NetworkScan.ScanErrorCode}.
- */
- private static int convertToScanErrorCode(int errCode) {
- switch (errCode) {
- case CellNetworkScanResult.STATUS_RADIO_NOT_AVAILABLE:
- return NetworkScan.ERROR_RADIO_INTERFACE_ERROR;
- case CellNetworkScanResult.STATUS_RADIO_GENERIC_FAILURE:
- default:
- return NetworkScan.ERROR_MODEM_ERROR;
- }
- }
-
- private final class NetworkScanCallbackImpl extends TelephonyScanManager.NetworkScanCallback {
- public void onResults(List<CellInfo> results) {
- Log.d(TAG, "Async scan onResults() results = "
- + CellInfoUtil.cellInfoListToString(results));
- NetworkScanHelper.this.onResults(results);
- }
-
- public void onComplete() {
- Log.d(TAG, "async scan onComplete()");
- NetworkScanHelper.this.onComplete();
- }
-
- public void onError(@NetworkScan.ScanErrorCode int errCode) {
- Log.d(TAG, "async scan onError() errorCode = " + errCode);
- NetworkScanHelper.this.onError(errCode);
- }
- }
-
- private static final class NetworkScanSyncTask implements Runnable {
- private final SettableFuture<List<CellInfo>> mCallback;
- private final TelephonyManager mTelephonyManager;
-
- NetworkScanSyncTask(
- TelephonyManager telephonyManager, SettableFuture<List<CellInfo>> callback) {
- mTelephonyManager = telephonyManager;
- mCallback = callback;
- }
-
- @Override
- public void run() {
- final CellNetworkScanResult result = mTelephonyManager.getAvailableNetworks();
- if (result.getStatus() == CellNetworkScanResult.STATUS_SUCCESS) {
- final List<CellInfo> cellInfos = result.getOperators()
- .stream()
- .map(operatorInfo
- -> CellInfoUtil.convertOperatorInfoToCellInfo(operatorInfo))
- .collect(Collectors.toList());
- Log.d(TAG, "Sync network scan completed, cellInfos = "
- + CellInfoUtil.cellInfoListToString(cellInfos));
- mCallback.set(cellInfos);
- } else {
- final Throwable error = new Throwable(
- Integer.toString(convertToScanErrorCode(result.getStatus())));
- mCallback.setException(error);
- Log.d(TAG, "Sync network scan error, ex = " + error);
- }
- }
- }
-}
diff --git a/src/com/android/settings/network/telephony/NetworkSelectRepository.kt b/src/com/android/settings/network/telephony/NetworkSelectRepository.kt
new file mode 100644
index 0000000..1f5fbc2
--- /dev/null
+++ b/src/com/android/settings/network/telephony/NetworkSelectRepository.kt
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network.telephony
+
+import android.content.Context
+import android.telephony.AccessNetworkConstants
+import android.telephony.NetworkRegistrationInfo
+import android.telephony.TelephonyManager
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+class NetworkSelectRepository(context: Context, subId: Int) {
+ private val telephonyManager =
+ context.getSystemService(TelephonyManager::class.java)!!.createForSubscriptionId(subId)
+
+ data class NetworkRegistrationAndForbiddenInfo(
+ val networkList: List<NetworkRegistrationInfo>,
+ val forbiddenPlmns: List<String>,
+ )
+
+ /** TODO: Move this to UI layer, when UI layer migrated to Kotlin. */
+ fun launchUpdateNetworkRegistrationInfo(
+ lifecycleOwner: LifecycleOwner,
+ action: (NetworkRegistrationAndForbiddenInfo) -> Unit,
+ ) {
+ lifecycleOwner.lifecycleScope.launch {
+ lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
+ withContext(Dispatchers.Default) {
+ getNetworkRegistrationInfo()
+ }?.let(action)
+ }
+ }
+ }
+
+ fun getNetworkRegistrationInfo(): NetworkRegistrationAndForbiddenInfo? {
+ if (telephonyManager.dataState != TelephonyManager.DATA_CONNECTED) return null
+ // Try to get the network registration states
+ val serviceState = telephonyManager.serviceState ?: return null
+ val networkList = serviceState.getNetworkRegistrationInfoListForTransportType(
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN
+ )
+ if (networkList.isEmpty()) return null
+ // Due to the aggregation of cell between carriers, it's possible to get CellIdentity
+ // containing forbidden PLMN.
+ // Getting current network from ServiceState is no longer a good idea.
+ // Add an additional rule to avoid from showing forbidden PLMN to the user.
+ return NetworkRegistrationAndForbiddenInfo(networkList, getForbiddenPlmns())
+ }
+
+ /**
+ * Update forbidden PLMNs from the USIM App
+ */
+ private fun getForbiddenPlmns(): List<String> {
+ return telephonyManager.forbiddenPlmns?.toList() ?: emptyList()
+ }
+}
diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
index 461930b..19bc390 100644
--- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java
+++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
@@ -16,7 +16,6 @@
package com.android.settings.network.telephony;
-import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
@@ -25,12 +24,10 @@
import android.os.Message;
import android.os.PersistableBundle;
import android.provider.Settings;
-import android.telephony.AccessNetworkConstants;
import android.telephony.CarrierConfigManager;
import android.telephony.CellIdentity;
import android.telephony.CellInfo;
import android.telephony.NetworkRegistrationInfo;
-import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -39,6 +36,7 @@
import android.view.View;
import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
@@ -48,14 +46,19 @@
import com.android.internal.telephony.OperatorInfo;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.network.telephony.scan.NetworkScanRepository;
+import com.android.settings.network.telephony.scan.NetworkScanRepository.NetworkScanCellInfos;
+import com.android.settings.network.telephony.scan.NetworkScanRepository.NetworkScanComplete;
+import com.android.settings.network.telephony.scan.NetworkScanRepository.NetworkScanError;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.utils.ThreadUtils;
+import kotlin.Unit;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -70,12 +73,8 @@
private static final String TAG = "NetworkSelectSettings";
private static final int EVENT_SET_NETWORK_SELECTION_MANUALLY_DONE = 1;
- private static final int EVENT_NETWORK_SCAN_RESULTS = 2;
- private static final int EVENT_NETWORK_SCAN_ERROR = 3;
- private static final int EVENT_NETWORK_SCAN_COMPLETED = 4;
private static final String PREF_KEY_NETWORK_OPERATORS = "network_operators_preference";
- private static final int MIN_NUMBER_OF_SCAN_REQUIRED = 2;
private PreferenceCategory mPreferenceCategory;
@VisibleForTesting
@@ -90,18 +89,16 @@
private CarrierConfigManager mCarrierConfigManager;
private List<String> mForbiddenPlmns;
private boolean mShow4GForLTE = false;
- private NetworkScanHelper mNetworkScanHelper;
private final ExecutorService mNetworkScanExecutor = Executors.newFixedThreadPool(1);
private MetricsFeatureProvider mMetricsFeatureProvider;
- private boolean mUseNewApi;
- private long mRequestIdManualNetworkSelect;
- private long mRequestIdManualNetworkScan;
- private long mWaitingForNumberOfScanResults;
- @VisibleForTesting
- boolean mIsAggregationEnabled = false;
private CarrierConfigManager.CarrierConfigChangeListener mCarrierConfigChangeListener;
private AtomicBoolean mShouldFilterOutSatellitePlmn = new AtomicBoolean();
+ private NetworkScanRepository mNetworkScanRepository;
+ private boolean mUpdateScanResult = false;
+
+ private NetworkSelectRepository mNetworkSelectRepository;
+
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -113,7 +110,6 @@
@Initializer
protected void onCreateInitialization() {
Context context = getContext();
- mUseNewApi = enableNewAutoSelectNetworkUI(context);
mSubId = getSubId();
mPreferenceCategory = getPreferenceCategory(PREF_KEY_NETWORK_OPERATORS);
@@ -123,8 +119,6 @@
mTelephonyManager = getTelephonyManager(context, mSubId);
mSatelliteManager = getSatelliteManager(context);
mCarrierConfigManager = getCarrierConfigManager(context);
- mNetworkScanHelper = new NetworkScanHelper(
- mTelephonyManager, mCallback, mNetworkScanExecutor);
PersistableBundle bundle = mCarrierConfigManager.getConfigForSubId(mSubId,
CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL,
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL);
@@ -135,30 +129,14 @@
true));
mMetricsFeatureProvider = getMetricsFeatureProvider(context);
- mIsAggregationEnabled = enableAggregation(context);
- Log.d(TAG, "init: mUseNewApi:" + mUseNewApi
- + " ,mIsAggregationEnabled:" + mIsAggregationEnabled + " ,mSubId:" + mSubId);
mCarrierConfigChangeListener =
(slotIndex, subId, carrierId, specificCarrierId) -> handleCarrierConfigChanged(
subId);
mCarrierConfigManager.registerCarrierConfigChangeListener(mNetworkScanExecutor,
mCarrierConfigChangeListener);
-
- }
-
- @Keep
- @VisibleForTesting
- protected boolean enableNewAutoSelectNetworkUI(Context context) {
- return context.getResources().getBoolean(
- com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI);
- }
-
- @Keep
- @VisibleForTesting
- protected boolean enableAggregation(Context context) {
- return context.getResources().getBoolean(
- R.bool.config_network_selection_list_aggregation_enabled);
+ mNetworkScanRepository = new NetworkScanRepository(context, mSubId);
+ mNetworkSelectRepository = new NetworkSelectRepository(context, mSubId);
}
@Keep
@@ -217,30 +195,52 @@
}
@Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- final Activity activity = getActivity();
- if (activity != null) {
- mProgressHeader = setPinnedHeaderView(
- com.android.settingslib.widget.progressbar.R.layout.progress_header)
- .findViewById(com.android.settingslib.widget.progressbar.R.id.progress_bar_animation);
- setProgressBarVisible(false);
- }
- forceUpdateConnectedPreferenceCategory();
+ mProgressHeader = setPinnedHeaderView(
+ com.android.settingslib.widget.progressbar.R.layout.progress_header
+ ).findViewById(com.android.settingslib.widget.progressbar.R.id.progress_bar_animation);
+ mNetworkSelectRepository.launchUpdateNetworkRegistrationInfo(
+ getViewLifecycleOwner(),
+ (info) -> {
+ forceUpdateConnectedPreferenceCategory(info);
+ return Unit.INSTANCE;
+ });
+ launchNetworkScan();
+ }
+
+ private void launchNetworkScan() {
+ mNetworkScanRepository.launchNetworkScan(getViewLifecycleOwner(), (networkScanResult) -> {
+ if (!mUpdateScanResult) {
+ // Not update UI if not in scan mode.
+ return Unit.INSTANCE;
+ }
+ if (networkScanResult instanceof NetworkScanCellInfos networkScanCellInfos) {
+ scanResultHandler(networkScanCellInfos.getCellInfos());
+ return Unit.INSTANCE;
+ }
+ if (!isPreferenceScreenEnabled()) {
+ clearPreferenceSummary();
+ enablePreferenceScreen(true);
+ } else if (networkScanResult instanceof NetworkScanComplete
+ && mCellInfoList == null) {
+ // In case the scan timeout before getting any results
+ addMessagePreference(R.string.empty_networks_list);
+ } else if (networkScanResult instanceof NetworkScanError) {
+ addMessagePreference(R.string.network_query_error);
+ }
+
+ return Unit.INSTANCE;
+ });
}
@Override
public void onStart() {
super.onStart();
- updateForbiddenPlmns();
- if (isProgressBarVisible()) {
- return;
- }
- if (mWaitingForNumberOfScanResults <= 0) {
- startNetworkQuery();
- }
+ setProgressBarVisible(true);
+ mUpdateScanResult = true;
}
/**
@@ -256,14 +256,6 @@
}
@Override
- public void onStop() {
- if (mWaitingForNumberOfScanResults <= 0) {
- stopNetworkQuery();
- }
- super.onStop();
- }
-
- @Override
public boolean onPreferenceTreeClick(Preference preference) {
if (preference == mSelectedPreference) {
Log.d(TAG, "onPreferenceTreeClick: preference is mSelectedPreference. Do nothing.");
@@ -274,7 +266,7 @@
return false;
}
- stopNetworkQuery();
+ mUpdateScanResult = false;
// Refresh the last selected item in case users reselect network.
clearPreferenceSummary();
@@ -293,8 +285,6 @@
// Disable the screen until network is manually set
enablePreferenceScreen(false);
- mRequestIdManualNetworkSelect = getNewRequestId();
- mWaitingForNumberOfScanResults = MIN_NUMBER_OF_SCAN_REQUIRED;
final OperatorInfo operator = mSelectedPreference.getOperatorInfo();
ThreadUtils.postOnBackgroundThread(() -> {
final Message msg = mHandler.obtainMessage(
@@ -328,7 +318,6 @@
switch (msg.what) {
case EVENT_SET_NETWORK_SELECTION_MANUALLY_DONE:
final boolean isSucceed = (boolean) msg.obj;
- stopNetworkQuery();
setProgressBarVisible(false);
enablePreferenceScreen(true);
@@ -340,86 +329,15 @@
Log.e(TAG, "No preference to update!");
}
break;
- case EVENT_NETWORK_SCAN_RESULTS:
- scanResultHandler((List<CellInfo>) msg.obj);
- break;
-
- case EVENT_NETWORK_SCAN_ERROR:
- stopNetworkQuery();
- Log.i(TAG, "Network scan failure " + msg.arg1 + ":"
- + " scan request 0x" + Long.toHexString(mRequestIdManualNetworkScan)
- + ", waiting for scan results = " + mWaitingForNumberOfScanResults
- + ", select request 0x"
- + Long.toHexString(mRequestIdManualNetworkSelect));
- if (mRequestIdManualNetworkScan < mRequestIdManualNetworkSelect) {
- break;
- }
- if (!isPreferenceScreenEnabled()) {
- clearPreferenceSummary();
- enablePreferenceScreen(true);
- } else {
- addMessagePreference(R.string.network_query_error);
- }
- break;
-
- case EVENT_NETWORK_SCAN_COMPLETED:
- stopNetworkQuery();
- Log.d(TAG, "Network scan complete:"
- + " scan request 0x" + Long.toHexString(mRequestIdManualNetworkScan)
- + ", waiting for scan results = " + mWaitingForNumberOfScanResults
- + ", select request 0x"
- + Long.toHexString(mRequestIdManualNetworkSelect));
- if (mRequestIdManualNetworkScan < mRequestIdManualNetworkSelect) {
- break;
- }
- if (!isPreferenceScreenEnabled()) {
- clearPreferenceSummary();
- enablePreferenceScreen(true);
- } else if (mCellInfoList == null) {
- // In case the scan timeout before getting any results
- addMessagePreference(R.string.empty_networks_list);
- }
- break;
}
- return;
}
};
- @VisibleForTesting
- List<CellInfo> doAggregation(List<CellInfo> cellInfoListInput) {
- if (!mIsAggregationEnabled) {
- Log.d(TAG, "no aggregation");
- return new ArrayList<>(cellInfoListInput);
- }
- ArrayList<CellInfo> aggregatedList = new ArrayList<>();
- for (CellInfo cellInfo : cellInfoListInput) {
- String plmn = CellInfoUtil.getNetworkTitle(cellInfo.getCellIdentity());
- Class className = cellInfo.getClass();
-
- Optional<CellInfo> itemInTheList = aggregatedList.stream().filter(
- item -> {
- String itemPlmn = CellInfoUtil.getNetworkTitle(item.getCellIdentity());
- return itemPlmn.equals(plmn) && item.getClass().equals(className);
- })
- .findFirst();
- if (itemInTheList.isPresent()) {
- if (cellInfo.isRegistered() && !itemInTheList.get().isRegistered()) {
- // Adding the registered cellinfo item into list. If there are two registered
- // cellinfo items, then select first one from source list.
- aggregatedList.set(aggregatedList.indexOf(itemInTheList.get()), cellInfo);
- }
- continue;
- }
- aggregatedList.add(cellInfo);
- }
-
- return filterOutSatellitePlmn(aggregatedList);
- }
-
/* We do not want to expose carrier satellite plmns to the user when manually scan the
cellular network. Therefore, it is needed to filter out satellite plmns from current cell
info list */
- private List<CellInfo> filterOutSatellitePlmn(List<CellInfo> cellInfoList) {
+ @VisibleForTesting
+ List<CellInfo> filterOutSatellitePlmn(List<CellInfo> cellInfoList) {
List<String> aggregatedSatellitePlmn = getSatellitePlmnsForCarrierWrapper();
if (!mShouldFilterOutSatellitePlmn.get() || aggregatedSatellitePlmn.isEmpty()) {
return cellInfoList;
@@ -451,39 +369,10 @@
}
}
- private final NetworkScanHelper.NetworkScanCallback mCallback =
- new NetworkScanHelper.NetworkScanCallback() {
- public void onResults(List<CellInfo> results) {
- final Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_RESULTS, results);
- msg.sendToTarget();
- }
-
- public void onComplete() {
- final Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED);
- msg.sendToTarget();
- }
-
- public void onError(int error) {
- final Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_ERROR, error,
- 0 /* arg2 */);
- msg.sendToTarget();
- }
- };
-
@Keep
@VisibleForTesting
protected void scanResultHandler(List<CellInfo> results) {
- if (mRequestIdManualNetworkScan < mRequestIdManualNetworkSelect) {
- Log.d(TAG, "CellInfoList (drop): "
- + CellInfoUtil.cellInfoListToString(new ArrayList<>(results)));
- return;
- }
- mWaitingForNumberOfScanResults--;
- if ((mWaitingForNumberOfScanResults <= 0) && (!isResumed())) {
- stopNetworkQuery();
- }
-
- mCellInfoList = doAggregation(results);
+ mCellInfoList = filterOutSatellitePlmn(results);
Log.d(TAG, "CellInfoList: " + CellInfoUtil.cellInfoListToString(mCellInfoList));
if (mCellInfoList != null && mCellInfoList.size() != 0) {
final NetworkOperatorPreference connectedPref = updateAllPreferenceCategory();
@@ -588,45 +477,26 @@
* - If the device has no data, we will remove the connected network operators list from the
* screen.
*/
- private void forceUpdateConnectedPreferenceCategory() {
- if (mTelephonyManager.getDataState() == mTelephonyManager.DATA_CONNECTED) {
- // Try to get the network registration states
- final ServiceState ss = mTelephonyManager.getServiceState();
- if (ss == null) {
- return;
+ private void forceUpdateConnectedPreferenceCategory(
+ NetworkSelectRepository.NetworkRegistrationAndForbiddenInfo info) {
+ for (NetworkRegistrationInfo regInfo : info.getNetworkList()) {
+ final CellIdentity cellIdentity = regInfo.getCellIdentity();
+ if (cellIdentity == null) {
+ continue;
}
- final List<NetworkRegistrationInfo> networkList =
- ss.getNetworkRegistrationInfoListForTransportType(
- AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
- if (networkList == null || networkList.size() == 0) {
- return;
+ final NetworkOperatorPreference pref = new NetworkOperatorPreference(
+ getPrefContext(), info.getForbiddenPlmns(), mShow4GForLTE);
+ pref.updateCell(null, cellIdentity);
+ if (pref.isForbiddenNetwork()) {
+ continue;
}
- // Due to the aggregation of cell between carriers, it's possible to get CellIdentity
- // containing forbidden PLMN.
- // Getting current network from ServiceState is no longer a good idea.
- // Add an additional rule to avoid from showing forbidden PLMN to the user.
- if (mForbiddenPlmns == null) {
- updateForbiddenPlmns();
- }
- for (NetworkRegistrationInfo regInfo : networkList) {
- final CellIdentity cellIdentity = regInfo.getCellIdentity();
- if (cellIdentity == null) {
- continue;
- }
- final NetworkOperatorPreference pref = new NetworkOperatorPreference(
- getPrefContext(), mForbiddenPlmns, mShow4GForLTE);
- pref.updateCell(null, cellIdentity);
- if (pref.isForbiddenNetwork()) {
- continue;
- }
- pref.setSummary(R.string.network_connected);
- // Update the signal strength icon, since the default signalStrength value
- // would be zero
- // (it would be quite confusing why the connected network has no signal)
- pref.setIcon(SignalStrength.NUM_SIGNAL_STRENGTH_BINS - 1);
- mPreferenceCategory.addPreference(pref);
- break;
- }
+ pref.setSummary(R.string.network_connected);
+ // Update the signal strength icon, since the default signalStrength value
+ // would be zero
+ // (it would be quite confusing why the connected network has no signal)
+ pref.setIcon(SignalStrength.NUM_SIGNAL_STRENGTH_BINS - 1);
+ mPreferenceCategory.addPreference(pref);
+ break;
}
}
@@ -642,11 +512,6 @@
}
}
- private long getNewRequestId() {
- return Math.max(mRequestIdManualNetworkSelect,
- mRequestIdManualNetworkScan) + 1;
- }
-
private boolean isProgressBarVisible() {
if (mProgressHeader == null) {
return false;
@@ -667,29 +532,8 @@
mPreferenceCategory.addPreference(mStatusMessagePreference);
}
- private void startNetworkQuery() {
- setProgressBarVisible(true);
- if (mNetworkScanHelper != null) {
- mRequestIdManualNetworkScan = getNewRequestId();
- mWaitingForNumberOfScanResults = MIN_NUMBER_OF_SCAN_REQUIRED;
- mNetworkScanHelper.startNetworkScan(
- mUseNewApi
- ? NetworkScanHelper.NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS
- : NetworkScanHelper.NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS);
- }
- }
-
- private void stopNetworkQuery() {
- setProgressBarVisible(false);
- if (mNetworkScanHelper != null) {
- mWaitingForNumberOfScanResults = 0;
- mNetworkScanHelper.stopNetworkQuery();
- }
- }
-
@Override
public void onDestroy() {
- stopNetworkQuery();
mNetworkScanExecutor.shutdown();
super.onDestroy();
}
diff --git a/src/com/android/settings/network/telephony/SubscriptionRepository.kt b/src/com/android/settings/network/telephony/SubscriptionRepository.kt
index e44b577..1da6a96 100644
--- a/src/com/android/settings/network/telephony/SubscriptionRepository.kt
+++ b/src/com/android/settings/network/telephony/SubscriptionRepository.kt
@@ -32,9 +32,24 @@
private const val TAG = "SubscriptionRepository"
-fun Context.isSubscriptionEnabledFlow(subId: Int) = subscriptionsChangedFlow().map {
- val subscriptionManager = getSystemService(SubscriptionManager::class.java)
+class SubscriptionRepository(private val context: Context) {
+ /**
+ * Return a list of subscriptions that are available and visible to the user.
+ *
+ * @return list of user selectable subscriptions.
+ */
+ fun getSelectableSubscriptionInfoList(): List<SubscriptionInfo> =
+ context.getSelectableSubscriptionInfoList()
+ fun isSubscriptionEnabledFlow(subId: Int) = context.isSubscriptionEnabledFlow(subId)
+}
+
+val Context.subscriptionManager: SubscriptionManager?
+ get() = getSystemService(SubscriptionManager::class.java)
+
+fun Context.requireSubscriptionManager(): SubscriptionManager = subscriptionManager!!
+
+fun Context.isSubscriptionEnabledFlow(subId: Int) = subscriptionsChangedFlow().map {
subscriptionManager?.isSubscriptionEnabled(subId) ?: false
}.flowOn(Dispatchers.Default)
@@ -43,7 +58,7 @@
}.flowOn(Dispatchers.Default)
fun Context.subscriptionsChangedFlow() = callbackFlow {
- val subscriptionManager = getSystemService(SubscriptionManager::class.java)!!
+ val subscriptionManager = requireSubscriptionManager()
val listener = object : SubscriptionManager.OnSubscriptionsChangedListener() {
override fun onSubscriptionsChanged() {
@@ -58,3 +73,35 @@
awaitClose { subscriptionManager.removeOnSubscriptionsChangedListener(listener) }
}.conflate().onEach { Log.d(TAG, "subscriptions changed") }.flowOn(Dispatchers.Default)
+
+/**
+ * Return a list of subscriptions that are available and visible to the user.
+ *
+ * @return list of user selectable subscriptions.
+ */
+fun Context.getSelectableSubscriptionInfoList(): List<SubscriptionInfo> {
+ val subscriptionManager = requireSubscriptionManager()
+ val availableList = subscriptionManager.getAvailableSubscriptionInfoList() ?: return emptyList()
+ val visibleList = availableList.filter { subInfo ->
+ // Opportunistic subscriptions are considered invisible
+ // to users so they should never be returned.
+ SubscriptionUtil.isSubscriptionVisible(subscriptionManager, this, subInfo)
+ }
+ // Multiple subscriptions in a group should only have one representative.
+ // It should be the current active primary subscription if any, or any primary subscription.
+ val groupUuidToSelectedIdMap = visibleList
+ .groupBy { it.groupUuid }
+ .mapValues { (_, subInfos) ->
+ subInfos.filter { it.simSlotIndex != SubscriptionManager.INVALID_SIM_SLOT_INDEX }
+ .ifEmpty { subInfos }
+ .minOf { it.subscriptionId }
+ }
+
+ return visibleList
+ .filter { subInfo ->
+ val groupUuid = subInfo.groupUuid ?: return@filter true
+ groupUuidToSelectedIdMap[groupUuid] == subInfo.subscriptionId
+ }
+ .sortedBy { it.subscriptionId }
+ .also { Log.d(TAG, "getSelectableSubscriptionInfoList: $it") }
+}
diff --git a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.kt b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.kt
index 0ee1d87..f184092 100644
--- a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.kt
+++ b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.kt
@@ -22,6 +22,7 @@
import android.telephony.SubscriptionManager
import android.telephony.TelephonyManager
import android.telephony.ims.ImsMmTelManager
+import android.util.Log
import androidx.lifecycle.LifecycleOwner
import androidx.preference.Preference
import androidx.preference.PreferenceScreen
@@ -76,6 +77,13 @@
}
override fun onViewCreated(viewLifecycleOwner: LifecycleOwner) {
+ if(mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID){
+ Log.e(
+ this.javaClass.simpleName,
+ "mSubId is INVALID_SUBSCRIPTION_ID"
+ )
+ return
+ }
wifiCallingRepositoryFactory(mSubId).wifiCallingReadyFlow()
.collectLatestWithLifecycle(viewLifecycleOwner) { isReady ->
preference.isVisible = isReady
diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.kt b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.kt
index d709574..67a2356 100644
--- a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.kt
+++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.kt
@@ -23,6 +23,7 @@
import android.provider.Settings
import android.telephony.CarrierConfigManager
import android.telephony.ServiceState
+import android.telephony.SubscriptionManager
import android.telephony.TelephonyManager
import androidx.annotation.VisibleForTesting
import androidx.compose.runtime.Composable
@@ -80,7 +81,7 @@
@VisibleForTesting
var progressDialog: ProgressDialog? = null
- private var subId by notNull<Int>()
+ private var subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID
/**
* Initialization based on given subscription id.
diff --git a/src/com/android/settings/network/telephony/scan/NetworkScanRepository.kt b/src/com/android/settings/network/telephony/scan/NetworkScanRepository.kt
new file mode 100644
index 0000000..2067b8c
--- /dev/null
+++ b/src/com/android/settings/network/telephony/scan/NetworkScanRepository.kt
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network.telephony.scan
+
+import android.content.Context
+import android.telephony.AccessNetworkConstants.AccessNetworkType
+import android.telephony.CellInfo
+import android.telephony.NetworkScanRequest
+import android.telephony.PhoneCapability
+import android.telephony.RadioAccessSpecifier
+import android.telephony.TelephonyManager
+import android.telephony.TelephonyScanManager
+import android.util.Log
+import androidx.annotation.VisibleForTesting
+import androidx.lifecycle.LifecycleOwner
+import com.android.settings.network.telephony.CellInfoUtil
+import com.android.settings.network.telephony.CellInfoUtil.getNetworkTitle
+import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.asExecutor
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.flowOn
+
+class NetworkScanRepository(context: Context, subId: Int) {
+ sealed interface NetworkScanResult
+
+ data class NetworkScanCellInfos(val cellInfos: List<CellInfo>) : NetworkScanResult
+ data object NetworkScanComplete : NetworkScanResult
+ data class NetworkScanError(val error: Int) : NetworkScanResult
+
+ private val telephonyManager =
+ context.getSystemService(TelephonyManager::class.java)!!.createForSubscriptionId(subId)
+
+ /** TODO: Move this to UI layer, when UI layer migrated to Kotlin. */
+ fun launchNetworkScan(lifecycleOwner: LifecycleOwner, onResult: (NetworkScanResult) -> Unit) {
+ networkScanFlow().collectLatestWithLifecycle(lifecycleOwner, action = onResult)
+ }
+
+ data class CellInfoScanKey(
+ val title: String?,
+ val className: String,
+ val isRegistered: Boolean,
+ ) {
+ constructor(cellInfo: CellInfo) : this(
+ title = cellInfo.cellIdentity.getNetworkTitle(),
+ className = cellInfo.javaClass.name,
+ isRegistered = cellInfo.isRegistered,
+ )
+ }
+
+ fun networkScanFlow(): Flow<NetworkScanResult> = callbackFlow {
+ val callback = object : TelephonyScanManager.NetworkScanCallback() {
+ override fun onResults(results: List<CellInfo>) {
+ val cellInfos = results.distinctBy { CellInfoScanKey(it) }
+ trySend(NetworkScanCellInfos(cellInfos))
+ Log.d(TAG, "CellInfoList: ${CellInfoUtil.cellInfoListToString(cellInfos)}")
+ }
+
+ override fun onComplete() {
+ trySend(NetworkScanComplete)
+ close()
+ Log.d(TAG, "onComplete")
+ }
+
+ override fun onError(error: Int) {
+ trySend(NetworkScanError(error))
+ close()
+ Log.d(TAG, "onError: $error")
+ }
+ }
+
+ val networkScan = telephonyManager.requestNetworkScan(
+ createNetworkScan(),
+ Dispatchers.Default.asExecutor(),
+ callback,
+ )
+
+ awaitClose { networkScan.stopScan() }
+ }.flowOn(Dispatchers.Default)
+
+ /** Create network scan for allowed network types. */
+ private fun createNetworkScan(): NetworkScanRequest {
+ val allowedNetworkTypes = getAllowedNetworkTypes()
+ Log.d(TAG, "createNetworkScan: allowedNetworkTypes = $allowedNetworkTypes")
+ val radioAccessSpecifiers = allowedNetworkTypes
+ .map { RadioAccessSpecifier(it, null, null) }
+ .toTypedArray()
+ return NetworkScanRequest(
+ NetworkScanRequest.SCAN_TYPE_ONE_SHOT,
+ radioAccessSpecifiers,
+ NetworkScanRequest.MIN_SEARCH_PERIODICITY_SEC, // one shot, not used
+ MAX_SEARCH_TIME_SEC,
+ true,
+ INCREMENTAL_RESULTS_PERIODICITY_SEC,
+ null,
+ )
+ }
+
+ private fun getAllowedNetworkTypes(): List<Int> {
+ val networkTypeBitmap3gpp: Long =
+ telephonyManager.getAllowedNetworkTypesBitmask() and
+ TelephonyManager.NETWORK_STANDARDS_FAMILY_BITMASK_3GPP
+ return buildList {
+ // If the allowed network types are unknown or if they are of the right class, scan for
+ // them; otherwise, skip them to save scan time and prevent users from being shown
+ // networks that they can't connect to.
+ if (networkTypeBitmap3gpp == 0L
+ || networkTypeBitmap3gpp and TelephonyManager.NETWORK_CLASS_BITMASK_2G != 0L
+ ) {
+ add(AccessNetworkType.GERAN)
+ }
+ if (networkTypeBitmap3gpp == 0L
+ || networkTypeBitmap3gpp and TelephonyManager.NETWORK_CLASS_BITMASK_3G != 0L
+ ) {
+ add(AccessNetworkType.UTRAN)
+ }
+ if (networkTypeBitmap3gpp == 0L
+ || networkTypeBitmap3gpp and TelephonyManager.NETWORK_CLASS_BITMASK_4G != 0L
+ ) {
+ add(AccessNetworkType.EUTRAN)
+ }
+ // If a device supports 5G stand-alone then the code below should be re-enabled; however
+ // a device supporting only non-standalone mode cannot perform PLMN selection and camp
+ // on a 5G network, which means that it shouldn't scan for 5G at the expense of battery
+ // as part of the manual network selection process.
+ //
+ if (networkTypeBitmap3gpp == 0L
+ || (networkTypeBitmap3gpp and TelephonyManager.NETWORK_CLASS_BITMASK_5G != 0L &&
+ hasNrSaCapability())
+ ) {
+ add(AccessNetworkType.NGRAN)
+ Log.d(TAG, "radioAccessSpecifiers add NGRAN.")
+ }
+ }
+ }
+
+ private fun hasNrSaCapability(): Boolean {
+ val phoneCapability = telephonyManager.getPhoneCapability()
+ return PhoneCapability.DEVICE_NR_CAPABILITY_SA in phoneCapability.deviceNrCapabilities
+ }
+
+ companion object {
+ private const val TAG = "NetworkScanRepository"
+
+ @VisibleForTesting
+ val MAX_SEARCH_TIME_SEC = 300
+
+ @VisibleForTesting
+ val INCREMENTAL_RESULTS_PERIODICITY_SEC = 3
+ }
+}
diff --git a/src/com/android/settings/notification/app/BubblePreference.java b/src/com/android/settings/notification/app/BubblePreference.java
index ab5fc39..29d6d30 100644
--- a/src/com/android/settings/notification/app/BubblePreference.java
+++ b/src/com/android/settings/notification/app/BubblePreference.java
@@ -21,34 +21,27 @@
import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED;
import android.content.Context;
-import android.content.res.ColorStateList;
import android.util.AttributeSet;
import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import androidx.annotation.NonNull;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
import com.android.settings.R;
-import com.android.settings.Utils;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedPreferenceHelper;
/**
* A tri-state preference allowing a user to specify what gets to bubble.
*/
-public class BubblePreference extends Preference implements View.OnClickListener {
+public class BubblePreference extends Preference implements RadioGroup.OnCheckedChangeListener {
RestrictedPreferenceHelper mHelper;
private int mSelectedPreference;
- private Context mContext;
-
- private ButtonViewHolder mBubbleAllButton;
- private ButtonViewHolder mBubbleSelectedButton;
- private ButtonViewHolder mBubbleNoneButton;
-
private boolean mSelectedVisible;
public BubblePreference(Context context) {
@@ -64,16 +57,16 @@
}
public BubblePreference(Context context, AttributeSet attrs,
- int defStyleAttr, int defStyleRes) {
+ int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mHelper = new RestrictedPreferenceHelper(context, this, attrs);
mHelper.useAdminDisabledSummary(true);
- mContext = context;
setLayoutResource(R.layout.bubble_preference);
}
public void setSelectedPreference(int preference) {
mSelectedPreference = preference;
+ notifyChanged();
}
public int getSelectedPreference() {
@@ -92,9 +85,8 @@
}
@Override
- public void onBindViewHolder(final PreferenceViewHolder holder) {
+ public void onBindViewHolder(@NonNull final PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
-
final boolean disabledByAdmin = mHelper.isDisabledByAdmin();
View summary = holder.findViewById(android.R.id.summary);
if (disabledByAdmin) {
@@ -105,74 +97,34 @@
}
holder.itemView.setClickable(false);
- View bubbleAll = holder.findViewById(R.id.bubble_all);
- ImageView bubbleAllImage = (ImageView) holder.findViewById(R.id.bubble_all_icon);
- TextView bubbleAllText = (TextView) holder.findViewById(R.id.bubble_all_label);
- mBubbleAllButton = new ButtonViewHolder(bubbleAll, bubbleAllImage, bubbleAllText,
- BUBBLE_PREFERENCE_ALL);
- mBubbleAllButton.setSelected(mContext, mSelectedPreference == BUBBLE_PREFERENCE_ALL);
- bubbleAll.setTag(BUBBLE_PREFERENCE_ALL);
- bubbleAll.setOnClickListener(this);
- bubbleAll.setVisibility(disabledByAdmin ? View.GONE : View.VISIBLE);
+ RadioButton bubbleAllButton = (RadioButton) holder.findViewById(R.id.bubble_all);
+ bubbleAllButton.setChecked(mSelectedPreference == BUBBLE_PREFERENCE_ALL);
+ bubbleAllButton.setTag(BUBBLE_PREFERENCE_ALL);
+ bubbleAllButton.setVisibility(disabledByAdmin ? View.GONE : View.VISIBLE);
- View bubbleSelected = holder.findViewById(R.id.bubble_selected);
- ImageView bubbleSelectedImage = (ImageView) holder.findViewById(R.id.bubble_selected_icon);
- TextView bubbleSelectedText = (TextView) holder.findViewById(R.id.bubble_selected_label);
- mBubbleSelectedButton = new ButtonViewHolder(bubbleSelected, bubbleSelectedImage,
- bubbleSelectedText, BUBBLE_PREFERENCE_SELECTED);
- mBubbleSelectedButton.setSelected(mContext,
- mSelectedPreference == BUBBLE_PREFERENCE_SELECTED);
- bubbleSelected.setTag(BUBBLE_PREFERENCE_SELECTED);
- bubbleSelected.setOnClickListener(this);
- bubbleSelected.setVisibility((!mSelectedVisible || disabledByAdmin)
- ? View.GONE : View.VISIBLE);
+ RadioButton bubbleSelectedButton = (RadioButton) holder.findViewById(R.id.bubble_selected);
+ bubbleSelectedButton.setChecked(mSelectedPreference == BUBBLE_PREFERENCE_SELECTED);
+ bubbleSelectedButton.setTag(BUBBLE_PREFERENCE_SELECTED);
+ int selectedButtonVisibility =
+ (!mSelectedVisible || disabledByAdmin) ? View.GONE : View.VISIBLE;
+ bubbleSelectedButton.setVisibility(selectedButtonVisibility);
- View bubbleNone = holder.findViewById(R.id.bubble_none);
- ImageView bubbleNoneImage = (ImageView) holder.findViewById(R.id.bubble_none_icon);
- TextView bubbleNoneText = (TextView) holder.findViewById(R.id.bubble_none_label);
- mBubbleNoneButton = new ButtonViewHolder(bubbleNone, bubbleNoneImage, bubbleNoneText,
- BUBBLE_PREFERENCE_NONE);
- mBubbleNoneButton.setSelected(mContext, mSelectedPreference == BUBBLE_PREFERENCE_NONE);
- bubbleNone.setTag(BUBBLE_PREFERENCE_NONE);
- bubbleNone.setOnClickListener(this);
- bubbleNone.setVisibility(disabledByAdmin ? View.GONE : View.VISIBLE);
+ RadioButton bubbleNoneButton = (RadioButton) holder.findViewById(R.id.bubble_none);
+ bubbleNoneButton.setChecked(mSelectedPreference == BUBBLE_PREFERENCE_NONE);
+ bubbleNoneButton.setTag(BUBBLE_PREFERENCE_NONE);
+ bubbleNoneButton.setVisibility(disabledByAdmin ? View.GONE : View.VISIBLE);
+
+ RadioGroup bublesRadioGroup = (RadioGroup) holder.findViewById(R.id.radio_group);
+ bublesRadioGroup.setOnCheckedChangeListener(this);
}
@Override
- public void onClick(View v) {
- final int selected = (int) v.getTag();
- callChangeListener(selected);
-
- mBubbleAllButton.setSelected(mContext, selected == BUBBLE_PREFERENCE_ALL);
- mBubbleSelectedButton.setSelected(mContext, selected == BUBBLE_PREFERENCE_SELECTED);
- mBubbleNoneButton.setSelected(mContext, selected == BUBBLE_PREFERENCE_NONE);
- }
-
- private class ButtonViewHolder {
- private View mView;
- private ImageView mImageView;
- private TextView mTextView;
- private int mId;
-
- ButtonViewHolder(View v, ImageView iv, TextView tv, int identifier) {
- mView = v;
- mImageView = iv;
- mTextView = tv;
- mId = identifier;
+ public void onCheckedChanged(@NonNull RadioGroup group, int checkedId) {
+ View v = group.findViewById(checkedId);
+ if (v == null || v.getTag() == null) {
+ return;
}
-
- void setSelected(Context context, boolean selected) {
- mView.setBackground(mContext.getDrawable(selected
- ? R.drawable.notification_importance_button_background_selected
- : R.drawable.notification_importance_button_background_unselected));
- mView.setSelected(selected);
-
- int colorResId = selected
- ? R.attr.notification_importance_button_foreground_color_selected
- : R.attr.notification_importance_button_foreground_color_unselected;
- ColorStateList stateList = Utils.getColorAttr(context, colorResId);
- mImageView.setImageTintList(stateList);
- mTextView.setTextColor(stateList);
- }
+ int selectedTag = (int) v.getTag();
+ callChangeListener(selectedTag);
}
}
diff --git a/src/com/android/settings/notification/zen/ZenModeBackend.java b/src/com/android/settings/notification/zen/ZenModeBackend.java
index c290c83..921a5ee 100644
--- a/src/com/android/settings/notification/zen/ZenModeBackend.java
+++ b/src/com/android/settings/notification/zen/ZenModeBackend.java
@@ -30,6 +30,7 @@
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.Settings;
+import android.service.notification.ZenAdapters;
import android.service.notification.ZenModeConfig;
import android.service.notification.ZenPolicy;
import android.util.Log;
@@ -399,14 +400,16 @@
ZenPolicy setDefaultZenPolicy(ZenPolicy zenPolicy) {
int calls;
if (mPolicy.allowCalls()) {
- calls = ZenModeConfig.getZenPolicySenders(mPolicy.allowCallsFrom());
+ calls = ZenAdapters.notificationPolicySendersToZenPolicyPeopleType(
+ mPolicy.allowCallsFrom());
} else {
calls = ZenPolicy.PEOPLE_TYPE_NONE;
}
int messages;
if (mPolicy.allowMessages()) {
- messages = ZenModeConfig.getZenPolicySenders(mPolicy.allowMessagesFrom());
+ messages = ZenAdapters.notificationPolicySendersToZenPolicyPeopleType(
+ mPolicy.allowMessagesFrom());
} else {
messages = ZenPolicy.PEOPLE_TYPE_NONE;
}
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index 631c735..a645300 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -416,6 +416,7 @@
public String getHint(Context context, boolean isAlpha, int type, ProfileType profile) {
if (isAlpha) {
if (android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
&& profile.equals(ProfileType.Private)) {
return context.getString(alphaHintForPrivateProfile);
} else if (type == TYPE_FINGERPRINT) {
@@ -433,6 +434,7 @@
}
} else {
if (android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
&& profile.equals(ProfileType.Private)) {
return context.getString(numericHintForPrivateProfile);
} else if (type == TYPE_FINGERPRINT) {
@@ -1147,7 +1149,9 @@
/*flags=*/0).getSystemService(UserManager.class);
if (userManager.isManagedProfile()) {
return ProfileType.Managed;
- } else if (android.os.Flags.allowPrivateProfile() && userManager.isPrivateProfile()) {
+ } else if (android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
+ && userManager.isPrivateProfile()) {
return ProfileType.Private;
} else if (userManager.isProfile()) {
return ProfileType.Other;
diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java
index 8d0aebe..c331991 100644
--- a/src/com/android/settings/password/ChooseLockPattern.java
+++ b/src/com/android/settings/password/ChooseLockPattern.java
@@ -478,7 +478,9 @@
.getString(SET_WORK_PROFILE_PATTERN_HEADER,
() -> getString(
R.string.lockpassword_choose_your_profile_pattern_header));
- } else if (android.os.Flags.allowPrivateProfile() && isPrivateProfile()) {
+ } else if (android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
+ && isPrivateProfile()) {
msg = getString(R.string.private_space_choose_your_pattern_header);
} else {
msg = getString(R.string.lockpassword_choose_your_pattern_header);
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
index f2ebd1f..cf80513 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
@@ -300,6 +300,7 @@
launchedCDC = true;
}
} else if (android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
&& userProperties != null
&& userProperties.isAuthAlwaysRequiredToDisableQuietMode()
&& isInternalActivity()) {
@@ -413,7 +414,8 @@
private boolean doesUserStateEnforceStrongAuth(int userId) {
if (android.os.Flags.allowPrivateProfile()
- && android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()) {
+ && android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
// Check if CE storage for user is locked since biometrics can't unlock fbe/keystore of
// the profile user using verifyTiedProfileChallenge. Biometrics can still be used if
// the user is stopped with delayed locking (i.e., with storage unlocked), so the user
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java b/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java
index 32e7489..e3182a4 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java
@@ -105,7 +105,8 @@
private static boolean isBiometricUnlockEnabledForPrivateSpace() {
return android.os.Flags.allowPrivateProfile()
- && android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace();
+ && android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures();
}
/**
diff --git a/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java b/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
index 1f0f7bb..7f0118c 100644
--- a/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
+++ b/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
@@ -104,7 +104,8 @@
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
- if (android.os.Flags.allowPrivateProfile()) {
+ if (android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
super.onCreate(savedInstanceState);
}
}
diff --git a/src/com/android/settings/privatespace/HidePrivateSpaceController.java b/src/com/android/settings/privatespace/HidePrivateSpaceController.java
index a53055c..81814ad 100644
--- a/src/com/android/settings/privatespace/HidePrivateSpaceController.java
+++ b/src/com/android/settings/privatespace/HidePrivateSpaceController.java
@@ -19,13 +19,21 @@
import static com.android.settings.privatespace.PrivateSpaceMaintainer.HIDE_PRIVATE_SPACE_ENTRY_POINT_DISABLED_VAL;
import static com.android.settings.privatespace.PrivateSpaceMaintainer.HIDE_PRIVATE_SPACE_ENTRY_POINT_ENABLED_VAL;
+import android.app.AlertDialog;
import android.content.Context;
+import android.content.DialogInterface;
+import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
/**
- * A class that is used to show details page for the setting to hide private space entry point
- * in All Apps.
+ * Toggle Preference Controller responsible for managing the visibility of private space entry point
+ * in the "All Apps" section. This includes:
+ *
+ * <p>Toggling the entry point's visibility (hiding/unhiding)
+ *
+ * <p>Displaying a dialog to inform the user that the entry point will be hidden when private space
+ * is locked (if the hide option is enabled)
*/
public class HidePrivateSpaceController extends TogglePreferenceController {
private final PrivateSpaceMaintainer mPrivateSpaceMaintainer;
@@ -38,7 +46,10 @@
@Override
@AvailabilityStatus
public int getAvailabilityStatus() {
- return android.os.Flags.allowPrivateProfile() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
+ ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
}
@Override
@@ -52,6 +63,9 @@
mPrivateSpaceMaintainer.setHidePrivateSpaceEntryPointSetting(
isChecked ? HIDE_PRIVATE_SPACE_ENTRY_POINT_ENABLED_VAL
: HIDE_PRIVATE_SPACE_ENTRY_POINT_DISABLED_VAL);
+ if (isChecked) {
+ showAlertDialog();
+ }
return true;
}
@@ -59,4 +73,16 @@
public int getSliceHighlightMenuRes() {
return 0;
}
+
+ private void showAlertDialog() {
+ new AlertDialog.Builder(mContext)
+ .setTitle(R.string.private_space_hide_dialog_title)
+ .setMessage(R.string.private_space_hide_dialog_message)
+ .setPositiveButton(
+ R.string.private_space_hide_dialog_button,
+ (DialogInterface dialog, int which) -> {
+ dialog.dismiss();
+ })
+ .show();
+ }
}
diff --git a/src/com/android/settings/privatespace/HidePrivateSpaceSensitiveNotificationsController.java b/src/com/android/settings/privatespace/HidePrivateSpaceSensitiveNotificationsController.java
index 1a89d37..6cb54a1 100644
--- a/src/com/android/settings/privatespace/HidePrivateSpaceSensitiveNotificationsController.java
+++ b/src/com/android/settings/privatespace/HidePrivateSpaceSensitiveNotificationsController.java
@@ -52,6 +52,7 @@
public int getAvailabilityStatus() {
if (!android.os.Flags.allowPrivateProfile()
|| !android.multiuser.Flags.enablePsSensitiveNotificationsToggle()
+ || !android.multiuser.Flags.enablePrivateSpaceFeatures()
|| !mPrivateSpaceMaintainer.doesPrivateSpaceExist()) {
return UNSUPPORTED_ON_DEVICE;
}
diff --git a/src/com/android/settings/privatespace/HidePrivateSpaceSettings.java b/src/com/android/settings/privatespace/HidePrivateSpaceSettings.java
index 124978a..c41267f 100644
--- a/src/com/android/settings/privatespace/HidePrivateSpaceSettings.java
+++ b/src/com/android/settings/privatespace/HidePrivateSpaceSettings.java
@@ -27,7 +27,8 @@
@Override
public void onCreate(Bundle icicle) {
- if (android.os.Flags.allowPrivateProfile()) {
+ if (android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
super.onCreate(icicle);
}
}
diff --git a/src/com/android/settings/privatespace/HidePrivateSpaceSummaryController.java b/src/com/android/settings/privatespace/HidePrivateSpaceSummaryController.java
index 42627af..a366b70 100644
--- a/src/com/android/settings/privatespace/HidePrivateSpaceSummaryController.java
+++ b/src/com/android/settings/privatespace/HidePrivateSpaceSummaryController.java
@@ -36,7 +36,10 @@
@Override
public int getAvailabilityStatus() {
- return android.os.Flags.allowPrivateProfile() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
+ ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
}
@Override
diff --git a/src/com/android/settings/privatespace/PrivateProfileContextHelperActivity.java b/src/com/android/settings/privatespace/PrivateProfileContextHelperActivity.java
index 12a7440..f2a50dc 100644
--- a/src/com/android/settings/privatespace/PrivateProfileContextHelperActivity.java
+++ b/src/com/android/settings/privatespace/PrivateProfileContextHelperActivity.java
@@ -59,7 +59,8 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
- if (!android.os.Flags.allowPrivateProfile()) {
+ if (!android.os.Flags.allowPrivateProfile()
+ || !android.multiuser.Flags.enablePrivateSpaceFeatures()) {
return;
}
setTheme(SetupWizardUtils.getTheme(this, getIntent()));
diff --git a/src/com/android/settings/privatespace/PrivateSpaceAuthenticationActivity.java b/src/com/android/settings/privatespace/PrivateSpaceAuthenticationActivity.java
index 63b1dc9..53d6b22 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceAuthenticationActivity.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceAuthenticationActivity.java
@@ -77,7 +77,8 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (Flags.allowPrivateProfile()) {
+ if (Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
ThemeHelper.trySetDynamicColor(this);
mPrivateSpaceMaintainer =
new Injector().injectPrivateSpaceMaintainer(getApplicationContext());
diff --git a/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java b/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java
index 726567e..32db8b6 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceDashboardFragment.java
@@ -32,7 +32,8 @@
@Override
public void onCreate(Bundle icicle) {
- if (android.os.Flags.allowPrivateProfile()) {
+ if (android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
super.onCreate(icicle);
if (icicle == null
&& getIntent().getBooleanExtra(EXTRA_SHOW_PRIVATE_SPACE_UNLOCKED, false)) {
diff --git a/src/com/android/settings/privatespace/PrivateSpaceEducation.java b/src/com/android/settings/privatespace/PrivateSpaceEducation.java
index 4c99873..cf22895 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceEducation.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceEducation.java
@@ -43,7 +43,8 @@
LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
- if (!android.os.Flags.allowPrivateProfile()) {
+ if (!android.os.Flags.allowPrivateProfile()
+ || !android.multiuser.Flags.enablePrivateSpaceFeatures()) {
return null;
}
GlifLayout rootView =
diff --git a/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
index 2d38ae2..3fb9b15 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceMaintainer.java
@@ -78,7 +78,8 @@
*/
@VisibleForTesting
public final synchronized boolean createPrivateSpace() {
- if (!Flags.allowPrivateProfile()) {
+ if (!Flags.allowPrivateProfile()
+ || !android.multiuser.Flags.enablePrivateSpaceFeatures()) {
return false;
}
// Check if Private space already exists
@@ -146,7 +147,8 @@
/** Returns true if the Private space exists. */
public synchronized boolean doesPrivateSpaceExist() {
- if (!Flags.allowPrivateProfile()) {
+ if (!Flags.allowPrivateProfile()
+ || !android.multiuser.Flags.enablePrivateSpaceFeatures()) {
return false;
}
if (mUserHandle != null) {
@@ -322,6 +324,7 @@
private boolean isPrivateSpaceAutoLockSupported() {
return android.os.Flags.allowPrivateProfile()
- && android.multiuser.Flags.supportAutolockForPrivateSpace();
+ && android.multiuser.Flags.supportAutolockForPrivateSpace()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures();
}
}
diff --git a/src/com/android/settings/privatespace/PrivateSpaceSafetySource.java b/src/com/android/settings/privatespace/PrivateSpaceSafetySource.java
index 6729830..4e1741a 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceSafetySource.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceSafetySource.java
@@ -51,7 +51,8 @@
return;
}
- if (!Flags.allowPrivateProfile()) {
+ if (!Flags.allowPrivateProfile()
+ || !android.multiuser.Flags.enablePrivateSpaceFeatures()) {
// Setting null safetySourceData so that an old entry gets cleared out and this way
// provide a response since SC always expects one on rescan.
SafetyCenterManagerWrapper.get().setSafetySourceData(
diff --git a/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java b/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
index 4a1e29b..399c2c8 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
@@ -51,7 +51,8 @@
LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
- if (!android.os.Flags.allowPrivateProfile()) {
+ if (!android.os.Flags.allowPrivateProfile()
+ || !android.multiuser.Flags.enablePrivateSpaceFeatures()) {
return null;
}
GlifLayout rootView =
diff --git a/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java b/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java
index 78c96dc..ec7132a 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceSetupActivity.java
@@ -42,7 +42,8 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
- if (!android.os.Flags.allowPrivateProfile()) {
+ if (!android.os.Flags.allowPrivateProfile()
+ || !android.multiuser.Flags.enablePrivateSpaceFeatures()) {
return;
}
setTheme(SetupWizardUtils.getTheme(this, getIntent()));
diff --git a/src/com/android/settings/privatespace/SetupSuccessFragment.java b/src/com/android/settings/privatespace/SetupSuccessFragment.java
index 13de1fc..cf63b22 100644
--- a/src/com/android/settings/privatespace/SetupSuccessFragment.java
+++ b/src/com/android/settings/privatespace/SetupSuccessFragment.java
@@ -47,7 +47,8 @@
LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
- if (!android.os.Flags.allowPrivateProfile()) {
+ if (!android.os.Flags.allowPrivateProfile()
+ || !android.multiuser.Flags.enablePrivateSpaceFeatures()) {
return null;
}
GlifLayout rootView =
diff --git a/src/com/android/settings/privatespace/autolock/AutoLockPreferenceController.java b/src/com/android/settings/privatespace/autolock/AutoLockPreferenceController.java
index a7a12a4..3416e14 100644
--- a/src/com/android/settings/privatespace/autolock/AutoLockPreferenceController.java
+++ b/src/com/android/settings/privatespace/autolock/AutoLockPreferenceController.java
@@ -40,7 +40,8 @@
@Override
public int getAvailabilityStatus() {
return android.os.Flags.allowPrivateProfile()
- && android.multiuser.Flags.supportAutolockForPrivateSpace()
+ && android.multiuser.Flags.supportAutolockForPrivateSpace()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
? AVAILABLE
: UNSUPPORTED_ON_DEVICE;
}
diff --git a/src/com/android/settings/privatespace/autolock/AutoLockSettingsFragment.java b/src/com/android/settings/privatespace/autolock/AutoLockSettingsFragment.java
index ef8bf8e..cb332d1 100644
--- a/src/com/android/settings/privatespace/autolock/AutoLockSettingsFragment.java
+++ b/src/com/android/settings/privatespace/autolock/AutoLockSettingsFragment.java
@@ -38,6 +38,8 @@
public class AutoLockSettingsFragment extends RadioButtonPickerFragment {
private static final String TAG = "PSAutoLockSetting";
+
+ private static final String AUTOLOCK_METRIC_KEY = "private_space_autolock_mode";
private PrivateSpaceMaintainer mPrivateSpaceMaintainer;
private CharSequence[] mAutoLockRadioOptions;
private CharSequence[] mAutoLockRadioValues;
@@ -45,7 +47,8 @@
@Override
public void onCreate(@NonNull Bundle icicle) {
if (android.os.Flags.allowPrivateProfile()
- && android.multiuser.Flags.supportAutolockForPrivateSpace()) {
+ && android.multiuser.Flags.supportAutolockForPrivateSpace()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
super.onCreate(icicle);
}
}
@@ -111,6 +114,12 @@
try {
@Settings.Secure.PrivateSpaceAutoLockOption final int value = Integer.parseInt(key);
mPrivateSpaceMaintainer.setPrivateSpaceAutoLockSetting(value);
+ mMetricsFeatureProvider.action(
+ mMetricsFeatureProvider.getAttribution(getActivity()),
+ SettingsEnums.ACTION_SET_PRIVATE_SPACE_AUTOLOCK,
+ getMetricsCategory(),
+ AUTOLOCK_METRIC_KEY,
+ value /* value */);
} catch (NumberFormatException e) {
Log.e(TAG, "could not persist screen timeout setting", e);
}
diff --git a/src/com/android/settings/privatespace/delete/DeletePrivateSpaceController.java b/src/com/android/settings/privatespace/delete/DeletePrivateSpaceController.java
index af4535e..a2fc6f8 100644
--- a/src/com/android/settings/privatespace/delete/DeletePrivateSpaceController.java
+++ b/src/com/android/settings/privatespace/delete/DeletePrivateSpaceController.java
@@ -34,7 +34,10 @@
@Override
public int getAvailabilityStatus() {
- return android.os.Flags.allowPrivateProfile() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
+ ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
}
@Override
diff --git a/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteActivity.java b/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteActivity.java
index a4109b8..b483aa3 100644
--- a/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteActivity.java
+++ b/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteActivity.java
@@ -35,7 +35,8 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
- if (!android.os.Flags.allowPrivateProfile()) {
+ if (!android.os.Flags.allowPrivateProfile()
+ || !android.multiuser.Flags.enablePrivateSpaceFeatures()) {
return;
}
setTheme(SetupWizardUtils.getTheme(this, getIntent()));
diff --git a/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragment.java b/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragment.java
index 7dd3a5b..bcc220f 100644
--- a/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragment.java
+++ b/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragment.java
@@ -56,7 +56,8 @@
@Override
public void onCreate(@Nullable Bundle icicle) {
- if (android.os.Flags.allowPrivateProfile()) {
+ if (android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
super.onCreate(icicle);
}
}
diff --git a/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragment.java b/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragment.java
index 3a16641..33f0a3e 100644
--- a/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragment.java
+++ b/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragment.java
@@ -62,7 +62,8 @@
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
- if (android.os.Flags.allowPrivateProfile()) {
+ if (android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
super.onCreate(savedInstanceState);
}
}
diff --git a/src/com/android/settings/privatespace/onelock/FaceFingerprintUnlockController.java b/src/com/android/settings/privatespace/onelock/FaceFingerprintUnlockController.java
index 2e3f284..04f4894 100644
--- a/src/com/android/settings/privatespace/onelock/FaceFingerprintUnlockController.java
+++ b/src/com/android/settings/privatespace/onelock/FaceFingerprintUnlockController.java
@@ -42,6 +42,7 @@
protected boolean isUserSupported() {
return android.os.Flags.allowPrivateProfile()
&& android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
&& mProfileUserId != UserHandle.USER_NULL;
}
diff --git a/src/com/android/settings/privatespace/onelock/PrivateSpaceBiometricSettings.java b/src/com/android/settings/privatespace/onelock/PrivateSpaceBiometricSettings.java
index dc00885..827f0b7 100644
--- a/src/com/android/settings/privatespace/onelock/PrivateSpaceBiometricSettings.java
+++ b/src/com/android/settings/privatespace/onelock/PrivateSpaceBiometricSettings.java
@@ -34,7 +34,8 @@
@Override
public void onAttach(Context context) {
if (android.os.Flags.allowPrivateProfile()
- && android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()) {
+ && android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
super.onAttach(context);
UserHandle privateProfileHandle =
PrivateSpaceMaintainer.getInstance(context).getPrivateProfileHandle();
diff --git a/src/com/android/settings/privatespace/onelock/PrivateSpaceFacePreferenceController.java b/src/com/android/settings/privatespace/onelock/PrivateSpaceFacePreferenceController.java
index b841d9a..583a093 100644
--- a/src/com/android/settings/privatespace/onelock/PrivateSpaceFacePreferenceController.java
+++ b/src/com/android/settings/privatespace/onelock/PrivateSpaceFacePreferenceController.java
@@ -45,6 +45,7 @@
protected boolean isUserSupported() {
return android.os.Flags.allowPrivateProfile()
&& android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
&& getUserId() != UserHandle.USER_NULL;
}
@@ -63,7 +64,8 @@
@Override
public int getAvailabilityStatus() {
return android.os.Flags.allowPrivateProfile()
- && android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()
+ && android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
? AVAILABLE
: UNSUPPORTED_ON_DEVICE;
}
diff --git a/src/com/android/settings/privatespace/onelock/PrivateSpaceFingerprintPreferenceController.java b/src/com/android/settings/privatespace/onelock/PrivateSpaceFingerprintPreferenceController.java
index d484904..f88c9fa 100644
--- a/src/com/android/settings/privatespace/onelock/PrivateSpaceFingerprintPreferenceController.java
+++ b/src/com/android/settings/privatespace/onelock/PrivateSpaceFingerprintPreferenceController.java
@@ -47,6 +47,7 @@
protected boolean isUserSupported() {
return android.os.Flags.allowPrivateProfile()
&& android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
&& getUserId() != UserHandle.USER_NULL;
}
@@ -65,7 +66,8 @@
@Override
public int getAvailabilityStatus() {
return android.os.Flags.allowPrivateProfile()
- && android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()
+ && android.multiuser.Flags.enableBiometricsToUnlockPrivateSpace()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
? AVAILABLE
: UNSUPPORTED_ON_DEVICE;
}
diff --git a/src/com/android/settings/privatespace/onelock/PrivateSpaceLockController.java b/src/com/android/settings/privatespace/onelock/PrivateSpaceLockController.java
index efbe9f9..e0f376e 100644
--- a/src/com/android/settings/privatespace/onelock/PrivateSpaceLockController.java
+++ b/src/com/android/settings/privatespace/onelock/PrivateSpaceLockController.java
@@ -74,7 +74,8 @@
@Override
public boolean isAvailable() {
- return android.os.Flags.allowPrivateProfile();
+ return android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures();
}
@Override
diff --git a/src/com/android/settings/privatespace/onelock/UseOneLockController.java b/src/com/android/settings/privatespace/onelock/UseOneLockController.java
index 31634b9..1af36b3 100644
--- a/src/com/android/settings/privatespace/onelock/UseOneLockController.java
+++ b/src/com/android/settings/privatespace/onelock/UseOneLockController.java
@@ -45,7 +45,10 @@
}
@Override
public int getAvailabilityStatus() {
- return android.os.Flags.allowPrivateProfile() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
+ ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
}
@Override
diff --git a/src/com/android/settings/privatespace/onelock/UseOneLockControllerSwitch.java b/src/com/android/settings/privatespace/onelock/UseOneLockControllerSwitch.java
index fd7d02b..680f5c7 100644
--- a/src/com/android/settings/privatespace/onelock/UseOneLockControllerSwitch.java
+++ b/src/com/android/settings/privatespace/onelock/UseOneLockControllerSwitch.java
@@ -95,7 +95,8 @@
@Override
public boolean isAvailable() {
- return android.os.Flags.allowPrivateProfile();
+ return android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures();
}
@Override
diff --git a/src/com/android/settings/privatespace/onelock/UseOneLockSettingsFragment.java b/src/com/android/settings/privatespace/onelock/UseOneLockSettingsFragment.java
index 413e02a..ce017e3 100644
--- a/src/com/android/settings/privatespace/onelock/UseOneLockSettingsFragment.java
+++ b/src/com/android/settings/privatespace/onelock/UseOneLockSettingsFragment.java
@@ -39,7 +39,8 @@
@Override
public void onCreate(Bundle icicle) {
- if (android.os.Flags.allowPrivateProfile()) {
+ if (android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()) {
super.onCreate(icicle);
}
}
diff --git a/src/com/android/settings/safetycenter/BiometricsSafetySource.java b/src/com/android/settings/safetycenter/BiometricsSafetySource.java
index 8e1c786..c93ced1 100644
--- a/src/com/android/settings/safetycenter/BiometricsSafetySource.java
+++ b/src/com/android/settings/safetycenter/BiometricsSafetySource.java
@@ -62,7 +62,9 @@
}
final Context profileParentContext =
context.createContextAsUser(profileParentUserHandle, 0);
- if (android.os.Flags.allowPrivateProfile() && userManager.isPrivateProfile()) {
+ if (android.os.Flags.allowPrivateProfile()
+ && android.multiuser.Flags.enablePrivateSpaceFeatures()
+ && userManager.isPrivateProfile()) {
// SC always expects a response from the source if the broadcast has been sent for this
// source, therefore, we need to send a null SafetySourceData.
SafetyCenterManagerWrapper.get().setSafetySourceData(
diff --git a/src/com/android/settings/search/SearchFeatureProvider.java b/src/com/android/settings/search/SearchFeatureProvider.java
index b1d04d4..5707bc2 100644
--- a/src/com/android/settings/search/SearchFeatureProvider.java
+++ b/src/com/android/settings/search/SearchFeatureProvider.java
@@ -100,6 +100,7 @@
// and goes to the search UI. Also set the background to null so there's no ripple.
final View navView = toolbar.getNavigationView();
navView.setClickable(false);
+ navView.setFocusable(false);
navView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
navView.setBackground(null);
diff --git a/src/com/android/settings/security/ContentProtectionPreferenceUtils.java b/src/com/android/settings/security/ContentProtectionPreferenceUtils.java
index d84d7c5..b1167ea 100644
--- a/src/com/android/settings/security/ContentProtectionPreferenceUtils.java
+++ b/src/com/android/settings/security/ContentProtectionPreferenceUtils.java
@@ -15,15 +15,23 @@
*/
package com.android.settings.security;
+import static android.view.contentprotection.flags.Flags.manageDevicePolicyEnabled;
+
import static com.android.internal.R.string.config_defaultContentProtectionService;
+import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.DeviceConfig;
import android.view.contentcapture.ContentCaptureManager;
-import androidx.annotation.Nullable;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.settings.Utils;
/** Util class for content protection preference. */
public class ContentProtectionPreferenceUtils {
@@ -60,4 +68,49 @@
ContentCaptureManager.DEVICE_CONFIG_PROPERTY_ENABLE_CONTENT_PROTECTION_RECEIVER,
ContentCaptureManager.DEFAULT_ENABLE_CONTENT_PROTECTION_RECEIVER);
}
+
+ /** Returns the managed profile or null if none exists. */
+ @Nullable
+ public static UserHandle getManagedProfile(@NonNull Context context) {
+ UserManager userManager = context.getSystemService(UserManager.class);
+ if (userManager == null) {
+ return null;
+ }
+ return Utils.getManagedProfile(userManager);
+ }
+
+ /** Returns the current content protection policy. */
+ @DevicePolicyManager.ContentProtectionPolicy
+ public static int getContentProtectionPolicy(
+ @NonNull Context context, @Nullable UserHandle managedProfile) {
+ if (!manageDevicePolicyEnabled()) {
+ return DevicePolicyManager.CONTENT_PROTECTION_DISABLED;
+ }
+ Context policyContext = createContentProtectionPolicyContext(context, managedProfile);
+ return getContentProtectionPolicyWithGivenContext(policyContext);
+ }
+
+ @NonNull
+ private static Context createContentProtectionPolicyContext(
+ @NonNull Context context, @Nullable UserHandle managedProfile) {
+ if (managedProfile == null) {
+ return context;
+ }
+ try {
+ return context.createPackageContextAsUser(
+ context.getPackageName(), /* flags= */ 0, managedProfile);
+ } catch (PackageManager.NameNotFoundException ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
+
+ @DevicePolicyManager.ContentProtectionPolicy
+ private static int getContentProtectionPolicyWithGivenContext(@NonNull Context context) {
+ DevicePolicyManager devicePolicyManager =
+ context.getSystemService(DevicePolicyManager.class);
+ if (devicePolicyManager == null) {
+ return DevicePolicyManager.CONTENT_PROTECTION_DISABLED;
+ }
+ return devicePolicyManager.getContentProtectionPolicy(/* admin= */ null);
+ }
}
diff --git a/src/com/android/settings/security/ContentProtectionTogglePreferenceController.java b/src/com/android/settings/security/ContentProtectionTogglePreferenceController.java
index 101364b..9203d61 100644
--- a/src/com/android/settings/security/ContentProtectionTogglePreferenceController.java
+++ b/src/com/android/settings/security/ContentProtectionTogglePreferenceController.java
@@ -15,12 +15,17 @@
*/
package com.android.settings.security;
+import static android.view.contentprotection.flags.Flags.manageDevicePolicyEnabled;
+
+import android.app.admin.DevicePolicyManager;
import android.content.ContentResolver;
import android.content.Context;
+import android.os.UserHandle;
import android.provider.Settings;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
@@ -40,12 +45,22 @@
static final String KEY_CONTENT_PROTECTION_PREFERENCE = "content_protection_user_consent";
@Nullable private SettingsMainSwitchPreference mSwitchBar;
+
@Nullable private RestrictedLockUtils.EnforcedAdmin mEnforcedAdmin;
- private final ContentResolver mContentResolver;
+
+ @NonNull private final ContentResolver mContentResolver;
+
+ @DevicePolicyManager.ContentProtectionPolicy
+ private int mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_DISABLED;
public ContentProtectionTogglePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mContentResolver = context.getContentResolver();
+
+ if (manageDevicePolicyEnabled()) {
+ mEnforcedAdmin = getEnforcedAdmin();
+ mContentProtectionPolicy = getContentProtectionPolicy(getManagedProfile());
+ }
}
@Override
@@ -56,14 +71,30 @@
@Override
public boolean isChecked() {
if (mEnforcedAdmin != null) {
- // If fully managed device, it should always unchecked
- return false;
+ if (!manageDevicePolicyEnabled()) {
+ // If fully managed device, it should always unchecked
+ return false;
+ }
+
+ if (mContentProtectionPolicy == DevicePolicyManager.CONTENT_PROTECTION_DISABLED) {
+ return false;
+ }
+ if (mContentProtectionPolicy == DevicePolicyManager.CONTENT_PROTECTION_ENABLED) {
+ return true;
+ }
}
return Settings.Global.getInt(mContentResolver, KEY_CONTENT_PROTECTION_PREFERENCE, 0) >= 0;
}
@Override
public boolean setChecked(boolean isChecked) {
+ if (manageDevicePolicyEnabled()) {
+ if (mEnforcedAdmin != null
+ && mContentProtectionPolicy
+ != DevicePolicyManager.CONTENT_PROTECTION_NOT_CONTROLLED_BY_POLICY) {
+ return false;
+ }
+ }
Settings.Global.putInt(
mContentResolver, KEY_CONTENT_PROTECTION_PREFERENCE, isChecked ? 1 : -1);
return true;
@@ -80,16 +111,20 @@
}
}
- /**
- * Temporary workaround for SettingsMainSwitchPreference.setDisabledByAdmin without user
- * restriction.
- */
+ // Workaround for SettingsMainSwitchPreference.setDisabledByAdmin without user restriction.
@Override
public void updateState(Preference preference) {
super.updateState(preference);
- // Assign the value to mEnforcedAdmin since it's needed in isChecked()
- mEnforcedAdmin = getEnforcedAdmin();
- if (mSwitchBar != null && mEnforcedAdmin != null) {
+
+ if (!manageDevicePolicyEnabled()) {
+ // Assign the value to mEnforcedAdmin since it's needed in isChecked()
+ mEnforcedAdmin = getEnforcedAdmin();
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_DISABLED;
+ }
+ if (mSwitchBar != null
+ && mEnforcedAdmin != null
+ && mContentProtectionPolicy
+ != DevicePolicyManager.CONTENT_PROTECTION_NOT_CONTROLLED_BY_POLICY) {
mSwitchBar.setDisabledByAdmin(mEnforcedAdmin);
}
}
@@ -107,7 +142,20 @@
}
@VisibleForTesting
+ @Nullable
+ protected UserHandle getManagedProfile() {
+ return ContentProtectionPreferenceUtils.getManagedProfile(mContext);
+ }
+
+ @VisibleForTesting
+ @Nullable
protected RestrictedLockUtils.EnforcedAdmin getEnforcedAdmin() {
return RestrictedLockUtilsInternal.getDeviceOwner(mContext);
}
+
+ @VisibleForTesting
+ @DevicePolicyManager.ContentProtectionPolicy
+ protected int getContentProtectionPolicy(@Nullable UserHandle userHandle) {
+ return ContentProtectionPreferenceUtils.getContentProtectionPolicy(mContext, userHandle);
+ }
}
diff --git a/src/com/android/settings/security/ContentProtectionWorkSwitchController.java b/src/com/android/settings/security/ContentProtectionWorkSwitchController.java
index 0404dcd..b9119ee 100644
--- a/src/com/android/settings/security/ContentProtectionWorkSwitchController.java
+++ b/src/com/android/settings/security/ContentProtectionWorkSwitchController.java
@@ -15,9 +15,11 @@
*/
package com.android.settings.security;
+import static android.view.contentprotection.flags.Flags.manageDevicePolicyEnabled;
+
+import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.os.UserHandle;
-import android.os.UserManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -25,7 +27,6 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
-import com.android.settings.Utils;
import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedSwitchPreference;
@@ -33,25 +34,49 @@
/** Preference controller for content protection work profile switch bar. */
public class ContentProtectionWorkSwitchController extends TogglePreferenceController {
+ @Nullable private UserHandle mManagedProfile;
+
+ @DevicePolicyManager.ContentProtectionPolicy
+ private int mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_DISABLED;
+
public ContentProtectionWorkSwitchController(
@NonNull Context context, @NonNull String preferenceKey) {
super(context, preferenceKey);
+
+ if (manageDevicePolicyEnabled()) {
+ mManagedProfile = getManagedProfile();
+ if (mManagedProfile != null) {
+ mContentProtectionPolicy = getContentProtectionPolicy(mManagedProfile);
+ }
+ }
}
@Override
public int getAvailabilityStatus() {
- return getManagedProfile() != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+ if (!manageDevicePolicyEnabled()) {
+ return getManagedProfile() != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+ }
+ if (mManagedProfile == null) {
+ return CONDITIONALLY_UNAVAILABLE;
+ }
+ if (mContentProtectionPolicy
+ == DevicePolicyManager.CONTENT_PROTECTION_NOT_CONTROLLED_BY_POLICY) {
+ return CONDITIONALLY_UNAVAILABLE;
+ }
+ return AVAILABLE;
}
- // The switch is always set to unchecked until Android V by design
@Override
public boolean isChecked() {
- return false;
+ if (!manageDevicePolicyEnabled()) {
+ return false;
+ }
+ return mContentProtectionPolicy == DevicePolicyManager.CONTENT_PROTECTION_ENABLED;
}
- // The switch is disabled until Android V by design
@Override
public boolean setChecked(boolean isChecked) {
+ // Controlled by the admin API
return false;
}
@@ -59,10 +84,13 @@
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
- RestrictedSwitchPreference switchPreference = screen.findPreference(getPreferenceKey());
- UserHandle managedProfile = getManagedProfile();
+ UserHandle managedProfile =
+ manageDevicePolicyEnabled() ? mManagedProfile : getManagedProfile();
if (managedProfile != null) {
- switchPreference.setDisabledByAdmin(getEnforcedAdmin(managedProfile));
+ RestrictedSwitchPreference switchPreference = screen.findPreference(getPreferenceKey());
+ if (switchPreference != null) {
+ switchPreference.setDisabledByAdmin(getEnforcedAdmin(managedProfile));
+ }
}
}
@@ -74,13 +102,18 @@
@VisibleForTesting
@Nullable
protected UserHandle getManagedProfile() {
- return Utils.getManagedProfile(mContext.getSystemService(UserManager.class));
+ return ContentProtectionPreferenceUtils.getManagedProfile(mContext);
}
@VisibleForTesting
@Nullable
- protected RestrictedLockUtils.EnforcedAdmin getEnforcedAdmin(
- @NonNull UserHandle managedProfile) {
- return RestrictedLockUtils.getProfileOrDeviceOwner(mContext, managedProfile);
+ protected RestrictedLockUtils.EnforcedAdmin getEnforcedAdmin(@NonNull UserHandle userHandle) {
+ return RestrictedLockUtils.getProfileOrDeviceOwner(mContext, userHandle);
+ }
+
+ @VisibleForTesting
+ @DevicePolicyManager.ContentProtectionPolicy
+ protected int getContentProtectionPolicy(@Nullable UserHandle userHandle) {
+ return ContentProtectionPreferenceUtils.getContentProtectionPolicy(mContext, userHandle);
}
}
diff --git a/src/com/android/settings/spa/SettingsSpaEnvironment.kt b/src/com/android/settings/spa/SettingsSpaEnvironment.kt
index 568188f..f701323 100644
--- a/src/com/android/settings/spa/SettingsSpaEnvironment.kt
+++ b/src/com/android/settings/spa/SettingsSpaEnvironment.kt
@@ -22,11 +22,11 @@
import com.android.settings.spa.about.AboutPhonePageProvider
import com.android.settings.spa.app.AllAppListPageProvider
import com.android.settings.spa.app.AppsMainPageProvider
-import com.android.settings.spa.app.battery.BatteryOptimizationModeAppListPageProvider
import com.android.settings.spa.app.appcompat.UserAspectRatioAppsPageProvider
import com.android.settings.spa.app.appinfo.AppInfoSettingsProvider
import com.android.settings.spa.app.appinfo.CloneAppInfoSettingsProvider
import com.android.settings.spa.app.backgroundinstall.BackgroundInstalledAppsPageProvider
+import com.android.settings.spa.app.battery.BatteryOptimizationModeAppListPageProvider
import com.android.settings.spa.app.specialaccess.AlarmsAndRemindersAppListProvider
import com.android.settings.spa.app.specialaccess.AllFilesAccessAppListProvider
import com.android.settings.spa.app.specialaccess.BackupTasksAppsListProvider
diff --git a/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt b/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt
index a0c363a..5a2a394 100644
--- a/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt
+++ b/src/com/android/settings/spa/network/NetworkCellularGroupProvider.kt
@@ -44,13 +44,13 @@
import com.android.settings.R
import com.android.settings.network.SubscriptionInfoListViewModel
import com.android.settings.network.telephony.MobileNetworkUtils
+import com.android.settings.spa.network.PrimarySimRepository.PrimarySimInfo
import com.android.settings.wifi.WifiPickerTrackerHelper
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.util.collectLatestWithLifecycle
-import com.android.settingslib.spa.widget.preference.ListPreferenceOption
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.preference.SwitchPreference
@@ -173,27 +173,23 @@
) {
val selectableSubscriptionInfoList by selectableSubscriptionInfoListFlow
.collectAsStateWithLifecycle(initialValue = emptyList())
- val activeSubscriptionInfoList: List<SubscriptionInfo> =
- selectableSubscriptionInfoList.filter { subscriptionInfo ->
- subscriptionInfo.simSlotIndex != -1
- }
val stringSims = stringResource(R.string.provider_network_settings_title)
RegularScaffold(title = stringSims) {
SimsSection(selectableSubscriptionInfoList)
PrimarySimSectionImpl(
- activeSubscriptionInfoList,
- defaultVoiceSubId,
- defaultSmsSubId,
- defaultDataSubId,
- nonDds
+ selectableSubscriptionInfoListFlow,
+ defaultVoiceSubId,
+ defaultSmsSubId,
+ defaultDataSubId,
+ nonDds
)
}
}
@Composable
fun PrimarySimImpl(
- subscriptionInfoList: List<SubscriptionInfo>,
+ primarySimInfo: PrimarySimInfo,
callsSelectedId: MutableIntState,
textsSelectedId: MutableIntState,
mobileDataSelectedId: MutableIntState,
@@ -237,108 +233,83 @@
}
},
) {
- var state = rememberSaveable { mutableStateOf(false) }
- var callsAndSmsList = remember {
- mutableListOf(ListPreferenceOption(id = -1, text = "Loading"))
- }
- var dataList = remember {
- mutableListOf(ListPreferenceOption(id = -1, text = "Loading"))
+ val telephonyManagerForNonDds: TelephonyManager? =
+ context.getSystemService(TelephonyManager::class.java)
+ ?.createForSubscriptionId(nonDds.intValue)
+ val automaticDataChecked = rememberSaveable() {
+ mutableStateOf(false)
}
- if (subscriptionInfoList.size >= 2) {
- state.value = true
- callsAndSmsList.clear()
- dataList.clear()
- for (info in subscriptionInfoList) {
- var item = ListPreferenceOption(
- id = info.subscriptionId,
- text = "${info.displayName}",
- summary = "${info.number}"
- )
- callsAndSmsList.add(item)
- dataList.add(item)
- }
- callsAndSmsList.add(
- ListPreferenceOption(
- id = SubscriptionManager.INVALID_SUBSCRIPTION_ID,
- text = stringResource(id = R.string.sim_calls_ask_first_prefs_title)
- )
- )
- } else {
- // hide the primary sim
- state.value = false
- Log.d(NetworkCellularGroupProvider.name, "Hide primary sim")
- }
+ CreatePrimarySimListPreference(
+ stringResource(id = R.string.primary_sim_calls_title),
+ primarySimInfo.callsAndSmsList,
+ callsSelectedId,
+ ImageVector.vectorResource(R.drawable.ic_phone),
+ actionSetCalls
+ )
+ CreatePrimarySimListPreference(
+ stringResource(id = R.string.primary_sim_texts_title),
+ primarySimInfo.callsAndSmsList,
+ textsSelectedId,
+ Icons.AutoMirrored.Outlined.Message,
+ actionSetTexts
+ )
+ CreatePrimarySimListPreference(
+ stringResource(id = R.string.mobile_data_settings_title),
+ primarySimInfo.dataList,
+ mobileDataSelectedId,
+ Icons.Outlined.DataUsage,
+ actionSetMobileData
+ )
- if (state.value) {
- val telephonyManagerForNonDds: TelephonyManager? =
- context.getSystemService(TelephonyManager::class.java)
- ?.createForSubscriptionId(nonDds.intValue)
- val automaticDataChecked = rememberSaveable() {
- mutableStateOf(false)
- }
-
- CreatePrimarySimListPreference(
- stringResource(id = R.string.primary_sim_calls_title),
- callsAndSmsList,
- callsSelectedId,
- ImageVector.vectorResource(R.drawable.ic_phone),
- actionSetCalls
- )
- CreatePrimarySimListPreference(
- stringResource(id = R.string.primary_sim_texts_title),
- callsAndSmsList,
- textsSelectedId,
- Icons.AutoMirrored.Outlined.Message,
- actionSetTexts
- )
- CreatePrimarySimListPreference(
- stringResource(id = R.string.mobile_data_settings_title),
- dataList,
- mobileDataSelectedId,
- Icons.Outlined.DataUsage,
- actionSetMobileData
- )
-
- val autoDataTitle = stringResource(id = R.string.primary_sim_automatic_data_title)
- val autoDataSummary = stringResource(id = R.string.primary_sim_automatic_data_msg)
- SwitchPreference(
- object : SwitchPreferenceModel {
- override val title = autoDataTitle
- override val summary = { autoDataSummary }
- override val checked = {
- if (nonDds.intValue != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
- coroutineScope.launch {
- automaticDataChecked.value = getAutomaticData(telephonyManagerForNonDds)
- Log.d(
- NetworkCellularGroupProvider.name,
- "NonDds:${nonDds.intValue}" +
- "getAutomaticData:${automaticDataChecked.value}"
- )
- }
+ val autoDataTitle = stringResource(id = R.string.primary_sim_automatic_data_title)
+ val autoDataSummary = stringResource(id = R.string.primary_sim_automatic_data_msg)
+ SwitchPreference(
+ object : SwitchPreferenceModel {
+ override val title = autoDataTitle
+ override val summary = { autoDataSummary }
+ override val checked = {
+ if (nonDds.intValue != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ coroutineScope.launch {
+ automaticDataChecked.value = getAutomaticData(telephonyManagerForNonDds)
+ Log.d(
+ NetworkCellularGroupProvider.name,
+ "NonDds:${nonDds.intValue}" +
+ "getAutomaticData:${automaticDataChecked.value}"
+ )
}
- automaticDataChecked.value
}
- override val onCheckedChange: ((Boolean) -> Unit)? = {
- automaticDataChecked.value = it
- actionSetAutoDataSwitch(it)
- }
+ automaticDataChecked.value
}
- )
- }
+ override val onCheckedChange: ((Boolean) -> Unit)? = {
+ automaticDataChecked.value = it
+ actionSetAutoDataSwitch(it)
+ }
+ }
+ )
}
@Composable
fun PrimarySimSectionImpl(
- subscriptionInfoList: List<SubscriptionInfo>,
+ subscriptionInfoListFlow: Flow<List<SubscriptionInfo>>,
callsSelectedId: MutableIntState,
textsSelectedId: MutableIntState,
mobileDataSelectedId: MutableIntState,
nonDds: MutableIntState,
) {
+ val context = LocalContext.current
+ val primarySimInfo = remember(subscriptionInfoListFlow) {
+ subscriptionInfoListFlow
+ .map { subscriptionInfoList ->
+ subscriptionInfoList.filter { subInfo -> subInfo.simSlotIndex != -1 }
+ }
+ .map(PrimarySimRepository(context)::getPrimarySimInfo)
+ .flowOn(Dispatchers.Default)
+ }.collectAsStateWithLifecycle(initialValue = null).value ?: return
+
Category(title = stringResource(id = R.string.primary_sim_title)) {
PrimarySimImpl(
- subscriptionInfoList,
+ primarySimInfo,
callsSelectedId,
textsSelectedId,
mobileDataSelectedId,
diff --git a/src/com/android/settings/spa/network/PrimarySimRepository.kt b/src/com/android/settings/spa/network/PrimarySimRepository.kt
new file mode 100644
index 0000000..b9eb3ff
--- /dev/null
+++ b/src/com/android/settings/spa/network/PrimarySimRepository.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.spa.network
+
+import android.content.Context
+import android.telephony.SubscriptionInfo
+import android.telephony.SubscriptionManager
+import android.util.Log
+import com.android.settings.R
+import com.android.settings.network.SubscriptionUtil
+import com.android.settingslib.spa.widget.preference.ListPreferenceOption
+
+class PrimarySimRepository(private val context: Context) {
+
+ data class PrimarySimInfo(
+ val callsAndSmsList: List<ListPreferenceOption>,
+ val dataList: List<ListPreferenceOption>,
+ )
+
+ fun getPrimarySimInfo(selectableSubscriptionInfoList: List<SubscriptionInfo>): PrimarySimInfo? {
+ if (selectableSubscriptionInfoList.size < 2) {
+ Log.d(TAG, "Hide primary sim")
+ return null
+ }
+
+ val callsAndSmsList = mutableListOf<ListPreferenceOption>()
+ val dataList = mutableListOf<ListPreferenceOption>()
+ for (info in selectableSubscriptionInfoList) {
+ val item = ListPreferenceOption(
+ id = info.subscriptionId,
+ text = "${info.displayName}",
+ summary = SubscriptionUtil.getFormattedPhoneNumber(context, info) ?: "",
+ )
+ callsAndSmsList += item
+ dataList += item
+ }
+ callsAndSmsList += ListPreferenceOption(
+ id = SubscriptionManager.INVALID_SUBSCRIPTION_ID,
+ text = context.getString(R.string.sim_calls_ask_first_prefs_title),
+ )
+
+ return PrimarySimInfo(callsAndSmsList, dataList)
+ }
+
+ private companion object {
+ private const val TAG = "PrimarySimRepository"
+ }
+}
diff --git a/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt b/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt
index 3b2d5ec..94e4a88 100644
--- a/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt
+++ b/src/com/android/settings/spa/network/SimOnboardingLabelSim.kt
@@ -16,6 +16,7 @@
package com.android.settings.spa.network
+import android.telephony.SubscriptionInfo
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
@@ -63,52 +64,55 @@
cancelAction
),
) {
- labelSimBody(onboardingService)
+ LabelSimBody(onboardingService)
}
}
@Composable
-private fun labelSimBody(onboardingService: SimOnboardingService) {
+private fun LabelSimBody(onboardingService: SimOnboardingService) {
Column(Modifier.padding(SettingsDimension.itemPadding)) {
SettingsBody(stringResource(R.string.sim_onboarding_label_sim_msg))
}
for (subInfo in onboardingService.getSelectableSubscriptionInfoList()) {
- var titleSimName by remember {
- mutableStateOf(
- onboardingService.getSubscriptionInfoDisplayName(subInfo)
- )
- }
- var summaryNumber = subInfo.number
- // TODO using the SubscriptionUtil.getFormattedPhoneNumber
- val alertDialogPresenter = rememberAlertDialogPresenter(
- confirmButton = AlertDialogButton(
- stringResource(R.string.mobile_network_sim_name_rename)
- ) {
- onboardingService.addItemForRenaming(subInfo, titleSimName)
- },
- dismissButton = AlertDialogButton(stringResource(R.string.cancel)) {
- titleSimName = onboardingService.getSubscriptionInfoDisplayName(subInfo)
- },
- title = stringResource(R.string.sim_onboarding_label_sim_dialog_title),
- text = {
- Text(summaryNumber,
- modifier = Modifier.padding(bottom = SettingsDimension.itemPaddingVertical))
- SettingsOutlinedTextField(
- value = titleSimName,
- label = stringResource(R.string.sim_onboarding_label_sim_dialog_label),
- enabled = true,
- shape = MaterialTheme.shapes.extraLarge
- ) {
- titleSimName = it
- }
- },
- )
- Preference(object : PreferenceModel {
- override val title = titleSimName
- override val summary: () -> String
- get() = { summaryNumber }
- override val onClick = alertDialogPresenter::open
- })
+ LabelSimPreference(onboardingService, subInfo)
}
-}
\ No newline at end of file
+}
+
+@Composable
+private fun LabelSimPreference(
+ onboardingService: SimOnboardingService,
+ subInfo: SubscriptionInfo,
+) {
+ var titleSimName by remember {
+ mutableStateOf(onboardingService.getSubscriptionInfoDisplayName(subInfo))
+ }
+ val phoneNumber = phoneNumber(subInfo)
+ val alertDialogPresenter = rememberAlertDialogPresenter(
+ confirmButton = AlertDialogButton(stringResource(R.string.mobile_network_sim_name_rename)) {
+ onboardingService.addItemForRenaming(subInfo, titleSimName)
+ },
+ dismissButton = AlertDialogButton(stringResource(R.string.cancel)) {
+ titleSimName = onboardingService.getSubscriptionInfoDisplayName(subInfo)
+ },
+ title = stringResource(R.string.sim_onboarding_label_sim_dialog_title),
+ text = {
+ Text(
+ phoneNumber.value ?: "",
+ modifier = Modifier.padding(bottom = SettingsDimension.itemPaddingVertical)
+ )
+ SettingsOutlinedTextField(
+ value = titleSimName,
+ label = stringResource(R.string.sim_onboarding_label_sim_dialog_label),
+ shape = MaterialTheme.shapes.extraLarge
+ ) {
+ titleSimName = it
+ }
+ },
+ )
+ Preference(object : PreferenceModel {
+ override val title = titleSimName
+ override val summary = { phoneNumber.value ?: "" }
+ override val onClick = alertDialogPresenter::open
+ })
+}
diff --git a/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt b/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt
index b984966..a8c0575 100644
--- a/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt
+++ b/src/com/android/settings/spa/network/SimOnboardingPrimarySim.kt
@@ -24,10 +24,13 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableIntState
import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settings.R
import com.android.settings.network.SimOnboardingService
import com.android.settingslib.spa.framework.theme.SettingsDimension
@@ -38,6 +41,9 @@
import com.android.settingslib.spa.widget.scaffold.SuwScaffold
import com.android.settingslib.spa.widget.ui.SettingsBody
import com.android.settingslib.spa.widget.ui.SettingsIcon
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.flow.flowOn
/**
* the sim onboarding primary sim compose
@@ -77,13 +83,19 @@
SettingsBody(stringResource(id = R.string.sim_onboarding_primary_sim_msg))
}
- var selectedSubscriptionInfoList =
- onboardingService.getSelectedSubscriptionInfoListWithRenaming()
+ val context = LocalContext.current
+ val primarySimInfo = remember {
+ flow {
+ val selectableSubInfoList =
+ onboardingService.getSelectedSubscriptionInfoListWithRenaming()
+ emit(PrimarySimRepository(context).getPrimarySimInfo(selectableSubInfoList))
+ }.flowOn(Dispatchers.Default)
+ }.collectAsStateWithLifecycle(initialValue = null).value ?: return@SuwScaffold
callsSelectedId.intValue = onboardingService.targetPrimarySimCalls
textsSelectedId.intValue = onboardingService.targetPrimarySimTexts
mobileDataSelectedId.intValue = onboardingService.targetPrimarySimMobileData
PrimarySimImpl(
- subscriptionInfoList = selectedSubscriptionInfoList,
+ primarySimInfo = primarySimInfo,
callsSelectedId = callsSelectedId,
textsSelectedId = textsSelectedId,
mobileDataSelectedId = mobileDataSelectedId,
diff --git a/src/com/android/settings/spa/network/SimsSection.kt b/src/com/android/settings/spa/network/SimsSection.kt
index 334ca61..0b638c4 100644
--- a/src/com/android/settings/spa/network/SimsSection.kt
+++ b/src/com/android/settings/spa/network/SimsSection.kt
@@ -25,6 +25,7 @@
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Add
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.State
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
@@ -36,10 +37,10 @@
import com.android.settings.network.telephony.phoneNumberFlow
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
-import com.android.settingslib.spa.widget.preference.TwoTargetSwitchPreference
import com.android.settingslib.spa.widget.ui.SettingsIcon
import com.android.settingslib.spaprivileged.model.enterprise.Restrictions
import com.android.settingslib.spaprivileged.template.preference.RestrictedPreference
+import com.android.settingslib.spaprivileged.template.preference.RestrictedTwoTargetSwitchPreference
@Composable
fun SimsSection(subscriptionInfoList: List<SubscriptionInfo>) {
@@ -58,12 +59,9 @@
val checked = remember(subInfo.subscriptionId) {
context.isSubscriptionEnabledFlow(subInfo.subscriptionId)
}.collectAsStateWithLifecycle(initialValue = false)
- val phoneNumber = remember(subInfo) {
- context.phoneNumberFlow(subInfo)
- }.collectAsStateWithLifecycle(initialValue = null)
- //TODO: Add the Restricted TwoTargetSwitchPreference in SPA
- TwoTargetSwitchPreference(
- object : SwitchPreferenceModel {
+ val phoneNumber = phoneNumber(subInfo)
+ RestrictedTwoTargetSwitchPreference(
+ model = object : SwitchPreferenceModel {
override val title = subInfo.displayName.toString()
override val summary = { phoneNumber.value ?: "" }
override val checked = { checked.value }
@@ -74,13 +72,22 @@
newChecked,
)
}
- }
+ },
+ restrictions = Restrictions(keys = listOf(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)),
) {
MobileNetworkUtils.launchMobileNetworkSettings(context, subInfo)
}
}
@Composable
+fun phoneNumber(subInfo: SubscriptionInfo): State<String?> {
+ val context = LocalContext.current
+ return remember(subInfo) {
+ context.phoneNumberFlow(subInfo)
+ }.collectAsStateWithLifecycle(initialValue = null)
+}
+
+@Composable
private fun AddSim() {
val context = LocalContext.current
if (remember { MobileNetworkUtils.showEuiccSettings(context) }) {
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index 5d45cb2..39c77a1 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -72,6 +72,7 @@
import com.android.settings.R;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.utils.AndroidKeystoreAliasLoader;
+import com.android.settings.wifi.details2.WifiPrivacyPreferenceController;
import com.android.settings.wifi.dpp.WifiDppUtils;
import com.android.settingslib.Utils;
import com.android.settingslib.utils.ThreadUtils;
@@ -154,6 +155,10 @@
@VisibleForTesting static final int PRIVACY_SPINNER_INDEX_RANDOMIZED_MAC = 0;
@VisibleForTesting static final int PRIVACY_SPINNER_INDEX_DEVICE_MAC = 1;
+ // Should be the same index value as wifi_dhcp_entries in arrays.xml
+ @VisibleForTesting static final int DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_ENABLE = 0;
+ @VisibleForTesting static final int DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE = 1;
+
/* Phase2 methods supported by PEAP are limited */
private ArrayAdapter<CharSequence> mPhase2PeapAdapter;
/* Phase2 methods supported by TTLS are limited */
@@ -194,6 +199,7 @@
private Spinner mMeteredSettingsSpinner;
private Spinner mHiddenSettingsSpinner;
private Spinner mPrivacySettingsSpinner;
+ private Spinner mDhcpSettingsSpinner;
private TextView mHiddenWarningView;
private TextView mProxyHostView;
private TextView mProxyPortView;
@@ -291,6 +297,7 @@
mMeteredSettingsSpinner = mView.findViewById(R.id.metered_settings);
mHiddenSettingsSpinner = mView.findViewById(R.id.hidden_settings);
mPrivacySettingsSpinner = mView.findViewById(R.id.privacy_settings);
+ mDhcpSettingsSpinner = mView.findViewById(R.id.dhcp_settings);
if (mWifiManager.isConnectedMacRandomizationSupported()) {
View privacySettingsLayout = mView.findViewById(R.id.privacy_settings_fields);
privacySettingsLayout.setVisibility(View.VISIBLE);
@@ -323,6 +330,12 @@
config.macRandomizationSetting == WifiConfiguration.RANDOMIZATION_PERSISTENT
? PRIVACY_SPINNER_INDEX_RANDOMIZED_MAC : PRIVACY_SPINNER_INDEX_DEVICE_MAC);
+ mDhcpSettingsSpinner.setSelection(
+ config.isSendDhcpHostnameEnabled()
+ ? DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_ENABLE :
+ DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE
+ );
+
if (config.getIpConfiguration().getIpAssignment() == IpAssignment.STATIC) {
mIpSettingsSpinner.setSelection(STATIC_IP);
showAdvancedFields = true;
@@ -841,6 +854,12 @@
: WifiConfiguration.RANDOMIZATION_NONE;
}
+ if (mDhcpSettingsSpinner != null) {
+ config.setSendDhcpHostnameEnabled(WifiPrivacyPreferenceController.Companion
+ .translatePrefValueToSendDhcpHostnameEnabled(mDhcpSettingsSpinner
+ .getSelectedItemPosition()));
+ }
+
return config;
}
diff --git a/src/com/android/settings/wifi/WifiConfigController2.java b/src/com/android/settings/wifi/WifiConfigController2.java
index 7c9b1d1..1e40568 100644
--- a/src/com/android/settings/wifi/WifiConfigController2.java
+++ b/src/com/android/settings/wifi/WifiConfigController2.java
@@ -74,6 +74,7 @@
import com.android.settings.R;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.utils.AndroidKeystoreAliasLoader;
+import com.android.settings.wifi.details2.WifiPrivacyPreferenceController;
import com.android.settings.wifi.details2.WifiPrivacyPreferenceController2;
import com.android.settings.wifi.dpp.WifiDppUtils;
import com.android.settingslib.Utils;
@@ -208,6 +209,8 @@
private Spinner mHiddenSettingsSpinner;
@Nullable
private Spinner mPrivacySettingsSpinner;
+ @Nullable
+ private Spinner mDhcpSettingsSpinner;
private TextView mHiddenWarningView;
private TextView mProxyHostView;
private TextView mProxyPortView;
@@ -308,6 +311,7 @@
mHiddenSettingsSpinner = mView.findViewById(R.id.hidden_settings);
if (!mHideMeteredAndPrivacy && mWifiManager.isConnectedMacRandomizationSupported()) {
mPrivacySettingsSpinner = mView.findViewById(R.id.privacy_settings);
+ mDhcpSettingsSpinner = mView.findViewById(R.id.dhcp_settings);
mView.findViewById(R.id.privacy_settings_fields).setVisibility(View.VISIBLE);
}
mHiddenSettingsSpinner.setOnItemSelectedListener(this);
@@ -342,6 +346,13 @@
mPrivacySettingsSpinner.setSelection(prefMacValue);
}
+ if (mDhcpSettingsSpinner != null) {
+ final int prefDhcpValue = WifiPrivacyPreferenceController.Companion
+ .translateSendDhcpHostnameEnabledToPrefValue(
+ config.isSendDhcpHostnameEnabled());
+ mDhcpSettingsSpinner.setSelection(prefDhcpValue);
+ }
+
if (config.getIpConfiguration().getIpAssignment() == IpAssignment.STATIC) {
mIpSettingsSpinner.setSelection(STATIC_IP);
showAdvancedFields = true;
@@ -854,6 +865,12 @@
.getSelectedItemPosition());
}
+ if (mDhcpSettingsSpinner != null) {
+ config.setSendDhcpHostnameEnabled(WifiPrivacyPreferenceController.Companion
+ .translatePrefValueToSendDhcpHostnameEnabled(mDhcpSettingsSpinner
+ .getSelectedItemPosition()));
+ }
+
return config;
}
diff --git a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
index e1774e3..06b3e5d 100644
--- a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
+++ b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
@@ -55,6 +55,7 @@
import com.android.settings.wifi.WifiDialog2;
import com.android.settings.wifi.WifiUtils;
import com.android.settings.wifi.details2.AddDevicePreferenceController2;
+import com.android.settings.wifi.details2.CertificateDetailsPreferenceController;
import com.android.settings.wifi.details2.WifiAutoConnectPreferenceController2;
import com.android.settings.wifi.details2.WifiDetailPreferenceController2;
import com.android.settings.wifi.details2.WifiMeteredPreferenceController2;
@@ -122,8 +123,12 @@
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
+ String wifiEntryKey = getArguments().getString(KEY_CHOSEN_WIFIENTRY_KEY);
+ setupNetworksDetailTracker();
use(WifiPrivacyPreferenceController.class)
- .setWifiEntryKey(getArguments().getString(KEY_CHOSEN_WIFIENTRY_KEY));
+ .setWifiEntryKey(wifiEntryKey);
+ use(CertificateDetailsPreferenceController.class)
+ .setWifiEntry(mNetworkDetailsTracker.getWifiEntry());
}
@Override
diff --git a/src/com/android/settings/wifi/details2/CertificateDetailsPreferenceController.kt b/src/com/android/settings/wifi/details2/CertificateDetailsPreferenceController.kt
new file mode 100644
index 0000000..8e1fa23
--- /dev/null
+++ b/src/com/android/settings/wifi/details2/CertificateDetailsPreferenceController.kt
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi.details2
+
+import android.content.Context
+import android.content.DialogInterface
+import android.net.http.SslCertificate
+import android.security.KeyChain
+import android.security.keystore.KeyProperties
+import android.security.keystore2.AndroidKeyStoreLoadStoreParameter
+import android.util.Log
+import android.view.View
+import android.widget.ArrayAdapter
+import android.widget.LinearLayout
+import android.widget.Spinner
+import androidx.appcompat.app.AlertDialog
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
+import com.android.settings.R
+import com.android.settings.spa.preference.ComposePreferenceController
+import com.android.settingslib.spa.widget.preference.Preference
+import com.android.settingslib.spa.widget.preference.PreferenceModel
+import com.android.wifi.flags.Flags
+import com.android.wifitrackerlib.WifiEntry
+import java.security.KeyStore
+import java.security.cert.X509Certificate
+
+class CertificateDetailsPreferenceController(context: Context, preferenceKey: String) :
+ ComposePreferenceController(context, preferenceKey) {
+
+ private lateinit var wifiEntry: WifiEntry
+ lateinit var certificateAliases: String
+ lateinit var certX509: X509Certificate
+
+ fun setWifiEntry(entry: WifiEntry) {
+ wifiEntry = entry
+ }
+
+ override fun getAvailabilityStatus(): Int {
+ return if (Flags.androidVWifiApi() && getCertX509(wifiEntry)) AVAILABLE
+ else CONDITIONALLY_UNAVAILABLE
+ }
+
+ @Composable
+ override fun Content() {
+ CertificateDetails()
+ }
+
+ @Composable
+ fun CertificateDetails() {
+ val context = LocalContext.current
+ Preference(object : PreferenceModel {
+ override val title = stringResource(com.android.internal.R.string.ssl_certificate)
+ override val summary = { certificateAliases }
+ override val onClick: () -> Unit = { createCertificateDetailsDialog(context, certX509) }
+ })
+ }
+
+ private fun getCertX509(wifiEntry: WifiEntry): Boolean {
+ certificateAliases =
+ wifiEntry.wifiConfiguration?.enterpriseConfig?.caCertificateAliases?.get(0)
+ ?: return false
+ return try {
+ val keyStore = KeyStore.getInstance("AndroidKeyStore")
+ keyStore.load(AndroidKeyStoreLoadStoreParameter(KeyProperties.NAMESPACE_WIFI))
+ val cert = keyStore.getCertificate(certificateAliases)
+ certX509 = KeyChain.toCertificate(cert.encoded)
+ true
+ } catch (e: Exception) {
+ Log.e(TAG, "Failed to open Android Keystore.", e)
+ false
+ }
+ }
+
+ private fun createCertificateDetailsDialog(context: Context, certX509: X509Certificate) {
+ val listener =
+ DialogInterface.OnClickListener { dialog, id ->
+ dialog.dismiss()
+ }
+ val titles = ArrayList<String>()
+ val sslCert = SslCertificate(certX509)
+ titles.add(sslCert.issuedTo.cName)
+ val arrayAdapter = ArrayAdapter(
+ context,
+ android.R.layout.simple_spinner_item,
+ titles
+ )
+ arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
+ val spinner = Spinner(context)
+ spinner.setAdapter(arrayAdapter)
+
+ val certLayout = LinearLayout(context)
+ certLayout.orientation = LinearLayout.VERTICAL
+ // Prevent content overlapping with spinner
+ certLayout.setClipChildren(true)
+ certLayout.addView(spinner)
+
+ val view = sslCert.inflateCertificateView(context)
+ view.visibility = View.VISIBLE
+ certLayout.addView(view)
+ certLayout.visibility = View.VISIBLE
+
+ val dialog = AlertDialog.Builder(context)
+ .setView(certLayout)
+ .setTitle(com.android.internal.R.string.ssl_certificate)
+ .setPositiveButton(R.string.wifi_settings_ssid_block_button_close, null)
+ .setNegativeButton(R.string.trusted_credentials_remove_label, listener).create()
+ dialog.show()
+ dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false)
+ }
+
+ companion object {
+ const val TAG = "CertificateDetailsPreferenceController"
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController.kt b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController.kt
index 42741e3..2ed2e5a 100644
--- a/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController.kt
+++ b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController.kt
@@ -63,4 +63,32 @@
}
})
}
+
+ companion object {
+ private const val PREF_SEND_DHCP_HOST_NAME_ENABLE = 0
+ private const val PREF_SEND_DHCP_HOST_NAME_DISABLE = 1
+
+ /**
+ * Returns preference index value.
+ *
+ * @param isSendDhcpHostnameEnabled determines whether device name can be sent.
+ * @return index value of preference
+ */
+ fun translateSendDhcpHostnameEnabledToPrefValue(
+ isSendDhcpHostnameEnabled: Boolean
+ ): Int {
+ return if (isSendDhcpHostnameEnabled) PREF_SEND_DHCP_HOST_NAME_ENABLE
+ else PREF_SEND_DHCP_HOST_NAME_DISABLE
+ }
+
+ /**
+ * Returns whether device name can be sent.
+ *
+ * @param prefDhcpRandomized is preference index value
+ * @return is send dhcp host name enabled
+ */
+ fun translatePrefValueToSendDhcpHostnameEnabled(prefDhcpRandomized: Int): Boolean {
+ return prefDhcpRandomized == PREF_SEND_DHCP_HOST_NAME_ENABLE
+ }
+ }
}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java
index d6a2492..404dbe5 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java
@@ -98,7 +98,20 @@
@Test
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void createTutorialPages_turnOnTwoFingerTripleTapShortcut_hasOnePage() {
- mShortcutTypes |= UserShortcutType.TWOFINGERTRIPLETAP;
+ mShortcutTypes |= UserShortcutType.TWOFINGER_DOUBLETAP;
+
+ final AlertDialog alertDialog =
+ createAccessibilityTutorialDialog(mContext, mShortcutTypes);
+
+ assertThat(createShortcutTutorialPages(mContext,
+ mShortcutTypes)).hasSize(/* expectedSize= */ 1);
+ assertThat(alertDialog).isNotNull();
+ }
+
+ @Test
+ @RequiresFlagsEnabled(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void createTutorialPages_turnOnQuickSettingShortcut_hasOnePage() {
+ mShortcutTypes |= UserShortcutType.QUICK_SETTINGS;
final AlertDialog alertDialog =
createAccessibilityTutorialDialog(mContext, mShortcutTypes);
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
index 05e56ca..624a39a 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
@@ -38,8 +38,12 @@
import android.content.pm.ServiceInfo;
import android.database.ContentObserver;
import android.os.Build;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.Flags;
import androidx.fragment.app.Fragment;
import androidx.test.core.app.ApplicationProvider;
@@ -59,6 +63,8 @@
import com.android.settingslib.search.SearchIndexableRaw;
import com.android.settingslib.testutils.shadow.ShadowColorDisplayManager;
+import com.google.common.truth.BooleanSubject;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -103,6 +109,7 @@
@Rule
public final MockitoRule mocks = MockitoJUnit.rule();
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private final Context mContext = ApplicationProvider.getApplicationContext();
@Spy
private final AccessibilityServiceInfo mServiceInfo = getMockAccessibilityServiceInfo(
@@ -316,30 +323,39 @@
}
@Test
- public void onCreate_haveRegisterToSpecificUrisAndActions() {
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void onCreate_flagDisabled_haveRegisterToSpecificUrisAndActions() {
setupFragment();
- ShadowContentResolver shadowContentResolver = shadowOf(mContext.getContentResolver());
- Collection<ContentObserver> a11yButtonTargetsObservers =
- shadowContentResolver.getContentObservers(
- Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS));
- Collection<ContentObserver> a11yShortcutTargetServiceObservers =
- shadowContentResolver.getContentObservers(Settings.Secure.getUriFor(
- Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE));
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS,
+ AccessibilitySettingsContentObserver.class).isTrue();
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
+ AccessibilitySettingsContentObserver.class).isTrue();
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_QS_TARGETS,
+ AccessibilitySettingsContentObserver.class).isFalse();
List<BroadcastReceiver> broadcastReceivers =
shadowOf((Application) ApplicationProvider.getApplicationContext())
.getRegisteredReceivers()
.stream().map(wrapper -> wrapper.broadcastReceiver).toList();
- assertThat(
- a11yButtonTargetsObservers.stream()
- .anyMatch(contentObserver ->
- contentObserver instanceof AccessibilitySettingsContentObserver))
- .isTrue();
- assertThat(
- a11yShortcutTargetServiceObservers.stream()
- .anyMatch(contentObserver ->
- contentObserver instanceof AccessibilitySettingsContentObserver))
- .isTrue();
+ assertThat(broadcastReceivers.stream().anyMatch(
+ broadcastReceiver -> broadcastReceiver instanceof PackageMonitor)).isTrue();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void onCreate_flagEnabled_haveRegisterToSpecificUrisAndActions() {
+ setupFragment();
+
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS,
+ AccessibilitySettingsContentObserver.class).isTrue();
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
+ AccessibilitySettingsContentObserver.class).isTrue();
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_QS_TARGETS,
+ AccessibilitySettingsContentObserver.class).isTrue();
+ List<BroadcastReceiver> broadcastReceivers =
+ shadowOf((Application) ApplicationProvider.getApplicationContext())
+ .getRegisteredReceivers()
+ .stream().map(wrapper -> wrapper.broadcastReceiver).toList();
assertThat(broadcastReceivers.stream().anyMatch(
broadcastReceiver -> broadcastReceiver instanceof PackageMonitor)).isTrue();
}
@@ -350,27 +366,16 @@
mActivityController.pause().stop().destroy();
- ShadowContentResolver shadowContentResolver = shadowOf(mContext.getContentResolver());
- Collection<ContentObserver> a11yButtonTargetsObservers =
- shadowContentResolver.getContentObservers(
- Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS));
- Collection<ContentObserver> a11yShortcutTargetServiceObservers =
- shadowContentResolver.getContentObservers(Settings.Secure.getUriFor(
- Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE));
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS,
+ AccessibilitySettingsContentObserver.class).isFalse();
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
+ AccessibilitySettingsContentObserver.class).isFalse();
+ assertUriObserversContainsClazz(Settings.Secure.ACCESSIBILITY_QS_TARGETS,
+ AccessibilitySettingsContentObserver.class).isFalse();
List<BroadcastReceiver> broadcastReceivers =
shadowOf((Application) ApplicationProvider.getApplicationContext())
.getRegisteredReceivers()
.stream().map(wrapper -> wrapper.broadcastReceiver).toList();
- assertThat(
- a11yButtonTargetsObservers.stream()
- .anyMatch(contentObserver ->
- contentObserver instanceof AccessibilitySettingsContentObserver))
- .isFalse();
- assertThat(
- a11yShortcutTargetServiceObservers.stream()
- .anyMatch(contentObserver ->
- contentObserver instanceof AccessibilitySettingsContentObserver))
- .isFalse();
assertThat(broadcastReceivers.stream().anyMatch(
broadcastReceiver -> broadcastReceiver instanceof PackageMonitor)).isFalse();
}
@@ -491,4 +496,14 @@
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS,
enabled ? componentName.flattenToString() : "");
}
+
+ private BooleanSubject assertUriObserversContainsClazz(
+ String settingUri, Class<?> clazz) {
+ ShadowContentResolver shadowContentResolver = shadowOf(mContext.getContentResolver());
+ Collection<ContentObserver> observers =
+ shadowContentResolver.getContentObservers(
+ Settings.Secure.getUriFor(settingUri));
+
+ return assertThat(observers.stream().anyMatch(clazz::isInstance));
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragmentTest.java
index 4607a59..f108b8e 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragmentTest.java
@@ -28,15 +28,24 @@
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+import android.app.Activity;
+import android.app.Application;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.Intent;
+import android.icu.text.CaseMap;
import android.os.Bundle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.accessibility.Flags;
import android.widget.PopupWindow;
import androidx.annotation.Nullable;
@@ -46,9 +55,14 @@
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
+import com.android.settings.R;
+import com.android.settings.SettingsActivity;
+import com.android.settings.SubSettings;
+import com.android.settings.accessibility.shortcuts.EditShortcutsPreferenceFragment;
import com.android.settings.testutils.shadow.ShadowFragment;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -60,13 +74,14 @@
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowApplication;
+import java.util.Locale;
+
/** Tests for {@link AccessibilityShortcutPreferenceFragment} */
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {
com.android.settings.testutils.shadow.ShadowFragment.class,
})
public class AccessibilityShortcutPreferenceFragmentTest {
-
private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example";
private static final String PLACEHOLDER_CLASS_NAME = PLACEHOLDER_PACKAGE_NAME + ".placeholder";
private static final String PLACEHOLDER_TILE_CLASS_NAME =
@@ -83,7 +98,8 @@
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS;
private static final String HARDWARE_SHORTCUT_KEY =
Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE;
-
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private TestAccessibilityShortcutPreferenceFragment mFragment;
private PreferenceScreen mScreen;
private Context mContext = ApplicationProvider.getApplicationContext();
@@ -206,6 +222,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
@Config(shadows = ShadowFragment.class)
public void restoreValueFromSavedInstanceState_showTooltipView() {
mContext.setTheme(androidx.appcompat.R.style.Theme_AppCompat);
@@ -223,6 +240,15 @@
}
@Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ @Config(shadows = ShadowFragment.class)
+ public void showQuickSettingsTooltipIfNeeded_qsFlagOn_dontShowTooltipView() {
+ mFragment.showQuickSettingsTooltipIfNeeded(QuickSettingsTooltipType.GUIDE_TO_EDIT);
+
+ assertThat(getLatestPopupWindow()).isNull();
+ }
+
+ @Test
@Config(shadows = ShadowFragment.class)
public void showGeneralCategory_shouldInitCategory() {
final Bundle savedInstanceState = new Bundle();
@@ -238,6 +264,50 @@
assertThat(mFragment.getGeneralCategoryDescription(null)).isNotNull();
}
+ @Test
+ @EnableFlags(com.android.settings.accessibility.Flags.FLAG_EDIT_SHORTCUTS_IN_FULL_SCREEN)
+ public void onSettingsClicked_editShortcutsFullScreenFlagOn_showFullScreenEditShortcutScreen() {
+ Activity activity = Robolectric.setupActivity(FragmentActivity.class);
+ when(mFragment.getContext()).thenReturn(activity);
+ Context context = mFragment.getContext();
+ final ShortcutPreference shortcutPreference =
+ new ShortcutPreference(context, /* attrs= */ null);
+
+ mFragment.onSettingsClicked(shortcutPreference);
+
+ Intent intent = shadowOf(
+ (Application) context.getApplicationContext()).getNextStartedActivity();
+ assertThat(intent).isNotNull();
+ assertThat(intent.getAction()).isEqualTo(Intent.ACTION_MAIN);
+ assertThat(intent.getComponent()).isEqualTo(
+ new ComponentName(context, SubSettings.class));
+ assertThat(intent.getExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
+ .isEqualTo(EditShortcutsPreferenceFragment.class.getName());
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void getShortcutTypeSummary_shortcutSummaryIsCorrectlySet() {
+ final PreferredShortcut userPreferredShortcut = new PreferredShortcut(
+ PLACEHOLDER_COMPONENT_NAME.flattenToString(),
+ UserShortcutType.HARDWARE | UserShortcutType.QUICK_SETTINGS);
+ putUserShortcutTypeIntoSharedPreference(mContext, userPreferredShortcut);
+ final ShortcutPreference shortcutPreference =
+ new ShortcutPreference(mContext, /* attrs= */ null);
+ shortcutPreference.setChecked(true);
+ shortcutPreference.setSettingsEditable(true);
+ mFragment.mShortcutPreference = shortcutPreference;
+ String expected = CaseMap.toTitle().wholeString().noLowercase().apply(Locale.getDefault(),
+ /* iter= */ null,
+ mContext.getString(
+ R.string.accessibility_feature_shortcut_setting_summary_quick_settings)
+ + ", "
+ + mContext.getString(R.string.accessibility_shortcut_hardware_keyword));
+
+ String summary = mFragment.getShortcutTypeSummary(mContext).toString();
+ assertThat(summary).isEqualTo(expected);
+ }
+
private void callEmptyOnClicked(DialogInterface dialog, int which) {}
private void putStringIntoSettings(String key, String componentName) {
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java
index 7825677..2d5deeb 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java
@@ -18,6 +18,10 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.ComponentName;
import android.content.Context;
@@ -25,20 +29,30 @@
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.Build;
+import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.Flags;
import androidx.test.core.app.ApplicationProvider;
+import com.android.internal.accessibility.util.ShortcutUtils;
import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityUtil.UserShortcutType;
+import com.android.settings.testutils.AccessibilityTestUtils;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
+import java.util.Set;
import java.util.StringJoiner;
@RunWith(RobolectricTestRunner.class)
@@ -55,14 +69,18 @@
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS;
private static final String HARDWARE_SHORTCUT_KEY =
Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE;
+ private static final String QUICK_SETTINGS_SHORTCUT_KEY =
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS;
private static final String PLACEHOLDER_SETTING_FEATURE = "placeholderSettingFeature";
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private Context mContext;
@Before
public void setUp() {
- mContext = ApplicationProvider.getApplicationContext();
+ mContext = spy(ApplicationProvider.getApplicationContext());
}
@Test
@@ -151,11 +169,12 @@
public void getUserShortcutTypeFromSettings_putOneValue_hasValue() {
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
- final int shortcutType = AccessibilityUtil.getUserShortcutTypesFromSettings(mContext,
+ final int shortcutTypes = AccessibilityUtil.getUserShortcutTypesFromSettings(mContext,
MOCK_COMPONENT_NAME);
- assertThat(
- (shortcutType & UserShortcutType.SOFTWARE) == UserShortcutType.SOFTWARE).isTrue();
+ assertThat(shortcutTypes).isEqualTo(
+ UserShortcutType.SOFTWARE
+ );
}
@Test
@@ -163,16 +182,34 @@
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
setShortcut(UserShortcutType.HARDWARE, MOCK_COMPONENT_NAME.flattenToString());
- final int shortcutType = AccessibilityUtil.getUserShortcutTypesFromSettings(mContext,
+ final int shortcutTypes = AccessibilityUtil.getUserShortcutTypesFromSettings(mContext,
MOCK_COMPONENT_NAME);
- assertThat(
- (shortcutType & UserShortcutType.SOFTWARE) == UserShortcutType.SOFTWARE).isTrue();
- assertThat(
- (shortcutType & UserShortcutType.HARDWARE) == UserShortcutType.HARDWARE).isTrue();
+ assertThat(shortcutTypes).isEqualTo(
+ UserShortcutType.SOFTWARE
+ | UserShortcutType.HARDWARE
+ );
}
@Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void getUserShortcutTypeFromSettings_threeShortcutTypesChosen() {
+ setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
+ setShortcut(UserShortcutType.HARDWARE, MOCK_COMPONENT_NAME.flattenToString());
+ setShortcut(UserShortcutType.QUICK_SETTINGS, MOCK_COMPONENT_NAME.flattenToString());
+
+ final int shortcutTypes = AccessibilityUtil.getUserShortcutTypesFromSettings(mContext,
+ MOCK_COMPONENT_NAME);
+
+ assertThat(shortcutTypes).isEqualTo(
+ UserShortcutType.SOFTWARE
+ | UserShortcutType.HARDWARE
+ | UserShortcutType.QUICK_SETTINGS
+ );
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void optInAllValuesToSettings_optInValue_haveMatchString() {
clearShortcuts();
int shortcutTypes = UserShortcutType.SOFTWARE | UserShortcutType.HARDWARE;
@@ -187,6 +224,24 @@
}
@Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void optInAllValuesToSettings_optInValue_callsA11yManager() {
+ AccessibilityManager a11yManager =
+ AccessibilityTestUtils.setupMockAccessibilityManager(mContext);
+ Set<String> shortcutTargets = Set.of(MOCK_COMPONENT_NAME.flattenToString());
+ int shortcutTypes = UserShortcutType.SOFTWARE | UserShortcutType.HARDWARE
+ | UserShortcutType.QUICK_SETTINGS;
+
+ AccessibilityUtil.optInAllValuesToSettings(mContext, shortcutTypes, MOCK_COMPONENT_NAME);
+
+ verify(a11yManager).enableShortcutsForTargets(
+ /* enable= */ true, shortcutTypes,
+ shortcutTargets, UserHandle.myUserId());
+ verifyNoMoreInteractions(a11yManager);
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void optInValueToSettings_optInValue_haveMatchString() {
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
@@ -199,6 +254,23 @@
}
@Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void optInValueToSettings_optInValue_callsA11yManager() {
+ AccessibilityManager a11yManager =
+ AccessibilityTestUtils.setupMockAccessibilityManager(mContext);
+ Set<String> shortcutTargets = Set.of(MOCK_COMPONENT_NAME2.flattenToString());
+
+ AccessibilityUtil.optInValueToSettings(
+ mContext, UserShortcutType.HARDWARE, MOCK_COMPONENT_NAME2);
+
+ verify(a11yManager).enableShortcutsForTargets(
+ /* enable= */ true, UserShortcutType.HARDWARE,
+ shortcutTargets, UserHandle.myUserId());
+ verifyNoMoreInteractions(a11yManager);
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void optInValueToSettings_optInTwoValues_haveMatchString() {
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
@@ -213,6 +285,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void optOutAllValuesToSettings_optOutValue_emptyString() {
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
setShortcut(UserShortcutType.HARDWARE, MOCK_COMPONENT_NAME.flattenToString());
@@ -227,6 +300,27 @@
}
@Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void optOutAllValuesToSettings_optOutValue_callsA1yManager() {
+ AccessibilityManager a11yManager =
+ AccessibilityTestUtils.setupMockAccessibilityManager(mContext);
+ int shortcutTypes =
+ UserShortcutType.SOFTWARE | UserShortcutType.HARDWARE
+ | UserShortcutType.QUICK_SETTINGS;
+ Set<String> shortcutTargets = Set.of(MOCK_COMPONENT_NAME.flattenToString());
+
+ AccessibilityUtil.optOutAllValuesFromSettings(mContext, shortcutTypes,
+ MOCK_COMPONENT_NAME);
+
+ verify(a11yManager).enableShortcutsForTargets(
+ /* enable= */ false,
+ shortcutTypes,
+ shortcutTargets, UserHandle.myUserId());
+ verifyNoMoreInteractions(a11yManager);
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void optOutValueFromSettings_optOutValue_emptyString() {
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString());
@@ -237,6 +331,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void optOutValueFromSettings_optOutValue_haveMatchString() {
setShortcut(UserShortcutType.SOFTWARE, MOCK_COMPONENT_NAME.flattenToString(),
MOCK_COMPONENT_NAME2.flattenToString());
@@ -248,6 +343,55 @@
MOCK_COMPONENT_NAME.flattenToString());
}
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void optOutValueFromSettings_optOutValue_callsA11yManager() {
+ AccessibilityManager a11yManager =
+ AccessibilityTestUtils.setupMockAccessibilityManager(mContext);
+ Set<String> shortcutTargets = Set.of(MOCK_COMPONENT_NAME.flattenToString());
+
+ AccessibilityUtil.optOutValueFromSettings(
+ mContext, UserShortcutType.QUICK_SETTINGS, MOCK_COMPONENT_NAME);
+
+ verify(a11yManager).enableShortcutsForTargets(
+ /* enable= */ false, UserShortcutType.QUICK_SETTINGS,
+ shortcutTargets, UserHandle.myUserId());
+ verifyNoMoreInteractions(a11yManager);
+ }
+
+ @Test
+ public void convertKeyFromSettings_shortcutTypeSoftware() {
+ assertThat(AccessibilityUtil.convertKeyFromSettings(UserShortcutType.SOFTWARE))
+ .isEqualTo(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS);
+ }
+
+ @Test
+ public void convertKeyFromSettings_shortcutTypeHardware() {
+ assertThat(AccessibilityUtil.convertKeyFromSettings(UserShortcutType.HARDWARE))
+ .isEqualTo(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE);
+ }
+
+ @Test
+ public void convertKeyFromSettings_shortcutTypeTripleTap() {
+ assertThat(AccessibilityUtil.convertKeyFromSettings(UserShortcutType.TRIPLETAP))
+ .isEqualTo(Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED);
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void convertKeyFromSettings_shortcutTypeMultiFingersMultiTap() {
+ assertThat(AccessibilityUtil.convertKeyFromSettings(UserShortcutType.TWOFINGER_DOUBLETAP))
+ .isEqualTo(
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED);
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void convertKeyFromSettings_shortcutTypeQuickSettings() {
+ assertThat(AccessibilityUtil.convertKeyFromSettings(UserShortcutType.QUICK_SETTINGS))
+ .isEqualTo(Settings.Secure.ACCESSIBILITY_QS_TARGETS);
+ }
+
private AccessibilityServiceInfo getMockAccessibilityServiceInfo() {
final ApplicationInfo applicationInfo = new ApplicationInfo();
final ServiceInfo serviceInfo = new ServiceInfo();
@@ -287,12 +431,12 @@
shortcutComponents.add(componentName);
}
Settings.Secure.putString(mContext.getContentResolver(),
- shortcutType == UserShortcutType.SOFTWARE ? SOFTWARE_SHORTCUT_KEY
- : HARDWARE_SHORTCUT_KEY, shortcutComponents.toString());
+ ShortcutUtils.convertToKey(shortcutType), shortcutComponents.toString());
}
private void clearShortcuts() {
Settings.Secure.putString(mContext.getContentResolver(), SOFTWARE_SHORTCUT_KEY, "");
Settings.Secure.putString(mContext.getContentResolver(), HARDWARE_SHORTCUT_KEY, "");
+ Settings.Secure.putString(mContext.getContentResolver(), QUICK_SETTINGS_SHORTCUT_KEY, "");
}
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingDevicePairingFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingDevicePairingFragmentTest.java
index e14686e..db82be6 100644
--- a/tests/robotests/src/com/android/settings/accessibility/HearingDevicePairingFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/HearingDevicePairingFragmentTest.java
@@ -178,7 +178,7 @@
}
@Test
- public void handleLeScanResult_isNotAndroidCompatible_() {
+ public void handleLeScanResult_isNotAndroidCompatible_discoverServices() {
ScanResult scanResult = mock(ScanResult.class);
doReturn(mDevice).when(scanResult).getDevice();
doReturn(mCachedDevice).when(mCachedDeviceManager).findDevice(mDevice);
@@ -190,6 +190,19 @@
}
@Test
+ public void handleLeScanResult_alreadyBonded_doNothing() {
+ ScanResult scanResult = mock(ScanResult.class);
+ doReturn(mDevice).when(scanResult).getDevice();
+ doReturn(mCachedDevice).when(mCachedDeviceManager).findDevice(mDevice);
+ doReturn(BluetoothDevice.BOND_BONDED).when(mCachedDevice).getBondState();
+
+ mFragment.handleLeScanResult(scanResult);
+
+ verify(mFragment, never()).addDevice(mCachedDevice);
+ verify(mFragment, never()).discoverServices(mCachedDevice);
+ }
+
+ @Test
public void onProfileConnectionStateChanged_deviceConnected_inSelectedList_finish() {
doReturn(true).when(mCachedDevice).isConnected();
mFragment.mSelectedDeviceList.add(mDevice);
diff --git a/tests/robotests/src/com/android/settings/accessibility/MagnificationAlwaysOnPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/MagnificationAlwaysOnPreferenceControllerTest.java
index e8015c5..417c3d4 100644
--- a/tests/robotests/src/com/android/settings/accessibility/MagnificationAlwaysOnPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/MagnificationAlwaysOnPreferenceControllerTest.java
@@ -17,10 +17,10 @@
package com.android.settings.accessibility;
import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
-import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -56,38 +56,13 @@
mSwitchPreference.setKey(MagnificationAlwaysOnPreferenceController.PREF_KEY);
screen.addPreference(mSwitchPreference);
mController.displayPreference(screen);
- }
- @Test
- public void isChecked_defaultStateForAlwaysOn_onResumeShouldReturnTrue() {
- mController.onResume();
-
- assertThat(mController.isChecked()).isTrue();
- assertThat(mSwitchPreference.isChecked()).isTrue();
- }
-
- @Test
- public void isChecked_enableAlwaysOn_onResumeShouldReturnTrue() {
- Settings.Secure.putInt(mContext.getContentResolver(), KEY_ALWAYS_ON, ON);
- mController.onResume();
-
- assertThat(mController.isChecked()).isTrue();
- assertThat(mSwitchPreference.isChecked()).isTrue();
- }
-
- @Test
- public void isChecked_disableAlwaysOn_onResumeShouldReturnFalse() {
- Settings.Secure.putInt(mContext.getContentResolver(), KEY_ALWAYS_ON, OFF);
- mController.onResume();
-
- assertThat(mController.isChecked()).isFalse();
- assertThat(mSwitchPreference.isChecked()).isFalse();
+ mController.updateState(mSwitchPreference);
+ reset(mSwitchPreference);
}
@Test
public void performClick_switchDefaultStateForAlwaysOn_shouldReturnFalse() {
- mController.onResume();
-
mSwitchPreference.performClick();
verify(mSwitchPreference).setChecked(false);
@@ -99,7 +74,7 @@
public void updateState_disableAlwaysOn_shouldReturnFalse() {
Settings.Secure.putInt(mContext.getContentResolver(), KEY_ALWAYS_ON, OFF);
- mController.updateState();
+ mController.updateState(mSwitchPreference);
verify(mSwitchPreference).setChecked(false);
assertThat(mController.isChecked()).isFalse();
diff --git a/tests/robotests/src/com/android/settings/accessibility/MagnificationFollowTypingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/MagnificationFollowTypingPreferenceControllerTest.java
index fd282a0..3aeeca8 100644
--- a/tests/robotests/src/com/android/settings/accessibility/MagnificationFollowTypingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/MagnificationFollowTypingPreferenceControllerTest.java
@@ -17,10 +17,10 @@
package com.android.settings.accessibility;
import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
-import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -56,38 +56,13 @@
mSwitchPreference.setKey(MagnificationFollowTypingPreferenceController.PREF_KEY);
screen.addPreference(mSwitchPreference);
mController.displayPreference(screen);
- }
- @Test
- public void isChecked_defaultStateForFollowTyping_onResumeShouldReturnTrue() {
- mController.onResume();
-
- assertThat(mController.isChecked()).isTrue();
- assertThat(mSwitchPreference.isChecked()).isTrue();
- }
-
- @Test
- public void isChecked_enableFollowTyping_onResumeShouldReturnTrue() {
- Settings.Secure.putInt(mContext.getContentResolver(), KEY_FOLLOW_TYPING, ON);
- mController.onResume();
-
- assertThat(mController.isChecked()).isTrue();
- assertThat(mSwitchPreference.isChecked()).isTrue();
- }
-
- @Test
- public void isChecked_disableFollowTyping_onResumeShouldReturnFalse() {
- Settings.Secure.putInt(mContext.getContentResolver(), KEY_FOLLOW_TYPING, OFF);
- mController.onResume();
-
- assertThat(mController.isChecked()).isFalse();
- assertThat(mSwitchPreference.isChecked()).isFalse();
+ mController.updateState(mSwitchPreference);
+ reset(mSwitchPreference);
}
@Test
public void performClick_switchDefaultStateForFollowTyping_shouldReturnFalse() {
- mController.onResume();
-
mSwitchPreference.performClick();
verify(mSwitchPreference).setChecked(false);
@@ -99,7 +74,7 @@
public void updateState_disableFollowTyping_shouldReturnFalse() {
Settings.Secure.putInt(mContext.getContentResolver(), KEY_FOLLOW_TYPING, OFF);
- mController.updateState();
+ mController.updateState(mSwitchPreference);
verify(mSwitchPreference).setChecked(false);
assertThat(mController.isChecked()).isFalse();
diff --git a/tests/robotests/src/com/android/settings/accessibility/MagnificationJoystickPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/MagnificationJoystickPreferenceControllerTest.java
index 236f18c..11258bb 100644
--- a/tests/robotests/src/com/android/settings/accessibility/MagnificationJoystickPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/MagnificationJoystickPreferenceControllerTest.java
@@ -17,10 +17,10 @@
package com.android.settings.accessibility;
import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
-import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -56,38 +56,13 @@
mSwitchPreference.setKey(MagnificationJoystickPreferenceController.PREF_KEY);
screen.addPreference(mSwitchPreference);
mController.displayPreference(screen);
- }
- @Test
- public void isChecked_defaultStateForJoystick_onResumeShouldReturnFalse() {
- mController.onResume();
-
- assertThat(mController.isChecked()).isFalse();
- assertThat(mSwitchPreference.isChecked()).isFalse();
- }
-
- @Test
- public void isChecked_enableJoystick_onResumeShouldReturnTrue() {
- Settings.Secure.putInt(mContext.getContentResolver(), KEY_JOYSTICK, ON);
- mController.onResume();
-
- assertThat(mController.isChecked()).isTrue();
- assertThat(mSwitchPreference.isChecked()).isTrue();
- }
-
- @Test
- public void isChecked_disableJoystick_onResumeShouldReturnFalse() {
- Settings.Secure.putInt(mContext.getContentResolver(), KEY_JOYSTICK, OFF);
- mController.onResume();
-
- assertThat(mController.isChecked()).isFalse();
- assertThat(mSwitchPreference.isChecked()).isFalse();
+ mController.updateState(mSwitchPreference);
+ reset(mSwitchPreference);
}
@Test
public void performClick_switchDefaultStateForJoystick_shouldReturnTrue() {
- mController.onResume();
-
mSwitchPreference.performClick();
verify(mSwitchPreference).setChecked(true);
@@ -99,7 +74,7 @@
public void updateState_disableJoystick_shouldReturnFalse() {
Settings.Secure.putInt(mContext.getContentResolver(), KEY_JOYSTICK, OFF);
- mController.updateState();
+ mController.updateState(mSwitchPreference);
verify(mSwitchPreference).setChecked(false);
assertThat(mController.isChecked()).isFalse();
diff --git a/tests/robotests/src/com/android/settings/accessibility/MagnificationModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/MagnificationModePreferenceControllerTest.java
index 62ff39b..0bc3862 100644
--- a/tests/robotests/src/com/android/settings/accessibility/MagnificationModePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/MagnificationModePreferenceControllerTest.java
@@ -90,7 +90,6 @@
mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference);
assertThat(getCheckedModeFromDialog()).isEqualTo(MAGNIFICATION_MODE_DEFAULT);
-
}
@Test
diff --git a/tests/robotests/src/com/android/settings/accessibility/MagnificationOneFingerPanningPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/MagnificationOneFingerPanningPreferenceControllerTest.java
new file mode 100644
index 0000000..4501d27
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/MagnificationOneFingerPanningPreferenceControllerTest.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
+import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.provider.Settings;
+
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.server.accessibility.Flags;
+import com.android.settings.R;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class MagnificationOneFingerPanningPreferenceControllerTest {
+ private static final String ONE_FINGER_PANNING_KEY =
+ Settings.Secure.ACCESSIBILITY_SINGLE_FINGER_PANNING_ENABLED;
+
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule =
+ DeviceFlagsValueProvider.createCheckFlagsRule();
+
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ private final SwitchPreference mSwitchPreference = spy(new SwitchPreference(mContext));
+ private final MagnificationOneFingerPanningPreferenceController mController =
+ new MagnificationOneFingerPanningPreferenceController(mContext);
+
+ private PreferenceScreen mScreen;
+
+ @Before
+ public void setUp() {
+ final PreferenceManager preferenceManager = new PreferenceManager(mContext);
+ mScreen = preferenceManager.createPreferenceScreen(mContext);
+ mSwitchPreference.setKey(MagnificationOneFingerPanningPreferenceController.PREF_KEY);
+ mScreen.addPreference(mSwitchPreference);
+ mController.displayPreference(mScreen);
+ }
+
+ @After
+ public void cleanup() {
+ // Can't use resetToDefaults as it NPE with
+ // "Cannot invoke "android.content.IContentProvider.call"
+ Settings.Secure.putInt(
+ mContext.getContentResolver(),
+ MagnificationOneFingerPanningPreferenceController.PREF_KEY,
+ (mController.mDefaultValue) ? ON : OFF);
+ }
+
+ @Test
+ public void displayPreference_defaultState_correctSummarySet() {
+ assertThat(mSwitchPreference.getSummary())
+ .isEqualTo(mContext.getString(
+ R.string.accessibility_magnification_one_finger_panning_summary_off));
+ }
+
+ @Test
+ @RequiresFlagsDisabled(Flags.FLAG_ENABLE_MAGNIFICATION_ONE_FINGER_PANNING_GESTURE)
+ public void getAvailabilityStatus_flagDisabled_disabled() {
+ int status = mController.getAvailabilityStatus();
+
+ assertThat(status).isEqualTo(DISABLED_FOR_USER);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_ONE_FINGER_PANNING_GESTURE)
+ public void getAvailabilityStatus_featureFlagEnabled_enabled() {
+ int status = mController.getAvailabilityStatus();
+
+ assertThat(status).isEqualTo(AVAILABLE);
+ }
+
+ @Test
+ public void isChecked_defaultState_returnFalse() {
+ assertThat(mController.isChecked()).isFalse();
+ assertThat(mSwitchPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void isChecked_settingsEnabled_returnTrue() {
+ Settings.Secure.putInt(mContext.getContentResolver(), ONE_FINGER_PANNING_KEY, ON);
+
+ assertThat(mController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void isChecked_settingsDisabled_returnTrue() {
+ Settings.Secure.putInt(mContext.getContentResolver(), ONE_FINGER_PANNING_KEY, OFF);
+
+ assertThat(mController.isChecked()).isFalse();
+ }
+
+ @Test
+ public void setChecked_enabled_enabledSummarySet() {
+ mController.setChecked(true);
+
+ assertThat(mSwitchPreference.getSummary()).isEqualTo(enabledSummary());
+ assertThat(mController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void setChecked_disabled_disabledSummarySet() {
+ mController.setChecked(false);
+
+ assertThat(mController.isChecked()).isFalse();
+ assertThat(mSwitchPreference.getSummary()).isEqualTo(disabledSummary());
+ }
+
+ @Test
+ public void getSummary_disable_disableSummaryTextUsed() {
+ Settings.Secure.putInt(mContext.getContentResolver(), ONE_FINGER_PANNING_KEY, OFF);
+
+ var summary = mController.getSummary();
+
+ assertThat(summary).isEqualTo(disabledSummary());
+ }
+
+ @Test
+ public void getSummary_enable_enabledSummaryTextUsed() {
+ Settings.Secure.putInt(mContext.getContentResolver(), ONE_FINGER_PANNING_KEY, ON);
+
+ var summary = mController.getSummary();
+
+ assertThat(summary).isEqualTo(enabledSummary());
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_ONE_FINGER_PANNING_GESTURE)
+ public void performClick_switchDefaultState_shouldReturnTrue() {
+ mSwitchPreference.performClick();
+
+ verify(mSwitchPreference).setChecked(true);
+ assertThat(mController.isChecked()).isTrue();
+ assertThat(mSwitchPreference.isChecked()).isTrue();
+ }
+
+ private String enabledSummary() {
+ return mContext.getString(
+ R.string.accessibility_magnification_one_finger_panning_summary_on);
+ }
+
+ private String disabledSummary() {
+ return mContext.getString(
+ R.string.accessibility_magnification_one_finger_panning_summary_off);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java
index 9155113..1a82a25 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleColorInversionPreferenceFragmentTest.java
@@ -31,10 +31,13 @@
import android.content.ComponentName;
import android.content.Context;
import android.os.Bundle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.accessibility.Flags;
import android.widget.PopupWindow;
import androidx.fragment.app.FragmentActivity;
@@ -49,6 +52,7 @@
import com.android.settings.widget.SettingsMainSwitchPreference;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -65,6 +69,8 @@
@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowFragment.class)
public class ToggleColorInversionPreferenceFragmentTest {
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private final Context mContext = ApplicationProvider.getApplicationContext();
private TestToggleColorInversionPreferenceFragment mFragment;
private PreferenceScreen mScreen;
@@ -131,6 +137,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void onPreferenceToggled_colorCorrectDisabled_shouldReturnTrueAndShowTooltipView() {
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, OFF);
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java
index 94db63b..850d1d79 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragmentTest.java
@@ -35,10 +35,13 @@
import android.content.ComponentName;
import android.content.Context;
import android.os.Bundle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.accessibility.Flags;
import android.widget.PopupWindow;
import androidx.fragment.app.FragmentActivity;
@@ -54,6 +57,7 @@
import com.android.settingslib.widget.SelectorWithWidgetPreference;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
@@ -70,6 +74,8 @@
@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowFragment.class)
public class ToggleDaltonizerPreferenceFragmentTest {
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private final Context mContext = ApplicationProvider.getApplicationContext();
private TestToggleDaltonizerPreferenceFragment mFragment;
private PreferenceScreen mScreen;
@@ -154,6 +160,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void onPreferenceToggled_colorCorrectDisabled_shouldReturnTrueAndShowTooltipView() {
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, OFF);
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
index 70c7cd6..6fb1c3f 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
@@ -24,6 +24,7 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -34,10 +35,11 @@
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.icu.text.CaseMap;
import android.os.Bundle;
-import android.platform.test.annotations.RequiresFlagsEnabled;
-import android.platform.test.flag.junit.CheckFlagsRule;
-import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
@@ -76,6 +78,8 @@
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowApplication;
+import java.util.Locale;
+
/** Tests for {@link ToggleFeaturePreferenceFragment} */
@RunWith(RobolectricTestRunner.class)
@LooperMode(LooperMode.Mode.LEGACY)
@@ -83,9 +87,8 @@
ShadowFragment.class,
})
public class ToggleFeaturePreferenceFragmentTest {
-
@Rule
- public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example";
private static final String PLACEHOLDER_CLASS_NAME = PLACEHOLDER_PACKAGE_NAME + ".placeholder";
@@ -144,8 +147,9 @@
}
@Test
+ @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
@Config(shadows = {ShadowFragment.class})
- public void onResume_haveRegisterToSpecificUris() {
+ public void onResume_flagEnabled_haveRegisterToSpecificUris() {
mFragment.onAttach(mContext);
mFragment.onCreate(Bundle.EMPTY);
@@ -160,6 +164,36 @@
Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)),
eq(false),
any(AccessibilitySettingsContentObserver.class));
+ verify(mContentResolver).registerContentObserver(
+ eq(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS)),
+ eq(false),
+ any(AccessibilitySettingsContentObserver.class));
+ }
+
+ @Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ @Config(shadows = {ShadowFragment.class})
+ public void onResume_flagDisabled_haveRegisterToSpecificUris() {
+ mFragment.onAttach(mContext);
+ mFragment.onCreate(Bundle.EMPTY);
+
+ mFragment.onResume();
+
+ verify(mContentResolver).registerContentObserver(
+ eq(Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS)),
+ eq(false),
+ any(AccessibilitySettingsContentObserver.class));
+ verify(mContentResolver).registerContentObserver(
+ eq(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)),
+ eq(false),
+ any(AccessibilitySettingsContentObserver.class));
+ verify(mContentResolver, never()).registerContentObserver(
+ eq(Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS)),
+ eq(false),
+ any(AccessibilitySettingsContentObserver.class));
}
@Test
@@ -295,6 +329,7 @@
}
@Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
@Config(shadows = ShadowFragment.class)
public void onPreferenceToggledOnEnabledService_showTooltipView() {
mFragment.onPreferenceToggled(
@@ -304,7 +339,7 @@
}
@Test
- @RequiresFlagsEnabled(com.android.settings.accessibility.Flags.FLAG_REMOVE_QS_TOOLTIP_IN_SUW)
+ @EnableFlags(com.android.settings.accessibility.Flags.FLAG_REMOVE_QS_TOOLTIP_IN_SUW)
@Config(shadows = ShadowFragment.class)
public void onPreferenceToggledOnEnabledService_inSuw_toolTipViewShouldNotShow() {
Intent suwIntent = new Intent();
@@ -318,6 +353,7 @@
}
@Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
@Config(shadows = ShadowFragment.class)
public void onPreferenceToggledOnEnabledService_tooltipViewShown_notShowTooltipView() {
mFragment.onPreferenceToggled(
@@ -348,7 +384,7 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ACCESSIBILITY_SHOW_APP_INFO_BUTTON)
+ @EnableFlags(Flags.FLAG_ACCESSIBILITY_SHOW_APP_INFO_BUTTON)
public void createAppInfoPreference_withValidComponentName() {
when(mPackageManager.isPackageAvailable(PLACEHOLDER_PACKAGE_NAME)).thenReturn(true);
mFragment.mComponentName = PLACEHOLDER_COMPONENT_NAME;
@@ -363,7 +399,7 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ACCESSIBILITY_SHOW_APP_INFO_BUTTON)
+ @EnableFlags(Flags.FLAG_ACCESSIBILITY_SHOW_APP_INFO_BUTTON)
public void createAppInfoPreference_noComponentName_shouldBeNull() {
mFragment.mComponentName = null;
@@ -373,7 +409,7 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ACCESSIBILITY_SHOW_APP_INFO_BUTTON)
+ @EnableFlags(Flags.FLAG_ACCESSIBILITY_SHOW_APP_INFO_BUTTON)
public void createAppInfoPreference_withUnavailablePackage_shouldBeNull() {
when(mPackageManager.isPackageAvailable(PLACEHOLDER_PACKAGE_NAME)).thenReturn(false);
mFragment.mComponentName = PLACEHOLDER_COMPONENT_NAME;
@@ -384,7 +420,7 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ACCESSIBILITY_SHOW_APP_INFO_BUTTON)
+ @EnableFlags(Flags.FLAG_ACCESSIBILITY_SHOW_APP_INFO_BUTTON)
public void createAppInfoPreference_inSetupWizard_shouldBeNull() {
when(mFragment.isAnySetupWizard()).thenReturn(true);
mFragment.mComponentName = PLACEHOLDER_COMPONENT_NAME;
@@ -421,6 +457,40 @@
.isEqualTo(PLACEHOLDER_COMPONENT_NAME.flattenToString());
}
+ @Test
+ @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ @Config(shadows = ShadowFragment.class)
+ public void showQuickSettingsTooltipIfNeeded_qsFlagOn_dontShowTooltipView() {
+ mFragment.showQuickSettingsTooltipIfNeeded(QuickSettingsTooltipType.GUIDE_TO_EDIT);
+
+ assertThat(getLatestPopupWindow()).isNull();
+ }
+
+ @Test
+ @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void getShortcutTypeSummary_shortcutSummaryIsCorrectlySet() {
+ final PreferredShortcut userPreferredShortcut = new PreferredShortcut(
+ PLACEHOLDER_COMPONENT_NAME.flattenToString(),
+ UserShortcutType.HARDWARE | UserShortcutType.QUICK_SETTINGS);
+ putUserShortcutTypeIntoSharedPreference(mContext, userPreferredShortcut);
+ final ShortcutPreference shortcutPreference =
+ new ShortcutPreference(mContext, /* attrs= */ null);
+ shortcutPreference.setChecked(true);
+ shortcutPreference.setSettingsEditable(true);
+ mFragment.mComponentName = PLACEHOLDER_COMPONENT_NAME;
+ mFragment.mShortcutPreference = shortcutPreference;
+ String expected = CaseMap.toTitle().wholeString().noLowercase().apply(Locale.getDefault(),
+ /* iter= */ null,
+ mContext.getString(
+ R.string.accessibility_feature_shortcut_setting_summary_quick_settings)
+ + ", "
+ + mContext.getString(R.string.accessibility_shortcut_hardware_keyword));
+
+ String summary = mFragment.getShortcutTypeSummary(mContext).toString();
+
+ assertThat(summary).isEqualTo(expected);
+ }
+
private void putSecureStringIntoSettings(String key, String componentName) {
Settings.Secure.putString(mContext.getContentResolver(), key, componentName);
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
index 4c49395..1d85705 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
@@ -19,6 +19,7 @@
import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
import static com.android.settings.accessibility.AccessibilityUtil.State.ON;
import static com.android.settings.accessibility.AccessibilityUtil.UserShortcutType;
+import static com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode;
import static com.android.settings.accessibility.ToggleFeaturePreferenceFragment.KEY_SAVED_USER_SHORTCUT_TYPE;
import static com.google.common.truth.Truth.assertThat;
@@ -29,6 +30,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import android.app.settings.SettingsEnums;
@@ -38,14 +40,19 @@
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.database.ContentObserver;
+import android.icu.text.CaseMap;
import android.net.Uri;
import android.os.Bundle;
-import android.platform.test.annotations.RequiresFlagsEnabled;
-import android.platform.test.flag.junit.CheckFlagsRule;
-import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.provider.DeviceConfig;
import android.provider.Settings;
+import android.view.accessibility.AccessibilityManager;
import androidx.appcompat.app.AlertDialog;
+import androidx.preference.Preference;
import androidx.preference.TwoStatePreference;
import androidx.test.core.app.ApplicationProvider;
@@ -54,12 +61,15 @@
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.accessibility.AccessibilityDialogUtils.DialogType;
+import com.android.settings.testutils.AccessibilityTestUtils;
+import com.android.settings.testutils.shadow.ShadowDeviceConfig;
import com.android.settings.testutils.shadow.ShadowStorageManager;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.google.common.truth.Correspondence;
+import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -75,6 +85,8 @@
import java.util.Collection;
import java.util.List;
+import java.util.Locale;
+import java.util.Set;
/** Tests for {@link ToggleScreenMagnificationPreferenceFragment}. */
@RunWith(RobolectricTestRunner.class)
@@ -82,11 +94,12 @@
ShadowUserManager.class,
ShadowStorageManager.class,
ShadowSettings.ShadowSecure.class,
+ ShadowDeviceConfig.class,
})
public class ToggleScreenMagnificationPreferenceFragmentTest {
@Rule
- public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private static final String PLACEHOLDER_PACKAGE_NAME = "com.mock.example";
private static final String PLACEHOLDER_CLASS_NAME =
@@ -109,15 +122,22 @@
private static final String KEY_FOLLOW_TYPING =
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED;
+ private static final String KEY_ALWAYS_ON =
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_ALWAYS_ON_ENABLED;
+ private static final String KEY_JOYSTICK =
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_JOYSTICK_ENABLED;
+
private FragmentController<ToggleScreenMagnificationPreferenceFragment> mFragController;
private Context mContext;
+ private AccessibilityManager mAccessibilityManager;
private Resources mSpyResources;
private ShadowPackageManager mShadowPackageManager;
@Before
public void setUpTestFragment() {
- mContext = ApplicationProvider.getApplicationContext();
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ mAccessibilityManager = AccessibilityTestUtils.setupMockAccessibilityManager(mContext);
// Set up the fragment that support window magnification feature
mSpyResources = spy(mContext.getResources());
@@ -137,15 +157,48 @@
mFragController = FragmentController.of(fragment, SettingsActivity.class);
}
+ @After
+ public void tearDown() {
+ ShadowDeviceConfig.reset();
+ }
+
+ @Test
+ public void onResume_defaultStateForMagnificationMode_preferenceShouldReturnFullScreen() {
+ mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
+
+ // Default is MagnificationMode.FULLSCREEN
+ final String expected =
+ MagnificationCapabilities.getSummary(mContext, MagnificationMode.FULLSCREEN);
+
+ final Preference preference = mFragController.get().findPreference(
+ MagnificationModePreferenceController.PREF_KEY);
+ assertThat(preference).isNotNull();
+ assertThat(preference.getSummary()).isEqualTo(expected);
+ }
+
+ @Test
+ public void onResume_setMagnificationModeToAll_preferenceShouldReturnAll() {
+ setKeyMagnificationMode(MagnificationMode.ALL);
+
+ mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
+
+ final String expected =
+ MagnificationCapabilities.getSummary(mContext, MagnificationMode.ALL);
+
+ final Preference preference = mFragController.get().findPreference(
+ MagnificationModePreferenceController.PREF_KEY);
+ assertThat(preference).isNotNull();
+ assertThat(preference.getSummary()).isEqualTo(expected);
+ }
+
@Test
public void onResume_defaultStateForFollowingTyping_switchPreferenceShouldReturnTrue() {
setKeyFollowTypingEnabled(true);
mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
- final TwoStatePreference switchPreference =
- mFragController.get().findPreference(
- MagnificationFollowTypingPreferenceController.PREF_KEY);
+ final TwoStatePreference switchPreference = mFragController.get().findPreference(
+ MagnificationFollowTypingPreferenceController.PREF_KEY);
assertThat(switchPreference).isNotNull();
assertThat(switchPreference.isChecked()).isTrue();
}
@@ -156,15 +209,122 @@
mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
- final TwoStatePreference switchPreference =
- mFragController.get().findPreference(
- MagnificationFollowTypingPreferenceController.PREF_KEY);
+ final TwoStatePreference switchPreference = mFragController.get().findPreference(
+ MagnificationFollowTypingPreferenceController.PREF_KEY);
assertThat(switchPreference).isNotNull();
assertThat(switchPreference.isChecked()).isFalse();
}
@Test
- public void onResume_haveRegisterToSpecificUris() {
+ public void onResume_defaultStateForAlwaysOn_switchPreferenceShouldReturnTrue() {
+ setAlwaysOnSupported(true);
+
+ mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
+
+ final TwoStatePreference switchPreference = mFragController.get().findPreference(
+ MagnificationAlwaysOnPreferenceController.PREF_KEY);
+ assertThat(switchPreference).isNotNull();
+ assertThat(switchPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void onResume_enableAlwaysOn_switchPreferenceShouldReturnTrue() {
+ setAlwaysOnSupported(true);
+ setKeyAlwaysOnEnabled(true);
+
+ mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
+
+ final TwoStatePreference switchPreference = mFragController.get().findPreference(
+ MagnificationAlwaysOnPreferenceController.PREF_KEY);
+ assertThat(switchPreference).isNotNull();
+ assertThat(switchPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void onResume_disableAlwaysOn_switchPreferenceShouldReturnFalse() {
+ setAlwaysOnSupported(true);
+ setKeyAlwaysOnEnabled(false);
+
+ mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
+
+ final TwoStatePreference switchPreference = mFragController.get().findPreference(
+ MagnificationAlwaysOnPreferenceController.PREF_KEY);
+ assertThat(switchPreference).isNotNull();
+ assertThat(switchPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void onResume_defaultStateForJoystick_switchPreferenceShouldReturnFalse() {
+ setJoystickSupported(true);
+
+ mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
+
+ final TwoStatePreference switchPreference = mFragController.get().findPreference(
+ MagnificationJoystickPreferenceController.PREF_KEY);
+ assertThat(switchPreference).isNotNull();
+ assertThat(switchPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void onResume_enableJoystick_switchPreferenceShouldReturnTrue() {
+ setJoystickSupported(true);
+ setKeyJoystickEnabled(true);
+
+ mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
+
+ final TwoStatePreference switchPreference = mFragController.get().findPreference(
+ MagnificationJoystickPreferenceController.PREF_KEY);
+ assertThat(switchPreference).isNotNull();
+ assertThat(switchPreference.isChecked()).isTrue();
+ }
+
+ @Test
+ public void onResume_disableJoystick_switchPreferenceShouldReturnFalse() {
+ setJoystickSupported(true);
+ setKeyJoystickEnabled(false);
+
+ mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
+
+ final TwoStatePreference switchPreference = mFragController.get().findPreference(
+ MagnificationJoystickPreferenceController.PREF_KEY);
+ assertThat(switchPreference).isNotNull();
+ assertThat(switchPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void onResume_flagEnabled_haveRegisterToSpecificUris() {
+ ShadowContentResolver shadowContentResolver = Shadows.shadowOf(
+ mContext.getContentResolver());
+ Uri[] observedUri = new Uri[]{
+ Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS),
+ Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE),
+ Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS),
+ Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED),
+ Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_ALWAYS_ON_ENABLED)
+ };
+ for (Uri uri : observedUri) {
+ // verify no observer registered before launching the fragment
+ assertThat(shadowContentResolver.getContentObservers(uri)).isEmpty();
+ }
+
+ mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
+
+ for (Uri uri : observedUri) {
+ Collection<ContentObserver> observers = shadowContentResolver.getContentObservers(uri);
+ assertThat(observers.size()).isEqualTo(1);
+ assertThat(observers.stream().findFirst().get()).isInstanceOf(
+ AccessibilitySettingsContentObserver.class);
+ }
+ }
+
+ @Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void onResume_flagDisabled_haveRegisterToSpecificUris() {
ShadowContentResolver shadowContentResolver = Shadows.shadowOf(
mContext.getContentResolver());
Uri[] observedUri = new Uri[]{
@@ -189,6 +349,9 @@
assertThat(observers.stream().findFirst().get()).isInstanceOf(
AccessibilitySettingsContentObserver.class);
}
+ assertThat(shadowContentResolver.getContentObservers(
+ Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS))).hasSize(0);
}
@Test
@@ -200,26 +363,27 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void hasMagnificationValuesInSettings_twoFingerTripleTapIsOn_isTrue() {
Settings.Secure.putInt(
mContext.getContentResolver(), TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, ON);
assertThat(ToggleScreenMagnificationPreferenceFragment.hasMagnificationValuesInSettings(
- mContext, UserShortcutType.TWOFINGERTRIPLETAP)).isTrue();
+ mContext, UserShortcutType.TWOFINGER_DOUBLETAP)).isTrue();
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void hasMagnificationValuesInSettings_twoFingerTripleTapIsOff_isFalse() {
Settings.Secure.putInt(
mContext.getContentResolver(), TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, OFF);
assertThat(ToggleScreenMagnificationPreferenceFragment.hasMagnificationValuesInSettings(
- mContext, UserShortcutType.TWOFINGERTRIPLETAP)).isFalse();
+ mContext, UserShortcutType.TWOFINGER_DOUBLETAP)).isFalse();
}
@Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
public void optInAllValuesToSettings_optInValue_haveMatchString() {
int shortcutTypes = UserShortcutType.SOFTWARE | UserShortcutType.TRIPLETAP;
@@ -232,9 +396,36 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void optInAllValuesToSettings_optInValue_callA11yManager() {
+ int shortcutTypes =
+ UserShortcutType.SOFTWARE | UserShortcutType.TRIPLETAP | UserShortcutType.HARDWARE
+ | UserShortcutType.QUICK_SETTINGS;
+ Set<String> shortcutTargets = Set.of(MAGNIFICATION_CONTROLLER_NAME);
+
+ ToggleScreenMagnificationPreferenceFragment.optInAllMagnificationValuesToSettings(mContext,
+ shortcutTypes);
+
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ true, UserShortcutType.SOFTWARE,
+ shortcutTargets, UserHandle.myUserId());
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ true, UserShortcutType.HARDWARE,
+ shortcutTargets, UserHandle.myUserId());
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ true, UserShortcutType.QUICK_SETTINGS,
+ shortcutTargets, UserHandle.myUserId());
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ true, UserShortcutType.TRIPLETAP,
+ shortcutTargets, UserHandle.myUserId());
+ verifyNoMoreInteractions(mAccessibilityManager);
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
public void optInAllValuesToSettings_twoFingerTripleTap_haveMatchString() {
- int shortcutTypes = UserShortcutType.TWOFINGERTRIPLETAP;
+ int shortcutTypes = UserShortcutType.TWOFINGER_DOUBLETAP;
ToggleScreenMagnificationPreferenceFragment.optInAllMagnificationValuesToSettings(mContext,
shortcutTypes);
@@ -244,6 +435,7 @@
}
@Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
public void optInAllValuesToSettings_existOtherValue_optInValue_haveMatchString() {
putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, PLACEHOLDER_COMPONENT_NAME.flattenToString());
@@ -255,6 +447,7 @@
}
@Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
public void optInAllValuesToSettings_software_sizeValueIsNull_putLargeSizeValue() {
ShadowSettings.ShadowSecure.reset();
@@ -322,6 +515,7 @@
}
@Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
public void optOutAllValuesToSettings_optOutValue_emptyString() {
putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, MAGNIFICATION_CONTROLLER_NAME);
putStringIntoSettings(HARDWARE_SHORTCUT_KEY, MAGNIFICATION_CONTROLLER_NAME);
@@ -338,19 +532,46 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void optOutAllValuesToSettings_optOutValue_callA11yManager() {
+ Set<String> shortcutTargets = Set.of(MAGNIFICATION_CONTROLLER_NAME);
+ putStringIntoSettings(SOFTWARE_SHORTCUT_KEY, MAGNIFICATION_CONTROLLER_NAME);
+ putStringIntoSettings(HARDWARE_SHORTCUT_KEY, MAGNIFICATION_CONTROLLER_NAME);
+ setMagnificationTripleTapEnabled(/* enabled= */ true);
+ int shortcutTypes =
+ UserShortcutType.SOFTWARE | UserShortcutType.HARDWARE | UserShortcutType.TRIPLETAP;
+
+ ToggleScreenMagnificationPreferenceFragment.optOutAllMagnificationValuesFromSettings(
+ mContext, shortcutTypes);
+
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ false, UserShortcutType.SOFTWARE,
+ shortcutTargets, UserHandle.myUserId());
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ false, UserShortcutType.HARDWARE,
+ shortcutTargets, UserHandle.myUserId());
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ false, UserShortcutType.TRIPLETAP,
+ shortcutTargets, UserHandle.myUserId());
+ verifyNoMoreInteractions(mAccessibilityManager);
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
public void optOutAllValuesToSettings_twoFingerTripleTap_settingsValueIsOff() {
Settings.Secure.putInt(mContext.getContentResolver(),
TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, ON);
ToggleScreenMagnificationPreferenceFragment.optOutAllMagnificationValuesFromSettings(
- mContext, UserShortcutType.TWOFINGERTRIPLETAP);
+ mContext, UserShortcutType.TWOFINGER_DOUBLETAP);
assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, ON)).isEqualTo(OFF);
}
@Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
public void optOutValueFromSettings_existOtherValue_optOutValue_haveMatchString() {
putStringIntoSettings(SOFTWARE_SHORTCUT_KEY,
PLACEHOLDER_COMPONENT_NAME.flattenToString() + ":" + MAGNIFICATION_CONTROLLER_NAME);
@@ -407,7 +628,7 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void updateShortcutPreferenceData_hasTwoFingerTripleTapInSettings_assignToVariable() {
Settings.Secure.putInt(
mContext.getContentResolver(), TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, ON);
@@ -417,14 +638,14 @@
final int expectedType = PreferredShortcuts.retrieveUserShortcutType(mContext,
MAGNIFICATION_CONTROLLER_NAME);
- assertThat(expectedType).isEqualTo(UserShortcutType.TWOFINGERTRIPLETAP);
+ assertThat(expectedType).isEqualTo(UserShortcutType.TWOFINGER_DOUBLETAP);
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void updateShortcutPreferenceData_hasTwoFingerTripleTapInSharedPref_assignToVariable() {
final PreferredShortcut tripleTapShortcut = new PreferredShortcut(
- MAGNIFICATION_CONTROLLER_NAME, UserShortcutType.TWOFINGERTRIPLETAP);
+ MAGNIFICATION_CONTROLLER_NAME, UserShortcutType.TWOFINGER_DOUBLETAP);
putUserShortcutTypeIntoSharedPreference(mContext, tripleTapShortcut);
mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
@@ -432,7 +653,7 @@
final int expectedType = PreferredShortcuts.retrieveUserShortcutType(mContext,
MAGNIFICATION_CONTROLLER_NAME);
- assertThat(expectedType).isEqualTo(UserShortcutType.TWOFINGERTRIPLETAP);
+ assertThat(expectedType).isEqualTo(UserShortcutType.TWOFINGER_DOUBLETAP);
}
@Test
@@ -471,7 +692,7 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void setupMagnificationEditShortcutDialog_twoFingerTripleTapOn_checkboxIsSavedValue() {
ToggleScreenMagnificationPreferenceFragment fragment =
mFragController.create(R.id.main_content, /* bundle= */
@@ -479,7 +700,7 @@
final ShortcutPreference shortcutPreference = new ShortcutPreference(mContext, /* attrs= */
null);
final PreferredShortcut twoFingerTripleTapShortcut = new PreferredShortcut(
- MAGNIFICATION_CONTROLLER_NAME, UserShortcutType.TWOFINGERTRIPLETAP);
+ MAGNIFICATION_CONTROLLER_NAME, UserShortcutType.TWOFINGER_DOUBLETAP);
fragment.mShortcutPreference = shortcutPreference;
PreferredShortcuts.saveUserShortcutType(mContext, twoFingerTripleTapShortcut);
@@ -488,7 +709,7 @@
createEditShortcutDialog(fragment.getActivity()));
final int checkboxValue = fragment.getShortcutTypeCheckBoxValue();
- assertThat(checkboxValue).isEqualTo(UserShortcutType.TWOFINGERTRIPLETAP);
+ assertThat(checkboxValue).isEqualTo(UserShortcutType.TWOFINGER_DOUBLETAP);
}
@Test
@@ -513,10 +734,10 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void restoreValueFromSavedInstanceState_twoFingerTripleTap_assignToVariable() {
final Bundle fragmentState =
- createFragmentSavedInstanceState(UserShortcutType.TWOFINGERTRIPLETAP);
+ createFragmentSavedInstanceState(UserShortcutType.TWOFINGER_DOUBLETAP);
ToggleScreenMagnificationPreferenceFragment fragment = mFragController.get();
// Had to use reflection to pass the savedInstanceState when launching the fragment
ReflectionHelpers.setField(fragment, "mSavedFragmentState", fragmentState);
@@ -530,8 +751,8 @@
final int expectedType = PreferredShortcuts.retrieveUserShortcutType(mContext,
MAGNIFICATION_CONTROLLER_NAME);
- assertThat(value).isEqualTo(UserShortcutType.TWOFINGERTRIPLETAP);
- assertThat(expectedType).isEqualTo(UserShortcutType.TWOFINGERTRIPLETAP);
+ assertThat(value).isEqualTo(UserShortcutType.TWOFINGER_DOUBLETAP);
+ assertThat(expectedType).isEqualTo(UserShortcutType.TWOFINGER_DOUBLETAP);
}
@Test
@@ -557,6 +778,28 @@
}
@Test
+ public void onCreateView_alwaysOnNotSupported_settingsPreferenceIsNull() {
+ setAlwaysOnSupported(false);
+
+ mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
+
+ final TwoStatePreference switchPreference = mFragController.get().findPreference(
+ MagnificationAlwaysOnPreferenceController.PREF_KEY);
+ assertThat(switchPreference).isNull();
+ }
+
+ @Test
+ public void onCreateView_joystickNotSupported_settingsPreferenceIsNull() {
+ setJoystickSupported(false);
+
+ mFragController.create(R.id.main_content, /* bundle= */ null).start().resume();
+
+ final TwoStatePreference switchPreference = mFragController.get().findPreference(
+ MagnificationJoystickPreferenceController.PREF_KEY);
+ assertThat(switchPreference).isNull();
+ }
+
+ @Test
public void onCreateView_setDialogDelegateAndAddTheControllerToLifeCycleObserver() {
Correspondence instanceOf = Correspondence.transforming(
observer -> (observer instanceof MagnificationModePreferenceController),
@@ -648,7 +891,7 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void getSummary_magnificationGestureEnabled_returnShortcutOnWithSummary() {
Settings.Secure.putInt(
mContext.getContentResolver(), TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, ON);
@@ -662,7 +905,7 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void getSummary_magnificationGestureDisabled_returnShortcutOffWithSummary() {
Settings.Secure.putInt(
mContext.getContentResolver(), TWO_FINGER_TRIPLE_TAP_SHORTCUT_KEY, OFF);
@@ -676,6 +919,33 @@
mContext.getText(R.string.magnification_feature_summary)));
}
+ @Test
+ @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void getShortcutTypeSummary_shortcutSummaryIsCorrectlySet() {
+ final PreferredShortcut userPreferredShortcut = new PreferredShortcut(
+ MAGNIFICATION_CONTROLLER_NAME,
+ UserShortcutType.HARDWARE | UserShortcutType.QUICK_SETTINGS);
+ putUserShortcutTypeIntoSharedPreference(mContext, userPreferredShortcut);
+ final ShortcutPreference shortcutPreference =
+ new ShortcutPreference(mContext, /* attrs= */ null);
+ shortcutPreference.setChecked(true);
+ shortcutPreference.setSettingsEditable(true);
+ ToggleScreenMagnificationPreferenceFragment fragment =
+ mFragController.create(R.id.main_content, /* bundle= */
+ null).start().resume().get();
+ fragment.mShortcutPreference = shortcutPreference;
+ String expected = CaseMap.toTitle().wholeString().noLowercase().apply(Locale.getDefault(),
+ /* iter= */ null,
+ mContext.getString(
+ R.string.accessibility_feature_shortcut_setting_summary_quick_settings)
+ + ", "
+ + mContext.getString(R.string.accessibility_shortcut_hardware_keyword));
+
+ String summary = fragment.getShortcutTypeSummary(mContext).toString();
+
+ assertThat(summary).isEqualTo(expected);
+ }
+
private void putStringIntoSettings(String key, String componentName) {
Settings.Secure.putString(mContext.getContentResolver(), key, componentName);
}
@@ -690,11 +960,41 @@
enabled ? ON : OFF);
}
+ private void setKeyMagnificationMode(@MagnificationMode int mode) {
+ MagnificationCapabilities.setCapabilities(mContext, mode);
+ }
+
private void setKeyFollowTypingEnabled(boolean enabled) {
Settings.Secure.putInt(mContext.getContentResolver(), KEY_FOLLOW_TYPING,
enabled ? ON : OFF);
}
+ private void setAlwaysOnSupported(boolean supported) {
+ ShadowDeviceConfig.setProperty(
+ DeviceConfig.NAMESPACE_WINDOW_MANAGER,
+ "AlwaysOnMagnifier__enable_always_on_magnifier",
+ supported ? "true" : "false",
+ /* makeDefault= */ false);
+ }
+
+ private void setKeyAlwaysOnEnabled(boolean enabled) {
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_ALWAYS_ON,
+ enabled ? ON : OFF);
+ }
+
+ private void setJoystickSupported(boolean supported) {
+ ShadowDeviceConfig.setProperty(
+ DeviceConfig.NAMESPACE_WINDOW_MANAGER,
+ "MagnificationJoystick__enable_magnification_joystick",
+ supported ? "true" : "false",
+ /* makeDefault= */ false);
+ }
+
+ private void setKeyJoystickEnabled(boolean enabled) {
+ Settings.Secure.putInt(mContext.getContentResolver(), KEY_JOYSTICK,
+ enabled ? ON : OFF);
+ }
+
private String getStringFromSettings(String key) {
return Settings.Secure.getString(mContext.getContentResolver(), key);
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java
index 56486d2..526b431 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java
@@ -86,7 +86,10 @@
/**
* Tests for {@link EditShortcutsPreferenceFragment}
*/
-@Config(shadows = SettingsShadowResources.class)
+@Config(shadows = {
+ SettingsShadowResources.class,
+ com.android.settings.testutils.shadow.ShadowAccessibilityManager.class
+})
@RunWith(RobolectricTestRunner.class)
public class EditShortcutsPreferenceFragmentTest {
private static final int METRICS_CATEGORY = 123;
@@ -99,7 +102,8 @@
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
- private final Context mContext = ApplicationProvider.getApplicationContext();
+ private Context mContext = ApplicationProvider.getApplicationContext();
+
private FragmentActivity mActivity;
private FragmentScenario<EditShortcutsPreferenceFragment> mFragmentScenario;
@@ -291,7 +295,7 @@
mFragmentScenario.onFragment(fragment -> {
TwoStatePreference preference = fragment.findPreference(
mContext.getString(
- R.string.accessibility_shortcut_two_fingers_double_tap_pref));
+ R.string.accessibility_shortcut_two_finger_double_tap_pref));
assertThat(preference.isChecked()).isTrue();
});
}
@@ -476,7 +480,26 @@
));
}
+ @Test
+ public void onQuickSettingsShortcutSettingChanged_preferredShortcutsUpdated() {
+ mFragmentScenario = createFragScenario(/* isInSuw= */ false);
+ mFragmentScenario.moveToState(Lifecycle.State.CREATED);
+ int currentPreferredShortcut =
+ PreferredShortcuts.retrieveUserShortcutType(mContext, TARGET);
+ assertThat(currentPreferredShortcut
+ & ShortcutConstants.UserShortcutType.QUICK_SETTINGS).isEqualTo(0);
+ ShortcutUtils.optInValueToSettings(
+ mContext, ShortcutConstants.UserShortcutType.QUICK_SETTINGS, TARGET);
+
+ // Calls onFragment so that the change to Setting is notified to its observer
+ mFragmentScenario.onFragment(fragment ->
+ assertThat(
+ PreferredShortcuts.retrieveUserShortcutType(
+ mContext, TARGET)
+ ).isEqualTo(ShortcutConstants.UserShortcutType.QUICK_SETTINGS)
+ );
+ }
private void assertLaunchSubSettingWithCurrentTargetComponents(
String componentName, boolean isInSuw) {
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionControllerTest.java
index 010386c..155cb22 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/GestureShortcutOptionControllerTest.java
@@ -16,9 +16,10 @@
package com.android.settings.accessibility.shortcuts;
+import static com.android.settings.testutils.AccessibilityTestUtils.setupMockAccessibilityManager;
+
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
@@ -148,8 +149,7 @@
}
private void enableTouchExploration(boolean enable) {
- AccessibilityManager am = mock(AccessibilityManager.class);
- when(mContext.getSystemService(AccessibilityManager.class)).thenReturn(am);
+ AccessibilityManager am = setupMockAccessibilityManager(mContext);
when(am.isTouchExplorationEnabled()).thenReturn(enable);
}
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionControllerTest.java
new file mode 100644
index 0000000..6086b17
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/QuickSettingsShortcutOptionControllerTest.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility.shortcuts;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.Flags;
+
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.internal.accessibility.common.ShortcutConstants;
+import com.android.internal.accessibility.util.ShortcutUtils;
+import com.android.settings.R;
+import com.android.settings.testutils.AccessibilityTestUtils;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Tests for {@link QuickSettingsShortcutOptionController}
+ */
+@RunWith(RobolectricTestRunner.class)
+public class QuickSettingsShortcutOptionControllerTest {
+ private static final String PREF_KEY = "prefKey";
+ private static final ComponentName TARGET = new ComponentName("FakePackage", "FakeClass");
+ private static final String TARGET_FLATTEN = TARGET.flattenToString();
+ private static final ComponentName TARGET_TILE =
+ new ComponentName("FakePackage", "FakeTileClass");
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+ private final Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private QuickSettingsShortcutOptionController mController;
+ private ShortcutOptionPreference mShortcutOptionPreference;
+ private AccessibilityManager mAccessibilityManager;
+
+ private PreferenceScreen mPreferenceScreen;
+
+ @Before
+ public void setUp() {
+ SettingsShadowResources.overrideResource(
+ com.android.internal.R.bool.config_quickSettingsSupported, true);
+ mAccessibilityManager = AccessibilityTestUtils.setupMockAccessibilityManager(mContext);
+ mController = new QuickSettingsShortcutOptionController(
+ mContext, PREF_KEY);
+ mController.setShortcutTargets(Set.of(TARGET_FLATTEN));
+ mShortcutOptionPreference = new ShortcutOptionPreference(mContext);
+ mShortcutOptionPreference.setKey(PREF_KEY);
+ mPreferenceScreen = new PreferenceManager(mContext).createPreferenceScreen(mContext);
+ mPreferenceScreen.addPreference(mShortcutOptionPreference);
+ }
+
+ @Test
+ public void displayPreference_verifyScreenTextSet() {
+ mController.displayPreference(mPreferenceScreen);
+
+ assertThat(mShortcutOptionPreference.getTitle().toString()).isEqualTo(
+ mContext.getString(
+ R.string.accessibility_shortcut_edit_dialog_title_quick_settings));
+ assertThat(mShortcutOptionPreference.getSummary().toString()).isEqualTo(
+ mContext.getString(
+ R.string.accessibility_shortcut_edit_dialog_summary_quick_settings));
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void isShortcutAvailable_a11yQsShortcutFlagDisabled_returnsFalse() {
+ assertThat(mController.isShortcutAvailable()).isFalse();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void isShortcutAvailable_qsNotSupported_returnsFalse() {
+ SettingsShadowResources.overrideResource(
+ com.android.internal.R.bool.config_quickSettingsSupported, false);
+
+ assertThat(mController.isShortcutAvailable()).isFalse();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void isShortcutAvailable_qsTileProvided_returnsTrue() {
+ when(mAccessibilityManager.getA11yFeatureToTileMap(UserHandle.myUserId()))
+ .thenReturn(Map.of(TARGET, TARGET_TILE));
+
+ assertThat(mController.isShortcutAvailable()).isTrue();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void isShortcutAvailable_qsTileNotProvided_returnsFalse() {
+ when(mAccessibilityManager.getA11yFeatureToTileMap(UserHandle.myUserId()))
+ .thenReturn(Collections.emptyMap());
+
+ assertThat(mController.isShortcutAvailable()).isFalse();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void isShortcutAvailable_qsTileProvided_invalidUseCase_returnFalse() {
+ AccessibilityServiceInfo mockStandardA11yService =
+ AccessibilityTestUtils.createAccessibilityServiceInfo(
+ mContext, TARGET, /* isAlwaysOnService= */ false);
+ when(mAccessibilityManager.getA11yFeatureToTileMap(UserHandle.myUserId()))
+ .thenReturn(Map.of(TARGET, TARGET_TILE));
+ // setup target as a standard a11y service
+ when(mAccessibilityManager.getInstalledAccessibilityServiceList())
+ .thenReturn(List.of(mockStandardA11yService));
+
+ assertThat(mController.isShortcutAvailable()).isFalse();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void isShortcutAvailable_qsTileProvided_validUseCase_returnTrue() {
+ AccessibilityServiceInfo mockAlwaysOnA11yService =
+ AccessibilityTestUtils.createAccessibilityServiceInfo(
+ mContext, TARGET, /* isAlwaysOnService= */ true);
+ when(mAccessibilityManager.getA11yFeatureToTileMap(UserHandle.myUserId()))
+ .thenReturn(Map.of(TARGET, TARGET_TILE));
+ // setup target as a always-on a11y service
+ when(mAccessibilityManager.getInstalledAccessibilityServiceList())
+ .thenReturn(List.of(mockAlwaysOnA11yService));
+
+
+ assertThat(mController.isShortcutAvailable()).isTrue();
+ }
+
+ @Test
+ public void isChecked_targetUseQsShortcut_returnTrue() {
+ ShortcutUtils.optInValueToSettings(
+ mContext, ShortcutConstants.UserShortcutType.QUICK_SETTINGS, TARGET_FLATTEN);
+
+ assertThat(mController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void isChecked_targetNotUseQsShortcut_returnFalse() {
+ ShortcutUtils.optOutValueFromSettings(
+ mContext, ShortcutConstants.UserShortcutType.QUICK_SETTINGS, TARGET_FLATTEN);
+
+ assertThat(mController.isChecked()).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceControllerTest.java
index 1f7e019..1eeb944 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/SoftwareShortcutOptionPreferenceControllerTest.java
@@ -22,6 +22,8 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import android.accessibilityservice.AccessibilityServiceInfo;
@@ -30,14 +32,15 @@
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.os.Build;
+import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.text.SpannableStringBuilder;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.Flags;
import androidx.fragment.app.FragmentActivity;
@@ -48,18 +51,18 @@
import com.android.settings.SubSettings;
import com.android.settings.accessibility.AccessibilityButtonFragment;
import com.android.settings.accessibility.FloatingMenuSizePreferenceController;
+import com.android.settings.testutils.AccessibilityTestUtils;
import com.android.settings.utils.AnnotationSpan;
import com.android.settingslib.accessibility.AccessibilityUtils;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.Shadows;
-import org.xmlpull.v1.XmlPullParserException;
-import java.io.IOException;
import java.util.List;
import java.util.Set;
@@ -77,18 +80,23 @@
new ComponentName("FakePackage", "StandardA11yService");
private static final String SOFTWARE_SHORTCUT_SETTING_NAME =
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS;
-
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private Context mContext;
+ private AccessibilityManager mAccessibilityManager;
private TestSoftwareShortcutOptionPreferenceController mController;
@Before
public void setUp() {
mContext = spy(Robolectric.buildActivity(FragmentActivity.class).get());
+ mAccessibilityManager = AccessibilityTestUtils.setupMockAccessibilityManager(mContext);
- AccessibilityServiceInfo mAlwaysOnServiceInfo = createAccessibilityServiceInfo(
- TARGET_ALWAYS_ON_A11Y_SERVICE, /* isAlwaysOnService= */ true);
- AccessibilityServiceInfo mStandardServiceInfo = createAccessibilityServiceInfo(
- TARGET_STANDARD_A11Y_SERVICE, /* isAlwaysOnService= */ false);
+ AccessibilityServiceInfo mAlwaysOnServiceInfo =
+ AccessibilityTestUtils.createAccessibilityServiceInfo(
+ mContext, TARGET_ALWAYS_ON_A11Y_SERVICE, /* isAlwaysOnService= */ true);
+ AccessibilityServiceInfo mStandardServiceInfo =
+ AccessibilityTestUtils.createAccessibilityServiceInfo(
+ mContext, TARGET_STANDARD_A11Y_SERVICE, /* isAlwaysOnService= */ false);
AccessibilityManager am = mock(AccessibilityManager.class);
when(mContext.getSystemService(Context.ACCESSIBILITY_SERVICE)).thenReturn(am);
when(am.getInstalledAccessibilityServiceList()).thenReturn(
@@ -170,6 +178,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_enableShortcut_shortcutTurnedOn() {
String target = TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString();
mController.setShortcutTargets(Set.of(target));
@@ -185,6 +194,27 @@
}
@Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void enableShortcutForTargets_enableShortcut_callA11yManager() {
+ String target = TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString();
+ mController.setShortcutTargets(Set.of(target));
+ assertThat(ShortcutUtils.isComponentIdExistingInSettings(
+ mContext, ShortcutConstants.UserShortcutType.SOFTWARE, target
+ )).isFalse();
+
+ mController.enableShortcutForTargets(true);
+
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ true,
+ ShortcutConstants.UserShortcutType.SOFTWARE,
+ Set.of(target),
+ UserHandle.myUserId()
+ );
+ verifyNoMoreInteractions(mAccessibilityManager);
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_disableShortcut_shortcutTurnedOff() {
String target = TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString();
ShortcutUtils.optInValueToSettings(
@@ -202,6 +232,29 @@
}
@Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void enableShortcutForTargets_disableShortcut_callA11yManager() {
+ String target = TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString();
+ ShortcutUtils.optInValueToSettings(
+ mContext, ShortcutConstants.UserShortcutType.SOFTWARE, target);
+ assertThat(ShortcutUtils.isComponentIdExistingInSettings(
+ mContext, ShortcutConstants.UserShortcutType.SOFTWARE, target
+ )).isTrue();
+ mController.setShortcutTargets(Set.of(target));
+
+ mController.enableShortcutForTargets(false);
+
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ false,
+ ShortcutConstants.UserShortcutType.SOFTWARE,
+ Set.of(target),
+ UserHandle.myUserId()
+ );
+ verifyNoMoreInteractions(mAccessibilityManager);
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_enableShortcutWithMagnification_menuSizeIncreased() {
mController.setShortcutTargets(Set.of(TARGET_MAGNIFICATION));
@@ -216,6 +269,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_enableShortcutWithMagnification_userConfigureSmallMenuSize_menuSizeNotChanged() {
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_FLOATING_MENU_SIZE,
@@ -233,6 +287,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_enableAlwaysOnServiceShortcut_turnsOnAlwaysOnService() {
mController.setShortcutTargets(
Set.of(TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString()));
@@ -244,6 +299,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_disableAlwaysOnServiceShortcut_turnsOffAlwaysOnService() {
mController.setShortcutTargets(
Set.of(TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString()));
@@ -255,6 +311,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_enableStandardServiceShortcut_wontTurnOnService() {
mController.setShortcutTargets(
Set.of(TARGET_STANDARD_A11Y_SERVICE.flattenToString()));
@@ -266,6 +323,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_disableStandardServiceShortcutWithServiceOn_wontTurnOffService() {
mController.setShortcutTargets(
Set.of(TARGET_STANDARD_A11Y_SERVICE.flattenToString()));
@@ -288,32 +346,6 @@
assertThat(intent.getExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)).isEqualTo(page);
}
- private AccessibilityServiceInfo createAccessibilityServiceInfo(
- ComponentName componentName, boolean isAlwaysOnService) {
- final ApplicationInfo applicationInfo = new ApplicationInfo();
- applicationInfo.targetSdkVersion = Build.VERSION_CODES.R;
- final ServiceInfo serviceInfo = new ServiceInfo();
- applicationInfo.packageName = componentName.getPackageName();
- serviceInfo.packageName = componentName.getPackageName();
- serviceInfo.name = componentName.getClassName();
- serviceInfo.applicationInfo = applicationInfo;
-
- final ResolveInfo resolveInfo = new ResolveInfo();
- resolveInfo.serviceInfo = serviceInfo;
- try {
- final AccessibilityServiceInfo info = new AccessibilityServiceInfo(resolveInfo,
- mContext);
- info.setComponentName(componentName);
- if (isAlwaysOnService) {
- info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;
- }
- return info;
- } catch (XmlPullParserException | IOException e) {
- // Do nothing
- }
- return null;
- }
-
private static class TestSoftwareShortcutOptionPreferenceController
extends SoftwareShortcutOptionPreferenceController {
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionControllerTest.java
index 800640a..b5daac5 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/TripleTapShortcutOptionControllerTest.java
@@ -21,19 +21,32 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
import android.content.ComponentName;
import android.content.Context;
import android.icu.text.MessageFormat;
+import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.Flags;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
+import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityUtil;
+import com.android.settings.testutils.AccessibilityTestUtils;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -50,13 +63,17 @@
"com.android.server.accessibility.MagnificationController";
private static final String TARGET_FAKE =
new ComponentName("FakePackage", "FakeClass").flattenToString();
- private final Context mContext = ApplicationProvider.getApplicationContext();
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ private final Context mContext = spy(ApplicationProvider.getApplicationContext());
private TripleTapShortcutOptionController mController;
private ShortcutOptionPreference mShortcutOptionPreference;
+ private AccessibilityManager mAccessibilityManager;
private PreferenceScreen mPreferenceScreen;
@Before
public void setUp() {
+ mAccessibilityManager = AccessibilityTestUtils.setupMockAccessibilityManager(mContext);
mController = new TripleTapShortcutOptionController(mContext, PREF_KEY);
mController.setShortcutTargets(Set.of(TARGET_MAGNIFICATION));
mShortcutOptionPreference = new ShortcutOptionPreference(mContext);
@@ -147,19 +164,26 @@
@Test
public void isChecked_tripleTapConfigured_returnTrue() {
- mController.enableShortcutForTargets(true);
+ Settings.Secure.putInt(
+ mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
+ AccessibilityUtil.State.ON);
assertThat(mController.isChecked()).isTrue();
}
@Test
public void isChecked_tripleTapNotConfigured_returnFalse() {
- mController.enableShortcutForTargets(false);
+ Settings.Secure.putInt(
+ mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
+ AccessibilityUtil.State.OFF);
assertThat(mController.isChecked()).isFalse();
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_enableShortcut_settingUpdated() {
mController.enableShortcutForTargets(true);
@@ -172,6 +196,21 @@
}
@Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void enableShortcutForTargets_enableShortcut_callA11yManager() {
+ mController.enableShortcutForTargets(true);
+
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ true,
+ ShortcutConstants.UserShortcutType.TRIPLETAP,
+ Set.of(TARGET_MAGNIFICATION),
+ UserHandle.myUserId()
+ );
+ verifyNoMoreInteractions(mAccessibilityManager);
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_disableShortcut_settingUpdated() {
mController.enableShortcutForTargets(false);
@@ -182,4 +221,18 @@
AccessibilityUtil.State.OFF)
).isEqualTo(AccessibilityUtil.State.OFF);
}
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void enableShortcutForTargets_disableShortcut_callA11yManager() {
+ mController.enableShortcutForTargets(false);
+
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ false,
+ ShortcutConstants.UserShortcutType.TRIPLETAP,
+ Set.of(TARGET_MAGNIFICATION),
+ UserHandle.myUserId()
+ );
+ verifyNoMoreInteractions(mAccessibilityManager);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingersDoubleTapShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionControllerTest.java
similarity index 62%
rename from tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingersDoubleTapShortcutOptionControllerTest.java
rename to tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionControllerTest.java
index d27560b..716dcdb 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingersDoubleTapShortcutOptionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/TwoFingerDoubleTapShortcutOptionControllerTest.java
@@ -18,22 +18,29 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
import android.content.ComponentName;
import android.content.Context;
import android.icu.text.MessageFormat;
-import android.platform.test.annotations.RequiresFlagsDisabled;
-import android.platform.test.annotations.RequiresFlagsEnabled;
-import android.platform.test.flag.junit.CheckFlagsRule;
-import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
+import android.view.accessibility.AccessibilityManager;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
+import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.server.accessibility.Flags;
import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityUtil;
+import com.android.settings.testutils.AccessibilityTestUtils;
import org.junit.Before;
import org.junit.Rule;
@@ -44,26 +51,28 @@
import java.util.Set;
/**
- * Tests for {@link TwoFingersDoubleTapShortcutOptionController}
+ * Tests for {@link TwoFingerDoubleTapShortcutOptionController}
*/
@RunWith(RobolectricTestRunner.class)
-public class TwoFingersDoubleTapShortcutOptionControllerTest {
+public class TwoFingerDoubleTapShortcutOptionControllerTest {
private static final String PREF_KEY = "prefKey";
private static final String TARGET_MAGNIFICATION =
"com.android.server.accessibility.MagnificationController";
private static final String TARGET_FAKE =
new ComponentName("FakePackage", "FakeClass").flattenToString();
@Rule
- public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
- private final Context mContext = ApplicationProvider.getApplicationContext();
- private TwoFingersDoubleTapShortcutOptionController mController;
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ private final Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private AccessibilityManager mAccessibilityManager;
+ private TwoFingerDoubleTapShortcutOptionController mController;
private ShortcutOptionPreference mShortcutOptionPreference;
private PreferenceScreen mPreferenceScreen;
@Before
public void setUp() {
- mController = new TwoFingersDoubleTapShortcutOptionController(mContext, PREF_KEY);
+ mAccessibilityManager = AccessibilityTestUtils.setupMockAccessibilityManager(mContext);
+ mController = new TwoFingerDoubleTapShortcutOptionController(mContext, PREF_KEY);
mController.setShortcutTargets(Set.of(TARGET_MAGNIFICATION));
mShortcutOptionPreference = new ShortcutOptionPreference(mContext);
mShortcutOptionPreference.setKey(PREF_KEY);
@@ -84,30 +93,30 @@
2));
}
- @RequiresFlagsDisabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
@Test
+ @DisableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void isShortcutAvailable_featureFlagTurnedOff_returnFalse() {
assertThat(mController.isShortcutAvailable()).isFalse();
}
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
@Test
+ @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void isShortcutAvailable_multipleTargets_returnFalse() {
mController.setShortcutTargets(Set.of(TARGET_FAKE, TARGET_MAGNIFICATION));
assertThat(mController.isShortcutAvailable()).isFalse();
}
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
@Test
+ @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void isShortcutAvailable_magnificationTargetOnly_returnTrue() {
mController.setShortcutTargets(Set.of(TARGET_MAGNIFICATION));
assertThat(mController.isShortcutAvailable()).isTrue();
}
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
@Test
+ @EnableFlags(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void isShortcutAvailable_nonMagnificationTarget_returnFalse() {
mController.setShortcutTargets(Set.of(TARGET_FAKE));
@@ -116,19 +125,26 @@
@Test
public void isChecked_twoFingersDoubleTapConfigured_returnTrue() {
- mController.enableShortcutForTargets(true);
+ Settings.Secure.putInt(
+ mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED,
+ AccessibilityUtil.State.ON);
assertThat(mController.isChecked()).isTrue();
}
@Test
public void isChecked_twoFingersDoubleTapNotConfigured_returnFalse() {
- mController.enableShortcutForTargets(false);
+ Settings.Secure.putInt(
+ mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED,
+ AccessibilityUtil.State.OFF);
assertThat(mController.isChecked()).isFalse();
}
@Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_enableShortcut_settingUpdated() {
mController.enableShortcutForTargets(true);
@@ -141,6 +157,21 @@
}
@Test
+ @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void enableShortcutForTargets_enableShortcut_callA11yManager() {
+ mController.enableShortcutForTargets(true);
+
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ true,
+ ShortcutConstants.UserShortcutType.TWOFINGER_DOUBLETAP,
+ Set.of(TARGET_MAGNIFICATION),
+ UserHandle.myUserId()
+ );
+ verifyNoMoreInteractions(mAccessibilityManager);
+ }
+
+ @Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_disableShortcut_settingUpdated() {
mController.enableShortcutForTargets(false);
@@ -151,4 +182,18 @@
AccessibilityUtil.State.OFF)
).isEqualTo(AccessibilityUtil.State.OFF);
}
+
+ @Test
+ @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void enableShortcutForTargets_disableShortcut_callA11yManager() {
+ mController.enableShortcutForTargets(false);
+
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ false,
+ ShortcutConstants.UserShortcutType.TWOFINGER_DOUBLETAP,
+ Set.of(TARGET_MAGNIFICATION),
+ UserHandle.myUserId()
+ );
+ verifyNoMoreInteractions(mAccessibilityManager);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionControllerTest.java
index 48a90a7..511503a 100644
--- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/VolumeKeysShortcutOptionControllerTest.java
@@ -18,8 +18,18 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
import android.content.ComponentName;
import android.content.Context;
+import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.Flags;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
@@ -28,8 +38,10 @@
import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.internal.accessibility.util.ShortcutUtils;
import com.android.settings.R;
+import com.android.settings.testutils.AccessibilityTestUtils;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -45,7 +57,11 @@
private static final String PREF_KEY = "prefKey";
private static final String TARGET =
new ComponentName("FakePackage", "FakeClass").flattenToString();
- private final Context mContext = ApplicationProvider.getApplicationContext();
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+ private final Context mContext = spy(ApplicationProvider.getApplicationContext());
+ private AccessibilityManager mAccessibilityManager;
private VolumeKeysShortcutOptionController mController;
private ShortcutOptionPreference mShortcutOptionPreference;
@@ -53,6 +69,7 @@
@Before
public void setUp() {
+ mAccessibilityManager = AccessibilityTestUtils.setupMockAccessibilityManager(mContext);
mController = new VolumeKeysShortcutOptionController(
mContext, PREF_KEY);
mController.setShortcutTargets(Set.of(TARGET));
@@ -94,6 +111,7 @@
}
@Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_enableVolumeKeysShortcut_shortcutSet() {
mController.enableShortcutForTargets(true);
@@ -103,6 +121,21 @@
}
@Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void enableShortcutForTargets_enableVolumeKeysShortcut_callA11yManager() {
+ mController.enableShortcutForTargets(true);
+
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ true,
+ ShortcutConstants.UserShortcutType.HARDWARE,
+ Set.of(TARGET),
+ UserHandle.myUserId()
+ );
+ verifyNoMoreInteractions(mAccessibilityManager);
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
public void enableShortcutForTargets_disableVolumeKeysShortcut_shortcutNotSet() {
mController.enableShortcutForTargets(false);
@@ -110,4 +143,18 @@
ShortcutUtils.isComponentIdExistingInSettings(
mContext, ShortcutConstants.UserShortcutType.HARDWARE, TARGET)).isFalse();
}
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void enableShortcutForTargets_disableVolumeKeysShortcut_callA11yManager() {
+ mController.enableShortcutForTargets(false);
+
+ verify(mAccessibilityManager).enableShortcutsForTargets(
+ /* enable= */ false,
+ ShortcutConstants.UserShortcutType.HARDWARE,
+ Set.of(TARGET),
+ UserHandle.myUserId()
+ );
+ verifyNoMoreInteractions(mAccessibilityManager);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java
index ce52027..562212e 100644
--- a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java
@@ -19,6 +19,7 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -48,12 +49,13 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@@ -62,6 +64,8 @@
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowEntityHeaderController.class, ShadowSettingsLibUtils.class})
public class AppInfoWithHeaderTest {
+ @Rule
+ public final MockitoRule mMockitoRule = MockitoJUnit.rule();
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private EntityHeaderController mHeaderController;
@@ -71,7 +75,6 @@
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
mFactory = FakeFeatureFactory.setupForTest();
when(mFactory.metricsFeatureProvider.getMetricsCategory(any(Object.class)))
.thenReturn(MetricsProto.MetricsEvent.SETTINGS_APP_NOTIF_CATEGORY);
@@ -120,7 +123,6 @@
assertThat(mAppInfoWithHeader.mPackageRemovedCalled).isTrue();
}
- @Ignore("b/315135755")
@Test
public void noExtraUserHandleInIntent_retrieveAppEntryWithMyUserId()
throws PackageManager.NameNotFoundException {
@@ -133,10 +135,8 @@
when(mAppInfoWithHeader.mState.getEntry(packageName,
UserHandle.myUserId())).thenReturn(entry);
- when(mAppInfoWithHeader.mPm.getPackageInfoAsUser(entry.info.packageName,
- PackageManager.MATCH_DISABLED_COMPONENTS |
- PackageManager.GET_SIGNING_CERTIFICATES |
- PackageManager.GET_PERMISSIONS, UserHandle.myUserId())).thenReturn(
+ when(mAppInfoWithHeader.mPm.getPackageInfoAsUser(eq(entry.info.packageName),
+ any(), eq(UserHandle.myUserId()))).thenReturn(
mAppInfoWithHeader.mPackageInfo);
mAppInfoWithHeader.retrieveAppEntry();
@@ -146,7 +146,6 @@
assertThat(mAppInfoWithHeader.mAppEntry).isNotNull();
}
- @Ignore("b/315135755")
@Test
public void extraUserHandleInIntent_retrieveAppEntryWithMyUserId()
throws PackageManager.NameNotFoundException {
@@ -161,10 +160,8 @@
entry.info.packageName = packageName;
when(mAppInfoWithHeader.mState.getEntry(packageName, USER_ID)).thenReturn(entry);
- when(mAppInfoWithHeader.mPm.getPackageInfoAsUser(entry.info.packageName,
- PackageManager.MATCH_DISABLED_COMPONENTS |
- PackageManager.GET_SIGNING_CERTIFICATES |
- PackageManager.GET_PERMISSIONS, USER_ID)).thenReturn(
+ when(mAppInfoWithHeader.mPm.getPackageInfoAsUser(eq(entry.info.packageName),
+ any(), eq(USER_ID))).thenReturn(
mAppInfoWithHeader.mPackageInfo);
mAppInfoWithHeader.retrieveAppEntry();
@@ -232,6 +229,8 @@
}
@Override
- protected Intent getIntent() { return mIntent; }
+ protected Intent getIntent() {
+ return mIntent;
+ }
}
}
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java
index 1aedce5..6df8b8e 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java
@@ -253,6 +253,24 @@
}
@Test
+ public void intro_CheckNullPropsReturnsErrorString() {
+ setupFingerprintEnrollIntroWith(newTokenOnlyIntent());
+ when(mFingerprintManager.getSensorPropertiesInternal()).thenReturn(null);
+ final int result = mFingerprintEnrollIntroduction.checkMaxEnrolled();
+
+ assertThat(result).isEqualTo(R.string.fingerprint_intro_error_unknown);
+ }
+
+ @Test
+ public void intro_CheckEmptyPropsReturnsErrorString() {
+ setupFingerprintEnrollIntroWith(newTokenOnlyIntent());
+ when(mFingerprintManager.getSensorPropertiesInternal()).thenReturn(List.of());
+ final int result = mFingerprintEnrollIntroduction.checkMaxEnrolled();
+
+ assertThat(result).isEqualTo(R.string.fingerprint_intro_error_unknown);
+ }
+
+ @Test
public void intro_CheckGenerateChallenge() {
setupFingerprintEnrollIntroWith(newGkPwHandleAndFromSettingsIntent());
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHearingAidsPresetsControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHearingAidsPresetsControllerTest.java
new file mode 100644
index 0000000..c08bb98
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHearingAidsPresetsControllerTest.java
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import static android.bluetooth.BluetoothCsipSetCoordinator.GROUP_ID_INVALID;
+import static android.bluetooth.BluetoothHapClient.PRESET_INDEX_UNAVAILABLE;
+
+import static com.android.settings.bluetooth.BluetoothDetailsHearingDeviceController.KEY_HEARING_DEVICE_GROUP;
+import static com.android.settings.bluetooth.BluetoothDetailsHearingAidsPresetsController.KEY_HEARING_AIDS_PRESETS;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHapClient;
+import android.bluetooth.BluetoothHapPresetInfo;
+
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceCategory;
+
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.HapClientProfile;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Executor;
+
+/** Tests for {@link BluetoothDetailsHearingAidsPresetsController}. */
+@RunWith(RobolectricTestRunner.class)
+public class BluetoothDetailsHearingAidsPresetsControllerTest extends
+ BluetoothDetailsControllerTestBase {
+
+ private static final int TEST_PRESET_INDEX = 1;
+ private static final String TEST_PRESET_NAME = "test_preset";
+ private static final int TEST_HAP_GROUP_ID = 1;
+
+ @Rule
+ public final MockitoRule mockito = MockitoJUnit.rule();
+
+ @Mock
+ private LocalBluetoothManager mLocalManager;
+ @Mock
+ private LocalBluetoothProfileManager mProfileManager;
+ @Mock
+ private HapClientProfile mHapClientProfile;
+ @Mock
+ private CachedBluetoothDevice mCachedChildDevice;
+ @Mock
+ private BluetoothDevice mChildDevice;
+
+ private BluetoothDetailsHearingAidsPresetsController mController;
+
+ @Override
+ public void setUp() {
+ super.setUp();
+
+ when(mLocalManager.getProfileManager()).thenReturn(mProfileManager);
+ when(mProfileManager.getHapClientProfile()).thenReturn(mHapClientProfile);
+ when(mCachedDevice.getProfiles()).thenReturn(List.of(mHapClientProfile));
+ when(mCachedDevice.isConnectedHapClientDevice()).thenReturn(true);
+ when(mCachedChildDevice.getDevice()).thenReturn(mChildDevice);
+ PreferenceCategory deviceControls = new PreferenceCategory(mContext);
+ deviceControls.setKey(KEY_HEARING_DEVICE_GROUP);
+ mScreen.addPreference(deviceControls);
+ mController = new BluetoothDetailsHearingAidsPresetsController(mContext, mFragment,
+ mLocalManager, mCachedDevice, mLifecycle);
+ mController.init(mScreen);
+ }
+
+ @Test
+ public void isAvailable_supportHap_returnTrue() {
+ when(mCachedDevice.getProfiles()).thenReturn(List.of(mHapClientProfile));
+
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void isAvailable_notSupportHap_returnFalse() {
+ when(mCachedDevice.getProfiles()).thenReturn(new ArrayList<>());
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void onResume_registerCallback() {
+ mController.onResume();
+
+ verify(mHapClientProfile).registerCallback(any(Executor.class),
+ any(BluetoothHapClient.Callback.class));
+ }
+
+ @Test
+ public void onPause_unregisterCallback() {
+ mController.onPause();
+
+ verify(mHapClientProfile).unregisterCallback(any(BluetoothHapClient.Callback.class));
+ }
+
+ @Test
+ public void onPreferenceChange_keyMatched_verifyStatusUpdated() {
+ final ListPreference presetPreference = getTestPresetPreference(KEY_HEARING_AIDS_PRESETS);
+
+ boolean handled = mController.onPreferenceChange(presetPreference,
+ String.valueOf(TEST_PRESET_INDEX));
+
+ assertThat(handled).isTrue();
+ verify(presetPreference).setSummary(TEST_PRESET_NAME);
+ }
+
+ @Test
+ public void onPreferenceChange_keyNotMatched_doNothing() {
+ final ListPreference presetPreference = getTestPresetPreference("wrong_key");
+
+ boolean handled = mController.onPreferenceChange(
+ presetPreference, String.valueOf(TEST_PRESET_INDEX));
+
+ assertThat(handled).isFalse();
+ verify(presetPreference, never()).setSummary(any());
+ }
+
+ @Test
+ public void onPreferenceChange_supportGroupOperation_validGroupId_verifySelectPresetForGroup() {
+ final ListPreference presetPreference = getTestPresetPreference(KEY_HEARING_AIDS_PRESETS);
+ when(mHapClientProfile.supportsSynchronizedPresets(mDevice)).thenReturn(true);
+ when(mHapClientProfile.getHapGroup(mDevice)).thenReturn(TEST_HAP_GROUP_ID);
+
+ mController.onPreferenceChange(presetPreference, String.valueOf(TEST_PRESET_INDEX));
+
+ verify(mHapClientProfile).selectPresetForGroup(TEST_HAP_GROUP_ID, TEST_PRESET_INDEX);
+ }
+
+ @Test
+ public void onPreferenceChange_notSupportGroupOperation_verifySelectPreset() {
+ final ListPreference presetPreference = getTestPresetPreference(KEY_HEARING_AIDS_PRESETS);
+ when(mHapClientProfile.supportsSynchronizedPresets(mDevice)).thenReturn(false);
+ when(mHapClientProfile.getHapGroup(mDevice)).thenReturn(TEST_HAP_GROUP_ID);
+
+ mController.onPreferenceChange(presetPreference, String.valueOf(TEST_PRESET_INDEX));
+
+ verify(mHapClientProfile).selectPreset(mDevice, TEST_PRESET_INDEX);
+ }
+
+ @Test
+ public void onPreferenceChange_invalidGroupId_verifySelectPreset() {
+ final ListPreference presetPreference = getTestPresetPreference(KEY_HEARING_AIDS_PRESETS);
+ when(mHapClientProfile.supportsSynchronizedPresets(mDevice)).thenReturn(true);
+ when(mHapClientProfile.getHapGroup(mDevice)).thenReturn(GROUP_ID_INVALID);
+
+ mController.onPreferenceChange(presetPreference, String.valueOf(TEST_PRESET_INDEX));
+
+ verify(mHapClientProfile).selectPreset(mDevice, TEST_PRESET_INDEX);
+ }
+
+ @Test
+ public void onPreferenceChange_notSupportGroupOperation_hasSubDevice_verifyStatusUpdated() {
+ final ListPreference presetPreference = getTestPresetPreference(KEY_HEARING_AIDS_PRESETS);
+ when(mHapClientProfile.supportsSynchronizedPresets(mDevice)).thenReturn(false);
+ when(mCachedDevice.getSubDevice()).thenReturn(mCachedChildDevice);
+
+ mController.onPreferenceChange(presetPreference, String.valueOf(TEST_PRESET_INDEX));
+
+ verify(mHapClientProfile).selectPreset(mDevice, TEST_PRESET_INDEX);
+ verify(mHapClientProfile).selectPreset(mChildDevice, TEST_PRESET_INDEX);
+ }
+
+ @Test
+ public void onPreferenceChange_notSupportGroupOperation_hasMemberDevice_verifyStatusUpdated() {
+ final ListPreference presetPreference = getTestPresetPreference(KEY_HEARING_AIDS_PRESETS);
+ when(mHapClientProfile.supportsSynchronizedPresets(mDevice)).thenReturn(false);
+ when(mCachedDevice.getMemberDevice()).thenReturn(Set.of(mCachedChildDevice));
+
+ mController.onPreferenceChange(presetPreference, String.valueOf(TEST_PRESET_INDEX));
+
+ verify(mHapClientProfile).selectPreset(mDevice, TEST_PRESET_INDEX);
+ verify(mHapClientProfile).selectPreset(mChildDevice, TEST_PRESET_INDEX);
+ }
+
+ @Test
+ public void refresh_emptyPresetInfo_preferenceDisabled() {
+ when(mHapClientProfile.getAllPresetInfo(mDevice)).thenReturn(new ArrayList<>());
+
+ mController.refresh();
+
+ assertThat(mController.getPreference()).isNotNull();
+ assertThat(mController.getPreference().isEnabled()).isFalse();
+ }
+
+ @Test
+ public void refresh_validPresetInfo_preferenceEnabled() {
+ BluetoothHapPresetInfo info = getTestPresetInfo();
+ when(mHapClientProfile.getAllPresetInfo(mDevice)).thenReturn(List.of(info));
+
+ mController.refresh();
+
+ assertThat(mController.getPreference()).isNotNull();
+ assertThat(mController.getPreference().isEnabled()).isTrue();
+ }
+
+ @Test
+ public void refresh_invalidActivePresetIndex_summaryIsNull() {
+ BluetoothHapPresetInfo info = getTestPresetInfo();
+ when(mHapClientProfile.getAllPresetInfo(mDevice)).thenReturn(List.of(info));
+ when(mHapClientProfile.getActivePresetIndex(mDevice)).thenReturn(PRESET_INDEX_UNAVAILABLE);
+
+ mController.refresh();
+
+ assertThat(mController.getPreference()).isNotNull();
+ assertThat(mController.getPreference().getSummary()).isNull();
+ }
+
+ @Test
+ public void refresh_validActivePresetIndex_summaryIsNotNull() {
+ BluetoothHapPresetInfo info = getTestPresetInfo();
+ when(mHapClientProfile.getAllPresetInfo(mDevice)).thenReturn(List.of(info));
+ when(mHapClientProfile.getActivePresetIndex(mDevice)).thenReturn(TEST_PRESET_INDEX);
+
+ mController.refresh();
+
+ assertThat(mController.getPreference()).isNotNull();
+ assertThat(mController.getPreference().getSummary()).isNotNull();
+ }
+
+ private BluetoothHapPresetInfo getTestPresetInfo() {
+ BluetoothHapPresetInfo info = mock(BluetoothHapPresetInfo.class);
+ when(info.getName()).thenReturn(TEST_PRESET_NAME);
+ when(info.getIndex()).thenReturn(TEST_PRESET_INDEX);
+ return info;
+ }
+
+ private ListPreference getTestPresetPreference(String key) {
+ final ListPreference presetPreference = spy(new ListPreference(mContext));
+ when(presetPreference.findIndexOfValue(String.valueOf(TEST_PRESET_INDEX))).thenReturn(0);
+ when(presetPreference.getEntries()).thenReturn(new CharSequence[]{TEST_PRESET_NAME});
+ when(presetPreference.getEntryValues()).thenReturn(
+ new CharSequence[]{String.valueOf(TEST_PRESET_INDEX)});
+ presetPreference.setKey(key);
+ return presetPreference;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControllerTest.java
new file mode 100644
index 0000000..2a50f89
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControllerTest.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+
+import com.android.settings.accessibility.Flags;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+
+/** Tests for {@link BluetoothDetailsHearingDeviceController}. */
+@RunWith(RobolectricTestRunner.class)
+public class BluetoothDetailsHearingDeviceControllerTest extends
+ BluetoothDetailsControllerTestBase {
+
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
+ @Rule
+ public final MockitoRule mockito = MockitoJUnit.rule();
+
+ @Mock
+ private LocalBluetoothManager mLocalManager;
+ @Mock
+ private LocalBluetoothProfileManager mProfileManager;
+ @Mock
+ private BluetoothDetailsHearingDeviceController mHearingDeviceController;
+ @Mock
+ private BluetoothDetailsHearingAidsPresetsController mPresetsController;
+ @Mock
+ private BluetoothDetailsHearingDeviceSettingsController mHearingDeviceSettingsController;
+
+ @Override
+ public void setUp() {
+ super.setUp();
+
+ when(mLocalManager.getProfileManager()).thenReturn(mProfileManager);
+ mHearingDeviceController = new BluetoothDetailsHearingDeviceController(mContext,
+ mFragment, mLocalManager, mCachedDevice, mLifecycle);
+ mHearingDeviceController.setSubControllers(mHearingDeviceSettingsController,
+ mPresetsController);
+ }
+
+ @Test
+ public void isAvailable_hearingDeviceSettingsAvailable_returnTrue() {
+ when(mHearingDeviceSettingsController.isAvailable()).thenReturn(true);
+
+ assertThat(mHearingDeviceController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void isAvailable_presetsControlsAvailable_returnTrue() {
+ when(mPresetsController.isAvailable()).thenReturn(true);
+
+ assertThat(mHearingDeviceController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void isAvailable_noControllersAvailable_returnFalse() {
+ when(mHearingDeviceSettingsController.isAvailable()).thenReturn(false);
+ when(mPresetsController.isAvailable()).thenReturn(false);
+
+ assertThat(mHearingDeviceController.isAvailable()).isFalse();
+ }
+
+
+ @Test
+ public void initSubControllers_launchFromHearingDevicePage_hearingDeviceSettingsNotExist() {
+ mHearingDeviceController.initSubControllers(true);
+
+ assertThat(mHearingDeviceController.getSubControllers().stream().anyMatch(
+ c -> c instanceof BluetoothDetailsHearingDeviceSettingsController)).isFalse();
+ }
+
+ @Test
+ public void initSubControllers_notLaunchFromHearingDevicePage_hearingDeviceSettingsExist() {
+ mHearingDeviceController.initSubControllers(false);
+
+ assertThat(mHearingDeviceController.getSubControllers().stream().anyMatch(
+ c -> c instanceof BluetoothDetailsHearingDeviceSettingsController)).isTrue();
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_HEARING_AID_PRESET_CONTROL)
+ public void initSubControllers_flagEnabled_presetControllerExist() {
+ mHearingDeviceController.initSubControllers(false);
+
+ assertThat(mHearingDeviceController.getSubControllers().stream().anyMatch(
+ c -> c instanceof BluetoothDetailsHearingAidsPresetsController)).isTrue();
+ }
+
+ @Test
+ @RequiresFlagsDisabled(Flags.FLAG_ENABLE_HEARING_AID_PRESET_CONTROL)
+ public void initSubControllers_flagDisabled_presetControllerNotExist() {
+ mHearingDeviceController.initSubControllers(false);
+
+ assertThat(mHearingDeviceController.getSubControllers().stream().anyMatch(
+ c -> c instanceof BluetoothDetailsHearingAidsPresetsController)).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceSettingsControllerTest.java
similarity index 81%
rename from tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsControllerTest.java
rename to tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceSettingsControllerTest.java
index 364d299..b420717 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceControlsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHearingDeviceSettingsControllerTest.java
@@ -39,23 +39,24 @@
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
-/** Tests for {@link BluetoothDetailsHearingDeviceControlsController}. */
+/** Tests for {@link BluetoothDetailsHearingDeviceSettingsController}. */
@RunWith(RobolectricTestRunner.class)
-public class BluetoothDetailsHearingDeviceControlsControllerTest extends
+public class BluetoothDetailsHearingDeviceSettingsControllerTest extends
BluetoothDetailsControllerTestBase {
+
@Rule
public final MockitoRule mockito = MockitoJUnit.rule();
@Captor
private ArgumentCaptor<Intent> mIntentArgumentCaptor;
- private BluetoothDetailsHearingDeviceControlsController mController;
+ private BluetoothDetailsHearingDeviceSettingsController mController;
@Override
public void setUp() {
super.setUp();
FakeFeatureFactory.setupForTest();
- mController = new BluetoothDetailsHearingDeviceControlsController(mActivity, mFragment,
+ mController = new BluetoothDetailsHearingDeviceSettingsController(mActivity, mFragment,
mCachedDevice, mLifecycle);
when(mCachedDevice.isHearingAidDevice()).thenReturn(true);
}
@@ -75,12 +76,12 @@
}
@Test
- public void onPreferenceClick_hearingDeviceControlsKey_LaunchExpectedFragment() {
- final Preference hearingControlsKeyPreference = new Preference(mContext);
- hearingControlsKeyPreference.setKey(
- BluetoothDetailsHearingDeviceControlsController.KEY_HEARING_DEVICE_CONTROLS);
+ public void onPreferenceClick_hearingDeviceSettingsKey_launchExpectedFragment() {
+ final Preference hearingDeviceSettingsPreference = new Preference(mContext);
+ hearingDeviceSettingsPreference.setKey(
+ BluetoothDetailsHearingDeviceSettingsController.KEY_HEARING_DEVICE_SETTINGS);
- mController.onPreferenceClick(hearingControlsKeyPreference);
+ mController.onPreferenceClick(hearingDeviceSettingsPreference);
assertStartActivityWithExpectedFragment(mActivity,
AccessibilityHearingAidsFragment.class.getName());
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
index fc72c41..50aa771 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragmentTest.java
@@ -18,7 +18,7 @@
import static android.bluetooth.BluetoothDevice.BOND_NONE;
-import static com.android.settings.bluetooth.BluetoothDetailsHearingDeviceControlsController.KEY_DEVICE_CONTROLS_GENERAL_GROUP;
+import static com.android.settings.bluetooth.BluetoothDetailsHearingDeviceSettingsController.KEY_HEARING_DEVICE_SETTINGS;
import static com.google.common.truth.Truth.assertThat;
@@ -237,7 +237,7 @@
assertThat(controllerList.stream()
.anyMatch(controller -> controller.getPreferenceKey().equals(
- KEY_DEVICE_CONTROLS_GENERAL_GROUP))).isFalse();
+ KEY_HEARING_DEVICE_SETTINGS))).isFalse();
}
@Test
@@ -253,7 +253,7 @@
assertThat(controllerList.stream()
.anyMatch(controller -> controller.getPreferenceKey().equals(
- KEY_DEVICE_CONTROLS_GENERAL_GROUP))).isTrue();
+ KEY_HEARING_DEVICE_SETTINGS))).isTrue();
}
private InputDevice createInputDeviceWithMatchingBluetoothAddress() {
diff --git a/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectFragmentTest.java
index 17e0d1c..3ab0e69 100644
--- a/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectFragmentTest.java
@@ -17,6 +17,7 @@
package com.android.settings.dashboard.profileselector;
import static android.content.Intent.EXTRA_USER_ID;
+import static android.content.pm.UserInfo.FLAG_MAIN;
import static android.os.UserManager.USER_TYPE_FULL_SYSTEM;
import static android.os.UserManager.USER_TYPE_PROFILE_MANAGED;
import static android.os.UserManager.USER_TYPE_PROFILE_PRIVATE;
@@ -118,7 +119,9 @@
profileSelectFragment.setViewPager(viewPager);
mFragmentManager.beginTransaction().add(profileSelectFragment, "tag");
- assertThat(mFragment.getTabId(mActivity, bundle)).isEqualTo(WORK_TAB);
+ // The expected position '2' comes from the order in which fragments are added in
+ // TestProfileSelectFragment#getFragments()
+ assertThat(mFragment.getTabId(mActivity, bundle)).isEqualTo(2);
}
@Test
@@ -136,7 +139,9 @@
profileSelectFragment.setViewPager(viewPager);
mFragmentManager.beginTransaction().add(profileSelectFragment, "tag");
- assertThat(mFragment.getTabId(mActivity, bundle)).isEqualTo(PRIVATE_TAB);
+ // The expected position '1' comes from the order in which fragments are added in
+ // TestProfileSelectFragment#getFragments()
+ assertThat(mFragment.getTabId(mActivity, bundle)).isEqualTo(1);
}
@Test
@@ -170,7 +175,8 @@
@Test
public void getTabId_setPrivateId_getCorrectTab() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
final Bundle bundle = new Bundle();
bundle.putInt(EXTRA_USER_ID, 11);
mUserManager.setPrivateProfile(11, "private", 0);
@@ -200,9 +206,10 @@
@Test
public void testGetFragments_whenOnlyPersonal_returnsOneFragment() {
- mSetFlagsRule.disableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.disableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mUserManager.addProfile(
- new UserInfo(0, PRIMARY_USER_NAME, null, 0, USER_TYPE_FULL_SYSTEM));
+ new UserInfo(0, PRIMARY_USER_NAME, null, FLAG_MAIN, USER_TYPE_FULL_SYSTEM));
Fragment[] fragments = ProfileSelectFragment.getFragments(
mContext,
null /* bundle */,
@@ -215,7 +222,7 @@
@Test
public void testGetFragments_whenPrivateDisabled_returnsOneFragment() {
mUserManager.addProfile(
- new UserInfo(0, PRIMARY_USER_NAME, null, 0, USER_TYPE_FULL_SYSTEM));
+ new UserInfo(0, PRIMARY_USER_NAME, null, FLAG_MAIN, USER_TYPE_FULL_SYSTEM));
mUserManager.addProfile(
new UserInfo(11, PRIVATE_USER_NAME, null, 0, USER_TYPE_PROFILE_PRIVATE));
Fragment[] fragments = ProfileSelectFragment.getFragments(
@@ -235,9 +242,10 @@
@Test
public void testGetFragments_whenPrivateEnabled_returnsTwoFragments() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mUserManager.addProfile(
- new UserInfo(0, PRIMARY_USER_NAME, null, 0, USER_TYPE_FULL_SYSTEM));
+ new UserInfo(0, PRIMARY_USER_NAME, null, FLAG_MAIN, USER_TYPE_FULL_SYSTEM));
mUserManager.addProfile(
new UserInfo(11, PRIVATE_USER_NAME, null, 0, USER_TYPE_PROFILE_PRIVATE));
Fragment[] fragments = ProfileSelectFragment.getFragments(
@@ -257,9 +265,10 @@
@Test
public void testGetFragments_whenManagedProfile_returnsTwoFragments() {
- mSetFlagsRule.disableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.disableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mUserManager.addProfile(
- new UserInfo(0, PRIMARY_USER_NAME, null, 0, USER_TYPE_FULL_SYSTEM));
+ new UserInfo(0, PRIMARY_USER_NAME, null, FLAG_MAIN, USER_TYPE_FULL_SYSTEM));
mUserManager.addProfile(
new UserInfo(10, MANAGED_USER_NAME, null, 0, USER_TYPE_PROFILE_MANAGED));
Fragment[] fragments = ProfileSelectFragment.getFragments(
@@ -279,9 +288,10 @@
@Test
public void testGetFragments_whenAllProfiles_returnsThreeFragments() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mUserManager.addProfile(
- new UserInfo(0, PRIMARY_USER_NAME, null, 0, USER_TYPE_FULL_SYSTEM));
+ new UserInfo(0, PRIMARY_USER_NAME, null, FLAG_MAIN, USER_TYPE_FULL_SYSTEM));
mUserManager.addProfile(
new UserInfo(10, MANAGED_USER_NAME, null, 0, USER_TYPE_PROFILE_MANAGED));
mUserManager.addProfile(
@@ -303,9 +313,10 @@
@Test
public void testGetFragments_whenAvailableBundle_returnsFragmentsWithCorrectBundles() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mUserManager.addProfile(
- new UserInfo(0, PRIMARY_USER_NAME, null, 0, USER_TYPE_FULL_SYSTEM));
+ new UserInfo(0, PRIMARY_USER_NAME, null, FLAG_MAIN, USER_TYPE_FULL_SYSTEM));
mUserManager.addProfile(
new UserInfo(10, MANAGED_USER_NAME, null, 0, USER_TYPE_PROFILE_MANAGED));
mUserManager.addProfile(
@@ -343,10 +354,25 @@
@Override
public Fragment[] getFragments() {
+ Fragment personalFragment = new SettingsPreferenceFragmentTest.TestFragment();
+ Bundle personalBundle = new Bundle();
+ personalBundle.putInt(EXTRA_PROFILE, ProfileType.PERSONAL);
+ personalFragment.setArguments(personalBundle);
+
+ Fragment workFragment = new SettingsPreferenceFragmentTest.TestFragment();
+ Bundle workBundle = new Bundle();
+ workBundle.putInt(EXTRA_PROFILE, ProfileType.WORK);
+ workFragment.setArguments(workBundle);
+
+ Fragment privateFragment = new SettingsPreferenceFragmentTest.TestFragment();
+ Bundle privateBundle = new Bundle();
+ privateBundle.putInt(EXTRA_PROFILE, ProfileType.PRIVATE);
+ privateFragment.setArguments(privateBundle);
+
return new Fragment[]{
- new SettingsPreferenceFragmentTest.TestFragment(), //0
- new SettingsPreferenceFragmentTest.TestFragment(),
- new SettingsPreferenceFragmentTest.TestFragment()
+ personalFragment, //0
+ privateFragment,
+ workFragment
};
}
}
diff --git a/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationFragmentTest.java
index 22fec8f..3cc47a8 100644
--- a/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectLocationFragmentTest.java
@@ -16,6 +16,7 @@
package com.android.settings.dashboard.profileselector;
+import static android.content.pm.UserInfo.FLAG_MAIN;
import static android.os.UserManager.USER_TYPE_FULL_SYSTEM;
import static android.os.UserManager.USER_TYPE_PROFILE_MANAGED;
import static android.os.UserManager.USER_TYPE_PROFILE_PRIVATE;
@@ -60,7 +61,7 @@
public void setUp() {
mUserManager = ShadowUserManager.getShadow();
mUserManager.addProfile(
- new UserInfo(0, PERSONAL_PROFILE_NAME, null, 0, USER_TYPE_FULL_SYSTEM));
+ new UserInfo(0, PERSONAL_PROFILE_NAME, null, FLAG_MAIN, USER_TYPE_FULL_SYSTEM));
mUserManager.addProfile(
new UserInfo(1, WORK_PROFILE_NAME, null, 0, USER_TYPE_PROFILE_MANAGED));
mUserManager.addProfile(
diff --git a/tests/robotests/src/com/android/settings/development/quarantine/QuarantinedAppsScreenControllerTest.java b/tests/robotests/src/com/android/settings/development/quarantine/QuarantinedAppsScreenControllerTest.java
deleted file mode 100644
index a93e529..0000000
--- a/tests/robotests/src/com/android/settings/development/quarantine/QuarantinedAppsScreenControllerTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development.quarantine;
-
-import static org.mockito.AdditionalMatchers.aryEq;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.isNull;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.SuspendDialogInfo;
-import android.os.UserHandle;
-
-import androidx.test.core.app.ApplicationProvider;
-
-import com.android.settingslib.applications.ApplicationsState.AppEntry;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-
-@RunWith(RobolectricTestRunner.class)
-public class QuarantinedAppsScreenControllerTest {
- private static final String PREF_KEY = "quarantined_apps_screen";
- private static final String TEST_PACKAGE = "com.example.test.pkg";
- private static final int TEST_APP_ID = 1234;
- private static final int TEST_USER_ID = 10;
-
- private Context mContext;
- private QuarantinedAppsScreenController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(ApplicationProvider.getApplicationContext());
- mController = new QuarantinedAppsScreenController(mContext, PREF_KEY);
- }
-
- @Test
- public void testOnPreferenceChange() {
- final Context userContext = mock(Context.class);
- doReturn(userContext).when(mContext).createContextAsUser(
- eq(UserHandle.of(TEST_USER_ID)), anyInt());
- final PackageManager packageManager = mock(PackageManager.class);
- doReturn(packageManager).when(userContext).getPackageManager();
-
- final AppEntry entry = createAppEntry(TEST_PACKAGE, TEST_APP_ID, TEST_USER_ID);
- final QuarantinedAppPreference preference = new QuarantinedAppPreference(mContext, entry);
-
- mController.onPreferenceChange(preference, true);
- verify(packageManager).setPackagesSuspended(aryEq(new String[] {TEST_PACKAGE}), eq(true),
- isNull(), isNull(), any(SuspendDialogInfo.class),
- eq(PackageManager.FLAG_SUSPEND_QUARANTINED));
-
- mController.onPreferenceChange(preference, false);
- verify(packageManager).setPackagesSuspended(aryEq(new String[] {TEST_PACKAGE}), eq(false),
- isNull(), isNull(), isNull(),
- eq(PackageManager.FLAG_SUSPEND_QUARANTINED));
- }
-
- private AppEntry createAppEntry(String packageName, int appId, int userId) {
- final AppEntry entry = mock(AppEntry.class);
- entry.info = createApplicationInfo(packageName, appId, userId);
- entry.extraInfo = false;
- return entry;
- }
-
- private ApplicationInfo createApplicationInfo(String packageName, int appId, int userId) {
- final ApplicationInfo info = new ApplicationInfo();
- info.packageName = packageName;
- info.uid = UserHandle.getUid(userId, appId);
- return info;
- }
-}
diff --git a/tests/robotests/src/com/android/settings/gestures/OneHandedSettingsUtilsTest.java b/tests/robotests/src/com/android/settings/gestures/OneHandedSettingsUtilsTest.java
index 9559043..ee5f72e 100644
--- a/tests/robotests/src/com/android/settings/gestures/OneHandedSettingsUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/OneHandedSettingsUtilsTest.java
@@ -16,13 +16,20 @@
package com.android.settings.gestures;
+import static com.android.settings.gestures.OneHandedSettingsUtils.ONE_HANDED_MODE_TARGET_NAME;
+
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
+import android.view.accessibility.Flags;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@@ -30,7 +37,8 @@
@RunWith(RobolectricTestRunner.class)
public class OneHandedSettingsUtilsTest {
-
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private static final int OFF = 0;
private static final int ON = 1;
@@ -120,4 +128,66 @@
OneHandedSettingsUtils.OneHandedTimeout.LONG.getValue(), mCurrentUserId))
.isEqualTo(12);
}
+
+ @Test
+ public void getShortcutEnabled_a11yButtonVolumeKeysShortcutEnabled_returnTrue() {
+ setupShortcuts(
+ /* enableFab= */ true, /* enableVolumeKeys= */ true, /* enableQs=*/ false);
+
+ assertThat(OneHandedSettingsUtils.getShortcutEnabled(mContext)).isTrue();
+ }
+
+ @Test
+ public void getShortcutEnabled_a11yButtonShortcutEnabled_returnTrue() {
+ setupShortcuts(
+ /* enableFab= */ true, /* enableVolumeKeys= */ false, /* enableQs=*/ false);
+
+ assertThat(OneHandedSettingsUtils.getShortcutEnabled(mContext)).isTrue();
+ }
+
+ @Test
+ public void getShortcutEnabled_volumeKeysShortcutEnabled_returnTrue() {
+ setupShortcuts(
+ /* enableFab= */ false, /* enableVolumeKeys= */ true, /* enableQs=*/ false);
+
+ assertThat(OneHandedSettingsUtils.getShortcutEnabled(mContext)).isTrue();
+ }
+
+ @Test
+ public void getShortcutEnabled_noShortcutsEnabled_returnFalse() {
+ setupShortcuts(
+ /* enableFab= */ false, /* enableVolumeKeys= */ false, /* enableQs=*/ false);
+
+ assertThat(OneHandedSettingsUtils.getShortcutEnabled(mContext)).isFalse();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void getShortcutEnabled_qsShortcutEnabled_returnTrue() {
+ setupShortcuts(
+ /* enableFab= */ false, /* enableVolumeKeys= */ false, /* enableQs=*/ true);
+
+ assertThat(OneHandedSettingsUtils.getShortcutEnabled(mContext)).isTrue();
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void getShortcutEnabled_flagDisabled_qsShortcutEnabled_returnFalse() {
+ setupShortcuts(
+ /* enableFab= */ false, /* enableVolumeKeys= */ false, /* enableQs=*/ true);
+
+ assertThat(OneHandedSettingsUtils.getShortcutEnabled(mContext)).isFalse();
+ }
+
+ private void setupShortcuts(boolean enableFab, boolean enableVolumeKeys, boolean enableQs) {
+ setupShortcut(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, enableFab);
+ setupShortcut(Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, enableVolumeKeys);
+ setupShortcut(Settings.Secure.ACCESSIBILITY_QS_TARGETS, enableQs);
+ }
+
+ private void setupShortcut(String shortcutSettingKey, boolean enabled) {
+ final String targetName = enabled ? ONE_HANDED_MODE_TARGET_NAME : "";
+ Settings.Secure.putStringForUser(
+ mContext.getContentResolver(), shortcutSettingKey, targetName, mCurrentUserId);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/location/LocationForPrivateProfilePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationForPrivateProfilePreferenceControllerTest.java
new file mode 100644
index 0000000..bf6261f
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/location/LocationForPrivateProfilePreferenceControllerTest.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.location;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+
+import androidx.lifecycle.LifecycleOwner;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+import com.android.settingslib.RestrictedSwitchPreference;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+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.util.ReflectionHelpers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+public class LocationForPrivateProfilePreferenceControllerTest {
+
+ @Mock
+ private RestrictedSwitchPreference mPreference;
+ @Mock
+ private PreferenceScreen mScreen;
+ @Mock
+ private UserManager mUserManager;
+ @Mock
+ private LocationEnabler mEnabler;
+ @Mock
+ private UserHandle mUserHandle;
+
+ private Context mContext;
+ private LocationForPrivateProfilePreferenceController mController;
+ private LifecycleOwner mLifecycleOwner;
+ private Lifecycle mLifecycle;
+ private LocationSettings mLocationSettings;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(ApplicationProvider.getApplicationContext());
+ doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE);
+ mockPrivateProfile();
+ mLifecycleOwner = () -> mLifecycle;
+ mLifecycle = new Lifecycle(mLifecycleOwner);
+ mLocationSettings = spy(new LocationSettings());
+ when(mLocationSettings.getSettingsLifecycle()).thenReturn(mLifecycle);
+ mController = new LocationForPrivateProfilePreferenceController(mContext, "key");
+ mController.init(mLocationSettings);
+ ReflectionHelpers.setField(mController, "mLocationEnabler", mEnabler);
+ when(mScreen.findPreference(any())).thenReturn(mPreference);
+ final String key = mController.getPreferenceKey();
+ when(mPreference.getKey()).thenReturn(key);
+ when(mPreference.isVisible()).thenReturn(true);
+ }
+
+ @Test
+ public void handlePreferenceTreeClick_preferenceChecked_shouldSetRestrictionAndOnSummary() {
+ mController.displayPreference(mScreen);
+ when(mPreference.isChecked()).thenReturn(true);
+
+ mController.handlePreferenceTreeClick(mPreference);
+
+ verify(mUserManager)
+ .setUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, false, mUserHandle);
+ verify(mPreference).setSummary(R.string.switch_on_text);
+ }
+
+ @Test
+ public void handlePreferenceTreeClick_preferenceUnchecked_shouldSetRestritionAndOffSummary() {
+ mController.displayPreference(mScreen);
+ when(mPreference.isChecked()).thenReturn(false);
+
+ mController.handlePreferenceTreeClick(mPreference);
+
+ verify(mUserManager)
+ .setUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, true, mUserHandle);
+ verify(mPreference).setSummary(R.string.switch_off_text);
+ }
+
+ @Test
+ public void onLocationModeChanged_disabledByAdmin_shouldDisablePreference() {
+ mController.displayPreference(mScreen);
+ final EnforcedAdmin admin = mock(EnforcedAdmin.class);
+ doReturn(admin).when(mEnabler).getShareLocationEnforcedAdmin(anyInt());
+ doReturn(false).when(mEnabler).hasShareLocationRestriction(anyInt());
+
+ mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
+
+ verify(mPreference).setDisabledByAdmin(any());
+ }
+
+ @Test
+ public void onLocationModeChanged_locationOff_shouldDisablePreference() {
+ mController.displayPreference(mScreen);
+ doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt());
+ doReturn(false).when(mEnabler).hasShareLocationRestriction(anyInt());
+
+ mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_OFF, false);
+
+ verify(mPreference).setEnabled(false);
+ verify(mPreference).setChecked(false);
+ verify(mPreference).setSummary(R.string.location_app_permission_summary_location_off);
+ }
+
+ @Test
+ public void onLocationModeChanged_locationOn_shouldEnablePreference() {
+ mController.displayPreference(mScreen);
+ doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt());
+ doReturn(false).when(mEnabler).hasShareLocationRestriction(anyInt());
+ doReturn(true).when(mEnabler).isEnabled(anyInt());
+
+ mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
+
+ verify(mPreference, times(2)).setEnabled(true);
+ verify(mPreference).setSummary(R.string.switch_on_text);
+ }
+
+ @Test
+ public void onLocationModeChanged_noRestriction_shouldCheckedPreference() {
+ mController.displayPreference(mScreen);
+ doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt());
+ doReturn(false).when(mEnabler).hasShareLocationRestriction(anyInt());
+ doReturn(true).when(mEnabler).isEnabled(anyInt());
+
+ mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
+
+ verify(mPreference).setChecked(true);
+ }
+
+ @Test
+ public void onLocationModeChanged_hasRestriction_shouldCheckedPreference() {
+ mController.displayPreference(mScreen);
+ doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt());
+ doReturn(true).when(mEnabler).hasShareLocationRestriction(anyInt());
+
+ mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false);
+
+ verify(mPreference).setChecked(false);
+ }
+
+ private void mockPrivateProfile() {
+ final List<UserHandle> userProfiles = new ArrayList<>();
+ doReturn(9).when(mUserHandle).getIdentifier();
+ userProfiles.add(mUserHandle);
+ doReturn(userProfiles).when(mUserManager).getUserProfiles();
+ doReturn(new UserInfo(
+ 9,
+ "user 9",
+ "",
+ 0,
+ UserManager.USER_TYPE_PROFILE_PRIVATE)).when(mUserManager).getUserInfo(9);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/network/SubscriptionUtilRoboTest.java b/tests/robotests/src/com/android/settings/network/SubscriptionUtilRoboTest.java
index 2595510..ae504be 100644
--- a/tests/robotests/src/com/android/settings/network/SubscriptionUtilRoboTest.java
+++ b/tests/robotests/src/com/android/settings/network/SubscriptionUtilRoboTest.java
@@ -16,11 +16,11 @@
package com.android.settings.network;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertFalse;
-import static org.mockito.ArgumentMatchers.any;
import static org.robolectric.Shadows.shadowOf;
import android.content.Context;
@@ -59,19 +59,19 @@
}
@Test
- public void isConnectedToWifiOrDifferentSubId_hasDataOnSubId2_returnTrue() {
+ public void isConnectedToMobileDataWithDifferentSubId_hasDataOnSubId2_returnTrue() {
addNetworkTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
mShadowSubscriptionManager.setActiveDataSubscriptionId(SUBID_2);
- assertTrue(SubscriptionUtil.isConnectedToWifiOrDifferentSubId(mContext, SUBID_1));
+ assertTrue(SubscriptionUtil.isConnectedToMobileDataWithDifferentSubId(mContext, SUBID_1));
}
@Test
- public void isConnectedToWifiOrDifferentSubId_hasDataOnSubId1_returnFalse() {
+ public void isConnectedToMobileDataWithDifferentSubId_hasDataOnSubId1_returnFalse() {
addNetworkTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
mShadowSubscriptionManager.setActiveDataSubscriptionId(SUBID_1);
- assertFalse(SubscriptionUtil.isConnectedToWifiOrDifferentSubId(mContext, SUBID_1));
+ assertFalse(SubscriptionUtil.isConnectedToMobileDataWithDifferentSubId(mContext, SUBID_1));
}
private void addNetworkTransportType(int networkType) {
diff --git a/tests/robotests/src/com/android/settings/privatespace/HidePrivateSpaceControllerTest.java b/tests/robotests/src/com/android/settings/privatespace/HidePrivateSpaceControllerTest.java
new file mode 100644
index 0000000..7ff18a5
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/privatespace/HidePrivateSpaceControllerTest.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.privatespace;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.platform.test.flag.junit.SetFlagsRule;
+
+import androidx.fragment.app.FragmentActivity;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowApplication;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowAlertDialog.class})
+public class HidePrivateSpaceControllerTest {
+ @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ private static final String KEY = "private_space_hidden";
+ private static final String DETAIL_PAGE_KEY = "private_space_hidden_details";
+ private HidePrivateSpaceController mHidePrivateSpaceController;
+ private HidePrivateSpaceSummaryController mHidePrivateSpaceSummaryController;
+ private FragmentActivity mActivity;
+
+ @Before
+ public void setUp() {
+ Context context = RuntimeEnvironment.application;
+ mHidePrivateSpaceController = new HidePrivateSpaceController(context, DETAIL_PAGE_KEY);
+ mHidePrivateSpaceSummaryController = new HidePrivateSpaceSummaryController(context, KEY);
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
+ }
+
+ /** Tests that when flags enabled the controller is available. */
+ @Test
+ public void getAvailabilityStatus_flagEnabled_returnsAvailable() {
+ mSetFlagsRule.enableFlags(android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+
+ assertThat(mHidePrivateSpaceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ /** Tests that when flags disabled the controller is unsupported. */
+ @Test
+ public void getAvailabilityStatus_flagDisabled_returnsUnsupported() {
+ mSetFlagsRule.disableFlags(android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+
+ assertThat(mHidePrivateSpaceController.getAvailabilityStatus())
+ .isEqualTo(UNSUPPORTED_ON_DEVICE);
+ }
+
+ /** Tests that when hide toggle is enabled dialog is displayed. */
+ @Test
+ public void setChecked_enabled_showsDialog() {
+ mSetFlagsRule.enableFlags(android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+ mHidePrivateSpaceController.setChecked(true);
+
+ ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
+ assertThat(shadowAlertDialog).isNotNull();
+ assertThat(shadowAlertDialog.getTitle().toString())
+ .isEqualTo(mActivity.getString(R.string.private_space_hide_dialog_title));
+ assertThat(shadowAlertDialog.getMessage().toString())
+ .isEqualTo(mActivity.getString(R.string.private_space_hide_dialog_message));
+ }
+
+ /** Tests that when hide toggle is disabled dialog is not displayed. */
+ @Test
+ public void setChecked_disabled_NoDialogShown() {
+ mSetFlagsRule.enableFlags(android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+ mHidePrivateSpaceController.setChecked(false);
+
+ ShadowAlertDialog shadowAlertDialog = getShadowAlertDialog();
+ assertThat(shadowAlertDialog).isNull();
+ }
+
+ /** Tests that when hide toggle is enabled then isChecked returns true. */
+ @Test
+ public void setChecked_enabled_isCheckedIsTrue() {
+ mSetFlagsRule.enableFlags(android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+ mHidePrivateSpaceController.setChecked(true);
+ assertThat(mHidePrivateSpaceController.isChecked()).isTrue();
+ }
+
+ /** Tests that when hide toggle is disabled then isChecked returns false. */
+ @Test
+ public void setChecked_disabled_isCheckedIsFalse() {
+ mSetFlagsRule.enableFlags(android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+ mHidePrivateSpaceController.setChecked(false);
+ assertThat(mHidePrivateSpaceController.isChecked()).isFalse();
+ }
+
+ /** Tests that hide preference summary displays On when toggle is enabled. */
+ @Test
+ public void setChecked_enable_summaryShouldDisplayOn() {
+ mSetFlagsRule.enableFlags(android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+ mHidePrivateSpaceController.setChecked(true);
+
+ assertThat(mHidePrivateSpaceSummaryController.getSummary().toString()).isEqualTo("On");
+ }
+
+ /** Tests that hide preference summary displays Off when toggle is disabled. */
+ @Test
+ public void setChecked_disable_summaryShouldDisplayOff() {
+ mSetFlagsRule.enableFlags(android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+ mHidePrivateSpaceController.setChecked(false);
+
+ assertThat(mHidePrivateSpaceSummaryController.getSummary().toString()).isEqualTo("Off");
+ }
+
+ private ShadowAlertDialog getShadowAlertDialog() {
+ ShadowApplication shadowApplication =
+ Shadow.extract(ApplicationProvider.getApplicationContext());
+ ShadowAlertDialog shadowAlertDialog = shadowApplication.getLatestAlertDialog();
+ return shadowAlertDialog;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/security/ContentProtectionPreferenceUtilsTest.java b/tests/robotests/src/com/android/settings/security/ContentProtectionPreferenceUtilsTest.java
index 9b49434..d6f9abd 100644
--- a/tests/robotests/src/com/android/settings/security/ContentProtectionPreferenceUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/security/ContentProtectionPreferenceUtilsTest.java
@@ -16,47 +16,73 @@
package com.android.settings.security;
+import static android.view.contentprotection.flags.Flags.FLAG_MANAGE_DEVICE_POLICY_ENABLED;
+
import static com.android.internal.R.string.config_defaultContentProtectionService;
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.DeviceConfig;
import android.view.contentcapture.ContentCaptureManager;
import com.android.settings.testutils.shadow.ShadowDeviceConfig;
import org.junit.After;
-import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
+import java.util.List;
+
@RunWith(RobolectricTestRunner.class)
-@Config(
- shadows = {
- ShadowDeviceConfig.class,
- })
+@Config(shadows = {ShadowDeviceConfig.class})
public class ContentProtectionPreferenceUtilsTest {
+
private static final String PACKAGE_NAME = "com.test.package";
private static final ComponentName COMPONENT_NAME =
new ComponentName(PACKAGE_NAME, "TestClass");
- private String mConfigDefaultContentProtectionService = COMPONENT_NAME.flattenToString();
+ private static final UserHandle USER_HANDLE = UserHandle.of(111);
+
+ private static final int PROCESS_USER_ID = 222;
+
+ private final String mConfigDefaultContentProtectionService = COMPONENT_NAME.flattenToString();
+
+ @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Mock private Context mMockContext;
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- }
+ @Mock private Context mMockUserContext;
+
+ @Mock private UserManager mMockUserManager;
+
+ @Mock private DevicePolicyManager mMockDevicePolicyManager;
+
+ @Mock private UserInfo mMockUserInfo;
@After
public void tearDown() {
@@ -134,7 +160,6 @@
assertThat(ContentProtectionPreferenceUtils.isAvailable(mMockContext)).isFalse();
}
-
@Test
public void isAvailable_bothDisabled_false() {
DeviceConfig.setProperty(
@@ -145,4 +170,113 @@
assertThat(ContentProtectionPreferenceUtils.isAvailable(mMockContext)).isFalse();
}
+
+ @Test
+ public void getManagedProfile_noProfiles() {
+ when(mMockContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
+ when(mMockUserManager.getUserProfiles()).thenReturn(List.of());
+
+ UserHandle actual = ContentProtectionPreferenceUtils.getManagedProfile(mMockContext);
+
+ assertThat(actual).isNull();
+ }
+
+ @Test
+ public void getManagedProfile_notManaged() {
+ when(mMockContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
+ when(mMockUserManager.getUserProfiles()).thenReturn(List.of(USER_HANDLE));
+ when(mMockUserManager.getProcessUserId()).thenReturn(PROCESS_USER_ID);
+ when(mMockUserManager.getUserInfo(USER_HANDLE.getIdentifier())).thenReturn(mMockUserInfo);
+
+ UserHandle actual = ContentProtectionPreferenceUtils.getManagedProfile(mMockContext);
+
+ assertThat(actual).isNull();
+ verify(mMockUserInfo).isManagedProfile();
+ }
+
+ @Test
+ public void getManagedProfile_managed() {
+ when(mMockContext.getSystemService(UserManager.class)).thenReturn(mMockUserManager);
+ when(mMockUserManager.getUserProfiles()).thenReturn(List.of(USER_HANDLE));
+ when(mMockUserManager.getProcessUserId()).thenReturn(PROCESS_USER_ID);
+ when(mMockUserManager.getUserInfo(USER_HANDLE.getIdentifier())).thenReturn(mMockUserInfo);
+ when(mMockUserInfo.isManagedProfile()).thenReturn(true);
+
+ UserHandle actual = ContentProtectionPreferenceUtils.getManagedProfile(mMockContext);
+
+ assertThat(actual).isEqualTo(USER_HANDLE);
+ }
+
+ @Test
+ public void getContentProtectionPolicy_flagDisabled_managedProfileNull() {
+ mSetFlagsRule.disableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+
+ int actual =
+ ContentProtectionPreferenceUtils.getContentProtectionPolicy(
+ mMockContext, /* managedProfile= */ null);
+
+ assertThat(actual).isEqualTo(DevicePolicyManager.CONTENT_PROTECTION_DISABLED);
+ }
+
+ @Test
+ public void getContentProtectionPolicy_flagDisabled_managedProfileNotNull() {
+ mSetFlagsRule.disableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+
+ int actual =
+ ContentProtectionPreferenceUtils.getContentProtectionPolicy(
+ mMockContext, USER_HANDLE);
+
+ assertThat(actual).isEqualTo(DevicePolicyManager.CONTENT_PROTECTION_DISABLED);
+ }
+
+ @Test
+ public void getContentProtectionPolicy_flagEnabled_managedProfileNull() throws Exception {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ when(mMockContext.getSystemService(DevicePolicyManager.class))
+ .thenReturn(mMockDevicePolicyManager);
+ when(mMockDevicePolicyManager.getContentProtectionPolicy(/* admin= */ null))
+ .thenReturn(DevicePolicyManager.CONTENT_PROTECTION_ENABLED);
+
+ int actual =
+ ContentProtectionPreferenceUtils.getContentProtectionPolicy(
+ mMockContext, /* managedProfile= */ null);
+
+ assertThat(actual).isEqualTo(DevicePolicyManager.CONTENT_PROTECTION_ENABLED);
+ verify(mMockContext, never()).createPackageContextAsUser(anyString(), anyInt(), any());
+ }
+
+ @Test
+ public void getContentProtectionPolicy_flagEnabled_managedProfileNotNull() throws Exception {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ when(mMockContext.getPackageName()).thenReturn(PACKAGE_NAME);
+ when(mMockContext.createPackageContextAsUser(PACKAGE_NAME, /* flags= */ 0, USER_HANDLE))
+ .thenReturn(mMockUserContext);
+ when(mMockUserContext.getSystemService(DevicePolicyManager.class))
+ .thenReturn(mMockDevicePolicyManager);
+ when(mMockDevicePolicyManager.getContentProtectionPolicy(/* admin= */ null))
+ .thenReturn(DevicePolicyManager.CONTENT_PROTECTION_ENABLED);
+
+ int actual =
+ ContentProtectionPreferenceUtils.getContentProtectionPolicy(
+ mMockContext, USER_HANDLE);
+
+ assertThat(actual).isEqualTo(DevicePolicyManager.CONTENT_PROTECTION_ENABLED);
+ }
+
+ @Test
+ public void getContentProtectionPolicy_flagEnabled_managedProfileNotNull_nameNotFound()
+ throws Exception {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ when(mMockContext.getPackageName()).thenReturn(PACKAGE_NAME);
+ when(mMockContext.createPackageContextAsUser(PACKAGE_NAME, /* flags= */ 0, USER_HANDLE))
+ .thenThrow(new PackageManager.NameNotFoundException());
+
+ assertThrows(
+ IllegalStateException.class,
+ () ->
+ ContentProtectionPreferenceUtils.getContentProtectionPolicy(
+ mMockContext, USER_HANDLE));
+
+ verify(mMockContext, never()).getSystemService(DevicePolicyManager.class);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/security/ContentProtectionTogglePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/ContentProtectionTogglePreferenceControllerTest.java
index 50e9a5c..075ac6c 100644
--- a/tests/robotests/src/com/android/settings/security/ContentProtectionTogglePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/ContentProtectionTogglePreferenceControllerTest.java
@@ -15,20 +15,25 @@
*/
package com.android.settings.security;
+import static android.view.contentprotection.flags.Flags.FLAG_MANAGE_DEVICE_POLICY_ENABLED;
+
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.security.ContentProtectionTogglePreferenceController.KEY_CONTENT_PROTECTION_PREFERENCE;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.admin.DevicePolicyManager;
import android.content.Context;
+import android.os.UserHandle;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
+import androidx.annotation.Nullable;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
@@ -42,37 +47,40 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
-@Config(
- shadows = {
- ShadowUtils.class,
- })
+@Config(shadows = {ShadowUtils.class})
public class ContentProtectionTogglePreferenceControllerTest {
- @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
- @Mock private PreferenceScreen mMockScreen;
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
- private RestrictedLockUtils.EnforcedAdmin mAdmin;
- private SettingsMainSwitchPreference mSwitchPreference;
private final Context mContext = ApplicationProvider.getApplicationContext();
- private ContentProtectionTogglePreferenceController mController;
+
+ @Mock private PreferenceScreen mMockPreferenceScreen;
+
+ @Mock private SettingsMainSwitchPreference mMockSwitchPreference;
+
+ @Nullable private RestrictedLockUtils.EnforcedAdmin mEnforcedAdmin;
+
+ @DevicePolicyManager.ContentProtectionPolicy
+ private int mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_DISABLED;
+
+ private TestContentProtectionTogglePreferenceController mController;
+
private int mSettingBackupValue;
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
mController = new TestContentProtectionTogglePreferenceController();
- mSwitchPreference = new SettingsMainSwitchPreference(mContext);
- when(mMockScreen.findPreference(mController.getPreferenceKey()))
- .thenReturn(mSwitchPreference);
+ SettingsMainSwitchPreference switchPreference = new SettingsMainSwitchPreference(mContext);
+ when(mMockPreferenceScreen.findPreference(mController.getPreferenceKey()))
+ .thenReturn(switchPreference);
mSettingBackupValue = getContentProtectionGlobalSetting();
Settings.Global.putInt(mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, 0);
}
@@ -87,89 +95,223 @@
}
@Test
- public void isAvailable_alwaysAvailable() {
+ public void constructor_flagDisabled_doesNotFetchData() {
+ mSetFlagsRule.disableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mController = new TestContentProtectionTogglePreferenceController();
+
+ assertThat(mController.mCounterGetManagedProfile).isEqualTo(0);
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(0);
+ assertThat(mController.mCounterGetContentProtectionPolicy).isEqualTo(0);
+ }
+
+ @Test
+ public void constructor_flagEnabled_fetchesData() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mController = new TestContentProtectionTogglePreferenceController();
+
+ assertThat(mController.mCounterGetManagedProfile).isEqualTo(1);
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(1);
+ assertThat(mController.mCounterGetContentProtectionPolicy).isEqualTo(1);
+ }
+
+ @Test
+ public void getAvailabilityStatus_available() {
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
assertThat(mController.isAvailable()).isTrue();
}
@Test
- public void displayPreference() {
- setUpFullyManagedMode();
- SettingsMainSwitchPreference mockSwitchPreference =
- mock(SettingsMainSwitchPreference.class);
- when(mMockScreen.findPreference(any())).thenReturn(mockSwitchPreference);
- when(mockSwitchPreference.getKey()).thenReturn(mController.getPreferenceKey());
-
- mController = new TestContentProtectionTogglePreferenceController();
- mController.displayPreference(mMockScreen);
-
- assertThat(mockSwitchPreference).isNotNull();
- }
-
- @Test
- public void updateState_notFullyManagedMode_enabled() {
- SettingsMainSwitchPreference mockSwitchPreference =
- mock(SettingsMainSwitchPreference.class);
- when(mMockScreen.findPreference(any())).thenReturn(mockSwitchPreference);
- when(mockSwitchPreference.getKey()).thenReturn(mController.getPreferenceKey());
-
- mController = new TestContentProtectionTogglePreferenceController();
- mController.displayPreference(mMockScreen);
- mController.updateState(mockSwitchPreference);
-
- verify(mockSwitchPreference, never()).setDisabledByAdmin(any());
- }
-
- @Test
- public void updateState_fullyManagedMode_disabled() {
- setUpFullyManagedMode();
- SettingsMainSwitchPreference mockSwitchPreference =
- mock(SettingsMainSwitchPreference.class);
- when(mMockScreen.findPreference(any())).thenReturn(mockSwitchPreference);
- when(mockSwitchPreference.getKey()).thenReturn(mController.getPreferenceKey());
-
- mController = new TestContentProtectionTogglePreferenceController();
- mController.displayPreference(mMockScreen);
- mController.updateState(mockSwitchPreference);
-
- verify(mockSwitchPreference).setDisabledByAdmin(mAdmin);
- }
-
- @Test
- public void isChecked_settingTurnOn() {
+ public void isChecked_noEnforcedAdmin_readsSettingsTrue() {
Settings.Global.putInt(mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, 1);
assertThat(mController.isChecked()).isTrue();
}
@Test
- public void isChecked_fullyManagedMode_settingTurnOff() {
- setUpFullyManagedMode();
- Settings.Global.putInt(mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, 1);
- SettingsMainSwitchPreference mockSwitchPreference =
- mock(SettingsMainSwitchPreference.class);
- when(mMockScreen.findPreference(any())).thenReturn(mockSwitchPreference);
- when(mockSwitchPreference.getKey()).thenReturn(mController.getPreferenceKey());
-
- mController = new TestContentProtectionTogglePreferenceController();
- mController.displayPreference(mMockScreen);
- mController.updateState(mockSwitchPreference);
-
- assertThat(mController.isChecked()).isFalse();
- }
-
- @Test
- public void isChecked_settingTurnOff() {
+ public void isChecked_noEnforcedAdmin_readsSettingsFalse() {
Settings.Global.putInt(
mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, -1);
assertThat(mController.isChecked()).isFalse();
- assertThat(getContentProtectionGlobalSetting()).isEqualTo(-1);
}
@Test
- public void isChecked_settingDefaultOn() {
+ public void isChecked_noEnforcedAdmin_readsSettingsDefaultTrue() {
assertThat(mController.isChecked()).isTrue();
- assertThat(getContentProtectionGlobalSetting()).isEqualTo(0);
+ }
+
+ @Test
+ public void isChecked_enforcedAdmin_flagDisabled_false() {
+ mSetFlagsRule.disableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mEnforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ Settings.Global.putInt(mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, 1);
+ setupForUpdateState();
+ mController.updateState(mMockSwitchPreference);
+
+ assertThat(mController.isChecked()).isFalse();
+ }
+
+ @Test
+ public void isChecked_enforcedAdmin_flagEnabled_policyDisabled_false() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mEnforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_DISABLED;
+ Settings.Global.putInt(mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, 1);
+ mController = new TestContentProtectionTogglePreferenceController();
+
+ assertThat(mController.isChecked()).isFalse();
+ }
+
+ @Test
+ public void isChecked_enforcedAdmin_flagEnabled_policyEnabled_true() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mEnforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_ENABLED;
+ Settings.Global.putInt(
+ mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, -1);
+ mController = new TestContentProtectionTogglePreferenceController();
+
+ assertThat(mController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void isChecked_enforcedAdmin_flagEnabled_policyNotControlled_readsSettingsTrue() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mEnforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_NOT_CONTROLLED_BY_POLICY;
+ Settings.Global.putInt(mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, 1);
+ mController = new TestContentProtectionTogglePreferenceController();
+
+ assertThat(mController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void isChecked_enforcedAdmin_flagEnabled_policyNotControlled_readsSettingsFalse() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mEnforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_NOT_CONTROLLED_BY_POLICY;
+ Settings.Global.putInt(
+ mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, -1);
+ mController = new TestContentProtectionTogglePreferenceController();
+
+ assertThat(mController.isChecked()).isFalse();
+ }
+
+ @Test
+ public void isChecked_enforcedAdmin_flagEnabled_policyNotControlled_readsSettingsDefaultTrue() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mEnforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_NOT_CONTROLLED_BY_POLICY;
+ mController = new TestContentProtectionTogglePreferenceController();
+
+ assertThat(mController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void displayPreference() {
+ setupForDisplayPreference();
+
+ mController.displayPreference(mMockPreferenceScreen);
+
+ verify(mMockSwitchPreference).addOnSwitchChangeListener(mController);
+ }
+
+ @Test
+ public void updateState_flagDisabled_noEnforcedAdmin() {
+ mSetFlagsRule.disableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ setupForUpdateState();
+
+ mController.updateState(mMockSwitchPreference);
+
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(1);
+ verify(mMockSwitchPreference, never()).setDisabledByAdmin(any());
+ }
+
+ @Test
+ public void updateState_flagDisabled_enforcedAdmin() {
+ mSetFlagsRule.disableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mEnforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ setupForUpdateState();
+
+ mController.updateState(mMockSwitchPreference);
+
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(1);
+ verify(mMockSwitchPreference).setDisabledByAdmin(mEnforcedAdmin);
+ }
+
+ @Test
+ public void updateState_flagEnabled_noEnforcedAdmin_policyDisabled() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_DISABLED;
+ setupForUpdateState();
+
+ mController.updateState(mMockSwitchPreference);
+
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(1);
+ verify(mMockSwitchPreference, never()).setDisabledByAdmin(any());
+ }
+
+ @Test
+ public void updateState_flagEnabled_noEnforcedAdmin_policyEnabled() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_ENABLED;
+ setupForUpdateState();
+
+ mController.updateState(mMockSwitchPreference);
+
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(1);
+ verify(mMockSwitchPreference, never()).setDisabledByAdmin(any());
+ }
+
+ @Test
+ public void updateState_flagEnabled_noEnforcedAdmin_policyNotControlled() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_NOT_CONTROLLED_BY_POLICY;
+ setupForUpdateState();
+
+ mController.updateState(mMockSwitchPreference);
+
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(1);
+ verify(mMockSwitchPreference, never()).setDisabledByAdmin(any());
+ }
+
+ @Test
+ public void updateState_flagEnabled_enforcedAdmin_policyDisabled() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mEnforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_DISABLED;
+ setupForUpdateState();
+
+ mController.updateState(mMockSwitchPreference);
+
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(1);
+ verify(mMockSwitchPreference).setDisabledByAdmin(mEnforcedAdmin);
+ }
+
+ @Test
+ public void updateState_flagEnabled_enforcedAdmin_policyEnabled() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mEnforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_ENABLED;
+ setupForUpdateState();
+
+ mController.updateState(mMockSwitchPreference);
+
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(1);
+ verify(mMockSwitchPreference).setDisabledByAdmin(mEnforcedAdmin);
+ }
+
+ @Test
+ public void updateState_flagEnabled_enforcedAdmin_policyNotControlled() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mEnforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_NOT_CONTROLLED_BY_POLICY;
+ setupForUpdateState();
+
+ mController.updateState(mMockSwitchPreference);
+
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(1);
+ verify(mMockSwitchPreference, never()).setDisabledByAdmin(any());
}
@Test
@@ -193,20 +335,49 @@
mContext.getContentResolver(), KEY_CONTENT_PROTECTION_PREFERENCE, 0);
}
- private void setUpFullyManagedMode() {
- mAdmin = new RestrictedLockUtils.EnforcedAdmin();
+ private void setupForDisplayPreference() {
+ when(mMockPreferenceScreen.findPreference(any())).thenReturn(mMockSwitchPreference);
+ when(mMockSwitchPreference.getKey()).thenReturn(mController.getPreferenceKey());
+ mController = new TestContentProtectionTogglePreferenceController();
+ }
+
+ private void setupForUpdateState() {
+ setupForDisplayPreference();
+ mController.displayPreference(mMockPreferenceScreen);
}
private class TestContentProtectionTogglePreferenceController
extends ContentProtectionTogglePreferenceController {
+ public int mCounterGetManagedProfile;
+
+ public int mCounterGetEnforcedAdmin;
+
+ public int mCounterGetContentProtectionPolicy;
+
TestContentProtectionTogglePreferenceController() {
super(ContentProtectionTogglePreferenceControllerTest.this.mContext, "key");
}
@Override
+ @Nullable
+ protected UserHandle getManagedProfile() {
+ mCounterGetManagedProfile++;
+ return null;
+ }
+
+ @Override
+ @Nullable
protected RestrictedLockUtils.EnforcedAdmin getEnforcedAdmin() {
- return mAdmin;
+ mCounterGetEnforcedAdmin++;
+ return mEnforcedAdmin;
+ }
+
+ @Override
+ @DevicePolicyManager.ContentProtectionPolicy
+ protected int getContentProtectionPolicy(@Nullable UserHandle userHandle) {
+ mCounterGetContentProtectionPolicy++;
+ return mContentProtectionPolicy;
}
}
}
diff --git a/tests/robotests/src/com/android/settings/security/ContentProtectionWorkSwitchControllerTest.java b/tests/robotests/src/com/android/settings/security/ContentProtectionWorkSwitchControllerTest.java
index 8d35e4d..3d367de 100644
--- a/tests/robotests/src/com/android/settings/security/ContentProtectionWorkSwitchControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/ContentProtectionWorkSwitchControllerTest.java
@@ -16,19 +16,22 @@
package com.android.settings.security;
+import static android.view.contentprotection.flags.Flags.FLAG_MANAGE_DEVICE_POLICY_ENABLED;
+
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.os.UserHandle;
+import android.platform.test.flag.junit.SetFlagsRule;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -39,55 +42,169 @@
import com.android.settingslib.RestrictedSwitchPreference;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class ContentProtectionWorkSwitchControllerTest {
+
private static final UserHandle TEST_USER_HANDLE = UserHandle.of(10);
+ @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
private final Context mContext = ApplicationProvider.getApplicationContext();
@Mock private PreferenceScreen mMockPreferenceScreen;
- private ContentProtectionWorkSwitchController mController;
- private UserHandle mManagedProfileUserHandle;
- private RestrictedLockUtils.EnforcedAdmin mEnforcedAdmin;
+
+ @Mock private RestrictedSwitchPreference mMockSwitchPreference;
+
+ @Nullable private UserHandle mManagedProfileUserHandle;
+
+ @Nullable private RestrictedLockUtils.EnforcedAdmin mEnforcedAdmin;
+
+ @DevicePolicyManager.ContentProtectionPolicy
+ private int mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_DISABLED;
+
+ private TestContentProtectionWorkSwitchController mController;
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
mController = new TestContentProtectionWorkSwitchController();
}
@Test
- public void isAvailable_managedProfile_available() {
+ public void constructor_flagDisabled_doesNotFetchData() {
+ mSetFlagsRule.disableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mController = new TestContentProtectionWorkSwitchController();
+
+ assertThat(mController.mCounterGetManagedProfile).isEqualTo(0);
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(0);
+ assertThat(mController.mCounterGetContentProtectionPolicy).isEqualTo(0);
+ }
+
+ @Test
+ public void constructor_flagEnabled_fetchesManagedProfile() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mController = new TestContentProtectionWorkSwitchController();
+
+ assertThat(mController.mCounterGetManagedProfile).isEqualTo(1);
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(0);
+ assertThat(mController.mCounterGetContentProtectionPolicy).isEqualTo(0);
+ }
+
+ @Test
+ public void constructor_flagEnabled_withManagedProfile_fetchesPolicy() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
mManagedProfileUserHandle = TEST_USER_HANDLE;
+ mController = new TestContentProtectionWorkSwitchController();
+
+ assertThat(mController.mCounterGetManagedProfile).isEqualTo(1);
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(0);
+ assertThat(mController.mCounterGetContentProtectionPolicy).isEqualTo(1);
+ }
+
+ @Test
+ public void getAvailabilityStatus_flagDisabled_managedProfile_available() {
+ mSetFlagsRule.disableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mManagedProfileUserHandle = TEST_USER_HANDLE;
+ mController = new TestContentProtectionWorkSwitchController();
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
assertThat(mController.isAvailable()).isTrue();
}
@Test
- public void isAvailable_noManagedProfile_notAvailable() {
- mManagedProfileUserHandle = null;
+ public void getAvailabilityStatus_flagDisabled_noManagedProfile_unavailable() {
+ mSetFlagsRule.disableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mController = new TestContentProtectionWorkSwitchController();
assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
assertThat(mController.isAvailable()).isFalse();
}
@Test
- public void isChecked_noManagedProfile_alwaysOff() {
- mManagedProfileUserHandle = null;
+ public void getAvailabilityStatus_flagEnabled_managedProfile_policyDisabled_available() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mManagedProfileUserHandle = TEST_USER_HANDLE;
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_DISABLED;
+ mController = new TestContentProtectionWorkSwitchController();
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void getAvailabilityStatus_flagEnabled_managedProfile_policyEnabled_available() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mManagedProfileUserHandle = TEST_USER_HANDLE;
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_ENABLED;
+ mController = new TestContentProtectionWorkSwitchController();
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void getAvailabilityStatus_flagEnabled_managedProfile_policyNotControlled_unavailable() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mManagedProfileUserHandle = TEST_USER_HANDLE;
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_NOT_CONTROLLED_BY_POLICY;
+ mController = new TestContentProtectionWorkSwitchController();
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void getAvailabilityStatus_flagEnabled_noManagedProfile_unavailable() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mController = new TestContentProtectionWorkSwitchController();
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void isChecked_flagDisabled_false() {
+ mSetFlagsRule.disableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mController = new TestContentProtectionWorkSwitchController();
assertThat(mController.isChecked()).isFalse();
}
@Test
- public void isChecked_managedProfile_alwaysOff() {
+ public void isChecked_flagEnabled_policyEnabled_true() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
mManagedProfileUserHandle = TEST_USER_HANDLE;
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_ENABLED;
+ mController = new TestContentProtectionWorkSwitchController();
+
+ assertThat(mController.isChecked()).isTrue();
+ }
+
+ @Test
+ public void isChecked_flagEnabled_policyDisabled_false() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mManagedProfileUserHandle = TEST_USER_HANDLE;
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_DISABLED;
+ mController = new TestContentProtectionWorkSwitchController();
+
+ assertThat(mController.isChecked()).isFalse();
+ }
+
+ @Test
+ public void isChecked_flagEnabled_policyNotControlled_false() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mManagedProfileUserHandle = TEST_USER_HANDLE;
+ mContentProtectionPolicy = DevicePolicyManager.CONTENT_PROTECTION_NOT_CONTROLLED_BY_POLICY;
+ mController = new TestContentProtectionWorkSwitchController();
assertThat(mController.isChecked()).isFalse();
}
@@ -99,50 +216,72 @@
}
@Test
- public void displayPreference_managedProfile_disabled() {
+ public void displayPreference_flagDisabled_managedProfile_disabledByAdmin() {
+ mSetFlagsRule.disableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
mManagedProfileUserHandle = TEST_USER_HANDLE;
mEnforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
- RestrictedSwitchPreference mockSwitchPreference = mock(RestrictedSwitchPreference.class);
- when(mMockPreferenceScreen.findPreference(any())).thenReturn(mockSwitchPreference);
- when(mockSwitchPreference.getKey()).thenReturn(mController.getPreferenceKey());
+ setupForDisplayPreference();
mController.displayPreference(mMockPreferenceScreen);
- assertThat(mController.isAvailable()).isTrue();
- verify(mockSwitchPreference).setDisabledByAdmin(mEnforcedAdmin);
+ verify(mMockSwitchPreference).setDisabledByAdmin(mEnforcedAdmin);
+ assertThat(mController.mCounterGetManagedProfile).isEqualTo(3);
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(1);
}
@Test
- public void displayPreference_noManagedProfile_notDisabled() {
- mManagedProfileUserHandle = null;
+ public void displayPreference_flagDisabled_noManagedProfile_notDisabledByAdmin() {
+ mSetFlagsRule.disableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ setupForDisplayPreference();
+
+ mController.displayPreference(mMockPreferenceScreen);
+
+ verify(mMockSwitchPreference, never()).setDisabledByAdmin(any());
+ assertThat(mController.mCounterGetManagedProfile).isEqualTo(3);
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(0);
+ }
+
+ @Test
+ public void displayPreference_flagEnabled_managedProfile_disabledByAdmin() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ mManagedProfileUserHandle = TEST_USER_HANDLE;
mEnforcedAdmin = new RestrictedLockUtils.EnforcedAdmin();
- RestrictedSwitchPreference mockSwitchPreference = mock(RestrictedSwitchPreference.class);
- when(mMockPreferenceScreen.findPreference(any())).thenReturn(mockSwitchPreference);
- when(mockSwitchPreference.getKey()).thenReturn(mController.getPreferenceKey());
+ setupForDisplayPreference();
mController.displayPreference(mMockPreferenceScreen);
- assertThat(mController.isAvailable()).isFalse();
- verify(mockSwitchPreference, never()).setDisabledByAdmin(any());
+ verify(mMockSwitchPreference).setDisabledByAdmin(mEnforcedAdmin);
+ assertThat(mController.mCounterGetManagedProfile).isEqualTo(1);
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(1);
}
@Test
- public void displayPreference_noEnforcedAdmin_notDisabled() {
- mManagedProfileUserHandle = null;
- mEnforcedAdmin = null;
- RestrictedSwitchPreference mockSwitchPreference = mock(RestrictedSwitchPreference.class);
- when(mMockPreferenceScreen.findPreference(any())).thenReturn(mockSwitchPreference);
- when(mockSwitchPreference.getKey()).thenReturn(mController.getPreferenceKey());
+ public void displayPreference_flagEnabled_noManagedProfile_notDisabledByAdmin() {
+ mSetFlagsRule.enableFlags(FLAG_MANAGE_DEVICE_POLICY_ENABLED);
+ setupForDisplayPreference();
mController.displayPreference(mMockPreferenceScreen);
- assertThat(mController.isAvailable()).isFalse();
- verify(mockSwitchPreference, never()).setDisabledByAdmin(any());
+ verify(mMockSwitchPreference, never()).setDisabledByAdmin(any());
+ assertThat(mController.mCounterGetManagedProfile).isEqualTo(1);
+ assertThat(mController.mCounterGetEnforcedAdmin).isEqualTo(0);
+ }
+
+ private void setupForDisplayPreference() {
+ when(mMockPreferenceScreen.findPreference(any())).thenReturn(mMockSwitchPreference);
+ when(mMockSwitchPreference.getKey()).thenReturn(mController.getPreferenceKey());
+ mController = new TestContentProtectionWorkSwitchController();
}
private class TestContentProtectionWorkSwitchController
extends ContentProtectionWorkSwitchController {
+ public int mCounterGetManagedProfile;
+
+ public int mCounterGetEnforcedAdmin;
+
+ public int mCounterGetContentProtectionPolicy;
+
TestContentProtectionWorkSwitchController() {
super(ContentProtectionWorkSwitchControllerTest.this.mContext, "key");
}
@@ -150,14 +289,23 @@
@Override
@Nullable
protected UserHandle getManagedProfile() {
+ mCounterGetManagedProfile++;
return mManagedProfileUserHandle;
}
@Override
@Nullable
protected RestrictedLockUtils.EnforcedAdmin getEnforcedAdmin(
- @NonNull UserHandle managedProfile) {
+ @NonNull UserHandle userHandle) {
+ mCounterGetEnforcedAdmin++;
return mEnforcedAdmin;
}
+
+ @Override
+ @DevicePolicyManager.ContentProtectionPolicy
+ protected int getContentProtectionPolicy(@Nullable UserHandle userHandle) {
+ mCounterGetContentProtectionPolicy++;
+ return mContentProtectionPolicy;
+ }
}
}
diff --git a/tests/robotests/src/com/android/settings/testutils/AccessibilityTestUtils.java b/tests/robotests/src/com/android/settings/testutils/AccessibilityTestUtils.java
index 8cda2d9..5d895d9 100644
--- a/tests/robotests/src/com/android/settings/testutils/AccessibilityTestUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/AccessibilityTestUtils.java
@@ -20,11 +20,25 @@
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.content.ComponentName;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.os.Build;
import android.provider.Settings;
+import android.view.accessibility.AccessibilityManager;
import com.android.settings.testutils.shadow.SettingsShadowResources;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
/**
* Utility class for common methods used in the accessibility feature related tests
*/
@@ -47,4 +61,39 @@
NAV_BAR_MODE_3BUTTON);
}
}
+
+ /**
+ * Returns a mock {@link AccessibilityManager}
+ */
+ public static AccessibilityManager setupMockAccessibilityManager(Context mockContext) {
+ AccessibilityManager am = mock(AccessibilityManager.class);
+ when(mockContext.getSystemService(AccessibilityManager.class)).thenReturn(am);
+ return am;
+ }
+
+ public static AccessibilityServiceInfo createAccessibilityServiceInfo(
+ Context context, ComponentName componentName, boolean isAlwaysOnService) {
+ final ApplicationInfo applicationInfo = new ApplicationInfo();
+ applicationInfo.targetSdkVersion = Build.VERSION_CODES.R;
+ final ServiceInfo serviceInfo = new ServiceInfo();
+ applicationInfo.packageName = componentName.getPackageName();
+ serviceInfo.packageName = componentName.getPackageName();
+ serviceInfo.name = componentName.getClassName();
+ serviceInfo.applicationInfo = applicationInfo;
+
+ final ResolveInfo resolveInfo = new ResolveInfo();
+ resolveInfo.serviceInfo = serviceInfo;
+ try {
+ final AccessibilityServiceInfo info = new AccessibilityServiceInfo(resolveInfo,
+ context);
+ info.setComponentName(componentName);
+ if (isAlwaysOnService) {
+ info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;
+ }
+ return info;
+ } catch (XmlPullParserException | IOException e) {
+ // Do nothing
+ }
+ return null;
+ }
}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java
new file mode 100644
index 0000000..d6e17d4
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAccessibilityManager.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.testutils.shadow;
+
+import android.annotation.UserIdInt;
+import android.content.ComponentName;
+import android.view.accessibility.AccessibilityManager;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * Shadow of {@link AccessibilityManager} with the hidden methods
+ */
+@Implements(AccessibilityManager.class)
+public class ShadowAccessibilityManager extends org.robolectric.shadows.ShadowAccessibilityManager {
+ /**
+ * Implements a hidden method {@link AccessibilityManager.getA11yFeatureToTileMap} and returns
+ * an empty map.
+ */
+ @Implementation
+ public Map<ComponentName, ComponentName> getA11yFeatureToTileMap(@UserIdInt int userId) {
+ return Collections.emptyMap();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/widget/RestrictedButtonTest.java b/tests/robotests/src/com/android/settings/widget/RestrictedButtonTest.java
index d696342..b3c7049 100644
--- a/tests/robotests/src/com/android/settings/widget/RestrictedButtonTest.java
+++ b/tests/robotests/src/com/android/settings/widget/RestrictedButtonTest.java
@@ -34,18 +34,18 @@
import com.android.settings.testutils.shadow.ShadowUserManager;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
import java.util.ArrayList;
import java.util.List;
-@Ignore("b/315133235")
@RunWith(RobolectricTestRunner.class)
+@LooperMode(LooperMode.Mode.LEGACY)
@Config(shadows = {ShadowUserManager.class, ShadowDevicePolicyManager.class})
public class RestrictedButtonTest {
diff --git a/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java
index 35dc666..293c4e4 100644
--- a/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/VideoPreferenceTest.java
@@ -40,7 +40,6 @@
import com.android.settings.testutils.shadow.ShadowSettingsMediaPlayer;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -48,6 +47,7 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
import org.robolectric.shadows.androidx.fragment.FragmentController;
@RunWith(RobolectricTestRunner.class)
@@ -141,7 +141,7 @@
assertThat(mAnimationController.isPlaying()).isTrue();
}
- @Ignore("b/315133235")
+ @LooperMode(LooperMode.Mode.LEGACY)
@Test
@Config(qualifiers = "mcc999")
public void onViewVisible_createAnimationController() {
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
index 4fcc93d..7d96496 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
@@ -16,6 +16,7 @@
package com.android.settings.wifi;
+import static com.android.settings.wifi.WifiConfigController.DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE;
import static com.android.settings.wifi.WifiConfigController2.DEFAULT_ANONYMOUS_ID;
import static com.android.settings.wifi.WifiConfigController2.WIFI_EAP_METHOD_SIM;
@@ -56,6 +57,7 @@
import com.android.settings.R;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.utils.AndroidKeystoreAliasLoader;
+import com.android.settings.wifi.details2.WifiPrivacyPreferenceController;
import com.android.settings.wifi.details2.WifiPrivacyPreferenceController2;
import com.android.wifitrackerlib.WifiEntry;
@@ -513,6 +515,42 @@
}
@Test
+ public void loadSavedDhcpValue_true() {
+ checkSavedDhcpValue(true);
+ }
+
+ @Test
+ public void loadSavedDhcpValue_false() {
+ checkSavedDhcpValue(false);
+ }
+
+ private void checkSavedDhcpValue(boolean dhcpValue) {
+ when(mWifiEntry.isSaved()).thenReturn(true);
+ final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
+ when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
+ when(mockWifiConfig.isSendDhcpHostnameEnabled()).thenReturn(dhcpValue);
+ when(mWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfig);
+ createController(mWifiEntry, WifiConfigUiBase2.MODE_CONNECT, false);
+ final Spinner dhcpSetting = mView.findViewById(R.id.dhcp_settings);
+ final int expectedPrefValue =
+ WifiPrivacyPreferenceController.Companion
+ .translateSendDhcpHostnameEnabledToPrefValue(dhcpValue);
+
+ assertThat(dhcpSetting.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(dhcpSetting.getSelectedItemPosition()).isEqualTo(expectedPrefValue);
+ }
+
+ @Test
+ public void saveDhcpValue_changedToFalse() {
+ createController(mWifiEntry, WifiConfigUiBase2.MODE_CONNECT, false);
+ final Spinner privacySetting = mView.findViewById(R.id.dhcp_settings);
+ privacySetting.setSelection(DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE);
+
+ WifiConfiguration config = mController.getConfig();
+ assertThat(config.isSendDhcpHostnameEnabled()).isEqualTo(false);
+ }
+
+ @Test
public void replaceTtsString_whenTargetMatched_shouldSuccess() {
createController(mWifiEntry, WifiConfigUiBase2.MODE_CONNECT, false);
final CharSequence[] display = {"PEAP", "AKA1", "AKA2'"};
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
index 2ff4596..d80464d 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
@@ -18,6 +18,8 @@
import static com.android.settings.wifi.WifiConfigController.PRIVACY_SPINNER_INDEX_DEVICE_MAC;
import static com.android.settings.wifi.WifiConfigController.PRIVACY_SPINNER_INDEX_RANDOMIZED_MAC;
+import static com.android.settings.wifi.WifiConfigController.DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_ENABLE;
+import static com.android.settings.wifi.WifiConfigController.DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE;
import static com.google.common.truth.Truth.assertThat;
@@ -451,6 +453,41 @@
}
@Test
+ public void loadSavedDhcpValue_true() {
+ checkSavedDhcpValue(true);
+ }
+
+ @Test
+ public void loadSavedDhcpValue_false() {
+ checkSavedDhcpValue(false);
+ }
+
+ private void checkSavedDhcpValue(boolean dhcpValue) {
+ when(mAccessPoint.isSaved()).thenReturn(true);
+ final WifiConfiguration mockWifiConfig = mock(WifiConfiguration.class);
+ when(mockWifiConfig.getIpConfiguration()).thenReturn(mock(IpConfiguration.class));
+ when(mockWifiConfig.isSendDhcpHostnameEnabled()).thenReturn(dhcpValue);
+ when(mAccessPoint.getConfig()).thenReturn(mockWifiConfig);
+ mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
+ WifiConfigUiBase.MODE_CONNECT);
+ final Spinner dhcpSetting = mView.findViewById(R.id.dhcp_settings);
+
+ assertThat(dhcpSetting.getVisibility()).isEqualTo(View.VISIBLE);
+ assertThat(dhcpSetting.getSelectedItemPosition()).isEqualTo(
+ dhcpValue ? DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_ENABLE :
+ DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE);
+ }
+
+ @Test
+ public void saveDhcpValue_changedToFalse() {
+ final Spinner privacySetting = mView.findViewById(R.id.dhcp_settings);
+ privacySetting.setSelection(DHCP_SPINNER_INDEX_SEND_DHCP_HOST_NAME_DISABLE);
+
+ WifiConfiguration config = mController.getConfig();
+ assertThat(config.isSendDhcpHostnameEnabled()).isEqualTo(false);
+ }
+
+ @Test
public void replaceTtsString_whenTargetMatched_shouldSuccess() {
final CharSequence[] display = {"PEAP", "AKA1", "AKA2'"};
final CharSequence[] target = {"AKA1", "AKA2'"};
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/Injector.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/Injector.kt
index 3cd2002..9d97fbf 100644
--- a/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/Injector.kt
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/Injector.kt
@@ -50,7 +50,7 @@
import platform.test.screenshot.DeviceEmulationSpec
import platform.test.screenshot.DisplaySpec
import platform.test.screenshot.FragmentScreenshotTestRule
-import platform.test.screenshot.GoldenImagePathManager
+import platform.test.screenshot.GoldenPathManager
import platform.test.screenshot.matchers.PixelPerfectMatcher
class Injector(step: FingerprintNavigationStep.UiStep) {
@@ -154,7 +154,7 @@
fun BiometricFragmentScreenShotRule() =
FragmentScreenshotTestRule(
DeviceEmulationSpec.forDisplays(Phone).first(),
- GoldenImagePathManager(
+ GoldenPathManager(
InstrumentationRegistry.getInstrumentation().context,
InstrumentationRegistry.getInstrumentation().targetContext.filesDir.absolutePath +
screenshotPath,
diff --git a/tests/spa_unit/AndroidManifest.xml b/tests/spa_unit/AndroidManifest.xml
index 51ac1b7..d234b5d 100644
--- a/tests/spa_unit/AndroidManifest.xml
+++ b/tests/spa_unit/AndroidManifest.xml
@@ -19,11 +19,14 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.android.settings.tests.spa_unit">
+ <uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" />
+ <uses-permission android:name="android.permission.LOG_COMPAT_CHANGE" />
<uses-permission android:name="android.permission.MANAGE_APPOPS" />
+ <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" />
+ <uses-permission android:name="android.permission.READ_COMPAT_CHANGE_CONFIG" />
+ <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
<uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG" />
- <uses-permission android:name="android.permission.READ_COMPAT_CHANGE_CONFIG" />
- <uses-permission android:name="android.permission.LOG_COMPAT_CHANGE" />
<application android:debuggable="true">
<provider android:name="com.android.settings.slices.SettingsSliceProvider"
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.kt
index 5f80855..7124b6a 100644
--- a/tests/spa_unit/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.kt
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/DataUsagePreferenceControllerTest.kt
@@ -120,7 +120,7 @@
on { loadFirstCycle() } doReturn usageData
}
controller.onViewCreated(TestLifecycleOwner())
- waitUntil { preference.summary != null }
+ waitUntil { !preference.summary.isNullOrBlank() }
controller.handlePreferenceTreeClick(preference)
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.kt
new file mode 100644
index 0000000..ca37082
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.kt
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network.telephony
+
+import android.content.Context
+import android.telephony.SubscriptionInfo
+import android.telephony.SubscriptionManager
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.hasText
+import androidx.compose.ui.test.isOff
+import androidx.compose.ui.test.isOn
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithText
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.R
+import com.android.settingslib.spa.testutils.waitUntilExists
+import kotlinx.coroutines.flow.flowOf
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doNothing
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.stub
+import org.mockito.kotlin.whenever
+
+@RunWith(AndroidJUnit4::class)
+class MobileNetworkSwitchControllerTest {
+ @get:Rule
+ val composeTestRule = createComposeRule()
+
+ private val mockSubscriptionManager = mock<SubscriptionManager> {
+ on { isSubscriptionEnabled(SUB_ID) } doReturn true
+ }
+
+ private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
+ on { subscriptionManager } doReturn mockSubscriptionManager
+ doNothing().whenever(mock).startActivity(any())
+ }
+
+ private val mockSubscriptionRepository = mock<SubscriptionRepository> {
+ on { getSelectableSubscriptionInfoList() } doReturn listOf(SubInfo)
+ on { isSubscriptionEnabledFlow(SUB_ID) } doReturn flowOf(false)
+ }
+
+ private val controller = MobileNetworkSwitchController(
+ context = context,
+ preferenceKey = TEST_KEY,
+ subscriptionRepository = mockSubscriptionRepository,
+ ).apply { init(SUB_ID) }
+
+ @Test
+ fun isVisible_pSimAndCanDisablePhysicalSubscription_returnTrue() {
+ val pSimSubInfo = SubscriptionInfo.Builder().apply {
+ setId(SUB_ID)
+ setEmbedded(false)
+ }.build()
+ mockSubscriptionManager.stub {
+ on { canDisablePhysicalSubscription() } doReturn true
+ }
+ mockSubscriptionRepository.stub {
+ on { getSelectableSubscriptionInfoList() } doReturn listOf(pSimSubInfo)
+ }
+
+ setContent()
+
+ composeTestRule.onNodeWithText(context.getString(R.string.mobile_network_use_sim_on))
+ .assertIsDisplayed()
+ }
+
+ @Test
+ fun isVisible_pSimAndCannotDisablePhysicalSubscription_returnFalse() {
+ val pSimSubInfo = SubscriptionInfo.Builder().apply {
+ setId(SUB_ID)
+ setEmbedded(false)
+ }.build()
+ mockSubscriptionManager.stub {
+ on { canDisablePhysicalSubscription() } doReturn false
+ }
+ mockSubscriptionRepository.stub {
+ on { getSelectableSubscriptionInfoList() } doReturn listOf(pSimSubInfo)
+ }
+
+ setContent()
+
+ composeTestRule.onNodeWithText(context.getString(R.string.mobile_network_use_sim_on))
+ .assertDoesNotExist()
+ }
+
+ @Test
+ fun isVisible_eSim_returnTrue() {
+ val eSimSubInfo = SubscriptionInfo.Builder().apply {
+ setId(SUB_ID)
+ setEmbedded(true)
+ }.build()
+ mockSubscriptionRepository.stub {
+ on { getSelectableSubscriptionInfoList() } doReturn listOf(eSimSubInfo)
+ }
+
+ setContent()
+
+ composeTestRule.onNodeWithText(context.getString(R.string.mobile_network_use_sim_on))
+ .assertIsDisplayed()
+ }
+
+ @Test
+ fun isChecked_subscriptionEnabled_switchIsOn() {
+ mockSubscriptionRepository.stub {
+ on { isSubscriptionEnabledFlow(SUB_ID) } doReturn flowOf(true)
+ }
+
+ setContent()
+
+ composeTestRule.waitUntilExists(
+ hasText(context.getString(R.string.mobile_network_use_sim_on)) and isOn()
+ )
+ }
+
+ @Test
+ fun isChecked_subscriptionNotEnabled_switchIsOff() {
+ mockSubscriptionRepository.stub {
+ on { isSubscriptionEnabledFlow(SUB_ID) } doReturn flowOf(false)
+ }
+
+ setContent()
+
+ composeTestRule.waitUntilExists(
+ hasText(context.getString(R.string.mobile_network_use_sim_on)) and isOff()
+ )
+ }
+
+ private fun setContent() {
+ composeTestRule.setContent {
+ CompositionLocalProvider(LocalContext provides context) {
+ controller.Content()
+ }
+ }
+ }
+
+ private companion object {
+ const val TEST_KEY = "test_key"
+ const val SUB_ID = 123
+
+ val SubInfo: SubscriptionInfo = SubscriptionInfo.Builder().apply {
+ setId(SUB_ID)
+ setEmbedded(true)
+ }.build()
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/NetworkSelectRepositoryTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/NetworkSelectRepositoryTest.kt
new file mode 100644
index 0000000..4137de4
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/NetworkSelectRepositoryTest.kt
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network.telephony
+
+import android.content.Context
+import android.telephony.AccessNetworkConstants
+import android.telephony.NetworkRegistrationInfo
+import android.telephony.ServiceState
+import android.telephony.TelephonyManager
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.network.telephony.scan.NetworkScanRepositoryTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.stub
+
+@RunWith(AndroidJUnit4::class)
+class NetworkSelectRepositoryTest {
+
+ private val mockServiceState = mock<ServiceState> {
+ on {
+ getNetworkRegistrationInfoListForTransportType(
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN
+ )
+ } doReturn NetworkRegistrationInfos
+ }
+
+ private val mockTelephonyManager = mock<TelephonyManager> {
+ on { createForSubscriptionId(SUB_ID) } doReturn mock
+ on { dataState } doReturn TelephonyManager.DATA_CONNECTED
+ on { serviceState } doReturn mockServiceState
+ }
+
+ private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
+ on { getSystemService(TelephonyManager::class.java) } doReturn mockTelephonyManager
+ }
+
+ private val repository = NetworkSelectRepository(context, SUB_ID)
+
+ @Test
+ fun getNetworkRegistrationInfo_notConnected_returnNull() {
+ mockTelephonyManager.stub {
+ on { dataState } doReturn TelephonyManager.DATA_DISCONNECTED
+ }
+
+ val info = repository.getNetworkRegistrationInfo()
+
+ assertThat(info).isNull()
+ }
+
+ @Test
+ fun getNetworkRegistrationInfo_nullServiceState_returnNull() {
+ mockTelephonyManager.stub {
+ on { serviceState } doReturn null
+ }
+
+ val info = repository.getNetworkRegistrationInfo()
+
+ assertThat(info).isNull()
+ }
+
+ @Test
+ fun getNetworkRegistrationInfo_emptyNetworkList_returnNull() {
+ mockServiceState.stub {
+ on {
+ getNetworkRegistrationInfoListForTransportType(
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN
+ )
+ } doReturn emptyList()
+ }
+
+ val info = repository.getNetworkRegistrationInfo()
+
+ assertThat(info).isNull()
+ }
+
+ @Test
+ fun getNetworkRegistrationInfo_hasNetworkList_returnInfo() {
+ mockServiceState.stub {
+ on {
+ getNetworkRegistrationInfoListForTransportType(
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN
+ )
+ } doReturn NetworkRegistrationInfos
+ }
+ mockTelephonyManager.stub {
+ on { forbiddenPlmns } doReturn arrayOf(FORBIDDEN_PLMN)
+ }
+
+ val info = repository.getNetworkRegistrationInfo()
+
+ assertThat(info).isEqualTo(
+ NetworkSelectRepository.NetworkRegistrationAndForbiddenInfo(
+ networkList = NetworkRegistrationInfos,
+ forbiddenPlmns = listOf(FORBIDDEN_PLMN),
+ )
+ )
+ }
+
+ private companion object {
+ const val SUB_ID = 1
+ val NetworkRegistrationInfos = listOf(NetworkRegistrationInfo.Builder().build())
+ const val FORBIDDEN_PLMN = "Forbidden PLMN"
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt
index a59bf93..80b3175 100644
--- a/tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt
@@ -17,12 +17,14 @@
package com.android.settings.network.telephony
import android.content.Context
+import android.telephony.SubscriptionInfo
import android.telephony.SubscriptionManager
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull
import com.android.settingslib.spa.testutils.toListWithTimeout
import com.google.common.truth.Truth.assertThat
+import java.util.UUID
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
@@ -47,16 +49,16 @@
}
private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
- on { getSystemService(SubscriptionManager::class.java) } doReturn mockSubscriptionManager
+ on { subscriptionManager } doReturn mockSubscriptionManager
}
@Test
fun isSubscriptionEnabledFlow() = runBlocking {
mockSubscriptionManager.stub {
- on { isSubscriptionEnabled(SUB_ID) } doReturn true
+ on { isSubscriptionEnabled(SUB_ID_1) } doReturn true
}
- val isEnabled = context.isSubscriptionEnabledFlow(SUB_ID).firstWithTimeoutOrNull()
+ val isEnabled = context.isSubscriptionEnabledFlow(SUB_ID_1).firstWithTimeoutOrNull()
assertThat(isEnabled).isTrue()
}
@@ -80,7 +82,69 @@
assertThat(listDeferred.await()).hasSize(2)
}
+ @Test
+ fun getSelectableSubscriptionInfoList_sortedBySubId() {
+ mockSubscriptionManager.stub {
+ on { getAvailableSubscriptionInfoList() } doReturn listOf(
+ SubscriptionInfo.Builder().apply {
+ setId(SUB_ID_2)
+ }.build(),
+ SubscriptionInfo.Builder().apply {
+ setId(SUB_ID_1)
+ }.build(),
+ )
+ }
+
+ val subInfos = context.getSelectableSubscriptionInfoList()
+
+ assertThat(subInfos.map { it.subscriptionId }).containsExactly(SUB_ID_1, SUB_ID_2).inOrder()
+ }
+
+ @Test
+ fun getSelectableSubscriptionInfoList_sameGroupAndOneHasSlot_returnTheOneWithSimSlotIndex() {
+ mockSubscriptionManager.stub {
+ on { getAvailableSubscriptionInfoList() } doReturn listOf(
+ SubscriptionInfo.Builder().apply {
+ setId(SUB_ID_1)
+ setGroupUuid(GROUP_UUID)
+ }.build(),
+ SubscriptionInfo.Builder().apply {
+ setId(SUB_ID_2)
+ setGroupUuid(GROUP_UUID)
+ setSimSlotIndex(SIM_SLOT_INDEX)
+ }.build(),
+ )
+ }
+
+ val subInfos = context.getSelectableSubscriptionInfoList()
+
+ assertThat(subInfos.map { it.subscriptionId }).containsExactly(SUB_ID_2)
+ }
+
+ @Test
+ fun getSelectableSubscriptionInfoList_sameGroupAndNonHasSlot_returnTheOneWithMinimumSubId() {
+ mockSubscriptionManager.stub {
+ on { getAvailableSubscriptionInfoList() } doReturn listOf(
+ SubscriptionInfo.Builder().apply {
+ setId(SUB_ID_2)
+ setGroupUuid(GROUP_UUID)
+ }.build(),
+ SubscriptionInfo.Builder().apply {
+ setId(SUB_ID_1)
+ setGroupUuid(GROUP_UUID)
+ }.build(),
+ )
+ }
+
+ val subInfos = context.getSelectableSubscriptionInfoList()
+
+ assertThat(subInfos.map { it.subscriptionId }).containsExactly(SUB_ID_1)
+ }
+
private companion object {
- const val SUB_ID = 1
+ const val SUB_ID_1 = 1
+ const val SUB_ID_2 = 2
+ val GROUP_UUID = UUID.randomUUID().toString()
+ const val SIM_SLOT_INDEX = 1
}
}
diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/scan/NetworkScanRepositoryTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/scan/NetworkScanRepositoryTest.kt
new file mode 100644
index 0000000..070c779
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/network/telephony/scan/NetworkScanRepositoryTest.kt
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network.telephony.scan
+
+import android.content.Context
+import android.telephony.AccessNetworkConstants.AccessNetworkType
+import android.telephony.CellIdentityCdma
+import android.telephony.CellIdentityGsm
+import android.telephony.CellIdentityLte
+import android.telephony.CellInfoCdma
+import android.telephony.CellInfoGsm
+import android.telephony.CellInfoLte
+import android.telephony.NetworkScan
+import android.telephony.NetworkScanRequest
+import android.telephony.PhoneCapability
+import android.telephony.TelephonyManager
+import android.telephony.TelephonyManager.NETWORK_CLASS_BITMASK_5G
+import android.telephony.TelephonyScanManager
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.network.telephony.scan.NetworkScanRepository.NetworkScanCellInfos
+import com.android.settings.network.telephony.scan.NetworkScanRepository.NetworkScanComplete
+import com.android.settings.network.telephony.scan.NetworkScanRepository.NetworkScanError
+import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull
+import com.android.settingslib.spa.testutils.toListWithTimeout
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.async
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.argThat
+import org.mockito.kotlin.doAnswer
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.stub
+import org.mockito.kotlin.verify
+
+@RunWith(AndroidJUnit4::class)
+class NetworkScanRepositoryTest {
+
+ private var callback: TelephonyScanManager.NetworkScanCallback? = null
+
+ private val mockTelephonyManager = mock<TelephonyManager> {
+ on { createForSubscriptionId(SUB_ID) } doReturn mock
+ on { requestNetworkScan(any(), any(), any()) } doAnswer {
+ callback = it.arguments[2] as TelephonyScanManager.NetworkScanCallback
+ mock<NetworkScan>()
+ }
+ }
+
+ private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
+ on { getSystemService(TelephonyManager::class.java) } doReturn mockTelephonyManager
+ }
+
+ private val repository = NetworkScanRepository(context, SUB_ID)
+
+ @Test
+ fun networkScanFlow_initial() = runBlocking {
+ val result = repository.networkScanFlow().firstWithTimeoutOrNull()
+
+ assertThat(result).isNull()
+ }
+
+ @Test
+ fun networkScanFlow_onResults(): Unit = runBlocking {
+ val cellInfos = listOf(CellInfoCdma().apply { cellIdentity = CELL_IDENTITY_CDMA })
+ val listDeferred = async {
+ repository.networkScanFlow().toListWithTimeout()
+ }
+ delay(100)
+
+ callback?.onResults(cellInfos)
+
+ assertThat(listDeferred.await()).containsExactly(NetworkScanCellInfos(cellInfos))
+ }
+
+ @Test
+ fun networkScanFlow_onComplete(): Unit = runBlocking {
+ val listDeferred = async {
+ repository.networkScanFlow().toListWithTimeout()
+ }
+ delay(100)
+
+ callback?.onComplete()
+
+ assertThat(listDeferred.await()).containsExactly(NetworkScanComplete)
+ }
+
+ @Test
+ fun networkScanFlow_onError(): Unit = runBlocking {
+ val listDeferred = async {
+ repository.networkScanFlow().toListWithTimeout()
+ }
+ delay(100)
+
+ callback?.onError(1)
+
+ assertThat(listDeferred.await()).containsExactly(NetworkScanError(1))
+ }
+
+ @Test
+ fun networkScanFlow_hasDuplicateItems(): Unit = runBlocking {
+ val cellInfos = listOf(
+ createCellInfoLte("123", false),
+ createCellInfoLte("123", false),
+ createCellInfoLte("124", true),
+ createCellInfoLte("124", true),
+ createCellInfoGsm("123", false),
+ createCellInfoGsm("123", false),
+ )
+ val listDeferred = async {
+ repository.networkScanFlow().toListWithTimeout()
+ }
+ delay(100)
+
+ callback?.onResults(cellInfos)
+
+ assertThat(listDeferred.await()).containsExactly(
+ NetworkScanCellInfos(
+ listOf(
+ createCellInfoLte("123", false),
+ createCellInfoLte("124", true),
+ createCellInfoGsm("123", false),
+ )
+ )
+ )
+ }
+
+
+ @Test
+ fun networkScanFlow_noDuplicateItems(): Unit = runBlocking {
+ val cellInfos = listOf(
+ createCellInfoLte("123", false),
+ createCellInfoLte("123", true),
+ createCellInfoLte("124", false),
+ createCellInfoLte("124", true),
+ createCellInfoGsm("456", false),
+ createCellInfoGsm("456", true),
+ )
+ val listDeferred = async {
+ repository.networkScanFlow().toListWithTimeout()
+ }
+ delay(100)
+
+ callback?.onResults(cellInfos)
+
+ assertThat(listDeferred.await()).containsExactly(
+ NetworkScanCellInfos(
+ listOf(
+ createCellInfoLte("123", false),
+ createCellInfoLte("123", true),
+ createCellInfoLte("124", false),
+ createCellInfoLte("124", true),
+ createCellInfoGsm("456", false),
+ createCellInfoGsm("456", true),
+ )
+ )
+ )
+ }
+
+ @Test
+ fun createNetworkScan_deviceHasNrSa_requestNgran(): Unit = runBlocking {
+ mockTelephonyManager.stub {
+ on { getAllowedNetworkTypesBitmask() } doReturn NETWORK_CLASS_BITMASK_5G
+ on { getPhoneCapability() } doReturn
+ createPhoneCapability(intArrayOf(PhoneCapability.DEVICE_NR_CAPABILITY_SA))
+ }
+
+ repository.networkScanFlow().firstWithTimeoutOrNull()
+
+ verify(mockTelephonyManager).requestNetworkScan(argThat<NetworkScanRequest> {
+ specifiers.any { it.radioAccessNetwork == AccessNetworkType.NGRAN }
+ }, any(), any())
+ }
+
+ @Test
+ fun createNetworkScan_deviceNoNrSa_noNgran(): Unit = runBlocking {
+ mockTelephonyManager.stub {
+ on { getAllowedNetworkTypesBitmask() } doReturn NETWORK_CLASS_BITMASK_5G
+ on { getPhoneCapability() } doReturn
+ createPhoneCapability(intArrayOf(PhoneCapability.DEVICE_NR_CAPABILITY_NSA))
+ }
+
+ repository.networkScanFlow().firstWithTimeoutOrNull()
+
+ verify(mockTelephonyManager).requestNetworkScan(argThat<NetworkScanRequest> {
+ specifiers.none { it.radioAccessNetwork == AccessNetworkType.NGRAN }
+ }, any(), any())
+ }
+
+ private companion object {
+ const val SUB_ID = 1
+ const val LONG = "Long"
+ const val SHORT = "Short"
+
+ val CELL_IDENTITY_CDMA = CellIdentityCdma(
+ /* nid = */ 1,
+ /* sid = */ 2,
+ /* bid = */ 3,
+ /* lon = */ 4,
+ /* lat = */ 5,
+ /* alphal = */ LONG,
+ /* alphas = */ SHORT,
+ )
+
+ private fun createCellInfoLte(alphaLong: String, registered: Boolean): CellInfoLte {
+ val cellIdentityLte = CellIdentityLte(
+ /* ci = */ 1,
+ /* pci = */ 2,
+ /* tac = */ 3,
+ /* earfcn = */ 4,
+ /* bands = */ intArrayOf(1, 2),
+ /* bandwidth = */ 10000,
+ /* mccStr = */ null,
+ /* mncStr = */ null,
+ /* alphal = */ alphaLong,
+ /* alphas = */ null,
+ /* additionalPlmns = */ emptyList(),
+ /* csgInfo = */ null,
+ )
+ return CellInfoLte().apply {
+ cellIdentity = cellIdentityLte
+ isRegistered = registered
+ }
+ }
+
+ private fun createCellInfoGsm(alphaLong: String, registered: Boolean): CellInfoGsm {
+ val cellIdentityGsm = CellIdentityGsm(
+ /* lac = */ 1,
+ /* cid = */ 2,
+ /* arfcn = */ 3,
+ /* bsic = */ 4,
+ /* mccStr = */ "123",
+ /* mncStr = */ "01",
+ /* alphal = */ alphaLong,
+ /* alphas = */ null,
+ /* additionalPlmns = */ emptyList(),
+ )
+ return CellInfoGsm().apply {
+ cellIdentity = cellIdentityGsm
+ isRegistered = registered
+ }
+ }
+
+ private fun createPhoneCapability(deviceNrCapabilities: IntArray) =
+ PhoneCapability.Builder().setDeviceNrCapabilities(deviceNrCapabilities).build()
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/wifi/details2/CertificateDetailsPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/wifi/details2/CertificateDetailsPreferenceControllerTest.kt
new file mode 100644
index 0000000..1499374
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/wifi/details2/CertificateDetailsPreferenceControllerTest.kt
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi.details2
+
+import android.content.Context
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithText
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import java.security.cert.X509Certificate
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doNothing
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.whenever
+
+@RunWith(AndroidJUnit4::class)
+class CertificateDetailsPreferenceControllerTest {
+ @get:Rule
+ val composeTestRule = createComposeRule()
+
+ private val mockCertX509 = mock<X509Certificate> {}
+
+ private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
+ doNothing().whenever(mock).startActivity(any())
+ }
+
+ private val controller = CertificateDetailsPreferenceController(context, TEST_KEY)
+
+ @Before
+ fun setUp() {
+ controller.certificateAliases = MOCK_CA
+ controller.certX509 = mockCertX509
+ }
+
+ @Test
+ fun title_isDisplayed() {
+ composeTestRule.setContent {
+ CompositionLocalProvider(LocalContext provides context) {
+ controller.Content()
+ }
+ }
+
+ composeTestRule.onNodeWithText(context.getString(com.android.internal.R.string.ssl_certificate))
+ .assertIsDisplayed()
+ }
+
+ private companion object {
+ const val TEST_KEY = "test_key"
+ const val MOCK_CA = "mock_ca"
+ }
+}
\ No newline at end of file
diff --git a/tests/uitests/src/com/android/settings/ui/SecuritySettingsTest.kt b/tests/uitests/src/com/android/settings/ui/SecuritySettingsTest.kt
index b5a4fe9..b792959 100644
--- a/tests/uitests/src/com/android/settings/ui/SecuritySettingsTest.kt
+++ b/tests/uitests/src/com/android/settings/ui/SecuritySettingsTest.kt
@@ -49,7 +49,8 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ALLOW_PRIVATE_PROFILE)
+ @RequiresFlagsEnabled(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES)
fun privateSpace_ifFlagON() {
device.assertHasTexts(listOf("Private Space"))
}
diff --git a/tests/uitests/src/com/android/settings/ui/privatespace/PrivateSpaceAuthenticationActivityTest.kt b/tests/uitests/src/com/android/settings/ui/privatespace/PrivateSpaceAuthenticationActivityTest.kt
index 8eadd9d..14feb49 100644
--- a/tests/uitests/src/com/android/settings/ui/privatespace/PrivateSpaceAuthenticationActivityTest.kt
+++ b/tests/uitests/src/com/android/settings/ui/privatespace/PrivateSpaceAuthenticationActivityTest.kt
@@ -38,7 +38,8 @@
@RunWith(AndroidJUnit4::class)
-@RequiresFlagsEnabled(Flags.FLAG_ALLOW_PRIVATE_PROFILE)
+@RequiresFlagsEnabled(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES)
class PrivateSpaceAuthenticationActivityTest {
private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
diff --git a/tests/unit/src/com/android/settings/accessibility/PreferredShortcutsTest.java b/tests/unit/src/com/android/settings/accessibility/PreferredShortcutsTest.java
index e3c07ef..4ef63d0 100644
--- a/tests/unit/src/com/android/settings/accessibility/PreferredShortcutsTest.java
+++ b/tests/unit/src/com/android/settings/accessibility/PreferredShortcutsTest.java
@@ -25,16 +25,22 @@
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
+import android.view.accessibility.Flags;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.internal.accessibility.common.ShortcutConstants;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import com.android.internal.accessibility.util.ShortcutUtils;
import org.junit.AfterClass;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -54,7 +60,8 @@
CLASS_NAME_2);
private static final ContentResolver sContentResolver =
ApplicationProvider.getApplicationContext().getContentResolver();
-
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private final Context mContext = ApplicationProvider.getApplicationContext();
@Before
@@ -166,11 +173,48 @@
.isEqualTo(target2ShortcutTypes);
}
+ @Test
+ @EnableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void updatePreferredShortcutFromSettings_colorInversionWithQsAndSoftwareShortcut_preferredShortcutsMatches() {
+ String target = COLOR_INVERSION_COMPONENT_NAME.flattenToString();
+ Settings.Secure.putString(sContentResolver,
+ Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, target);
+ Settings.Secure.putString(sContentResolver,
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS, target);
+
+ PreferredShortcuts.updatePreferredShortcutsFromSettings(mContext, Set.of(target));
+
+ int savedPreferredShortcut = PreferredShortcuts.retrieveUserShortcutType(
+ mContext, target);
+ assertThat(savedPreferredShortcut).isEqualTo(
+ UserShortcutType.SOFTWARE | UserShortcutType.QUICK_SETTINGS);
+
+ }
+
+ @Test
+ @DisableFlags(Flags.FLAG_A11Y_QS_SHORTCUT)
+ public void updatePreferredShortcutFromSettings_colorInversionWithQsAndHardwareShortcut_qsShortcutNotSaved() {
+ String target = COLOR_INVERSION_COMPONENT_NAME.flattenToString();
+ Settings.Secure.putString(sContentResolver,
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, target);
+ Settings.Secure.putString(sContentResolver,
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS, target);
+ assertThat(!android.view.accessibility.Flags.a11yQsShortcut()).isTrue();
+
+ PreferredShortcuts.updatePreferredShortcutsFromSettings(mContext, Set.of(target));
+
+ int savedPreferredShortcut = PreferredShortcuts.retrieveUserShortcutType(
+ mContext, target);
+ assertThat(savedPreferredShortcut).isEqualTo(UserShortcutType.HARDWARE);
+ }
+
private static void clearShortcuts() {
Settings.Secure.putString(sContentResolver,
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, "");
Settings.Secure.putString(sContentResolver,
Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, "");
+ Settings.Secure.putString(sContentResolver,
+ Settings.Secure.ACCESSIBILITY_QS_TARGETS, "");
Settings.Secure.putInt(
sContentResolver,
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
@@ -179,5 +223,7 @@
sContentResolver,
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED,
AccessibilityUtil.State.OFF);
+
+ PreferredShortcuts.clearPreferredShortcuts(ApplicationProvider.getApplicationContext());
}
}
diff --git a/tests/unit/src/com/android/settings/applications/credentials/CredentialsPickerActivityTest.java b/tests/unit/src/com/android/settings/applications/credentials/CredentialsPickerActivityTest.java
index 044c23d..62e9909 100644
--- a/tests/unit/src/com/android/settings/applications/credentials/CredentialsPickerActivityTest.java
+++ b/tests/unit/src/com/android/settings/applications/credentials/CredentialsPickerActivityTest.java
@@ -19,21 +19,21 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.UserInfo;
-import android.os.UserHandle;
+import android.os.Flags;
import android.os.UserManager;
+import android.platform.test.flag.junit.SetFlagsRule;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
-import com.google.common.collect.Lists;
-
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -41,6 +41,7 @@
@RunWith(AndroidJUnit4.class)
public class CredentialsPickerActivityTest {
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@Mock private UserManager mUserManager;
@@ -76,13 +77,11 @@
@Test
public void testInjectFragmentIntoIntent_privateProfile() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
Intent intent = new Intent();
// Simulate private profile.
- UserHandle privateUser = new UserHandle(100);
- when(mUserManager.getUserInfo(100))
- .thenReturn(new UserInfo(100, "", "", 0, UserManager.USER_TYPE_PROFILE_PRIVATE));
- when(mUserManager.getUserProfiles()).thenReturn(Lists.newArrayList(privateUser));
+ doReturn(true).when(mUserManager).isPrivateProfile();
assertThat(DefaultCombinedPickerPrivate.isUserHandledByFragment(mUserManager)).isTrue();
CredentialsPickerActivity.injectFragmentIntoIntent(mMockContext, intent);
diff --git a/tests/unit/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceControllerTest.java
index d02240e..99fb7a4 100644
--- a/tests/unit/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceControllerTest.java
@@ -117,7 +117,7 @@
// Set the preference back to none and make sure the view was updated.
dcpc.updatePreferenceForProvider(ppp, null, null, null, null, null);
- assertThat(ppp.getTitle().toString()).isEqualTo("None");
+ assertThat(ppp.getTitle().toString()).isEqualTo("None selected");
assertThat(ppp.getSummary()).isNull();
assertThat(ppp.getIcon()).isNull();
}
diff --git a/tests/unit/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtilsTest.java b/tests/unit/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtilsTest.java
index a671a45..3a330f2 100644
--- a/tests/unit/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtilsTest.java
+++ b/tests/unit/src/com/android/settings/biometrics/combination/CombinedBiometricStatusUtilsTest.java
@@ -310,7 +310,8 @@
when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(false);
mSetFlagsRule.enableFlags(
android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
assertThat(mCombinedBiometricStatusUtils.getPrivateProfileSettingsClassName())
.isEqualTo(Settings.PrivateSpaceBiometricSettingsActivity.class.getName());
diff --git a/tests/unit/src/com/android/settings/conecteddevice/threadnetwork/ThreadNetworkPreferenceControllerTest.kt b/tests/unit/src/com/android/settings/conecteddevice/threadnetwork/ThreadNetworkPreferenceControllerTest.kt
index 644095d..976096c 100644
--- a/tests/unit/src/com/android/settings/conecteddevice/threadnetwork/ThreadNetworkPreferenceControllerTest.kt
+++ b/tests/unit/src/com/android/settings/conecteddevice/threadnetwork/ThreadNetworkPreferenceControllerTest.kt
@@ -33,13 +33,13 @@
import androidx.preference.SwitchPreference
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.net.thread.platform.flags.Flags
import com.android.settings.R
import com.android.settings.core.BasePreferenceController.AVAILABLE
import com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE
import com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING
import com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE
import com.android.settings.connecteddevice.threadnetwork.ThreadNetworkPreferenceController.BaseThreadNetworkController
+import com.android.settings.flags.Flags
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Rule
@@ -68,7 +68,7 @@
@Before
fun setUp() {
- mSetFlagsRule.enableFlags(Flags.FLAG_THREAD_ENABLED_PLATFORM)
+ mSetFlagsRule.enableFlags(Flags.FLAG_THREAD_SETTINGS_ENABLED)
context = spy(ApplicationProvider.getApplicationContext<Context>())
executor = ContextCompat.getMainExecutor(context)
fakeThreadNetworkController = FakeThreadNetworkController(executor)
@@ -96,7 +96,7 @@
@Test
fun availabilityStatus_flagDisabled_returnsConditionallyUnavailable() {
- mSetFlagsRule.disableFlags(Flags.FLAG_THREAD_ENABLED_PLATFORM)
+ mSetFlagsRule.disableFlags(Flags.FLAG_THREAD_SETTINGS_ENABLED)
assertThat(controller.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE)
}
diff --git a/tests/unit/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceControllerTest.java
new file mode 100644
index 0000000..0811f04
--- /dev/null
+++ b/tests/unit/src/com/android/settings/development/bluetooth/BluetoothStackLogPreferenceControllerTest.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.development.bluetooth;
+
+import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY;
+import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST;
+import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BTSTACK_LOG_MODE_VERBOSE_INDEX;
+import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BTSTACK_LOG_MODE_DEBUG_INDEX;
+import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BTSTACK_LOG_MODE_INFO_INDEX;
+import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BTSTACK_LOG_MODE_WARN_INDEX;
+import static com.android.settings.development.bluetooth.BluetoothStackLogPreferenceController.BTSTACK_LOG_MODE_ERROR_INDEX;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.os.Looper;
+import android.os.SystemProperties;
+
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class BluetoothStackLogPreferenceControllerTest {
+ private static final String TAG = "BluetoothStackLogPreferenceControllerTest";
+
+ @Mock private Context mContext;
+
+ private ListPreference mPreference;
+ private PreferenceManager mPreferenceManager;
+ private PreferenceScreen mPreferenceScreen;
+
+ private BluetoothStackLogPreferenceController mController;
+
+ private CharSequence[] mListValues;
+ private CharSequence[] mListEntries;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ mContext = ApplicationProvider.getApplicationContext();
+
+ if (Looper.myLooper() == null) {
+ Looper.prepare();
+ }
+
+ mPreferenceManager = new PreferenceManager(mContext);
+ mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
+ mPreference = new ListPreference(mContext);
+
+ mController = new BluetoothStackLogPreferenceController(mContext);
+
+ mPreference.setKey(mController.getPreferenceKey());
+ mPreference.setEntries(com.android.settings.R.array.bt_stack_log_level_entries);
+ mPreference.setEntryValues(com.android.settings.R.array.bt_stack_log_level_values);
+
+ mPreferenceScreen.addPreference(mPreference);
+ mController.displayPreference(mPreferenceScreen);
+
+ mListValues = mPreference.getEntryValues();
+ mListEntries = mPreference.getEntries();
+ }
+
+ /**
+ * Test that default log level is set to INFO
+ */
+ @Test
+ public void verifyDefaultState_enablesDefaultLogLevelEntriesAndValuesSameSize() {
+ mController.onPreferenceChange(mPreference, mController.getDefaultModeIndex());
+ assertThat(mPreference.getValue().toString()).isEqualTo(mListValues
+ [BTSTACK_LOG_MODE_INFO_INDEX].toString());
+ assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries
+ [BTSTACK_LOG_MODE_INFO_INDEX].toString());
+ }
+
+ /**
+ * Test that log level is changed to VERBOSE when VERBOSE is selected
+ */
+ @Test
+ public void onPreferenceChanged_enableBluetoothStackVerboseLogLevel() {
+ mController.onPreferenceChange(mPreference, mListValues[BTSTACK_LOG_MODE_VERBOSE_INDEX]
+ .toString());
+
+ final String persistedLogLevel = SystemProperties.get(
+ BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST);
+ final String logLevel = SystemProperties.get(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY);
+ assertThat(persistedLogLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_VERBOSE_INDEX]
+ .toString());
+ assertThat(logLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_VERBOSE_INDEX].toString());
+
+ assertThat(mPreference.getValue().toString()).isEqualTo(mListValues
+ [BTSTACK_LOG_MODE_VERBOSE_INDEX].toString());
+ assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries
+ [BTSTACK_LOG_MODE_VERBOSE_INDEX].toString());
+ }
+
+ /**
+ * Test that log level is changed to DEBUG when DEBUG is selected
+ */
+ @Test
+ public void onPreferenceChanged_enableBluetoothStackDebugLogLevel() {
+ mController.onPreferenceChange(mPreference, mListValues[BTSTACK_LOG_MODE_DEBUG_INDEX]
+ .toString());
+
+ final String persistedLogLevel = SystemProperties.get(
+ BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST);
+ final String logLevel = SystemProperties.get(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY);
+ assertThat(persistedLogLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_DEBUG_INDEX]
+ .toString());
+ assertThat(logLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_DEBUG_INDEX].toString());
+
+ assertThat(mPreference.getValue().toString()).isEqualTo(mListValues
+ [BTSTACK_LOG_MODE_DEBUG_INDEX].toString());
+ assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries
+ [BTSTACK_LOG_MODE_DEBUG_INDEX].toString());
+ }
+
+ /**
+ * Test that log level is changed to INFO when INFO is selected
+ */
+ @Test
+ public void onPreferenceChanged_enableBluetoothStackInfoLogLevel() {
+ mController.onPreferenceChange(mPreference, mListValues[BTSTACK_LOG_MODE_INFO_INDEX]
+ .toString());
+
+ final String persistedLogLevel = SystemProperties.get(
+ BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST);
+ final String logLevel = SystemProperties.get(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY);
+ assertThat(persistedLogLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_INFO_INDEX]
+ .toString());
+ assertThat(logLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_INFO_INDEX].toString());
+
+ assertThat(mPreference.getValue().toString()).isEqualTo(mListValues
+ [BTSTACK_LOG_MODE_INFO_INDEX].toString());
+ assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries
+ [BTSTACK_LOG_MODE_INFO_INDEX].toString());
+ }
+
+ /**
+ * Test that log level is changed to WARN when WARN is selected
+ */
+ @Test
+ public void onPreferenceChanged_enableBluetoothStackWarnLogLevel() {
+ mController.onPreferenceChange(mPreference, mListValues[BTSTACK_LOG_MODE_WARN_INDEX]
+ .toString());
+
+ final String persistedLogLevel = SystemProperties.get(
+ BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST);
+ final String logLevel = SystemProperties.get(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY);
+ assertThat(persistedLogLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_WARN_INDEX]
+ .toString());
+ assertThat(logLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_WARN_INDEX].toString());
+
+ assertThat(mPreference.getValue().toString()).isEqualTo(mListValues
+
+ [BTSTACK_LOG_MODE_WARN_INDEX].toString());
+ assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries
+ [BTSTACK_LOG_MODE_WARN_INDEX].toString());
+ }
+
+ /**
+ * Test that log level is changed to ERROR when ERROR is selected
+ */
+ @Test
+ public void onPreferenceChanged_enableBluetoothStackErrorLogLevel() {
+ mController.onPreferenceChange(mPreference, mListValues[BTSTACK_LOG_MODE_ERROR_INDEX]
+ .toString());
+
+ final String persistedLogLevel = SystemProperties.get(
+ BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY_PERSIST);
+ final String logLevel = SystemProperties.get(BLUETOOTH_BTSTACK_LOG_MODE_PROPERTY);
+ assertThat(persistedLogLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_ERROR_INDEX]
+ .toString());
+ assertThat(logLevel).isEqualTo(mListValues[BTSTACK_LOG_MODE_ERROR_INDEX].toString());
+
+ assertThat(mPreference.getValue().toString()).isEqualTo(mListValues
+ [BTSTACK_LOG_MODE_ERROR_INDEX].toString());
+ assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries
+ [BTSTACK_LOG_MODE_ERROR_INDEX].toString());
+ }
+
+ /**
+ * Test that preference is disabled when developer options is disabled
+ * Log level is also reset to default
+ */
+ @Test
+ public void onDeveloperOptionsDisabled_shouldDisablePreference() {
+ mController.onDeveloperOptionsDisabled();
+ assertThat(mPreference.isEnabled()).isFalse();
+ assertThat(mPreference.getValue().toString()).isEqualTo(mListValues[mController
+ .getDefaultModeIndex()].toString());
+ assertThat(mPreference.getSummary().toString()).isEqualTo(mListEntries[mController
+ .getDefaultModeIndex()].toString());
+ }
+}
diff --git a/tests/unit/src/com/android/settings/development/quarantine/QuarantinedAppStateBridgeTest.java b/tests/unit/src/com/android/settings/development/quarantine/QuarantinedAppStateBridgeTest.java
deleted file mode 100644
index 707d2b9..0000000
--- a/tests/unit/src/com/android/settings/development/quarantine/QuarantinedAppStateBridgeTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development.quarantine;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.os.UserHandle;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settingslib.applications.ApplicationsState.AppEntry;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-public class QuarantinedAppStateBridgeTest {
- private static final String TEST_PACKAGE = "com.example.test.pkg";
- private static final int TEST_APP_ID = 1234;
- private static final int TEST_USER_ID_1 = 0;
- private static final int TEST_USER_ID_2 = 10;
-
- @Mock
- private Context mContext;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- }
-
- @Test
- public void updateExtraInfo_packageQuarantined() throws Exception {
- setPackageQuarantined(TEST_PACKAGE, TEST_USER_ID_1, false);
- setPackageQuarantined(TEST_PACKAGE, TEST_USER_ID_2, true);
-
- final QuarantinedAppStateBridge bridge =
- new QuarantinedAppStateBridge(mContext, null, null);
- final AppEntry entry = mock(AppEntry.class);
-
- bridge.updateExtraInfo(entry, TEST_PACKAGE, UserHandle.getUid(TEST_USER_ID_2, TEST_APP_ID));
- assertThat(entry.extraInfo).isEqualTo(true);
- }
-
- @Test
- public void updateExtraInfo_packageNotQuarantined() throws Exception {
- setPackageQuarantined(TEST_PACKAGE, TEST_USER_ID_1, false);
- setPackageQuarantined(TEST_PACKAGE, TEST_USER_ID_2, false);
-
- final QuarantinedAppStateBridge bridge =
- new QuarantinedAppStateBridge(mContext, null, null);
- final AppEntry entry = mock(AppEntry.class);
-
- bridge.updateExtraInfo(entry, TEST_PACKAGE, UserHandle.getUid(TEST_USER_ID_2, TEST_APP_ID));
- assertThat(entry.extraInfo).isEqualTo(false);
- }
-
- private void setPackageQuarantined(String packageName, int userId, boolean quarantined)
- throws Exception {
- final Context userContext = mock(Context.class);
- when(mContext.createContextAsUser(eq(UserHandle.of(userId)), anyInt()))
- .thenReturn(userContext);
- final PackageManager packageManager = mock(PackageManager.class);
- when(userContext.getPackageManager()).thenReturn(packageManager);
- when(packageManager.isPackageQuarantined(packageName)).thenReturn(quarantined);
- }
-}
diff --git a/tests/unit/src/com/android/settings/development/quarantine/QuarantinedAppsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/development/quarantine/QuarantinedAppsPreferenceControllerTest.java
deleted file mode 100644
index 33e4392..0000000
--- a/tests/unit/src/com/android/settings/development/quarantine/QuarantinedAppsPreferenceControllerTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development.quarantine;
-
-import static com.android.settings.core.BasePreferenceController.AVAILABLE;
-import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
-
-import static org.junit.Assert.assertEquals;
-
-import android.content.Context;
-import android.content.pm.Flags;
-import android.platform.test.annotations.RequiresFlagsDisabled;
-import android.platform.test.annotations.RequiresFlagsEnabled;
-import android.platform.test.flag.junit.CheckFlagsRule;
-import android.platform.test.flag.junit.DeviceFlagsValueProvider;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-public class QuarantinedAppsPreferenceControllerTest {
-
- private static final String PREF_KEY = "quarantined_apps";
-
- @Rule
- public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
-
- @Mock
- private Context mContext;
- private QuarantinedAppsPreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mController = new QuarantinedAppsPreferenceController(mContext, PREF_KEY);
- }
-
- @Test
- @RequiresFlagsEnabled(Flags.FLAG_QUARANTINED_ENABLED)
- public void testAvailabilityStatus_flagEnabled() {
- assertEquals(mController.getAvailabilityStatus(), AVAILABLE);
- }
-
- @Test
- @RequiresFlagsDisabled(Flags.FLAG_QUARANTINED_ENABLED)
- public void testAvailabilityStatus_flagDisabled() {
- assertEquals(mController.getAvailabilityStatus(), CONDITIONALLY_UNAVAILABLE);
- }
-}
diff --git a/tests/unit/src/com/android/settings/network/NetworkProviderCallsSmsFragmentTest.java b/tests/unit/src/com/android/settings/network/NetworkProviderCallsSmsFragmentTest.java
index d00e2dd..cc9e116 100644
--- a/tests/unit/src/com/android/settings/network/NetworkProviderCallsSmsFragmentTest.java
+++ b/tests/unit/src/com/android/settings/network/NetworkProviderCallsSmsFragmentTest.java
@@ -22,12 +22,16 @@
import android.content.Context;
import android.os.Looper;
+import android.platform.test.flag.junit.SetFlagsRule;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.settings.flags.Flags;
+
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
@@ -36,7 +40,8 @@
@RunWith(AndroidJUnit4.class)
public class NetworkProviderCallsSmsFragmentTest {
-
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private Context mContext;
private List<String> mPreferenceKeyList;
@@ -49,6 +54,7 @@
if (Looper.myLooper() == null) {
Looper.prepare();
}
+ mSetFlagsRule.disableFlags(Flags.FLAG_IS_DUAL_SIM_ONBOARDING_ENABLED);
}
@Test
diff --git a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java
index 3b9ac9d..6c946e5 100644
--- a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java
+++ b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java
@@ -25,6 +25,7 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
@@ -65,6 +66,9 @@
private static final CharSequence CARRIER_1 = "carrier1";
private static final CharSequence CARRIER_1_SPACE = " carrier1 ";
private static final CharSequence CARRIER_2 = "carrier2";
+ private static final int RAC_CARRIER_ID = 1;
+ private static final int NO_RAC_CARRIER_ID = 2;
+ private static final int[] CARRIERS_THAT_USE_RAC = {RAC_CARRIER_ID};
private Context mContext;
private NetworkCapabilities mNetworkCapabilities;
@@ -81,6 +85,7 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(ApplicationProvider.getApplicationContext());
+ when(mContext.getResources()).thenReturn(mResources);
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubMgr);
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelMgr);
when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
@@ -109,6 +114,40 @@
assertThat(subs).hasSize(1);
}
+ @Test
+ public void hasSubscriptionWithRacCarrier_containsRac_returnTrue() {
+ when(mResources.getIntArray(anyInt())).thenReturn(CARRIERS_THAT_USE_RAC);
+ final SubscriptionInfo info = mock(SubscriptionInfo.class);
+ when(info.getCarrierId()).thenReturn(RAC_CARRIER_ID);
+ when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(Arrays.asList(info));
+
+ assertTrue(SubscriptionUtil.hasSubscriptionWithRacCarrier(mContext));
+ }
+
+ @Test
+ public void hasSubscriptionWithRacCarrier_doesNotContainsRac_returnFalse() {
+ when(mResources.getIntArray(anyInt())).thenReturn(CARRIERS_THAT_USE_RAC);
+ final SubscriptionInfo info = mock(SubscriptionInfo.class);
+ when(info.getCarrierId()).thenReturn(NO_RAC_CARRIER_ID);
+ when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(Arrays.asList(info));
+
+ assertFalse(SubscriptionUtil.hasSubscriptionWithRacCarrier(mContext));
+ }
+
+ @Test
+ public void isCarrierRac_returnTrue() {
+ when(mResources.getIntArray(anyInt())).thenReturn(CARRIERS_THAT_USE_RAC);
+
+ assertTrue(SubscriptionUtil.isCarrierRac(mContext, RAC_CARRIER_ID));
+ }
+
+ @Test
+ public void isCarrierRac_returnFalse() {
+ when(mResources.getIntArray(anyInt())).thenReturn(CARRIERS_THAT_USE_RAC);
+
+ assertFalse(SubscriptionUtil.isCarrierRac(mContext, NO_RAC_CARRIER_ID));
+ }
+
@Ignore
@Test
public void getAvailableSubscriptions_twoSubscriptions_twoResults() {
@@ -526,7 +565,6 @@
@Test
public void isSimHardwareVisible_configAsInvisible_returnFalse() {
- when(mContext.getResources()).thenReturn(mResources);
when(mResources.getBoolean(R.bool.config_show_sim_info))
.thenReturn(false);
@@ -535,7 +573,6 @@
@Test
public void isSimHardwareVisible_configAsVisible_returnTrue() {
- when(mContext.getResources()).thenReturn(mResources);
when(mResources.getBoolean(R.bool.config_show_sim_info))
.thenReturn(true);
@@ -599,17 +636,17 @@
}
@Test
- public void isConnectedToWifiOrDifferentSubId_hasWiFi_returnTrue() {
+ public void isConnectedToWifi_hasWiFi_returnTrue() {
addNetworkTransportType(NetworkCapabilities.TRANSPORT_WIFI);
- assertTrue(SubscriptionUtil.isConnectedToWifiOrDifferentSubId(mContext, SUBID_1));
+ assertTrue(SubscriptionUtil.isConnectedToWifi(mContext));
}
@Test
- public void isConnectedToWifiOrDifferentSubId_noData_and_noWiFi_returnFalse() {
+ public void isConnectedToWifi_noWiFi_returnFalse() {
addNetworkTransportType(NetworkCapabilities.TRANSPORT_BLUETOOTH);
- assertFalse(SubscriptionUtil.isConnectedToWifiOrDifferentSubId(mContext, SUBID_1));
+ assertFalse(SubscriptionUtil.isConnectedToWifi(mContext));
}
private void addNetworkTransportType(int networkType) {
diff --git a/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
index bca12c1..58a3f3a 100644
--- a/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
@@ -148,6 +148,7 @@
when(mUserManager.isAdminUser()).thenReturn(true);
when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
when(mLifecycleOwner.getLifecycle()).thenReturn(mLifecycleRegistry);
+ when(mSubscriptionManager.createForAllUserProfiles()).thenReturn(mSubscriptionManager);
mPreferenceManager = new PreferenceManager(mContext);
mPreferenceScreen = mPreferenceManager.createPreferenceScreen(mContext);
diff --git a/tests/unit/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java
index ef5d4a7..42e3a83 100644
--- a/tests/unit/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/DefaultSubscriptionControllerTest.java
@@ -26,6 +26,7 @@
import android.content.Context;
import android.os.Looper;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.telecom.TelecomManager;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -40,6 +41,7 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.settings.flags.Flags;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.testutils.ResourcesUtils;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -47,6 +49,7 @@
import org.junit.After;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -58,6 +61,8 @@
@RunWith(AndroidJUnit4.class)
public class DefaultSubscriptionControllerTest {
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private static final String SUB_ID_1 = "1";
private static final String SUB_ID_2 = "2";
@@ -105,10 +110,11 @@
if (Looper.myLooper() == null) {
Looper.prepare();
}
-
+ mSetFlagsRule.disableFlags(Flags.FLAG_IS_DUAL_SIM_ONBOARDING_ENABLED);
mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubMgr);
when(mContext.getSystemService(TelecomManager.class)).thenReturn(mTelecomManager);
+ when(mSubMgr.createForAllUserProfiles()).thenReturn(mSubMgr);
final String key = "prefkey";
mController = new TestDefaultSubscriptionController(mContext, key, mLifecycle,
@@ -312,9 +318,9 @@
mController.setDefaultSubscription(Integer.parseInt(mSubInfo1.subId));
mSubscriptionInfoEntityList.add(mSubInfo1);
mSubscriptionInfoEntityList.add(mSubInfo2);
- mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList);
mController.displayPreference(mScreen);
+ mController.onActiveSubInfoChanged(mSubscriptionInfoEntityList);
assertThat(mListPreference.getEntries().length).isEqualTo(3);
mSubscriptionInfoEntityList.add(mSubInfo3);
diff --git a/tests/unit/src/com/android/settings/network/telephony/DisableSimFooterPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/DisableSimFooterPreferenceControllerTest.java
index 72feb30..bbbee21 100644
--- a/tests/unit/src/com/android/settings/network/telephony/DisableSimFooterPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/DisableSimFooterPreferenceControllerTest.java
@@ -57,6 +57,8 @@
MockitoAnnotations.initMocks(this);
mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+ when(mSubscriptionManager.createForAllUserProfiles()).thenReturn(mSubscriptionManager);
+
when(mInfo.getSubscriptionId()).thenReturn(SUB_ID);
SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mInfo));
mController = new DisableSimFooterPreferenceController(mContext, PREF_KEY);
diff --git a/tests/unit/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
index 11a490e..152091a 100644
--- a/tests/unit/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
@@ -28,6 +28,7 @@
import android.app.Instrumentation;
import android.content.Context;
import android.os.Looper;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -41,12 +42,14 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
+import com.android.settings.flags.Flags;
import com.android.settings.testutils.ResourcesUtils;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.mobile.dataservice.MobileNetworkInfoEntity;
import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -54,6 +57,8 @@
@RunWith(AndroidJUnit4.class)
public class MobileDataPreferenceControllerTest {
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private static final String SUB_ID_1 = "1";
private static final String SUB_ID_2 = "2";
private static final String DISPLAY_NAME_1 = "Sub 1";
@@ -93,6 +98,7 @@
if (Looper.myLooper() == null) {
Looper.prepare();
}
+ mSetFlagsRule.disableFlags(Flags.FLAG_IS_DUAL_SIM_ONBOARDING_ENABLED);
mContext = spy(ApplicationProvider.getApplicationContext());
doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
diff --git a/tests/unit/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.java
deleted file mode 100644
index 3cdd23a..0000000
--- a/tests/unit/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Looper;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyCallback;
-import android.telephony.TelephonyManager;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.LinearLayout;
-
-import androidx.preference.PreferenceManager;
-import androidx.preference.PreferenceScreen;
-import androidx.preference.PreferenceViewHolder;
-import androidx.test.annotation.UiThreadTest;
-import androidx.test.core.app.ApplicationProvider;
-
-import com.android.settings.network.SubscriptionUtil;
-import com.android.settings.widget.SettingsMainSwitchPreference;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-
-import java.util.Arrays;
-import java.util.concurrent.Executor;
-
-public class MobileNetworkSwitchControllerTest {
- @Rule
- public final MockitoRule mMockitoRule = MockitoJUnit.rule();
-
- @Mock
- private SubscriptionManager mSubscriptionManager;
- @Mock
- private SubscriptionInfo mSubscription;
- @Mock
- private TelephonyManager mTelephonyManager;
-
- private PreferenceScreen mScreen;
- private PreferenceManager mPreferenceManager;
- private SettingsMainSwitchPreference mSwitchBar;
- private Context mContext;
- private MobileNetworkSwitchController mController;
- private int mSubId = 123;
-
- @Before
- public void setUp() {
- if (Looper.myLooper() == null) {
- Looper.prepare();
- }
- mContext = spy(ApplicationProvider.getApplicationContext());
- when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
- when(mSubscriptionManager.setSubscriptionEnabled(eq(mSubId), anyBoolean()))
- .thenReturn(true);
-
- when(mSubscription.isEmbedded()).thenReturn(true);
- when(mSubscription.getSubscriptionId()).thenReturn(mSubId);
- // Most tests want to have 2 available subscriptions so that the switch bar will show.
- final SubscriptionInfo sub2 = mock(SubscriptionInfo.class);
- when(sub2.getSubscriptionId()).thenReturn(456);
- SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscription, sub2));
-
- when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
- when(mTelephonyManager.createForSubscriptionId(mSubId))
- .thenReturn(mTelephonyManager);
-
- final String key = "prefKey";
- mController = new MobileNetworkSwitchController(mContext, key);
- mController.init(mSubscription.getSubscriptionId());
-
- mPreferenceManager = new PreferenceManager(mContext);
- mScreen = mPreferenceManager.createPreferenceScreen(mContext);
- mSwitchBar = new SettingsMainSwitchPreference(mContext);
- mSwitchBar.setKey(key);
- mSwitchBar.setTitle("123");
- mScreen.addPreference(mSwitchBar);
-
- final LayoutInflater inflater = LayoutInflater.from(mContext);
- final View view = inflater.inflate(mSwitchBar.getLayoutResource(),
- new LinearLayout(mContext), false);
- final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(view);
- mSwitchBar.onBindViewHolder(holder);
- }
-
- @After
- public void cleanUp() {
- SubscriptionUtil.setAvailableSubscriptionsForTesting(null);
- }
-
- @Test
- @UiThreadTest
- public void isAvailable_pSIM_isNotAvailable() {
- when(mSubscription.isEmbedded()).thenReturn(false);
- mController.displayPreference(mScreen);
- assertThat(mSwitchBar.isShowing()).isFalse();
-
- when(mSubscriptionManager.canDisablePhysicalSubscription()).thenReturn(true);
- mController.displayPreference(mScreen);
- assertThat(mSwitchBar.isShowing()).isTrue();
- }
-
- @Test
- @UiThreadTest
- public void displayPreference_oneEnabledSubscription_switchBarNotHidden() {
- doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(mSubId);
- SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscription));
- mController.displayPreference(mScreen);
- assertThat(mSwitchBar.isShowing()).isTrue();
- }
-
- @Test
- @UiThreadTest
- public void displayPreference_oneDisabledSubscription_switchBarNotHidden() {
- doReturn(false).when(mSubscriptionManager).isActiveSubscriptionId(mSubId);
- SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscription));
-
- mController.displayPreference(mScreen);
-
- assertThat(mSwitchBar.isShowing()).isTrue();
- }
-
- @Test
- @UiThreadTest
- public void displayPreference_subscriptionEnabled_switchIsOn() {
- when(mSubscriptionManager.isActiveSubscriptionId(mSubId)).thenReturn(true);
- mController.displayPreference(mScreen);
- assertThat(mSwitchBar.isShowing()).isTrue();
- assertThat(mSwitchBar.isChecked()).isTrue();
- }
-
- @Test
- @UiThreadTest
- public void displayPreference_subscriptionDisabled_switchIsOff() {
- when(mSubscriptionManager.isActiveSubscriptionId(mSubId)).thenReturn(false);
-
- mController.displayPreference(mScreen);
-
- assertThat(mSwitchBar.isShowing()).isTrue();
- assertThat(mSwitchBar.isChecked()).isFalse();
- }
-
- @Test
- @UiThreadTest
- public void switchChangeListener_fromEnabledToDisabled_setSubscriptionEnabledCalledCorrectly() {
- when(mSubscriptionManager.isActiveSubscriptionId(mSubId)).thenReturn(true);
- mController.displayPreference(mScreen);
- assertThat(mSwitchBar.isShowing()).isTrue();
- assertThat(mSwitchBar.isChecked()).isTrue();
-
- final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
- doNothing().when(mContext).startActivity(intentCaptor.capture());
-
- // set switch off then should start a Activity.
- mSwitchBar.setChecked(false);
-
- when(mSubscriptionManager.isActiveSubscriptionId(mSubId)).thenReturn(false);
- // Simulate action of back from previous activity.
- mController.displayPreference(mScreen);
- Bundle extra = intentCaptor.getValue().getExtras();
-
- verify(mContext, times(1)).startActivity(any());
- assertThat(extra.getInt(ToggleSubscriptionDialogActivity.ARG_SUB_ID)).isEqualTo(mSubId);
- assertThat(extra.getBoolean(ToggleSubscriptionDialogActivity.ARG_enable))
- .isEqualTo(false);
- assertThat(mSwitchBar.isChecked()).isFalse();
- }
-
- @Test
- @UiThreadTest
- public void switchChangeListener_fromEnabledToDisabled_setSubscriptionEnabledFailed() {
- when(mSubscriptionManager.setSubscriptionEnabled(eq(mSubId), anyBoolean()))
- .thenReturn(false);
- when(mSubscriptionManager.isActiveSubscriptionId(mSubId)).thenReturn(true);
- mController.displayPreference(mScreen);
- assertThat(mSwitchBar.isShowing()).isTrue();
- assertThat(mSwitchBar.isChecked()).isTrue();
-
- final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
- doNothing().when(mContext).startActivity(intentCaptor.capture());
-
- // set switch off then should start a Activity.
- mSwitchBar.setChecked(false);
-
- // Simulate action of back from previous activity.
- mController.displayPreference(mScreen);
- Bundle extra = intentCaptor.getValue().getExtras();
-
- verify(mContext, times(1)).startActivity(any());
- assertThat(extra.getInt(ToggleSubscriptionDialogActivity.ARG_SUB_ID)).isEqualTo(mSubId);
- assertThat(extra.getBoolean(ToggleSubscriptionDialogActivity.ARG_enable))
- .isEqualTo(false);
- assertThat(mSwitchBar.isChecked()).isTrue();
- }
-
- @Test
- @UiThreadTest
- public void switchChangeListener_fromDisabledToEnabled_setSubscriptionEnabledCalledCorrectly() {
- when(mSubscriptionManager.isActiveSubscriptionId(mSubId)).thenReturn(false);
- mController.displayPreference(mScreen);
- assertThat(mSwitchBar.isShowing()).isTrue();
- assertThat(mSwitchBar.isChecked()).isFalse();
-
- final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
- doNothing().when(mContext).startActivity(intentCaptor.capture());
- mSwitchBar.setChecked(true);
- Bundle extra = intentCaptor.getValue().getExtras();
-
- verify(mContext, times(1)).startActivity(any());
- assertThat(extra.getInt(ToggleSubscriptionDialogActivity.ARG_SUB_ID)).isEqualTo(mSubId);
- assertThat(extra.getBoolean(ToggleSubscriptionDialogActivity.ARG_enable)).isEqualTo(true);
- }
- @Test
- @UiThreadTest
- public void onResumeAndonPause_registerAndUnregisterTelephonyCallback() {
- mController.onResume();
-
- verify(mTelephonyManager)
- .registerTelephonyCallback(any(Executor.class), any(TelephonyCallback.class));
-
- mController.onPause();
- verify(mTelephonyManager)
- .unregisterTelephonyCallback(any(TelephonyCallback.class));
- }
-
- @Test
- @UiThreadTest
- public void onPause_doNotRegisterAndUnregisterTelephonyCallback() {
- mController.onPause();
- verify(mTelephonyManager, times(0))
- .unregisterTelephonyCallback(any(TelephonyCallback.class));
- }
-}
diff --git a/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java b/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
index 947ba75..a6f8f2d 100644
--- a/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
@@ -134,6 +134,10 @@
when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
Arrays.asList(mSubscriptionInfo1, mSubscriptionInfo2));
+ when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID_1)).thenReturn(
+ mSubscriptionInfo1);
+ when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID_2)).thenReturn(
+ mSubscriptionInfo2);
when(mTelephonyManager.getNetworkOperatorName()).thenReturn(
PLMN_FROM_TELEPHONY_MANAGER_API);
diff --git a/tests/unit/src/com/android/settings/network/telephony/NetworkScanHelperTest.java b/tests/unit/src/com/android/settings/network/telephony/NetworkScanHelperTest.java
deleted file mode 100644
index f046c9a..0000000
--- a/tests/unit/src/com/android/settings/network/telephony/NetworkScanHelperTest.java
+++ /dev/null
@@ -1,260 +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.settings.network.telephony;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doAnswer;
-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 static org.mockito.Mockito.when;
-
-import android.telephony.AccessNetworkConstants;
-import android.telephony.CellInfo;
-import android.telephony.ModemInfo;
-import android.telephony.NetworkScan;
-import android.telephony.NetworkScanRequest;
-import android.telephony.PhoneCapability;
-import android.telephony.RadioAccessSpecifier;
-import android.telephony.TelephonyManager;
-import android.telephony.TelephonyScanManager;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-@RunWith(AndroidJUnit4.class)
-public class NetworkScanHelperTest {
-
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private List<CellInfo> mCellInfos;
- @Mock
- private NetworkScanHelper.NetworkScanCallback mNetworkScanCallback;
-
- private static final long THREAD_EXECUTION_TIMEOUT_MS = 3000L;
-
- private ExecutorService mNetworkScanExecutor;
- private NetworkScanHelper mNetworkScanHelper;
-
- private static final int SCAN_ID = 1234;
- private static final int SUB_ID = 1;
-
- private NetworkScan mNetworkScan;
-
- public class NetworkScanMock extends NetworkScan {
- NetworkScanMock(int scanId, int subId) {
- super(scanId, subId);
- }
-
- @Override
- public void stopScan() {
- return;
- }
- }
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mNetworkScanExecutor = Executors.newFixedThreadPool(1);
-
- mNetworkScanHelper = new NetworkScanHelper(mTelephonyManager,
- mNetworkScanCallback, mNetworkScanExecutor);
-
- mNetworkScan = spy(new NetworkScanMock(SCAN_ID, SUB_ID));
- }
-
- @Test
- public void startNetworkScan_incrementalAndSuccess_completionWithResult() {
- when(mCellInfos.size()).thenReturn(1);
-
- doAnswer(new Answer() {
- @Override
- public Object answer(InvocationOnMock invocation) throws Throwable {
- TelephonyScanManager.NetworkScanCallback callback =
- (TelephonyScanManager.NetworkScanCallback)
- (invocation.getArguments()[2]);
- callback.onResults(mCellInfos);
- callback.onComplete();
- return mNetworkScan;
- }
- }).when(mTelephonyManager).requestNetworkScan(
- any(NetworkScanRequest.class), any(Executor.class),
- any(TelephonyScanManager.NetworkScanCallback.class));
-
- ArgumentCaptor<List<CellInfo>> argument = ArgumentCaptor.forClass(List.class);
-
- startNetworkScan_incremental(true);
-
- verify(mNetworkScanCallback, times(1)).onResults(argument.capture());
- List<CellInfo> actualResult = argument.getValue();
- assertThat(actualResult.size()).isEqualTo(mCellInfos.size());
- verify(mNetworkScanCallback, times(1)).onComplete();
- }
-
- @Test
- public void startNetworkScan_incrementalAndImmediateFailure_failureWithErrorCode() {
- doReturn(null).when(mTelephonyManager).requestNetworkScan(
- any(NetworkScanRequest.class), any(Executor.class),
- any(TelephonyScanManager.NetworkScanCallback.class));
-
- startNetworkScan_incremental(true);
-
- verify(mNetworkScanCallback, times(1)).onError(anyInt());
- }
-
- @Test
- public void startNetworkScan_incrementalAndFailure_failureWithErrorCode() {
- doAnswer(new Answer() {
- @Override
- public Object answer(InvocationOnMock invocation) throws Throwable {
- TelephonyScanManager.NetworkScanCallback callback =
- (TelephonyScanManager.NetworkScanCallback)
- (invocation.getArguments()[2]);
- callback.onError(NetworkScan.ERROR_MODEM_ERROR);
- return mNetworkScan;
- }
- }).when(mTelephonyManager).requestNetworkScan(
- any(NetworkScanRequest.class), any(Executor.class),
- any(TelephonyScanManager.NetworkScanCallback.class));
-
- startNetworkScan_incremental(true);
-
- verify(mNetworkScanCallback, times(1)).onError(anyInt());
- }
-
- @Test
- public void startNetworkScan_incrementalAndAbort_doStop() {
- doReturn(mNetworkScan).when(mTelephonyManager).requestNetworkScan(
- any(NetworkScanRequest.class), any(Executor.class),
- any(TelephonyScanManager.NetworkScanCallback.class));
-
- startNetworkScan_incremental(false);
-
- verify(mNetworkScan, times(1)).stopScan();
- }
-
- @Test
- public void createNetworkScanForPreferredAccessNetworks_deviceNoNrSa_noNgran() {
- int[] deviceNrCapabilities = new int[]{PhoneCapability.DEVICE_NR_CAPABILITY_NSA};
- PhoneCapability phoneCapability = createPhoneCapability(deviceNrCapabilities);
- doReturn(TelephonyManager.NETWORK_CLASS_BITMASK_2G
- | TelephonyManager.NETWORK_CLASS_BITMASK_3G
- | TelephonyManager.NETWORK_CLASS_BITMASK_4G
- | TelephonyManager.NETWORK_CLASS_BITMASK_5G).when(
- mTelephonyManager).getPreferredNetworkTypeBitmask();
- doReturn(phoneCapability).when(mTelephonyManager).getPhoneCapability();
- List<RadioAccessSpecifier> radioAccessSpecifiers = new ArrayList<>();
- radioAccessSpecifiers.add(
- new RadioAccessSpecifier(AccessNetworkConstants.AccessNetworkType.GERAN, null,
- null));
- radioAccessSpecifiers.add(
- new RadioAccessSpecifier(AccessNetworkConstants.AccessNetworkType.UTRAN, null,
- null));
- radioAccessSpecifiers.add(
- new RadioAccessSpecifier(AccessNetworkConstants.AccessNetworkType.EUTRAN, null,
- null));
- NetworkScanRequest expectedNetworkScanRequest = createNetworkScanRequest(
- radioAccessSpecifiers);
-
- assertEquals(expectedNetworkScanRequest,
- mNetworkScanHelper.createNetworkScanForPreferredAccessNetworks());
- }
-
- @Test
- public void createNetworkScanForPreferredAccessNetworks_deviceHasNrSa_hasNgran() {
- int[] deviceNrCapabilities = new int[]{PhoneCapability.DEVICE_NR_CAPABILITY_NSA,
- PhoneCapability.DEVICE_NR_CAPABILITY_SA};
- PhoneCapability phoneCapability = createPhoneCapability(deviceNrCapabilities);
- doReturn(TelephonyManager.NETWORK_CLASS_BITMASK_2G
- | TelephonyManager.NETWORK_CLASS_BITMASK_3G
- | TelephonyManager.NETWORK_CLASS_BITMASK_4G
- | TelephonyManager.NETWORK_CLASS_BITMASK_5G).when(
- mTelephonyManager).getPreferredNetworkTypeBitmask();
- doReturn(phoneCapability).when(mTelephonyManager).getPhoneCapability();
- List<RadioAccessSpecifier> radioAccessSpecifiers = new ArrayList<>();
- radioAccessSpecifiers.add(
- new RadioAccessSpecifier(AccessNetworkConstants.AccessNetworkType.GERAN, null,
- null));
- radioAccessSpecifiers.add(
- new RadioAccessSpecifier(AccessNetworkConstants.AccessNetworkType.UTRAN, null,
- null));
- radioAccessSpecifiers.add(
- new RadioAccessSpecifier(AccessNetworkConstants.AccessNetworkType.EUTRAN, null,
- null));
- radioAccessSpecifiers.add(
- new RadioAccessSpecifier(AccessNetworkConstants.AccessNetworkType.NGRAN, null,
- null));
- NetworkScanRequest expectedNetworkScanRequest = createNetworkScanRequest(
- radioAccessSpecifiers);
-
- assertEquals(expectedNetworkScanRequest,
- mNetworkScanHelper.createNetworkScanForPreferredAccessNetworks());
- }
-
- private PhoneCapability createPhoneCapability(int[] deviceNrCapabilities) {
- int maxActiveVoiceCalls = 1;
- int maxActiveData = 2;
- ModemInfo modemInfo = new ModemInfo(1, 2, true, false);
- List<ModemInfo> logicalModemList = new ArrayList<>();
- logicalModemList.add(modemInfo);
- return new PhoneCapability(maxActiveVoiceCalls, maxActiveData,
- logicalModemList, false, deviceNrCapabilities);
- }
-
- private NetworkScanRequest createNetworkScanRequest(
- List<RadioAccessSpecifier> radioAccessSpecifiers) {
- return new NetworkScanRequest(
- NetworkScanRequest.SCAN_TYPE_ONE_SHOT,
- radioAccessSpecifiers.toArray(
- new RadioAccessSpecifier[radioAccessSpecifiers.size()]),
- mNetworkScanHelper.SEARCH_PERIODICITY_SEC,
- mNetworkScanHelper.MAX_SEARCH_TIME_SEC,
- mNetworkScanHelper.INCREMENTAL_RESULTS,
- mNetworkScanHelper.INCREMENTAL_RESULTS_PERIODICITY_SEC,
- null /* List of PLMN ids (MCC-MNC) */);
- }
-
- private void startNetworkScan_incremental(boolean waitForCompletion) {
- mNetworkScanHelper.startNetworkScan(
- NetworkScanHelper.NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS);
- if (!waitForCompletion) {
- mNetworkScanHelper.stopNetworkQuery();
- }
- }
-
-}
diff --git a/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java b/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java
index 080534e..a4657ce 100644
--- a/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java
@@ -83,7 +83,6 @@
public Context mContext;
public PreferenceCategory mPreferenceCategory;
- public boolean mIsAggregationEnabled = true;
private TargetClass mNetworkSelectSettings;
@@ -104,12 +103,13 @@
doReturn(mCellId2).when(mCellInfo2).getCellIdentity();
doReturn(mock(CellSignalStrength.class)).when(mCellInfo2).getCellSignalStrength();
doReturn(CARRIER_NAME2).when(mCellId2).getOperatorAlphaLong();
- mIsAggregationEnabled = true;
mNetworkSelectSettings = spy(new TargetClass(this));
PersistableBundle config = new PersistableBundle();
config.putBoolean(CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL, true);
- doReturn(config).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
+ doReturn(config).when(mCarrierConfigManager).getConfigForSubId(SUB_ID,
+ CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL,
+ CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL);
doReturn(TelephonyManager.DATA_CONNECTED).when(mTelephonyManager).getDataState();
}
@@ -175,11 +175,6 @@
}
@Override
- protected boolean enableAggregation(Context context) {
- return mTestEnv.mIsAggregationEnabled;
- }
-
- @Override
protected int getSubId() {
return SUB_ID;
}
@@ -210,77 +205,7 @@
}
@Test
- public void doAggregation_hasDuplicateItemsDiffCellIdCase1_removeSamePlmnRatItem() {
- mNetworkSelectSettings.onCreateInitialization();
- List<CellInfo> testList = Arrays.asList(
- createLteCellInfo(true, 123, "123", "232", "CarrierA"),
- createLteCellInfo(true, 1234, "123", "232", "CarrierA"),
- createGsmCellInfo(false, 123, "123", "232", "CarrierB"));
- List<CellInfo> expected = Arrays.asList(
- createLteCellInfo(true, 123, "123", "232", "CarrierA"),
- createGsmCellInfo(false, 123, "123", "232", "CarrierB"));
- assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
- }
-
- @Test
- public void doAggregation_hasDuplicateItemsDiffCellIdCase2_removeSamePlmnRatItem() {
- mNetworkSelectSettings.onCreateInitialization();
- List<CellInfo> testList = Arrays.asList(
- createLteCellInfo(true, 123, "123", "232", "CarrierA"),
- createGsmCellInfo(false, 123, "123", "232", "CarrierB"),
- createLteCellInfo(false, 1234, "123", "232", "CarrierB"),
- createGsmCellInfo(false, 1234, "123", "232", "CarrierB"));
- List<CellInfo> expected = Arrays.asList(
- createLteCellInfo(true, 123, "123", "232", "CarrierA"),
- createGsmCellInfo(false, 123, "123", "232", "CarrierB"),
- createLteCellInfo(false, 1234, "123", "232", "CarrierB"));
- assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
- }
-
- @Test
- public void doAggregation_hasDuplicateItemsDiffMccMncCase1_removeSamePlmnRatItem() {
- mNetworkSelectSettings.onCreateInitialization();
- List<CellInfo> testList = Arrays.asList(
- createLteCellInfo(true, 123, "123", "232", "CarrierA"),
- createLteCellInfo(true, 123, "456", "232", "CarrierA"),
- createGsmCellInfo(false, 123, "123", "232", "CarrierB"));
- List<CellInfo> expected = Arrays.asList(
- createLteCellInfo(true, 123, "123", "232", "CarrierA"),
- createGsmCellInfo(false, 123, "123", "232", "CarrierB"));
- assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
- }
-
- @Test
- public void doAggregation_hasDuplicateItemsDiffMccMncCase2_removeSamePlmnRatItem() {
- mNetworkSelectSettings.onCreateInitialization();
- List<CellInfo> testList = Arrays.asList(
- createLteCellInfo(true, 123, "123", "232", "CarrierA"),
- createGsmCellInfo(false, 123, "123", "232", "CarrierB"),
- createLteCellInfo(false, 1234, "123", "232", "CarrierB"),
- createGsmCellInfo(false, 123, "456", "232", "CarrierB"));
- List<CellInfo> expected = Arrays.asList(
- createLteCellInfo(true, 123, "123", "232", "CarrierA"),
- createGsmCellInfo(false, 123, "123", "232", "CarrierB"),
- createLteCellInfo(false, 1234, "123", "232", "CarrierB"));
- assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
- }
-
- @Test
- public void doAggregation_hasDuplicateItemsDiffMccMncCase3_removeSamePlmnRatItem() {
- mNetworkSelectSettings.onCreateInitialization();
- List<CellInfo> testList = Arrays.asList(
- createLteCellInfo(false, 123, "123", "232", "CarrierA"),
- createLteCellInfo(false, 124, "123", "233", "CarrierA"),
- createLteCellInfo(true, 125, "123", "234", "CarrierA"),
- createGsmCellInfo(false, 126, "456", "232", "CarrierA"));
- List<CellInfo> expected = Arrays.asList(
- createLteCellInfo(true, 125, "123", "234", "CarrierA"),
- createGsmCellInfo(false, 126, "456", "232", "CarrierA"));
- assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
- }
-
- @Test
- public void doAggregation_filterOutSatellitePlmn_whenKeyIsTrue() {
+ public void filterOutSatellitePlmn_filterOutSatellitePlmn_whenKeyIsTrue() {
PersistableBundle config = new PersistableBundle();
config.putBoolean(
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL, true);
@@ -304,11 +229,11 @@
List<CellInfo> expected = Arrays.asList(
createGsmCellInfo(false, 123, "123", "233", "CarrierB"),
createLteCellInfo(false, 1234, "123", "234", "CarrierC"));
- assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
+ assertThat(mNetworkSelectSettings.filterOutSatellitePlmn(testList)).isEqualTo(expected);
}
@Test
- public void doAggregation_filterOutSatellitePlmn_whenNoSatellitePlmnIsAvailable() {
+ public void filterOutSatellitePlmn_filterOutSatellitePlmn_whenNoSatellitePlmnIsAvailable() {
PersistableBundle config = new PersistableBundle();
config.putBoolean(
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL, true);
@@ -336,17 +261,17 @@
createGsmCellInfo(false, 123, "123", "233", "CarrierB"),
createLteCellInfo(false, 1234, "123", "234", "CarrierC"),
createGsmCellInfo(false, 12345, "123", "235", "CarrierD"));
- assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
+ assertThat(mNetworkSelectSettings.filterOutSatellitePlmn(testList)).isEqualTo(expected);
// Expect no filter out when KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL is false.
config.putBoolean(
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL, false);
mNetworkSelectSettings.onCreateInitialization();
- assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
+ assertThat(mNetworkSelectSettings.filterOutSatellitePlmn(testList)).isEqualTo(expected);
}
@Test
- public void doAggregation_filterOutSatellitePlmn_whenKeyIsFalse() {
+ public void filterOutSatellitePlmn_filterOutSatellitePlmn_whenKeyIsFalse() {
PersistableBundle config = new PersistableBundle();
config.putBoolean(
CarrierConfigManager.KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL, true);
@@ -372,7 +297,7 @@
createGsmCellInfo(false, 123, "123", "233", "CarrierB"),
createLteCellInfo(false, 1234, "123", "234", "CarrierC"),
createGsmCellInfo(false, 12345, "123", "235", "CarrierD"));
- assertThat(mNetworkSelectSettings.doAggregation(testList)).isEqualTo(expected);
+ assertThat(mNetworkSelectSettings.filterOutSatellitePlmn(testList)).isEqualTo(expected);
}
private CellInfoLte createLteCellInfo(boolean registered, int cellId, String mcc, String mnc,
diff --git a/tests/unit/src/com/android/settings/privatespace/FaceFingerprintUnlockControllerTest.java b/tests/unit/src/com/android/settings/privatespace/FaceFingerprintUnlockControllerTest.java
index f1da363..857135f 100644
--- a/tests/unit/src/com/android/settings/privatespace/FaceFingerprintUnlockControllerTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/FaceFingerprintUnlockControllerTest.java
@@ -75,7 +75,8 @@
public void getAvailabilityStatus_whenFlagsEnabled_returnsAvailable() {
mSetFlagsRule.enableFlags(
android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
assertThat(mFaceFingerprintUnlockController.isAvailable()).isEqualTo(true);
}
@@ -83,18 +84,33 @@
/** Tests that the controller is not available when Biometrics flag is not enabled. */
@Test
public void getAvailabilityStatus_whenBiometricFlagDisabled_returnsFalse() {
- mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mSetFlagsRule.disableFlags(
android.multiuser.Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE);
assertThat(mFaceFingerprintUnlockController.isAvailable()).isEqualTo(false);
}
- /** Tests that the controller is not available when private feature flag is not enabled. */
+ /**
+ * Tests that the controller is not available when the main private space flag is not
+ * enabled.
+ */
@Test
- public void getAvailabilityStatus_whenPrivateFlagDisabled_returnsFalse() {
+ public void getAvailabilityStatus_whenPsMainFlagDisabled_returnsFalse() {
mSetFlagsRule.disableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE);
mSetFlagsRule.enableFlags(
+ android.multiuser.Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+
+ assertThat(mFaceFingerprintUnlockController.isAvailable()).isEqualTo(false);
+ }
+
+ /** Tests that the controller is not available when private features flag is not enabled. */
+ @Test
+ public void getAvailabilityStatus_whenPsFeaturesFlagDisabled_returnsFalse() {
+ mSetFlagsRule.disableFlags(android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
+ mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
android.multiuser.Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE);
assertThat(mFaceFingerprintUnlockController.isAvailable()).isEqualTo(false);
@@ -106,7 +122,8 @@
doReturn(false).when(mLockPatternUtils).isSeparateProfileChallengeEnabled(anyInt());
mSetFlagsRule.enableFlags(
android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mFaceFingerprintUnlockController.updateState(mPreference);
assertThat(mPreference.isEnabled()).isFalse();
@@ -119,7 +136,8 @@
doReturn(true).when(mLockPatternUtils).isSeparateProfileChallengeEnabled(anyInt());
mSetFlagsRule.enableFlags(
android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_ENABLE_BIOMETRICS_TO_UNLOCK_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mFaceFingerprintUnlockController.updateState(mPreference);
assertThat(mPreference.isEnabled()).isTrue();
diff --git a/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceControllerTest.java b/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceControllerTest.java
deleted file mode 100644
index 0abe314..0000000
--- a/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceControllerTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.privatespace;
-
-import static com.android.settings.core.BasePreferenceController.AVAILABLE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.os.Flags;
-import android.platform.test.annotations.RequiresFlagsEnabled;
-import android.platform.test.flag.junit.CheckFlagsRule;
-import android.platform.test.flag.junit.DeviceFlagsValueProvider;
-import android.provider.Settings;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@RequiresFlagsEnabled(Flags.FLAG_ALLOW_PRIVATE_PROFILE)
-public class HidePrivateSpaceControllerTest {
- @Rule
- public final CheckFlagsRule mCheckFlagsRule =
- DeviceFlagsValueProvider.createCheckFlagsRule();
-
- private static final String KEY = "private_space_hidden";
- private static final String DETAIL_PAGE_KEY = "private_space_hidden_details";
- private Context mContext;
- private HidePrivateSpaceSummaryController mHidePrivateSpaceSummaryController;
- private HidePrivateSpaceController mHidePrivateSpaceController;
- private ContentResolver mContentResolver;
- private int mOriginalHiddenValue;
-
- /** Required setup before a test. */
- @Before
- public void setUp() {
- mContext = spy(ApplicationProvider.getApplicationContext());
- mContentResolver = mContext.getContentResolver();
- mHidePrivateSpaceSummaryController = new HidePrivateSpaceSummaryController(mContext, KEY);
- mHidePrivateSpaceController =
- new HidePrivateSpaceController(mContext, DETAIL_PAGE_KEY);
- mOriginalHiddenValue = Settings.Secure.getInt(mContentResolver,
- Settings.Secure.HIDE_PRIVATESPACE_ENTRY_POINT, 0);
- }
-
- @After
- public void tearDown() {
- Settings.Secure.putInt(mContentResolver, Settings.Secure.HIDE_PRIVATESPACE_ENTRY_POINT,
- mOriginalHiddenValue);
- }
-
- /** Tests that the controller is always available. */
- @Test
- public void getAvailabilityStatus_returnsAvailable() {
- assertThat(mHidePrivateSpaceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
- }
-
- /** Tests that hide preference summary displays On when hide toggle is enabled.*/
- @Test
- public void setChecked_enable_shouldDisplayOn() {
- Settings.Secure.putInt(mContentResolver, Settings.Secure.HIDE_PRIVATESPACE_ENTRY_POINT,
- 0);
- assertThat(mHidePrivateSpaceController.isChecked()).isFalse();
-
- mHidePrivateSpaceController.setChecked(true);
-
- assertThat(mHidePrivateSpaceSummaryController.getSummary().toString())
- .isEqualTo("On");
- assertThat(mHidePrivateSpaceController.isChecked()).isTrue();
- }
-
- /** Tests that hide preference summary displays Off when toggle is disabled.*/
- @Test
- public void setChecked_disable_shouldDisplayOff() {
- Settings.Secure.putInt(mContentResolver, Settings.Secure.HIDE_PRIVATESPACE_ENTRY_POINT,
- 1);
-
- assertThat(mHidePrivateSpaceController.isChecked()).isTrue();
-
- mHidePrivateSpaceController.setChecked(false);
-
- assertThat(mHidePrivateSpaceSummaryController.getSummary().toString())
- .isEqualTo("Off");
- assertThat(mHidePrivateSpaceController.isChecked()).isFalse();
- }
-}
diff --git a/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceSensitiveNotificationsControllerTest.java b/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceSensitiveNotificationsControllerTest.java
index 1430dfd..88503a5 100644
--- a/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceSensitiveNotificationsControllerTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceSensitiveNotificationsControllerTest.java
@@ -67,7 +67,8 @@
mSetFlagsRule.enableFlags(
android.multiuser.Flags.FLAG_ENABLE_PS_SENSITIVE_NOTIFICATIONS_TOGGLE);
- mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mPrivateProfileId = PrivateSpaceMaintainer.getInstance(
mContext).getPrivateProfileHandle().getIdentifier();
@@ -143,7 +144,8 @@
public void getAvailabilityStatus_flagDisabled() {
mSetFlagsRule.disableFlags(
android.multiuser.Flags.FLAG_ENABLE_PS_SENSITIVE_NOTIFICATIONS_TOGGLE);
- mSetFlagsRule.disableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.disableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 1);
Settings.Secure.putInt(mContext.getContentResolver(),
diff --git a/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceSummaryControllerTest.java b/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceSummaryControllerTest.java
index 39f7b9c..ed072d3 100644
--- a/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceSummaryControllerTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/HidePrivateSpaceSummaryControllerTest.java
@@ -40,7 +40,8 @@
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
-@RequiresFlagsEnabled(Flags.FLAG_ALLOW_PRIVATE_PROFILE)
+@RequiresFlagsEnabled({Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
public class HidePrivateSpaceSummaryControllerTest {
@Rule
public final CheckFlagsRule mCheckFlagsRule =
diff --git a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceAuthenticationActivityTest.java b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceAuthenticationActivityTest.java
index 4c6feea..8a7bd70 100644
--- a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceAuthenticationActivityTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceAuthenticationActivityTest.java
@@ -88,7 +88,8 @@
/** Tests that when Private does not exist setup flow is started. */
//TODO(b/307729746) Plan to add more tests for complete setup flow
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ALLOW_PRIVATE_PROFILE)
+ @RequiresFlagsEnabled({Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
public void whenPrivateProfileDoesNotExist_triggersSetupFlow() {
when(mPrivateSpaceMaintainer.doesPrivateSpaceExist()).thenReturn(false);
diff --git a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceLockControllerTest.java b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceLockControllerTest.java
index 0d9db7e..c203a3c 100644
--- a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceLockControllerTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceLockControllerTest.java
@@ -80,7 +80,8 @@
/** Tests that the controller is always available. */
@Test
public void getAvailabilityStatus_returnsAvailable() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
assertThat(mPrivateSpaceLockController.isAvailable()).isEqualTo(true);
}
@@ -89,7 +90,8 @@
@Test
public void getSummary_whenScreenLock() {
doReturn(false).when(mLockPatternUtils).isSeparateProfileChallengeEnabled(anyInt());
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mPrivateSpaceLockController.updateState(mPreference);
assertThat(mPreference.isEnabled()).isFalse();
@@ -103,7 +105,8 @@
.when(mLockPatternUtils).isSeparateProfileChallengeEnabled(anyInt());
doReturn(CREDENTIAL_TYPE_PATTERN)
.when(mLockPatternUtils).getCredentialTypeForUser(anyInt());
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mPrivateSpaceLockController.updateState(mPreference);
assertThat(mPreference.isEnabled()).isTrue();
@@ -115,7 +118,8 @@
public void getSummary_whenProfileLockPin() {
doReturn(true).when(mLockPatternUtils).isSeparateProfileChallengeEnabled(anyInt());
doReturn(CREDENTIAL_TYPE_PIN).when(mLockPatternUtils).getCredentialTypeForUser(anyInt());
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mPrivateSpaceLockController.updateState(mPreference);
assertThat(mPreference.isEnabled()).isTrue();
@@ -129,7 +133,8 @@
.when(mLockPatternUtils).isSeparateProfileChallengeEnabled(anyInt());
doReturn(CREDENTIAL_TYPE_PASSWORD)
.when(mLockPatternUtils).getCredentialTypeForUser(anyInt());
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mPrivateSpaceLockController.updateState(mPreference);
assertThat(mPreference.isEnabled()).isTrue();
diff --git a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java
index 8510b11..50f67d3 100644
--- a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java
@@ -148,7 +148,8 @@
public void createPrivateSpace_psDoesNotExist_setsDefaultPsSensitiveNotificationsValue() {
mSetFlagsRule.enableFlags(
Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_ENABLE_PS_SENSITIVE_NOTIFICATIONS_TOGGLE);
+ android.multiuser.Flags.FLAG_ENABLE_PS_SENSITIVE_NOTIFICATIONS_TOGGLE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
PrivateSpaceMaintainer privateSpaceMaintainer =
PrivateSpaceMaintainer.getInstance(mContext);
privateSpaceMaintainer.deletePrivateSpace();
@@ -259,7 +260,8 @@
public void createPrivateSpace_psDoesNotExist_resetsPSAutoLockSettings() {
mSetFlagsRule.enableFlags(
Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
final int autoLockOption = 2;
PrivateSpaceMaintainer privateSpaceMaintainer =
PrivateSpaceMaintainer.getInstance(mContext);
@@ -282,7 +284,8 @@
public void createPrivateSpace_psExists_doesNotResetPSAutoLockSettings() {
mSetFlagsRule.enableFlags(
Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
final int privateSpaceAutLockValue = 1;
PrivateSpaceMaintainer privateSpaceMaintainer =
PrivateSpaceMaintainer.getInstance(mContext);
diff --git a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceSafetySourceTest.java b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceSafetySourceTest.java
index cf9ea05..940f70d 100644
--- a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceSafetySourceTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceSafetySourceTest.java
@@ -86,7 +86,8 @@
@Test
public void onDeviceRebootedEvent_whenSafetyCenterEnabled_setsData() {
when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(true);
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
@@ -98,7 +99,8 @@
@Test
public void setSafetySourceData_whenFeatureDisabled_setsNullData() {
when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(true);
- mSetFlagsRule.disableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.disableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
@@ -113,7 +115,8 @@
@Test
public void setSafetySourceData_setsEnabled() {
when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(true);
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
@@ -129,7 +132,8 @@
@Test
public void setSafetySourceData_setsPsAuthenticatorIntent() {
when(mSafetyCenterManagerWrapper.isEnabled(mContext)).thenReturn(true);
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
PrivateSpaceSafetySource.setSafetySourceData(mContext, EVENT_TYPE_DEVICE_REBOOTED);
diff --git a/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java b/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java
index 744a8ec..5c2a15c 100644
--- a/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/UseOneLockControllerTest.java
@@ -74,7 +74,8 @@
/** Tests that the controller is always available. */
@Test
public void getAvailabilityStatus_returnsAvailable() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
assertThat(mUseOneLockController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@@ -87,7 +88,8 @@
.when(mLockPatternUtils).isSeparateProfileChallengeEnabled(anyInt());
doReturn(CREDENTIAL_TYPE_PATTERN)
.when(mLockPatternUtils).getCredentialTypeForUser(anyInt());
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mUseOneLockController.updateState(mPreference);
assertThat(mUseOneLockController.getSummary().toString()).isEqualTo("Pattern");
@@ -99,7 +101,8 @@
doReturn(true)
.when(mLockPatternUtils).isSeparateProfileChallengeEnabled(anyInt());
doReturn(CREDENTIAL_TYPE_PIN).when(mLockPatternUtils).getCredentialTypeForUser(anyInt());
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mUseOneLockController.updateState(mPreference);
assertThat(mUseOneLockController.getSummary().toString()).isEqualTo("PIN");
@@ -112,7 +115,8 @@
.when(mLockPatternUtils).isSeparateProfileChallengeEnabled(anyInt());
doReturn(CREDENTIAL_TYPE_PASSWORD)
.when(mLockPatternUtils).getCredentialTypeForUser(anyInt());
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mUseOneLockController.updateState(mPreference);
assertThat(mUseOneLockController.getSummary().toString()).isEqualTo("Password");
diff --git a/tests/unit/src/com/android/settings/privatespace/autolock/AutoLockPreferenceControllerTest.java b/tests/unit/src/com/android/settings/privatespace/autolock/AutoLockPreferenceControllerTest.java
index 01381d8..45c2c75 100644
--- a/tests/unit/src/com/android/settings/privatespace/autolock/AutoLockPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/autolock/AutoLockPreferenceControllerTest.java
@@ -75,7 +75,8 @@
public void getAvailabilityStatus_withAutoLockFlagEnabled_returnsAvailable() {
mSetFlagsRule.enableFlags(
Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
assertThat(mAutoLockPreferenceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@@ -83,7 +84,8 @@
/** Tests that the controller is not available when auto lock flag is off. */
@Test
public void getAvailabilityStatus_withAutoLockFlagDisabled_returnsNull() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mSetFlagsRule.disableFlags(android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
assertThat(mAutoLockPreferenceController.getAvailabilityStatus())
@@ -98,7 +100,8 @@
public void getSummary_whenOptionEveryTimeDeviceLocks_returnsEveryTimeDeviceLocks() {
mSetFlagsRule.enableFlags(
Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
Settings.Secure.putInt(
mContentResolver,
@@ -116,7 +119,8 @@
public void getSummary_whenOptionAfter5MinutesOfInactivity_returnsAfter5MinutesOfInactivity() {
mSetFlagsRule.enableFlags(
Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
Settings.Secure.putInt(
mContentResolver,
@@ -131,7 +135,8 @@
public void getSummary_whenOptionNever_returnsNever() {
mSetFlagsRule.enableFlags(
Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
Settings.Secure.putInt(
mContentResolver,
diff --git a/tests/unit/src/com/android/settings/privatespace/autolock/AutoLockSettingsFragmentTest.java b/tests/unit/src/com/android/settings/privatespace/autolock/AutoLockSettingsFragmentTest.java
index 971ca40..1c620c0 100644
--- a/tests/unit/src/com/android/settings/privatespace/autolock/AutoLockSettingsFragmentTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/autolock/AutoLockSettingsFragmentTest.java
@@ -94,7 +94,8 @@
public void verifyMetricsConstant() {
mSetFlagsRule.enableFlags(
Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
assertThat(mFragment.getMetricsCategory()).isEqualTo(SettingsEnums.PRIVATE_SPACE_SETTINGS);
}
@@ -103,7 +104,8 @@
public void getCandidates_returnsCandidateInfoListWithAllKeys() {
mSetFlagsRule.enableFlags(
Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mFragment.onAttach(mContext);
final List<? extends CandidateInfo> candidates = mFragment.getCandidates();
@@ -120,7 +122,8 @@
public void getDefaultKey_returnsStoredAutoLockOptionsValue() {
mSetFlagsRule.enableFlags(
Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mFragment.onAttach(mContext);
@@ -144,7 +147,8 @@
public void setDefaultKey_storesCorrectAutoLockOptionValue() {
mSetFlagsRule.enableFlags(
Flags.FLAG_ALLOW_PRIVATE_PROFILE,
- android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE);
+ android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mFragment.onAttach(mContext);
mFragment.setDefaultKey("2");
diff --git a/tests/unit/src/com/android/settings/privatespace/delete/DeletePrivateSpaceControllerTest.java b/tests/unit/src/com/android/settings/privatespace/delete/DeletePrivateSpaceControllerTest.java
index 371ca24..ed8decd 100644
--- a/tests/unit/src/com/android/settings/privatespace/delete/DeletePrivateSpaceControllerTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/delete/DeletePrivateSpaceControllerTest.java
@@ -58,7 +58,8 @@
/** Tests that the controller is available when private space flag is enabled. */
@Test
public void getAvailabilityStatus_whenPrivateFlagEnabled_returnsAvailable() {
- mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
assertThat(mDeletePrivateSpaceController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@@ -66,7 +67,8 @@
/** Tests that the controller is not available when private space flag is disabled. */
@Test
public void getAvailabilityStatus_whenPrivateFlagDisabled_returnsUnsupportedOnDevice() {
- mSetFlagsRule.disableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.disableFlags(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
assertThat(mDeletePrivateSpaceController.getAvailabilityStatus())
.isEqualTo(UNSUPPORTED_ON_DEVICE);
diff --git a/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragmentTest.java b/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragmentTest.java
index 16ccbc4..5c48375 100644
--- a/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragmentTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeleteFragmentTest.java
@@ -39,7 +39,8 @@
@Test
@UiThreadTest
public void verifyMetricsConstant() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mFragment = spy(new PrivateSpaceDeleteFragment());
assertThat(mFragment.getMetricsCategory()).isEqualTo(SettingsEnums.PRIVATE_SPACE_SETTINGS);
}
diff --git a/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragmentTest.java b/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragmentTest.java
index 5c2ef23..ffc1edf 100644
--- a/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragmentTest.java
+++ b/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragmentTest.java
@@ -77,7 +77,8 @@
@Test
@UiThreadTest
public void verifyMetricsConstant() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
assertThat(mFragment.getMetricsCategory()).isEqualTo(SettingsEnums.PRIVATE_SPACE_SETTINGS);
}
@@ -87,7 +88,8 @@
public void deletePrivateSpace_deletesPS() {
PrivateSpaceDeletionProgressFragment spyFragment = spy(mFragment);
doNothing().when(spyFragment).showSuccessfulDeletionToast();
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mPrivateSpaceMaintainer.createPrivateSpace();
spyFragment.deletePrivateSpace();
@@ -100,7 +102,8 @@
public void deletePrivateSpace_onDeletion_showsDeletedToast() {
PrivateSpaceDeletionProgressFragment spyFragment = spy(mFragment);
doNothing().when(spyFragment).showSuccessfulDeletionToast();
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
mPrivateSpaceMaintainer.createPrivateSpace();
spyFragment.deletePrivateSpace();
@@ -123,7 +126,8 @@
spyFragment.setPrivateSpaceMaintainer(injector);
doReturn(DELETE_PS_ERROR_INTERNAL).when(mPrivateSpaceMaintainerMock).deletePrivateSpace();
doNothing().when(spyFragment).showDeletionInternalErrorToast();
- mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
spyFragment.deletePrivateSpace();
diff --git a/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java b/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
index 85bd0e2..cd4c3c6 100644
--- a/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
+++ b/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java
@@ -247,7 +247,8 @@
@Test
public void onReceive_onRefresh_withPrivateSpaceFeatureDisabled_setsNullData() {
when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true);
- mSetFlagsRule.disableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE);
+ mSetFlagsRule.disableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE,
+ android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES);
Intent intent =
new Intent()