Merge "Import translations. DO NOT MERGE ANYWHERE" into main
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/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/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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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/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-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-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-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-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-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/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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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/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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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/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 dd2d7e3..fe3f429 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">
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 80063b6..2037323 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4676,6 +4676,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] -->
@@ -4835,6 +4839,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] -->
@@ -4849,6 +4855,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] -->
@@ -4863,10 +4871,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] -->
@@ -4885,6 +4893,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] -->
@@ -11977,6 +11991,12 @@
<!-- 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>
+
<!-- DSU Loader. Do not translate. -->
<string name="dsu_loader_title" translatable="false">DSU Loader</string>
diff --git a/res/xml/accessibility_edit_shortcuts.xml b/res/xml/accessibility_edit_shortcuts.xml
index fdb5b99..37e25af 100644
--- a/res/xml/accessibility_edit_shortcuts.xml
+++ b/res/xml/accessibility_edit_shortcuts.xml
@@ -26,6 +26,14 @@
settings:allowDividerBelow="false"/>
<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_fab_pref"
android:persistent="false"
android:selectable="true"
@@ -58,12 +66,12 @@
settings:controller="com.android.settings.accessibility.shortcuts.VolumeKeysShortcutOptionController" />
<com.android.settings.accessibility.shortcuts.ShortcutOptionPreference
- android:key="@string/accessibility_shortcut_two_fingers_double_tap_pref"
+ 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.TwoFingersDoubleTapShortcutOptionController" />
+ settings:controller="com.android.settings.accessibility.shortcuts.TwoFingerDoubleTapShortcutOptionController" />
<Preference
android:icon="@drawable/ic_keyboard_arrow_down"
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index 1fdfcaf..b1ebbb8 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"
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/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/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
index 09a691e..8af284d 100644
--- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
@@ -452,7 +452,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 +544,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/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..6d5f536 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -711,6 +711,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 +913,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 985d45d..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;
/**
@@ -357,7 +359,7 @@
}
if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
if (mTwoFingerTripleTapTypeCheckBox.isChecked()) {
- value |= UserShortcutType.TWOFINGERTRIPLETAP;
+ value |= UserShortcutType.TWOFINGER_DOUBLETAP;
}
}
return value;
@@ -419,7 +421,7 @@
hasShortcutType(value, UserShortcutType.TRIPLETAP));
if (Flags.enableMagnificationMultipleFingerMultipleTapGesture()) {
mTwoFingerTripleTapTypeCheckBox.setChecked(
- hasShortcutType(value, UserShortcutType.TWOFINGERTRIPLETAP));
+ hasShortcutType(value, UserShortcutType.TWOFINGER_DOUBLETAP));
}
}
@@ -483,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));
}
@@ -497,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);
@@ -678,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);
@@ -694,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;
@@ -743,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);
@@ -759,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;
@@ -803,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;
@@ -820,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;
@@ -857,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 aba342a..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(
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/dashboard/profileselector/ProfileSelectFragment.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
index e8f407b..494ef95 100644
--- a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
+++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java
@@ -233,7 +233,12 @@
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;
@@ -325,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(),
@@ -345,7 +350,7 @@
privateFragmentConstructor));
}
} else {
- Log.d(TAG, "Not showing tab for unsupported user");
+ Log.d(TAG, "Not showing tab for unsupported user " + userInfo);
}
}
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/Enable16kPagesPreferenceController.java b/src/com/android/settings/development/Enable16kPagesPreferenceController.java
index 3f9da57..7049e79 100644
--- a/src/com/android/settings/development/Enable16kPagesPreferenceController.java
+++ b/src/com/android/settings/development/Enable16kPagesPreferenceController.java
@@ -22,6 +22,7 @@
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;
@@ -34,7 +35,6 @@
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 +54,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 +69,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 +89,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 +98,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 +116,10 @@
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
mEnable16k = (Boolean) newValue;
+ if (isDataf2fs()) {
+ EnableExt4WarningDialog.show(mFragment, this);
+ return false;
+ }
Enable16kPagesWarningDialog.show(mFragment, this, mEnable16k);
return true;
}
@@ -162,7 +168,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 +297,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 +398,24 @@
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;
+ }
}
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/fuelgauge/BatterySettingsStorage.java b/src/com/android/settings/fuelgauge/BatterySettingsStorage.java
index 36fa5bb..99edbec 100644
--- a/src/com/android/settings/fuelgauge/BatterySettingsStorage.java
+++ b/src/com/android/settings/fuelgauge/BatterySettingsStorage.java
@@ -52,6 +52,7 @@
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
/** An implementation to backup and restore battery configurations. */
@@ -321,8 +322,8 @@
@NonNull BackupContext backupContext, @NonNull OutputStream outputStream)
throws IOException {
final long timestamp = System.currentTimeMillis();
- final ArraySet<ApplicationInfo> applications = getInstalledApplications();
- if (applications == null || applications.isEmpty()) {
+ final ApplicationInfo[] applications = getInstalledApplications();
+ if (applications.length == 0) {
Log.w(TAG, "no data found in the getInstalledApplications()");
return EntityBackupResult.DELETE;
}
@@ -360,15 +361,24 @@
TAG,
String.format(
"backup getInstalledApplications():%d count=%d in %d/ms",
- applications.size(),
+ applications.length,
backupCount,
(System.currentTimeMillis() - timestamp)));
return EntityBackupResult.UPDATE;
}
- private @Nullable ArraySet<ApplicationInfo> getInstalledApplications() {
- return BatteryOptimizeUtils.getInstalledApplications(
- mApplication, AppGlobals.getPackageManager());
+ private ApplicationInfo[] getInstalledApplications() {
+ ArraySet<ApplicationInfo> installedApplications =
+ BatteryOptimizeUtils.getInstalledApplications(
+ mApplication, AppGlobals.getPackageManager());
+ ApplicationInfo[] applicationInfos = new ApplicationInfo[0];
+ if (installedApplications == null || installedApplications.isEmpty()) {
+ return applicationInfos;
+ }
+ applicationInfos = installedApplications.toArray(applicationInfos);
+ // sort the list to ensure backup data is stable
+ Arrays.sort(applicationInfos, Comparator.comparing(info -> info.packageName));
+ return applicationInfos;
}
static @NonNull SharedPreferences getSharedPreferences(Context context) {
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/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/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/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/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..e963bd0 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
@@ -34,10 +34,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 +77,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 +86,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";
@@ -295,6 +297,7 @@
}
@Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
@Config(shadows = ShadowFragment.class)
public void onPreferenceToggledOnEnabledService_showTooltipView() {
mFragment.onPreferenceToggled(
@@ -304,7 +307,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 +321,7 @@
}
@Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
@Config(shadows = ShadowFragment.class)
public void onPreferenceToggledOnEnabledService_tooltipViewShown_notShowTooltipView() {
mFragment.onPreferenceToggled(
@@ -348,7 +352,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 +367,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 +377,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 +388,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 +425,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 b459faa..3d24fbb 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java
@@ -30,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;
@@ -39,13 +40,16 @@
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;
@@ -57,6 +61,7 @@
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;
@@ -80,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)
@@ -92,7 +99,7 @@
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 =
@@ -122,13 +129,15 @@
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());
@@ -319,26 +328,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;
@@ -351,9 +361,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);
@@ -363,6 +400,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());
@@ -374,6 +412,7 @@
}
@Test
+ @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT)
public void optInAllValuesToSettings_software_sizeValueIsNull_putLargeSizeValue() {
ShadowSettings.ShadowSecure.reset();
@@ -441,6 +480,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);
@@ -457,19 +497,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);
@@ -526,7 +593,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);
@@ -536,14 +603,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();
@@ -551,7 +618,7 @@
final int expectedType = PreferredShortcuts.retrieveUserShortcutType(mContext,
MAGNIFICATION_CONTROLLER_NAME);
- assertThat(expectedType).isEqualTo(UserShortcutType.TWOFINGERTRIPLETAP);
+ assertThat(expectedType).isEqualTo(UserShortcutType.TWOFINGER_DOUBLETAP);
}
@Test
@@ -590,7 +657,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= */
@@ -598,7 +665,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);
@@ -607,7 +674,7 @@
createEditShortcutDialog(fragment.getActivity()));
final int checkboxValue = fragment.getShortcutTypeCheckBoxValue();
- assertThat(checkboxValue).isEqualTo(UserShortcutType.TWOFINGERTRIPLETAP);
+ assertThat(checkboxValue).isEqualTo(UserShortcutType.TWOFINGER_DOUBLETAP);
}
@Test
@@ -632,10 +699,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);
@@ -649,8 +716,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
@@ -789,7 +856,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);
@@ -803,7 +870,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);
@@ -817,6 +884,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);
}
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/dashboard/profileselector/ProfileSelectFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectFragmentTest.java
index 46e4ea5..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;
@@ -208,7 +209,7 @@
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 */,
@@ -221,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(
@@ -244,7 +245,7 @@
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(
@@ -267,7 +268,7 @@
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(
@@ -290,7 +291,7 @@
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(
@@ -315,7 +316,7 @@
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(
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/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/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/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());
+ }
+}