Merge "Flag off stickiness of show/hide system setting." into tm-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 71c07a0..0472f07 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2855,7 +2855,7 @@
android:name="Settings$BatterySaverSettingsActivity"
android:label="@string/battery_saver"
android:exported="true"
- android:icon="@drawable/ic_settings_battery">
+ android:icon="@drawable/ic_homepage_battery">
<intent-filter android:priority="1">
<action android:name="android.settings.BATTERY_SAVER_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
@@ -2870,6 +2870,7 @@
<activity android:name=".fuelgauge.BatterySaverModeVoiceActivity"
android:label="@string/power_usage_summary_title"
+ android:icon="@drawable/ic_homepage_battery"
android:theme="@*android:style/Theme.DeviceDefault.Light.Voice"
android:exported="true">
<intent-filter>
diff --git a/res/drawable/homepage_app_bar_background.xml b/res/drawable/homepage_app_bar_background.xml
new file mode 100644
index 0000000..6872ab7
--- /dev/null
+++ b/res/drawable/homepage_app_bar_background.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2022 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid
+ android:color="@color/settings_two_pane_background_color" />
+ <corners
+ android:bottomLeftRadius="@dimen/homepage_app_bar_corner_radius"
+ android:bottomRightRadius="@dimen/homepage_app_bar_corner_radius" />
+</shape>
\ No newline at end of file
diff --git a/res/drawable/homepage_highlighted_item_background.xml b/res/drawable/homepage_highlighted_item_background.xml
index 7e0dea5..4656a46 100644
--- a/res/drawable/homepage_highlighted_item_background.xml
+++ b/res/drawable/homepage_highlighted_item_background.xml
@@ -14,10 +14,14 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <solid
- android:color="@color/accent_select_background" />
- <corners
- android:radius="@dimen/homepage_preference_corner_radius" />
-</shape>
\ No newline at end of file
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@*android:color/ripple_material_light">
+ <item>
+ <shape android:shape="rectangle">
+ <solid
+ android:color="@color/accent_select_background" />
+ <corners
+ android:radius="@dimen/homepage_preference_corner_radius" />
+ </shape>
+ </item>
+</ripple>
\ No newline at end of file
diff --git a/res/layout/search_bar_two_pane_version.xml b/res/layout/search_bar_two_pane_version.xml
index ede5722..9ce220c 100644
--- a/res/layout/search_bar_two_pane_version.xml
+++ b/res/layout/search_bar_two_pane_version.xml
@@ -21,8 +21,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
- android:layout_marginEnd="@dimen/search_bar_margin"
- android:layout_marginVertical="@dimen/search_bar_margin">
+ android:layout_marginEnd="@dimen/search_bar_margin">
<Toolbar
android:id="@+id/search_action_bar_two_pane"
android:layout_width="match_parent"
diff --git a/res/layout/settings_homepage_app_bar_two_pane_layout.xml b/res/layout/settings_homepage_app_bar_two_pane_layout.xml
index 0cd8c90..b9c1493 100644
--- a/res/layout/settings_homepage_app_bar_two_pane_layout.xml
+++ b/res/layout/settings_homepage_app_bar_two_pane_layout.xml
@@ -17,29 +17,21 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/app_bar_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- android:background="@color/settings_two_pane_background_color">
+ android:layout_marginHorizontal="@dimen/homepage_app_bar_margin_horizontal_two_pane"
+ android:padding="@dimen/homepage_app_bar_padding_two_pane"
+ android:orientation="horizontal"
+ android:background="@drawable/homepage_app_bar_background">
- <FrameLayout
- android:id="@+id/two_pane_suggestion_content"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
+ <include layout="@layout/search_bar_two_pane_version"/>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
+ <ImageView
+ android:id="@+id/account_avatar_two_pane_version"
+ android:layout_width="@dimen/avatar_length"
+ android:layout_height="@dimen/avatar_length"
+ android:layout_gravity="center"
+ android:contentDescription="@string/search_bar_account_avatar_content_description"/>
- <include layout="@layout/search_bar_two_pane_version"/>
-
- <ImageView
- android:id="@+id/account_avatar_two_pane_version"
- android:layout_width="@dimen/avatar_length"
- android:layout_height="@dimen/avatar_length"
- android:layout_gravity="center"
- android:contentDescription="@string/search_bar_account_avatar_content_description"/>
- </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/res/layout/settings_homepage_container.xml b/res/layout/settings_homepage_container.xml
index 3de5a8a..89d40d0 100644
--- a/res/layout/settings_homepage_container.xml
+++ b/res/layout/settings_homepage_container.xml
@@ -34,6 +34,11 @@
android:layout_height="wrap_content"
android:orientation="vertical">
+ <include
+ android:id="@+id/suggestion_container_two_pane"
+ layout="@layout/suggestion_container_two_pane"
+ android:visibility="gone"/>
+
<FrameLayout
android:id="@+id/contextual_cards_content"
android:layout_width="match_parent"
diff --git a/res/layout/suggestion_container_two_pane.xml b/res/layout/suggestion_container_two_pane.xml
new file mode 100644
index 0000000..412a0d4
--- /dev/null
+++ b/res/layout/suggestion_container_two_pane.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2022 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/homepage_app_bar_margin_bottom_two_pane"
+ android:layout_marginHorizontal="@dimen/homepage_padding_horizontal_two_pane">
+
+ <FrameLayout
+ android:id="@+id/two_pane_suggestion_content"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+</FrameLayout>
diff --git a/res/values-af/arrays.xml b/res/values-af/arrays.xml
index 4c0ac1d..b7c367a 100644
--- a/res/values-af/arrays.xml
+++ b/res/values-af/arrays.xml
@@ -485,7 +485,7 @@
<item msgid="8186970968968646288">"Gekas (leeg)"</item>
</string-array>
<string-array name="color_picker">
- <item msgid="7216413848731287689">"Groenblou"</item>
+ <item msgid="7216413848731287689">"Siaan"</item>
<item msgid="5661027589207588703">"Blou"</item>
<item msgid="1219738214736244749">"Groen"</item>
<item msgid="6331809026622602308">"Pers"</item>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index dfb2596..91f3f3b 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Stelselverstek"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Taalkeuse vir hierdie program is nie in Instellings beskikbaar nie."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Taal kan verskil van tale wat in die program beskikbaar is. Sommige programme steun dalk nie hierdie instelling nie."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Net programme wat taalkeuses ondersteun, word hier gewys."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Verwyder gekose tale?</item>
<item quantity="one">Verwyder gekose taal?</item>
diff --git a/res/values-as/arrays.xml b/res/values-as/arrays.xml
index 52cbe56..02c8c51 100644
--- a/res/values-as/arrays.xml
+++ b/res/values-as/arrays.xml
@@ -180,7 +180,7 @@
</string-array>
<string-array name="wifi_proxy_settings">
<item msgid="4669222334822978847">"নাই"</item>
- <item msgid="6242198071587397280">"হস্তকৃত"</item>
+ <item msgid="6242198071587397280">"মেনুৱেল"</item>
<item msgid="464383874780058242">"প্ৰক্সি স্বয়ং-কনফিগাৰেশ্বন"</item>
</string-array>
<string-array name="apn_auth_entries">
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 147a818..80842d2 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"ছিষ্টেম ডিফ’ল্ট"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"এই এপ্টোৰ বাবে ছেটিঙৰ পৰা ভাষা বাছনি কৰাৰ সুবিধা উপলব্ধ নহয়।"</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"ভাষাটো এপ্টোত উপলব্ধ ভাষাসমূহতকৈ পৃথক হ’ব পাৰে। কিছুমান এপে এই ছেটিংটো সমৰ্থন নকৰিব পাৰে।"</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"কেৱল ভাষা বাছনি কৰাৰ সুবিধা থকা এপ্সমূহ ইয়াত দেখুওৱা হৈছে।"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">বাছনি কৰা ভাষাসমূহ আঁতৰাবনে?</item>
<item quantity="other">বাছনি কৰা ভাষাসমূহ আঁতৰাবনে?</item>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index f4821fe..bdffc5e 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Sistem defoltu"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Bu tətbiq üçün dil seçimini Ayarlardan etmək olmur."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Dil tətbiqdə əlçatan dillərdən fərqli ola bilər. Bəzi tətbiqlər bu ayarı dəstəkləməyə bilər."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Burada yalnız dil seçimini dəstəkləyən tətbiqlər göstərilir."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Seçilmiş dillər silinsin?</item>
<item quantity="one">Seçilmiş dil silinsin?</item>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 2713d6b..b17b156 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -229,6 +229,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Podrazumevani sistemski"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Izbor jezika za ovu aplikaciju nije dostupan iz Podešavanja."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Jezik može da se razlikuje od jezika dostupnih u aplikaciji. Neke aplikacije možda ne podržavaju ovo podešavanje."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Ovde se prikazuju samo aplikacije koje podržavaju izbor jezika."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Želite li da uklonite izabrane jezike?</item>
<item quantity="few">Želite li da uklonite izabrane jezike?</item>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index ccc6d75..fe9af98 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Стандартно за системата"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Избирането на език за това приложение не е налице от настройките."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Езикът може да се различава от езиците, налични в приложението. Възможно е някои приложения да не поддържат тази настройка."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Тук са показани само приложенията, които поддържат избиране на език."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Да се премахнат ли избраните езици?</item>
<item quantity="one">Да се премахне ли избраният език?</item>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 9ceb9c6..87cf387 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"সিস্টেম ডিফল্ট"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"এই অ্যাপের জন্য \'সেটিংস\' থেকে ভাষা বেছে নেওয়ার সুবিধা উপলভ্য নেই।"</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"অ্যাপে উপলভ্য থাকা ভাষা আলাদা হতে পারে। কিছু অ্যাপে এই সেটিং কাজ নাও করতে পারে।"</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"শুধুমাত্র সেইসব অ্যাপ দেখানো হয়েছে যার মধ্যে ভাষা বেছে নেওয়ার বিকল্প আছে।"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">নির্বাচিত ভাষা সরাবেন?</item>
<item quantity="other">নির্বাচিত ভাষা সরাবেন?</item>
diff --git a/res/values-bs/arrays.xml b/res/values-bs/arrays.xml
index 42dc013..3e1f8f3 100644
--- a/res/values-bs/arrays.xml
+++ b/res/values-bs/arrays.xml
@@ -387,11 +387,11 @@
<item msgid="5012882784126308133">"Mala početna slova"</item>
</string-array>
<string-array name="captioning_font_size_selector_titles">
- <item msgid="923916134548435468">"Vrlo mali"</item>
- <item msgid="5738147437573674872">"Mali"</item>
+ <item msgid="923916134548435468">"Vrlo malo"</item>
+ <item msgid="5738147437573674872">"Malo"</item>
<item msgid="4691660235626027304">"Srednje"</item>
- <item msgid="824386705928670045">"Veliki"</item>
- <item msgid="2790561781512874585">"Vrlo veliki"</item>
+ <item msgid="824386705928670045">"Veliko"</item>
+ <item msgid="2790561781512874585">"Vrlo veliko"</item>
</string-array>
<string-array name="captioning_edge_type_selector_titles">
<item msgid="70686029249840227">"Zadano"</item>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 63a8ddd..28ea355 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -229,6 +229,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Sistemski zadano"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Odabir jezika za ovu aplikaciju nije dostupan u Postavkama."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Jezik se može razlikovati od jezika dostupnih u aplikaciji. Neke aplikacije možda neće podržavati ovu postavku."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Ovdje su prikazane samo aplikacije koje podržavaju odabir jezika."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Ukloniti odabrane jezike?</item>
<item quantity="few">Ukloniti odabrane jezike?</item>
diff --git a/res/values-ca/arrays.xml b/res/values-ca/arrays.xml
index 68f7be9..0f94336 100644
--- a/res/values-ca/arrays.xml
+++ b/res/values-ca/arrays.xml
@@ -387,7 +387,7 @@
<item msgid="5012882784126308133">"Versaletes"</item>
</string-array>
<string-array name="captioning_font_size_selector_titles">
- <item msgid="923916134548435468">"Molt petit"</item>
+ <item msgid="923916134548435468">"Molt petita"</item>
<item msgid="5738147437573674872">"Petita"</item>
<item msgid="4691660235626027304">"Mitjana"</item>
<item msgid="824386705928670045">"Gran"</item>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 51a8a1b..96108b6 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Valor predeterminat del sistema"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"La selecció d\'idioma per a aquesta aplicació no està disponible des de Configuració."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"És possible que l\'idioma no coincideixi amb els que hi ha disponibles a l\'aplicació. Algunes aplicacions no admeten aquesta opció de configuració."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Aquí només es mostren les aplicacions que admeten la selecció d'idioma."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Vols suprimir els idiomes seleccionats?</item>
<item quantity="one">Vols suprimir l\'idioma seleccionat?</item>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index e90a20e..8058bac 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -230,6 +230,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Výchozí nastavení systému"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"V Nastavení nelze vybrat jazyk pro tuto aplikaci."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Jazyky nemusí odpovídat jazykům dostupným v aplikaci. Toto nastavení mohou podporovat jen některé aplikace."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Zobrazují se tu pouze aplikace, které podporují výběr jazyka."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="few">Odstranit vybrané jazyky?</item>
<item quantity="many">Odstranit vybrané jazyky?</item>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 1c46693..ca4351b 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Standardeinstellung des Systems"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Für diese App ist in den Einstellungen keine Sprachauswahl verfügbar."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Die Sprache kann von den in der App verfügbaren Sprachen abweichen. Einige Apps unterstützen diese Einstellung möglicherweise nicht."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Hier werden nur Apps angezeigt, die die Sprachauswahl unterstützen."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Ausgewählte Sprachen entfernen?</item>
<item quantity="one">Ausgewählte Sprache entfernen?</item>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 47745fd..4dba7f5 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Προεπιλογή συστήματος"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Η δυνατότητα επιλογής γλώσσας για αυτήν την εφαρμογή δεν είναι διαθέσιμη από τις Ρυθμίσεις."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Η γλώσσα μπορεί να διαφέρει από τις γλώσσες που είναι διαθέσιμες στην εφαρμογή. Ορισμένες εφαρμογές μπορεί να μην υποστηρίζουν αυτήν τη ρύθμιση."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Εδώ εμφανίζονται μόνο εφαρμογές που υποστηρίζουν την επιλογή γλώσσας."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Να αφαιρεθούν οι επιλεγμένες γλώσσες;</item>
<item quantity="one">Να αφαιρεθεί η επιλεγμένη γλώσσα;</item>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 4e2c331..b0d74f2 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"System default"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Language selection for this app isn’t available from Settings."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Language may differ from languages available in the app. Some apps may not support this setting."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Only apps that support language selection are shown here."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Remove selected languages?</item>
<item quantity="one">Remove selected language?</item>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 98c1a46..a30e3f4 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"System default"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Language selection for this app isn’t available from Settings."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Language may differ from languages available in the app. Some apps may not support this setting."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Only apps that support language selection are shown here."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Remove selected languages?</item>
<item quantity="one">Remove selected language?</item>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index d49243d..cdc2556 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"System default"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Language selection for this app isn’t available from Settings."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Language may differ from languages available in the app. Some apps may not support this setting."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Only apps that support language selection are shown here."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Remove selected languages?</item>
<item quantity="one">Remove selected language?</item>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index bb089bb..e5f065a 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"System default"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Language selection for this app isn’t available from Settings."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Language may differ from languages available in the app. Some apps may not support this setting."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Only apps that support language selection are shown here."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Remove selected languages?</item>
<item quantity="one">Remove selected language?</item>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 65414c8..0901515 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"System default"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Language selection for this app isn’t available from Settings."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Language may differ from languages available in the app. Some apps may not support this setting."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Only apps that support language selection are shown here."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Remove selected languages?</item>
<item quantity="one">Remove selected language?</item>
diff --git a/res/values-es/arrays.xml b/res/values-es/arrays.xml
index 7af2782..513f813 100644
--- a/res/values-es/arrays.xml
+++ b/res/values-es/arrays.xml
@@ -580,7 +580,7 @@
<!-- no translation found for rtt_setting_mode:3 (7725394146877517088) -->
<string-array name="nfc_payment_favor">
<item msgid="9104058551372383947">"Siempre"</item>
- <item msgid="5283665583617307336">"Excepto si hay otra aplicación de pago abierta"</item>
+ <item msgid="5283665583617307336">"Excepto si hay otra aplicación para pagos abierta"</item>
</string-array>
<string-array name="nfc_payment_favor_values">
<item msgid="2373999996715432397">"0"</item>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 7b8d2c9..3b6b76e 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Predeterminado del sistema"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"La selección de idioma para esta aplicación no está disponible en Ajustes."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Puede que el idioma no coincida con los que hay disponibles en la aplicación. Algunas aplicaciones no son compatibles con este ajuste."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Aquí solo se muestran las aplicaciones que admiten la selección de idioma."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">¿Quitar idiomas seleccionados?</item>
<item quantity="one">¿Quitar idioma seleccionado?</item>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index c8b4176..4a1073f 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Süsteemi vaikeseade"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Selle rakenduse jaoks pole seadetes keele valimine saadaval."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Keel võib rakenduses saadaolevatest keeltest erineda. Mõni rakendus ei pruugi seda seadet toetada."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Siin on kuvatud ainult rakendused, mis toetavad keele valimist."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Kas eemaldada valitud keeled?</item>
<item quantity="one">Kas eemaldada valitud keel?</item>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 96b8745..6009305 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"پیشفرض سیستم"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"انتخاب زبان از «تنظیمات» برای این برنامه دردسترس نیست."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"زبان ممکن است با زبانهای موجود در برنامه متفاوت باشد. ممکن است برخیاز برنامهها از این تنظیم پشتیبانی نکنند."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"فقط برنامههایی که از انتخاب زبان پشتیبانی میکنند اینجا نمایش داده میشود."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">زبانهای انتخابی حذف شوند؟</item>
<item quantity="other">زبانهای انتخابی حذف شوند؟</item>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index b9cca3c..468a633 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Järjestelmän oletusarvo"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Sovellukselle ei voi valita kieltä asetuksista."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Kieli saattaa erota sovelluksessa saatavilla olevista kielistä. Jotkin sovellukset eivät ehkä tue tätä asetusta."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Täällä näkyvät vain sovellukset, jotka tukevat kielen valitsemista."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Poistetaanko valitut kielet?</item>
<item quantity="one">Poistetaanko valittu kieli?</item>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index e59245e..d5ac122 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Paramètre système par défaut"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"La sélection de la langue pour cette application n\'est pas accessible à partir des paramètres."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"La langue peut différer des langues offertes dans l\'application. Certaines applications peuvent ne pas prendre en charge ce paramètre."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Seules les applications qui prennent en charge la sélection de la langue sont affichées ici."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Supprimer la langue sélectionnée?</item>
<item quantity="other">Supprimer les langues sélectionnées?</item>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 4a448c6..286997b 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Opción predeterminada do sistema"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"A opción de seleccionar un idioma para esta aplicación non está dispoñible en Configuración."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"É posible que o idioma non estea dispoñible na aplicación. Pode que algunhas aplicacións non sexan compatibles con esta opción de configuración."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Aquí só se mostran as aplicacións que admiten a selección de idioma."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Queres quitar os idiomas seleccionados?</item>
<item quantity="one">Queres quitar o idioma seleccionado?</item>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index eb50a6a..73bafa7 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"સિસ્ટમ ડિફૉલ્ટ"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"આ ઍપ માટે સેટિંગમાંથી ભાષા પસંદ કરી શકાતી નથી."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"આ ભાષા ઍપમાં ઉપલબ્ધ ભાષાઓથી અલગ હોઈ શકે છે. કેટલીક ઍપ આ સેટિંગને સપોર્ટ ન કરે એવું બની શકે છે."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"માત્ર ભાષાની પસંદગીને સપોર્ટ કરતી ઍપ જ અહીં બતાવવામાં આવી છે."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">પસંદ કરેલ ભાષાઓને કાઢી નાખીએ?</item>
<item quantity="other">પસંદ કરેલ ભાષાઓને કાઢી નાખીએ?</item>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index ec8b8a6..f5b63aa 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"सिस्टम डिफ़ॉल्ट"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"सेटिंग में, इस ऐप्लिकेशन की भाषा चुनने का विकल्प मौजूद नहीं है."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"भाषा, ऐप्लिकेशन में उपलब्ध भाषाओं से अलग हो सकती है. हो सकता है कि कुछ ऐप्लिकेशन के साथ, भाषा की यह सेटिंग काम न करे."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"यहां सिर्फ़ वे ऐप्लिकेशन दिखाए गए हैं जिनमें भाषा चुनने का विकल्प मौजूद है."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">क्या आप चुनी गई भाषा हटाना चाहते हैं?</item>
<item quantity="other">क्या आप चुनी गई भाषाएं हटाना चाहते हैं?</item>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 487a3a1..9cbc0fc 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -229,6 +229,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Zadane postavke sustava"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Odabir jezika za ovu aplikaciju nije dostupan u postavkama."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Jezik se može razlikovati od jezika dostupnih u aplikaciji. Neke aplikacije možda ne podržavaju tu postavku."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Ovdje se prikazuju samo aplikacije koje podržavaju odabir jezika."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Želite li ukloniti odabrane jezike?</item>
<item quantity="few">Želite li ukloniti odabrane jezike?</item>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 0bb827b..9dad46f 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Rendszerbeállítás"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"A Nyelvválasztás nem áll rendelkezésre ehhez az alkalmazáshoz a Beállításokban."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"A nyelv eltérhet az alkalmazásban rendelkezésre álló nyelvektől. Előfordulhat, hogy egyes alkalmazások nem támogatják ezt a beállítást."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Csak azok az alkalmazások láthatók itt, amelyek támogatják a nyelvválasztást."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Eltávolítja a kiválasztott nyelveket?</item>
<item quantity="one">Eltávolítja a kiválasztott nyelvet?</item>
diff --git a/res/values-hy/arrays.xml b/res/values-hy/arrays.xml
index 9681888..42043b3 100644
--- a/res/values-hy/arrays.xml
+++ b/res/values-hy/arrays.xml
@@ -409,9 +409,9 @@
</string-array>
<string-array name="captioning_preset_selector_titles">
<item msgid="3880932435325583041">"Կարգավորված է հավելվածով"</item>
- <item msgid="8719204526359229387">"Սպիտակը սևի վրա"</item>
- <item msgid="5410164687403735103">"Սևը սպիտակի վրա"</item>
- <item msgid="1119043472912497241">"Դեղինը սևի վրա"</item>
+ <item msgid="8719204526359229387">"Սպիտակ՝ սևի վրա"</item>
+ <item msgid="5410164687403735103">"Սև՝ սպիտակի վրա"</item>
+ <item msgid="1119043472912497241">"Դեղին՝ սևի վրա"</item>
<item msgid="2836895041823327816">"Դեղինը կապույտի վրա"</item>
<item msgid="747238414788976867">"Հատուկ"</item>
</string-array>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 797712f..e5e63e0 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Կանխադրված"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Լեզվի ընտրությունն այս հավելվածի համար հասանելի չէ Կարգավորումներում։"</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Լեզուն կարող է հավելվածում հասանելի լեզուների ցանկում չլինել։ Որոշ հավելվածներ կարող են չաջակցել այս կարգավորումը։"</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Այստեղ ցուցադրված են միայն այն հավելվածները, որոնցում աջակցվում է լեզվի ընտրությունը։"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Հեռացնե՞լ ընտրված լեզուն</item>
<item quantity="other">Հեռացնե՞լ ընտրված լեզուները</item>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 3bb1aca..73c6fc0 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Default sistem"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Pemilihan bahasa untuk aplikasi ini tidak tersedia dari Setelan."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Bahasa mungkin berbeda dari bahasa yang tersedia di aplikasi. Beberapa aplikasi mungkin tidak mendukung setelan ini."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Hanya aplikasi yang mendukung pilihan bahasa yang ditampilkan di sini."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Hapus bahasa yang dipilih?</item>
<item quantity="one">Hapus bahasa yang dipilih?</item>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 75792a5..d490ed3 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Sjálfgildi kerfis"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Ekki er hægt að velja tungumál fyrir þetta forrit í stillingum."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Tungumál kann að vera frábrugðið tiltækum tungumálum í forritinu. Tiltekin forrit styðja hugsanlega ekki þessa stillingu."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Hér eru aðeins birt forrit sem styðja val á tungumáli."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Fjarlægja valin tungumál?</item>
<item quantity="other">Fjarlægja valin tungumál?</item>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index cbcb0e1..21221fc 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Predefinita di sistema"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"La selezione della lingua per questa app non è disponibile nelle Impostazioni."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"La lingua potrebbe essere diversa dalle lingue disponibili nell\'app. Alcune app potrebbero non supportare questa impostazione."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Qui vengono mostrate soltanto le app che supportano la selezione della lingua."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Rimuovere le lingue selezionate?</item>
<item quantity="one">Rimuovere la lingua selezionata?</item>
diff --git a/res/values-iw/arrays.xml b/res/values-iw/arrays.xml
index df97f79..023aa01 100644
--- a/res/values-iw/arrays.xml
+++ b/res/values-iw/arrays.xml
@@ -417,7 +417,7 @@
</string-array>
<string-array name="accessibility_button_location_selector_titles">
<item msgid="6485511780196327736">"צף מעל אפליקציות אחרות"</item>
- <item msgid="3605616699204153590">"סרגל ניווט"</item>
+ <item msgid="3605616699204153590">"סרגל הניווט"</item>
</string-array>
<string-array name="accessibility_button_gesture_selector_titles">
<item msgid="2370918472773154939">"לחצן"</item>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 00222fe..33bf9ad 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -230,6 +230,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"ברירת המחדל של המערכת"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"בחירות השפה לאפליקציה הזו לא זמינה בהגדרות."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"השפה עשויה להיות שונה מהשפות הזמינות באפליקציה. יכול להיות שחלק מהאפליקציות לא תומכות בהגדרה הזו."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"מוצגות כאן רק אפליקציות התומכות בבחירת שפה."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="two">להסיר את השפות שנבחרו?</item>
<item quantity="many">להסיר את השפות שנבחרו?</item>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index c4b67ab..8f6f054 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"システムのデフォルト"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"このアプリの言語は [設定] から選択できません。"</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"アプリで利用できない言語の可能性があります。一部のアプリはこの設定に対応していない可能性があります。"</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"ここには、選択した言語に対応するアプリのみが表示されます。"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">選択した言語を削除しますか?</item>
<item quantity="one">選択した言語を削除しますか?</item>
diff --git a/res/values-kk/arrays.xml b/res/values-kk/arrays.xml
index 2d03d67..bbc2339 100644
--- a/res/values-kk/arrays.xml
+++ b/res/values-kk/arrays.xml
@@ -387,8 +387,8 @@
<item msgid="5012882784126308133">"Кішкене бас әріптер"</item>
</string-array>
<string-array name="captioning_font_size_selector_titles">
- <item msgid="923916134548435468">"Өте кішкене"</item>
- <item msgid="5738147437573674872">"Кішкене"</item>
+ <item msgid="923916134548435468">"Өте кіші"</item>
+ <item msgid="5738147437573674872">"Кіші"</item>
<item msgid="4691660235626027304">"Орташа"</item>
<item msgid="824386705928670045">"Үлкен"</item>
<item msgid="2790561781512874585">"Өте үлкен"</item>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index e52fa62..ecb56a7 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Жүйенің әдепкі параметрі"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Бұл қолданба үшін \"Параметрлер\" бөлімінен тіл таңдау мүмкіндігі қолжетімсіз."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Тілдер қолданбадағы тілдерден өзгеше болуы мүмкін. Кейбір қолданба бұл параметрді қолдамауы мүмкін."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Мұнда тіл таңдау мүмкіндігі бар қолданбалар ғана көрсетілген."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Таңдалған тілдерді жою керек пе?</item>
<item quantity="one">Таңдалған тілді жою керек пе?</item>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index d7c5041..524dfcf 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"លំនាំដើមប្រព័ន្ធ"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"មិនអាចជ្រើសរើសភាសាសម្រាប់កម្មវិធីនេះពីការកំណត់បានទេ។"</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"ភាសាអាចមានភាពខុសគ្នាពីភាសាដែលមាននៅក្នុងកម្មវិធី។ កម្មវិធីមួយចំនួនប្រហែលជាមិនអាចប្រើការកំណត់នេះបានទេ។"</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"មានតែកម្មវិធីដែលស្គាល់ការជ្រើសរើសភាសាប៉ុណ្ណោះដែលបង្ហាញនៅទីនេះ។"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">លុបភាសាដែលបានជ្រើសរើសឬ?</item>
<item quantity="one">លុបភាសាដែលបានជ្រើសរើសឬ?</item>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 99dce28..55ad7df 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"ಸಿಸ್ಟಂ ಡೀಫಾಲ್ಟ್"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"ಸೆಟ್ಟಿಂಗ್ಗಳ ಮೂಲಕ ಈ ಆ್ಯಪ್ಗಾಗಿ ಭಾಷೆಯ ಆಯ್ಕೆಯು ಲಭ್ಯವಿಲ್ಲ."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"ಆ್ಯಪ್ನಲ್ಲಿ ಲಭ್ಯವಿರುವ ಭಾಷೆಗಳಿಗಿಂತ ಭಾಷೆ ಭಿನ್ನವಾಗಿರಬಹುದು. ಕೆಲವು ಆ್ಯಪ್ಗಳು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬೆಂಬಲಿಸದಿರಬಹುದು."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"ಭಾಷೆಯ ಆಯ್ಕೆಯನ್ನು ಬೆಂಬಲಿಸುವ ಆ್ಯಪ್ಗಳನ್ನು ಮಾತ್ರ ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತದೆ."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">ಆಯ್ಕೆಮಾಡಿದ ಭಾಷೆಗಳನ್ನು ತೆಗೆದುಹಾಕಬೇಕೇ?</item>
<item quantity="other">ಆಯ್ಕೆಮಾಡಿದ ಭಾಷೆಗಳನ್ನು ತೆಗೆದುಹಾಕಬೇಕೇ?</item>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 7ba3442..00c4ac4 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"시스템 기본값"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"설정에서 이 앱의 언어를 선택할 수 없습니다."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"언어가 앱에서 사용 가능한 언어와 다를 수 있습니다. 일부 앱에서는 이 설정을 지원하지 않을 수도 있습니다."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"언어 선택을 지원하는 앱만 여기에 표시됩니다."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">선택한 언어를 삭제하시겠습니까?</item>
<item quantity="one">선택한 언어를 삭제하시겠습니까?</item>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index e7bb0e3..872d5f4 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Системанын демейки параметрлери"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Бул колдонмонун тилин Жөндөөлөрдөн тандоого болбойт."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Тил колдонмодо жеткиликтүү тилдерден айырмаланышы мүмкүн. Бул жөндөө айрым колдонмолор тарабынан колдоого алынбайт болушу мүмкүн."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Бул жерде тил тандоого мүмкүн болгон колдонмолор гана көрсөтүлөт."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Тандалган тилдерди өчүрөсүзбү?</item>
<item quantity="one">Тандалган тилди өчүрөсүзбү?</item>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index f9efbf0..d770f56 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"ຄ່າເລີ່ມຕົ້ນຂອງລະບົບ"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"ບໍ່ສາມາດເລືອກພາສາສຳລັບແອັບນີ້ຈາກການຕັ້ງຄ່າໄດ້."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"ພາສາອາດແຕກຕ່າງໄປຈາກພາສາທີ່ສາມາດໃຊ້ໄດ້ໃນແອັບ. ບາງແອັບອາດບໍ່ຮອງຮັບການຕັ້ງຄ່ານີ້."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"ມີພຽງແອັບທີ່ຮອງຮັບການເລືອກພາສາທີ່ສະແດງຢູ່ບ່ອນນີ້."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">ລຶບພາສາທີ່ເລືອກບໍ?</item>
<item quantity="one">ລຶບພາສາທີ່ເລືອກບໍ?</item>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index d5abba9..b96e554 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -230,6 +230,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Numatytoji sistemos vertė"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Šios programos kalbos pasirinkimas nepasiekiamas iš skilties „Nustatymai“."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Kalba gali skirtis nuo programoje pasiekiamų kalbų. Kai kuriose programose šis nustatymas gali būti nepalaikomas."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Čia rodomos tik kalbos pasirinkimą palaikančios programos."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Pašalinti pasirinktas kalbas?</item>
<item quantity="few">Pašalinti pasirinktas kalbas?</item>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index f603fa8..6627b88 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Стандардно за системот"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Не може да се бира јазик за апликацијава од „Поставките“."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Јазикот може да се разликува од јазиците достапни во апликацијата. Некои апликации може да не ја поддржуваат оваа поставка."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Само апликациите што поддржуваат бирање јазик се прикажани овде."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Да се отстранат избраните јазици?</item>
<item quantity="other">Да се отстранат избраните јазици?</item>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index ffb5bec..33dbd7f 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"സിസ്റ്റം ഡിഫോൾട്ട്"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"ക്രമീകരണത്തിൽ നിന്ന് ഈ ആപ്പിനുള്ള ഭാഷ തിരഞ്ഞെടുക്കാനുള്ള ഓപ്ഷൻ ലഭ്യമല്ല."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"ആപ്പിൽ ലഭ്യമായ ഭാഷകളിൽ നിന്ന് ഭാഷ വ്യത്യാസപ്പെട്ടേക്കാം. ചില ആപ്പുകൾ ഈ ക്രമീകരണത്തെ പിന്തുണച്ചേക്കില്ല."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"ഭാഷാ സെലക്ഷൻ പിന്തുണയ്ക്കുന്ന ആപ്പുകൾ മാത്രമാണ് ഇവിടെ കാണിക്കുന്നത്."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">തിരഞ്ഞെടുത്ത ഭാഷകൾ നീക്കംചെയ്യണോ?</item>
<item quantity="one">തിരഞ്ഞെടുത്ത ഭാഷ നീക്കംചെയ്യണോ?</item>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index b93ea98..2f86f05 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Системийн өгөгдмөл"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Энэ аппын хэлийг Тохиргоо хэсгээс сонгох боломжгүй байна."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Хэл нь аппад боломжтой хэлээс шалтгаалан харилцан адилгүй байж болно. Зарим апп энэ тохиргоог дэмждэггүй байж магадгүй."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Зөвхөн хэлний сонголтыг дэмждэг аппуудыг энд харуулав."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Сонгосон хэлийг хасах уу?</item>
<item quantity="one">Сонгосон хэлийг хасах уу?</item>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 6ac9270..3b7ab98 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Lalai sistem"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Pemilihan bahasa untuk apl ini tidak tersedia daripada Tetapan."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Bahasa mungkin berbeza daripada bahasa yang tersedia dalam apl. Sesetengah apl mungkin tidak menyokong tetapan ini."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Hanya apl yang menyokong pemilihan bahasa dipaparkan di sini."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Alih keluar bahasa yang dipilih?</item>
<item quantity="one">Alih keluar bahasa yang dipilih?</item>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 7870be8..3dbb787 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"စနစ်မူရင်း"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"ဤအက်ပ်အတွက် ‘ဆက်တင်များ’ မှ ဘာသာစကား ရွေးချယ်မှု မရရှိနိုင်ပါ။"</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"ဘာသာစကားသည် အက်ပ်တွင် ရရှိနိုင်သော ဘာသာစကားများမှ ကွဲပြားနိုင်သည်။ အချို့အက်ပ်များက ဤဆက်တင်ကို မပံ့ပိုးနိုင်ပါ။"</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"ဘာသာစကားရွေးချယ်မှုကို ပံ့ပိုးသည့် အက်ပ်များကိုသာ ဤနေရာတွင် ပြထားသည်။"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">ရွေးထားသည့် ဘာသာစကားများကို ဖယ်ရှားမလား။</item>
<item quantity="one">ရွေးထားသည့် ဘာသာစကားကို ဖယ်ရှားမလား။</item>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 5060cc9..3929410 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Systeemstandaard"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Taalselectie voor deze app is niet beschikbaar via Instellingen."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"De taal kan verschillen van de beschikbare talen in de app. Sommige apps ondersteunen deze instelling mogelijk niet."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Hier zie je alleen apps die taalselectie ondersteunen."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Geselecteerde talen verwijderen?</item>
<item quantity="one">Geselecteerde taal verwijderen?</item>
diff --git a/res/values-or/arrays.xml b/res/values-or/arrays.xml
index 6ed8c8e..069eb48 100644
--- a/res/values-or/arrays.xml
+++ b/res/values-or/arrays.xml
@@ -485,7 +485,7 @@
<item msgid="8186970968968646288">"କ୍ୟାଶ୍ ହୋଇଥିବା (ଖାଲି)"</item>
</string-array>
<string-array name="color_picker">
- <item msgid="7216413848731287689">"ସାଇଆନ୍"</item>
+ <item msgid="7216413848731287689">"ସିଆନ୍"</item>
<item msgid="5661027589207588703">"ନୀଳ"</item>
<item msgid="1219738214736244749">"ସବୁଜ"</item>
<item msgid="6331809026622602308">"ବାଇଗଣୀ"</item>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 02389dc..ed5164d 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"ਸਿਸਟਮ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਇਸ ਐਪ ਲਈ ਭਾਸ਼ਾ ਦੀ ਚੋਣ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"ਭਾਸ਼ਾ ਐਪ ਵਿਚਲੀਆਂ ਉਪਲਬਧ ਭਾਸ਼ਾਵਾਂ ਨਾਲੋਂ ਵੱਖਰੀ ਹੋ ਸਕਦੀ ਹੈ। ਕੁਝ ਐਪਾਂ ਸ਼ਾਇਦ ਇਸ ਸੈਟਿੰਗਾਂ ਦਾ ਸਮਰਥਨ ਨਾ ਕਰਨ।"</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"ਸਿਰਫ਼ ਉਹ ਐਪਾਂ ਹੀ ਇੱਥੇ ਦਿਖਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ ਜੋ ਭਾਸ਼ਾ ਦੀ ਚੋਣ ਦਾ ਸਮਰਥਨ ਕਰਦੀਆਂ ਹਨ।"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">ਕੀ ਚੁਣੀ ਗਈ ਭਾਸ਼ਾ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?</item>
<item quantity="other">ਕੀ ਚੁਣੀਆਂ ਗਈਆਂ ਭਾਸ਼ਾਵਾਂ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?</item>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index 494fae1..0f57759 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Padrão do sistema"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"A seleção de idioma para este app não está disponível nas configurações."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"O idioma pode ser diferente dos disponíveis no app. Alguns apps podem não ter suporte a essa configuração."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Apenas apps que têm suporte à seleção de idioma são mostrados aqui."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Remover o idioma selecionado?</item>
<item quantity="other">Remover idiomas selecionados?</item>
diff --git a/res/values-pt-rPT/arrays.xml b/res/values-pt-rPT/arrays.xml
index 1dbfaeb..c61e794 100644
--- a/res/values-pt-rPT/arrays.xml
+++ b/res/values-pt-rPT/arrays.xml
@@ -270,7 +270,7 @@
<item msgid="6485000384018554920">"volume do toque"</item>
<item msgid="3378000878531336372">"volume de multimédia"</item>
<item msgid="5272927168355895681">"volume de alarme"</item>
- <item msgid="4422070755065530548">"volume de notificação"</item>
+ <item msgid="4422070755065530548">"volume de notificações"</item>
<item msgid="3250654589277825306">"volume de Bluetooth"</item>
<item msgid="4212187233638382465">"Manter ativo"</item>
<item msgid="5099026183238335900">"monitorizar localização"</item>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 494fae1..0f57759 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Padrão do sistema"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"A seleção de idioma para este app não está disponível nas configurações."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"O idioma pode ser diferente dos disponíveis no app. Alguns apps podem não ter suporte a essa configuração."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Apenas apps que têm suporte à seleção de idioma são mostrados aqui."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Remover o idioma selecionado?</item>
<item quantity="other">Remover idiomas selecionados?</item>
diff --git a/res/values-ro/arrays.xml b/res/values-ro/arrays.xml
index e6409d7..cabcb09 100644
--- a/res/values-ro/arrays.xml
+++ b/res/values-ro/arrays.xml
@@ -387,8 +387,8 @@
<item msgid="5012882784126308133">"Majuscule mici"</item>
</string-array>
<string-array name="captioning_font_size_selector_titles">
- <item msgid="923916134548435468">"Foarte mic"</item>
- <item msgid="5738147437573674872">"Mic"</item>
+ <item msgid="923916134548435468">"Foarte mică"</item>
+ <item msgid="5738147437573674872">"Mică"</item>
<item msgid="4691660235626027304">"Medie"</item>
<item msgid="824386705928670045">"Mare"</item>
<item msgid="2790561781512874585">"Foarte mare"</item>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 69ad41e..1b3f615 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -229,6 +229,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Prestabilit de sistem"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Selectarea limbii pentru această aplicație din Setări nu este disponibilă."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Limba poate fi alta decât limbile disponibile în aplicație. Este posibil ca unele aplicații să nu accepte această setare."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Aici sunt afișate numai aplicațiile care acceptă selectarea limbii."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="few">Eliminați limbile selectate?</item>
<item quantity="other">Eliminați limbile selectate?</item>
diff --git a/res/values-si/arrays.xml b/res/values-si/arrays.xml
index 976b790..a8bf675 100644
--- a/res/values-si/arrays.xml
+++ b/res/values-si/arrays.xml
@@ -296,7 +296,7 @@
<item msgid="2504191192460059817">"තිරය ක්රියාත්මක කිරීම"</item>
<item msgid="7905819538788103556">"ගිණුම් ලබා ගැනීම"</item>
<item msgid="1675025662248079254">"පසුබිමෙහි ධාවනය"</item>
- <item msgid="2553974920157061225">"ප්රවේශ්යතා හඬ පරිමාව"</item>
+ <item msgid="2553974920157061225">"ප්රවේශ්යතා හඬ"</item>
</string-array>
<string-array name="app_ops_labels">
<item msgid="7780927354556651567">"ස්ථානය"</item>
@@ -363,7 +363,7 @@
<item msgid="4281352581602735717">"තිරය ක්රියාත්මක කිරීම"</item>
<item msgid="346122795998225472">"ගිණුම් ලබා ගැනීම"</item>
<item msgid="3756073389408535680">"පසුබිමෙහි ධාවනය"</item>
- <item msgid="2114661179947426734">"ප්රවේශ්යතා හඬ පරිමාව"</item>
+ <item msgid="2114661179947426734">"ප්රවේශ්යතා හඬ"</item>
</string-array>
<string-array name="long_press_timeout_selector_titles">
<item msgid="6926391290986427331">"කොට"</item>
diff --git a/res/values-sl/arrays.xml b/res/values-sl/arrays.xml
index c39a0bc..ca80126 100644
--- a/res/values-sl/arrays.xml
+++ b/res/values-sl/arrays.xml
@@ -424,7 +424,7 @@
<item msgid="6922258575853746220">"Poteza"</item>
</string-array>
<string-array name="accessibility_button_size_selector_titles">
- <item msgid="7482952318152486459">"Majhen"</item>
+ <item msgid="7482952318152486459">"Majhna"</item>
<item msgid="1666628329913333563">"Velik"</item>
</string-array>
<string-array name="vpn_types_long">
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index cd288a9..39f7092 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -230,6 +230,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Sistemsko privzeto"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"V nastavitvah ni na voljo izbire jezika za to aplikacijo."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Jezik se morda razlikuje od jezikov, ki so na voljo v aplikaciji. Nekatere aplikacije morda ne podpirajo te nastavitve."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Tukaj so prikazane samo aplikacije, ki podpirajo izbiro jezika."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Želite odstraniti izbrane jezike?</item>
<item quantity="two">Želite odstraniti izbrane jezike?</item>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index a6df705..cd5d70b 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Parazgjedhja e sistemit"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Zgjedhja e gjuhës për këtë aplikacion nuk ofrohet nga \"Cilësimet\"."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Gjuha mund të ndryshojë nga gjuhët që ofrohen në aplikacion. Disa aplikacione mund të mos e mbështetin këtë cilësim."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Vetëm aplikacionet që mbështetin zgjedhjen e gjuhës shfaqen këtu."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Të hiqet gjuha e zgjedhur?</item>
<item quantity="one">Të hiqet gjuha e zgjedhur?</item>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index b5805ae..adab5b5 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -229,6 +229,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Подразумевани системски"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Избор језика за ову апликацију није доступан из Подешавања."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Језик може да се разликује од језика доступних у апликацији. Неке апликације можда не подржавају ово подешавање."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Овде се приказују само апликације које подржавају избор језика."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Желите ли да уклоните изабране језике?</item>
<item quantity="few">Желите ли да уклоните изабране језике?</item>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 5e11d62..7db27e0 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Systemets standardinställning"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Det går inte att välja språk för den här appen i Inställningar."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Alla språk kanske inte är tillgängliga i appen. Vissa appar kanske inte har stöd för denna inställning."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Endast appar som har stöd för språkval visas här."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Vill du ta bort de valda språken?</item>
<item quantity="one">Vill du ta bort det valda språket?</item>
diff --git a/res/values-sw/arrays.xml b/res/values-sw/arrays.xml
index 366c8b6..e3434d0 100644
--- a/res/values-sw/arrays.xml
+++ b/res/values-sw/arrays.xml
@@ -288,7 +288,7 @@
<item msgid="1745447762712473288">"tumia sip"</item>
<item msgid="2986821801246709737">"chakata simu uliyopiga"</item>
<item msgid="2702338156976571452">"alama ya kidole"</item>
- <item msgid="7925495329948404955">"vitambua shughuli za mwili"</item>
+ <item msgid="7925495329948404955">"vitambuzi vya shughuli za mwili"</item>
<item msgid="8163066895749904470">"soma matangazo ya simu"</item>
<item msgid="7621394050624063528">"eneo la jaribio"</item>
<item msgid="37519917674959757">"soma hifadhi"</item>
@@ -355,7 +355,7 @@
<item msgid="9143978647977300187">"Tumia sip"</item>
<item msgid="3053060162752878562">"Chakata simu uliyopiga"</item>
<item msgid="4480721672278100858">"Alama ya kidole"</item>
- <item msgid="7883743426029759112">"Vitambua shughuli za mwili"</item>
+ <item msgid="7883743426029759112">"Vitambuzi vya shughuli za mwili"</item>
<item msgid="2546206711741159825">"Soma matangazo ya simu"</item>
<item msgid="2363460595607829243">"Eneo la jaribio"</item>
<item msgid="3778165903878569143">"Soma hifadhi"</item>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index a11af1e..01f5116 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Chaguomsingi la mfumo"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Chaguo la lugha kwa programu hii halipatikani kwenye Mipangilio."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Huenda lugha ikatofautiana na zinazopatikana katika programu. Huenda baadhi ya programu zisiwe na uwezo wa kutumia mipangilio hii."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Programu zinazotumia chaguo la lugha ndizo zinazoonyeshwa hapa."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Ungependa kuondoa lugha zilizochaguliwa?</item>
<item quantity="one">Ungependa kuondoa lugha iliyochaguliwa?</item>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 2f6c37a..8a24e7e 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"சிஸ்டத்தின் இயல்பு"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"அமைப்புகளில் இந்த ஆப்ஸுக்கான மொழித் தேர்வு கிடைக்கவில்லை."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"ஆப்ஸில் இருக்கும் மொழிகளிலிருந்து மொழி வேறுபடலாம். சில ஆப்ஸில் இந்த அமைப்பைப் பயன்படுத்த முடியாது."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"மொழித் தேர்வை ஆதரிக்கும் ஆப்ஸ் மட்டும் இங்கே காட்டப்படும்."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">தேர்ந்தெடுத்த மொழிகளை அகற்றவா?</item>
<item quantity="one">தேர்ந்தெடுத்த மொழியை அகற்றவா?</item>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 4168a67..7b3d21c 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"సిస్టమ్ ఆటోమేటిక్ సెట్టింగ్"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"ఈ యాప్ కోసం భాష ఎంపిక సెట్టింగ్లలో అందుబాటులో లేదు."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"యాప్లో అందుబాటులో ఉన్న భాషలకు భాష భిన్నంగా ఉండవచ్చు. కొన్ని యాప్లు ఈ సెట్టింగ్కు సపోర్ట్ చేయకపోవచ్చు."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"భాష ఎంపికను సపోర్ట్ చేసే యాప్లు మాత్రమే ఇక్కడ చూపబడతాయి."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">ఎంచుకున్న భాషలను తీసివేయాలా?</item>
<item quantity="one">ఎంచుకున్న భాషను తీసివేయాలా?</item>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 5acf18a..fde49f6 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"ค่าเริ่มต้นของระบบ"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"การเลือกภาษาสำหรับแอปนี้ไม่พร้อมให้ใช้งานจากการตั้งค่า"</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"ภาษาอาจแตกต่างจากที่ให้บริการในแอป บางแอปอาจไม่รองรับการตั้งค่านี้"</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"ส่วนนี้แสดงเฉพาะแอปที่รองรับการเลือกภาษา"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">นำภาษาที่เลือกออกไหม</item>
<item quantity="one">นำภาษาที่เลือกออกไหม</item>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index b944178..f031d15 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Default ng system"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Hindi available sa Mga Setting ang pagpili ng wika para sa app na ito."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Posibleng iba ang wika sa mga wikang available sa app. Posibleng hindi suportahan ng ilang app ang setting na ito."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Mga app lang na sumusuporta sa pagpili ng wika ang ipinapakita dito."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Alisin ang mga piniling wika?</item>
<item quantity="other">Alisin ang mga piniling wika?</item>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 530d5ca..8effefe 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Sistem varsayılanı"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Ayarlar\'da bu uygulama için dil seçimi mevcut değil."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Dil, uygulamada bulunan dillerden farklı olabilir. Bazı uygulamalar bu ayarı desteklemeyebilir."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Yalnızca dil seçimini destekleyen uygulamalar burada görünür."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Seçilen diller kaldırılsın mı?</item>
<item quantity="one">Seçilen dil kaldırılsın mı?</item>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 99ee7d4..c2ae814 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"سسٹم ڈیفالٹ"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"اس ایپ کے لیے زبان کا انتخاب ترتیبات سے دستیاب نہیں ہے۔"</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"زبان ایپ میں دستیاب زبانوں سے مختلف ہو سکتی ہے۔ ہو سکتا ہے کچھ ایپس اس ترتیب کو سپورٹ نہ کریں۔"</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"یہاں صرف ان ایپس کی فہرست دکھائی جاتی ہے جو زبان کے انتخاب کو سپورٹ کرتی ہیں۔"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">منتخب کردہ زبانیں ہٹائیں؟</item>
<item quantity="one">منتخب کردہ زبان ہٹائیں؟</item>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index ad34078..5616191 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Tizim standarti"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Bu ilova uchun Sozlamalardan tilni tanlash imkonsiz"</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Bu til ilovadagi tillardan farq qilishi mumkin. Ayrim ilovalarda bu sozlama ishlamaydi."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Faqat til tanlash imkoni bor ilovalar shu yerda chiqadi."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Tanlangan tillar olib tashlansinmi?</item>
<item quantity="one">Tanlangan til olib tashlansinmi?</item>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index f09096b..6a69f4d 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Theo chế độ mặc định của hệ thống"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Bạn chưa thể chọn ngôn ngữ cho ứng dụng này trong phần Cài đặt."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Ngôn ngữ có thể khác với ngôn ngữ có sẵn trong ứng dụng. Một số ứng dụng có thể không hỗ trợ cài đặt này."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Chỉ những ứng dụng hỗ trợ lựa chọn ngôn ngữ mới được hiển thị."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">Xóa các ngôn ngữ đã chọn?</item>
<item quantity="one">Xóa ngôn ngữ đã chọn?</item>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 7a23a7d..068eb8b 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"系统默认设置"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"您无法从“设置”中选择此应用的语言。"</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"语言可能与应用中可用的语言不同。部分应用可能不支持此设置。"</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"此处仅显示支持选择语言的应用。"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">要移除所选语言吗?</item>
<item quantity="one">要移除所选语言吗?</item>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index dc2a11d..7de398d 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"系統預設"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"「設定」中不提供此應用程式的語言選擇。"</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"可用的語言可能與應用程式支援的語言不同,部分應用程式可能不支援此設定。"</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"這裡只會顯示支援語言選擇的應用程式。"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">要移除選取的語言嗎?</item>
<item quantity="one">要移除選取的語言嗎?</item>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 0e6a2d0..52fa6a9 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"系統預設"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"無法從「設定」選取這個應用程式的語言。"</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"可用的語言可能與應用程式支援的語言不同,某些應用程式可能不支援這項設定。"</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"只有可讓使用者選取語言的應用程式才會顯示在這裡。"</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="other">要移除所選語言嗎?</item>
<item quantity="one">要移除所選語言嗎?</item>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index e033103..d6a1480 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -228,6 +228,7 @@
<string name="preference_of_system_locale_summary" msgid="5612241394431188535">"Okuzenzakalelayo kwesistimu"</string>
<string name="desc_no_available_supported_locale" msgid="7883271726226947273">"Ukukhetha ulimi kwale app akutholakali Kumasethingi."</string>
<string name="desc_app_locale_disclaimer" msgid="5295933110644789052">"Ulimi lungahluka ezilimini ezitholakala ku-app. Amanye ama-app angase angalisekeli leli sethingi."</string>
+ <string name="desc_app_locale_selection_supported" msgid="6149467826636295127">"Ama-app asekela ukukhethwa kolimi kuphela aboniswa lapha."</string>
<plurals name="dlg_remove_locales_title" formatted="false" msgid="2845515796732609837">
<item quantity="one">Susa izilimi ezikhethiwe?</item>
<item quantity="other">Susa izilimi ezikhethiwe?</item>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 3d616a8..b88d01d 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -152,6 +152,12 @@
<dimen name="homepage_preference_icon_padding_start_two_pane">8dp</dimen>
<dimen name="homepage_preference_text_padding_start">16dp</dimen>
<dimen name="homepage_preference_text_padding_start_two_pane">24dp</dimen>
+ <dimen name="homepage_app_bar_corner_radius">32dp</dimen>
+ <dimen name="homepage_app_bar_padding_two_pane">6dp</dimen>
+ <!-- bottom: search_bar_margin - homepage_app_bar_padding_two_pane -->
+ <dimen name="homepage_app_bar_margin_bottom_two_pane">10dp</dimen>
+ <!-- horizontal: homepage_padding_horizontal_two_pane - homepage_app_bar_padding_two_pane -->
+ <dimen name="homepage_app_bar_margin_horizontal_two_pane">18dp</dimen>
<!-- Dimensions for Wifi Assistant Card -->
<dimen name="wifi_assistant_padding_top_bottom">16dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1d685ef..6a0fad2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -518,6 +518,9 @@
<!-- Description for the disclaimer of per app language. [CHAR LIMIT=NONE]-->
<string name="desc_app_locale_disclaimer">Language may differ from languages available in the app. Some apps may not support this setting.</string>
+ <!-- Description for introduction of the locale selection supported of app list [CHAR LIMIT=NONE]-->
+ <string name="desc_app_locale_selection_supported">Only apps that support language selection are shown here.</string>
+
<!-- The title of the confirmation dialog shown when the user selects one / several languages and tries to remove them [CHAR LIMIT=60] -->
<plurals name="dlg_remove_locales_title">
<item quantity="one">Remove selected language?</item>
@@ -8613,7 +8616,7 @@
<string name="spatial_audio_wired_headphones">Wired headphones</string>
<!-- Sound: Summary for the spatializer effect. [CHAR LIMIT=NONE]-->
- <string name="spatial_audio_text">Spatial Audio creates immersive sound that seems like it’s coming from all around you. Only works with some media.</string>
+ <string name="spatial_audio_text">Audio from compatible media becomes more immersive</string>
<!-- Sound: Summary for the Spatial audio setting when it is off. [CHAR LIMIT=NONE]-->
<string name="spatial_summary_off">Off</string>
@@ -8624,6 +8627,12 @@
<!-- Sound: Summary for the Spatial audio setting when it is on with two output devices enabled. [CHAR LIMIT=NONE]-->
<string name="spatial_summary_on_two">On / <xliff:g id="output device" example="Phone speaker">%1$s</xliff:g> and <xliff:g id="output device" example="Wired headphones">%2$s</xliff:g></string>
+ <!-- Sound: Footer message for the Spatial audio setting. [CHAR LIMIT=NONE]-->
+ <string name="spatial_audio_footer_title">You can also turn on Spatial Audio for Bluetooth devices.</string>
+
+ <!-- Sound: Footer hyperlink text to launch the Connected devices settings page. [CHAR LIMIT=NONE]-->
+ <string name="spatial_audio_footer_learn_more_text">Connected devices settings</string>
+
<!-- Sound: Summary for the Do not Disturb option that describes how many automatic rules (schedules) are enabled [CHAR LIMIT=NONE]-->
<string name="zen_mode_settings_schedules_summary">
{count, plural,
diff --git a/res/xml/bluetooth_device_details_fragment.xml b/res/xml/bluetooth_device_details_fragment.xml
index f6c0af6..f330b19 100644
--- a/res/xml/bluetooth_device_details_fragment.xml
+++ b/res/xml/bluetooth_device_details_fragment.xml
@@ -47,6 +47,11 @@
settings:allowDividerBelow="true"/>
<com.android.settings.slices.SlicePreference
+ android:key="bt_extra_control"
+ settings:controller="com.android.settings.slices.SlicePreferenceController"
+ settings:allowDividerAbove="true"/>
+
+ <com.android.settings.slices.SlicePreference
android:key="bt_device_slice"
settings:controller="com.android.settings.slices.BlockingSlicePrefController"
settings:allowDividerBelow="true"
@@ -61,6 +66,18 @@
<PreferenceCategory
android:key="bluetooth_profiles"/>
+ <PreferenceCategory
+ android:key="bluetooth_related_tools"
+ android:title="@string/bluetooth_screen_related">
+ <Preference
+ android:key="live_caption"
+ android:icon="@drawable/ic_live_caption"
+ android:persistent="false"
+ android:summary="@string/live_caption_summary"
+ android:title="@string/live_caption_title"
+ settings:controller="com.android.settings.accessibility.LiveCaptionPreferenceController"/>
+ </PreferenceCategory>
+
<com.android.settingslib.widget.FooterPreference
android:key="device_details_footer"
android:selectable="false"
diff --git a/res/xml/spatial_audio_settings.xml b/res/xml/spatial_audio_settings.xml
index da33986..13d3b25 100644
--- a/res/xml/spatial_audio_settings.xml
+++ b/res/xml/spatial_audio_settings.xml
@@ -34,4 +34,9 @@
android:title="@string/spatial_audio_wired_headphones"
settings:controller="com.android.settings.notification.SpatialAudioWiredHeadphonesController"/>
+ <com.android.settingslib.widget.FooterPreference
+ android:key="spatial_audio_footer"
+ android:title="@string/spatial_audio_footer_title"
+ android:selectable="false"
+ settings:searchable="false"/>
</PreferenceScreen>
diff --git a/src/com/android/settings/DefaultRingtonePreference.java b/src/com/android/settings/DefaultRingtonePreference.java
index 914c4b2..824a5a0 100644
--- a/src/com/android/settings/DefaultRingtonePreference.java
+++ b/src/com/android/settings/DefaultRingtonePreference.java
@@ -46,6 +46,11 @@
@Override
protected void onSaveRingtone(Uri ringtoneUri) {
+ if (ringtoneUri == null) {
+ setActualDefaultRingtoneUri(ringtoneUri);
+ return;
+ }
+
String mimeType = getContext().getContentResolver().getType(ringtoneUri);
if (mimeType == null) {
Log.e(TAG, "onSaveRingtone for URI:" + ringtoneUri
diff --git a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java
index 8f0ca3e..3dde687 100644
--- a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java
+++ b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java
@@ -38,13 +38,15 @@
import com.android.settings.bluetooth.BluetoothDeviceDetailsFragment;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.SubSettingLauncher;
+import com.android.settingslib.bluetooth.BluetoothCallback;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.HearingAidProfile;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
-import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
@@ -53,7 +55,7 @@
* Controller that shows and updates the bluetooth device name
*/
public class AccessibilityHearingAidPreferenceController extends BasePreferenceController
- implements LifecycleObserver, OnStart, OnStop {
+ implements LifecycleObserver, OnStart, OnStop, BluetoothCallback {
private static final String TAG = "AccessibilityHearingAidPreferenceController";
private Preference mHearingAidPreference;
@@ -82,15 +84,13 @@
private final LocalBluetoothManager mLocalBluetoothManager;
private final BluetoothAdapter mBluetoothAdapter;
- //cache value of supporting hearing aid or not
- private boolean mHearingAidProfileSupported;
+
private FragmentManager mFragmentManager;
public AccessibilityHearingAidPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mLocalBluetoothManager = getLocalBluetoothManager();
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- mHearingAidProfileSupported = isHearingAidProfileSupported();
}
@Override
@@ -101,29 +101,27 @@
@Override
public int getAvailabilityStatus() {
- return mHearingAidProfileSupported ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ return isHearingAidProfileSupported() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
@Override
public void onStart() {
- if (mHearingAidProfileSupported) {
- IntentFilter filter = new IntentFilter();
- filter.addAction(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
- filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
- mContext.registerReceiver(mHearingAidChangedReceiver, filter);
- }
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
+ filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
+ mContext.registerReceiver(mHearingAidChangedReceiver, filter);
+ mLocalBluetoothManager.getEventManager().registerCallback(this);
}
@Override
public void onStop() {
- if (mHearingAidProfileSupported) {
- mContext.unregisterReceiver(mHearingAidChangedReceiver);
- }
+ mContext.unregisterReceiver(mHearingAidChangedReceiver);
+ mLocalBluetoothManager.getEventManager().unregisterCallback(this);
}
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
- if (TextUtils.equals(preference.getKey(), getPreferenceKey())){
+ if (TextUtils.equals(preference.getKey(), getPreferenceKey())) {
final CachedBluetoothDevice device = getConnectedHearingAidDevice();
if (device == null) {
launchHearingAidInstructionDialog();
@@ -141,7 +139,38 @@
if (device == null) {
return mContext.getText(R.string.accessibility_hearingaid_not_connected_summary);
}
- return device.getName();
+
+ final int connectedNum = getConnectedHearingAidDeviceNum();
+ final CharSequence name = device.getName();
+ final int side = device.getDeviceSide();
+ final CachedBluetoothDevice subDevice = device.getSubDevice();
+ if (connectedNum > 1) {
+ return mContext.getString(R.string.accessibility_hearingaid_more_device_summary, name);
+ }
+ if (subDevice != null && subDevice.isConnected()) {
+ return mContext.getString(
+ R.string.accessibility_hearingaid_left_and_right_side_device_summary, name);
+ }
+ if (side == HearingAidProfile.DeviceSide.SIDE_INVALID) {
+ return mContext.getString(
+ R.string.accessibility_hearingaid_active_device_summary, name);
+ }
+ return (side == HearingAidProfile.DeviceSide.SIDE_LEFT)
+ ? mContext.getString(
+ R.string.accessibility_hearingaid_left_side_device_summary, name)
+ : mContext.getString(
+ R.string.accessibility_hearingaid_right_side_device_summary, name);
+ }
+
+ @Override
+ public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) {
+ if (activeDevice == null) {
+ return;
+ }
+
+ if (bluetoothProfile == BluetoothProfile.HEARING_AID) {
+ HearingAidUtils.launchHearingAidPairingDialog(mFragmentManager, activeDevice);
+ }
}
public void setFragmentManager(FragmentManager fragmentManager) {
@@ -150,33 +179,44 @@
@VisibleForTesting
CachedBluetoothDevice getConnectedHearingAidDevice() {
- if (!mHearingAidProfileSupported) {
+ if (!isHearingAidProfileSupported()) {
return null;
}
- if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
- return null;
- }
- final List<BluetoothDevice> deviceList = mLocalBluetoothManager.getProfileManager()
- .getHearingAidProfile().getConnectedDevices();
- final Iterator it = deviceList.iterator();
- while (it.hasNext()) {
- BluetoothDevice obj = (BluetoothDevice)it.next();
- if (!mLocalBluetoothManager.getCachedDeviceManager().isSubDevice(obj)) {
- return mLocalBluetoothManager.getCachedDeviceManager().findDevice(obj);
+
+ final CachedBluetoothDeviceManager deviceManager =
+ mLocalBluetoothManager.getCachedDeviceManager();
+ final HearingAidProfile hearingAidProfile =
+ mLocalBluetoothManager.getProfileManager().getHearingAidProfile();
+ final List<BluetoothDevice> deviceList = hearingAidProfile.getConnectedDevices();
+ for (BluetoothDevice obj : deviceList) {
+ if (!deviceManager.isSubDevice(obj)) {
+ return deviceManager.findDevice(obj);
}
}
return null;
}
+ private int getConnectedHearingAidDeviceNum() {
+ if (!isHearingAidProfileSupported()) {
+ return 0;
+ }
+
+ final CachedBluetoothDeviceManager deviceManager =
+ mLocalBluetoothManager.getCachedDeviceManager();
+ final HearingAidProfile hearingAidProfile =
+ mLocalBluetoothManager.getProfileManager().getHearingAidProfile();
+ final List<BluetoothDevice> deviceList = hearingAidProfile.getConnectedDevices();
+ return (int) deviceList.stream()
+ .filter(device -> !deviceManager.isSubDevice(device))
+ .count();
+ }
+
private boolean isHearingAidProfileSupported() {
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
return false;
}
final List<Integer> supportedList = mBluetoothAdapter.getSupportedProfiles();
- if (supportedList.contains(BluetoothProfile.HEARING_AID)) {
- return true;
- }
- return false;
+ return supportedList.contains(BluetoothProfile.HEARING_AID);
}
private LocalBluetoothManager getLocalBluetoothManager() {
diff --git a/src/com/android/settings/accessibility/HearingAidUtils.java b/src/com/android/settings/accessibility/HearingAidUtils.java
new file mode 100644
index 0000000..a3d2c93
--- /dev/null
+++ b/src/com/android/settings/accessibility/HearingAidUtils.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.FragmentManager;
+
+import com.android.settings.bluetooth.HearingAidPairingDialogFragment;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.HearingAidProfile;
+
+/** Provides utility methods related hearing aids. */
+public final class HearingAidUtils {
+ private static final String TAG = "HearingAidUtils";
+
+ private HearingAidUtils(){}
+
+ /**
+ * Launches pairing dialog when hearing aid device needs other side of hearing aid device to
+ * work.
+ *
+ * @param fragmentManager The {@link FragmentManager} used to show dialog fragment
+ * @param device The {@link CachedBluetoothDevice} need to be hearing aid device
+ */
+ public static void launchHearingAidPairingDialog(FragmentManager fragmentManager,
+ @NonNull CachedBluetoothDevice device) {
+ if (device.isConnectedHearingAidDevice()
+ && device.getDeviceMode() == HearingAidProfile.DeviceMode.MODE_BINAURAL
+ && device.getSubDevice() == null) {
+ launchHearingAidPairingDialogInternal(fragmentManager, device);
+ }
+ }
+
+ private static void launchHearingAidPairingDialogInternal(FragmentManager fragmentManager,
+ @NonNull CachedBluetoothDevice device) {
+ if (device.getDeviceSide() == HearingAidProfile.DeviceSide.SIDE_INVALID) {
+ Log.w(TAG, "Can not launch hearing aid pairing dialog for invalid side");
+ return;
+ }
+ HearingAidPairingDialogFragment.newInstance(device).show(fragmentManager,
+ HearingAidPairingDialogFragment.TAG);
+ }
+}
diff --git a/src/com/android/settings/applications/AppStateBaseBridge.java b/src/com/android/settings/applications/AppStateBaseBridge.java
index d7f253b..a4bdabf 100644
--- a/src/com/android/settings/applications/AppStateBaseBridge.java
+++ b/src/com/android/settings/applications/AppStateBaseBridge.java
@@ -52,7 +52,6 @@
public void resume(boolean forceLoadAllApps) {
mForceLoadAllApps = forceLoadAllApps;
- mHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ALL);
if (mForceLoadAllApps) {
mAppSession.onResume();
} else {
diff --git a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
index ef5b029..d1d286d 100644
--- a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
+++ b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
@@ -85,12 +85,27 @@
return view;
}
+ static View newHeader(ViewGroup parent, int resText) {
+ ViewGroup view = (ViewGroup) LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.preference_app_header, parent, false);
+ TextView textView = view.findViewById(R.id.apps_top_intro_text);
+ textView.setText(resText);
+ return view;
+ }
+
void setSummary(CharSequence summary) {
mSummary.setText(summary);
+ updateSummaryVisibility();
}
void setSummary(@StringRes int summary) {
mSummary.setText(summary);
+ updateSummaryVisibility();
+ }
+
+ private void updateSummaryVisibility() {
+ // Hide an empty summary and then title will be vertically centered.
+ mSummary.setVisibility(TextUtils.isEmpty(mSummary.getText()) ? View.GONE : View.VISIBLE);
}
void setEnabled(boolean isEnabled) {
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index a6abd10..9796454 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -824,14 +824,16 @@
if (mApplications == null) {
return;
}
- final int position = mRecyclerView.getChildAdapterPosition(view);
+ final int applicationPosition =
+ ApplicationsAdapter.getApplicationPosition(
+ mListType, mRecyclerView.getChildAdapterPosition(view));
- if (position == RecyclerView.NO_POSITION) {
+ if (applicationPosition == RecyclerView.NO_POSITION) {
Log.w(TAG, "Cannot find position for child, skipping onClick handling");
return;
}
- if (mApplications.getApplicationCount() > position) {
- ApplicationsState.AppEntry entry = mApplications.getAppEntry(position);
+ if (mApplications.getApplicationCount() > applicationPosition) {
+ ApplicationsState.AppEntry entry = mApplications.getAppEntry(applicationPosition);
mCurrentPkgName = entry.info.packageName;
mCurrentUid = entry.info.uid;
startApplicationDetailsActivity();
@@ -1058,6 +1060,7 @@
private static final String STATE_LAST_SCROLL_INDEX = "state_last_scroll_index";
private static final int VIEW_TYPE_APP = 0;
private static final int VIEW_TYPE_EXTRA_VIEW = 1;
+ private static final int VIEW_TYPE_APP_HEADER = 2;
private final ApplicationsState mState;
private final ApplicationsState.Session mSession;
@@ -1229,7 +1232,11 @@
@Override
public ApplicationViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View view;
- if (mManageApplications.mListType == LIST_TYPE_NOTIFICATION) {
+ if (mManageApplications.mListType == LIST_TYPE_APPS_LOCALE
+ && viewType == VIEW_TYPE_APP_HEADER) {
+ view = ApplicationViewHolder.newHeader(parent,
+ R.string.desc_app_locale_selection_supported);
+ } else if (mManageApplications.mListType == LIST_TYPE_NOTIFICATION) {
view = ApplicationViewHolder.newView(parent, true /* twoTarget */);
} else {
view = ApplicationViewHolder.newView(parent, false /* twoTarget */);
@@ -1239,6 +1246,9 @@
@Override
public int getItemViewType(int position) {
+ if (position == 0 && mManageApplications.mListType == LIST_TYPE_APPS_LOCALE) {
+ return VIEW_TYPE_APP_HEADER;
+ }
return VIEW_TYPE_APP;
}
@@ -1470,36 +1480,59 @@
}
}
+ /**
+ * Item count include all items. If UI has a header on the app list, it shall shift 1 to
+ * application count for the total item count.
+ */
@Override
public int getItemCount() {
- if (mEntries == null) {
- return 0;
+ int count = getApplicationCount();
+ if (count != 0 && mManageApplications.mListType == LIST_TYPE_APPS_LOCALE) {
+ count++;
}
- return mEntries.size();
+ return count;
}
public int getApplicationCount() {
return mEntries != null ? mEntries.size() : 0;
}
- public AppEntry getAppEntry(int position) {
- return mEntries.get(position);
+ public AppEntry getAppEntry(int applicationPosition) {
+ return mEntries.get(applicationPosition);
}
+ /**
+ * Item Id follows all item on the app list. If UI has a header on the list, it shall
+ * shift 1 to the position for correct app entry.
+ */
@Override
public long getItemId(int position) {
- if (position == mEntries.size()) {
+ int applicationPosition =
+ getApplicationPosition(mManageApplications.mListType, position);
+ if (applicationPosition == mEntries.size()
+ || applicationPosition == RecyclerView.NO_POSITION) {
return -1;
}
- return mEntries.get(position).id;
+ return mEntries.get(applicationPosition).id;
}
+ /**
+ * Check item in the list shall enable or disable.
+ * @param position The item position in the list
+ */
public boolean isEnabled(int position) {
- if (getItemViewType(position) == VIEW_TYPE_EXTRA_VIEW
+ int itemViewType = getItemViewType(position);
+ if (itemViewType == VIEW_TYPE_EXTRA_VIEW || itemViewType == VIEW_TYPE_APP_HEADER
|| mManageApplications.mListType != LIST_TYPE_HIGH_POWER) {
return true;
}
- ApplicationsState.AppEntry entry = mEntries.get(position);
+
+ int applicationPosition =
+ getApplicationPosition(mManageApplications.mListType, position);
+ if (applicationPosition == RecyclerView.NO_POSITION) {
+ return true;
+ }
+ ApplicationsState.AppEntry entry = mEntries.get(applicationPosition);
return !mBackend.isSysAllowlisted(entry.info.packageName)
&& !mBackend.isDefaultActiveApp(entry.info.packageName);
@@ -1507,8 +1540,21 @@
@Override
public void onBindViewHolder(ApplicationViewHolder holder, int position) {
+ if (getItemViewType(position) == VIEW_TYPE_APP_HEADER) {
+ // It does not bind holder here, due to header view.
+ return;
+ }
+
+ int applicationPosition =
+ getApplicationPosition(mManageApplications.mListType, position);
+ if (applicationPosition == RecyclerView.NO_POSITION) {
+ return;
+ }
// Bind the data efficiently with the holder
- final ApplicationsState.AppEntry entry = mEntries.get(position);
+ // If there is a header on the list, the position shall be shifted. Thus, it shall use
+ // #getApplicationPosition to get real application position for the app entry.
+ final ApplicationsState.AppEntry entry = mEntries.get(applicationPosition);
+
synchronized (entry) {
mState.ensureLabelDescription(entry);
holder.setTitle(entry.label, entry.labelDescription);
@@ -1608,6 +1654,22 @@
}
}
+ /**
+ * Adjusts position if this list adds a header.
+ * TODO(b/232533002) Add a header view on adapter of RecyclerView may not a good idea since
+ * ManageApplication is a generic purpose. In the future, here shall look for
+ * a better way to add a header without using recyclerView or any other ways
+ * to achieve the goal.
+ */
+ public static int getApplicationPosition(int listType, int position) {
+ int applicationPosition = position;
+ // Adjust position due to header added.
+ if (listType == LIST_TYPE_APPS_LOCALE) {
+ applicationPosition = position > 0 ? position - 1 : RecyclerView.NO_POSITION;
+ }
+ return applicationPosition;
+ }
+
public static class OnScrollListener extends RecyclerView.OnScrollListener {
private int mScrollState = SCROLL_STATE_IDLE;
private boolean mDelayNotifyDataChange;
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsController.java b/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsController.java
index 272d142..e3f0f09 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsCompanionAppsController.java
@@ -186,7 +186,7 @@
String address, PreferenceCategory container) {
// If the device is FastPair, remove CDM companion apps.
final BluetoothFeatureProvider bluetoothFeatureProvider = FeatureFactory.getFactory(context)
- .getBluetoothFeatureProvider(context);
+ .getBluetoothFeatureProvider();
final boolean sliceEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI,
SettingsUIDeviceConfig.BT_SLICE_SETTINGS_ENABLED, true);
final Uri settingsUri = bluetoothFeatureProvider.getBluetoothDeviceSettingsUri(
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
index 9c7aa58..06a71f0 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
@@ -75,10 +75,8 @@
if (TextUtils.isEmpty(summaryText)) {
// If first summary is unavailable, not to show second summary.
mHeaderController.setSecondSummary((CharSequence)null);
- } else {
- // If both the hearing aids are connected, two device status should be shown.
- mHeaderController.setSecondSummary(mDeviceManager.getSubDeviceSummary(mCachedDevice));
}
+
mHeaderController.setLabel(mCachedDevice.getName());
mHeaderController.setIcon(pair.first);
mHeaderController.setIconContentDescription(pair.second);
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsRelatedToolsController.java b/src/com/android/settings/bluetooth/BluetoothDetailsRelatedToolsController.java
new file mode 100644
index 0000000..bfaea85
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsRelatedToolsController.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.accessibilityservice.AccessibilityShortcutInfo;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.UserHandle;
+import android.view.accessibility.AccessibilityManager;
+
+import androidx.annotation.NonNull;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceScreen;
+
+import com.android.net.module.util.CollectionUtils;
+import com.android.settings.accessibility.RestrictedPreferenceHelper;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.RestrictedPreference;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * This class adds related tools preference.
+ */
+public class BluetoothDetailsRelatedToolsController extends BluetoothDetailsController{
+ private static final String KEY_RELATED_TOOLS_GROUP = "bluetooth_related_tools";
+ private static final String KEY_LIVE_CAPTION = "live_caption";
+ private static final int ORDINAL = 99;
+
+ private PreferenceCategory mPreferenceCategory;
+
+ public BluetoothDetailsRelatedToolsController(Context context,
+ PreferenceFragmentCompat fragment, CachedBluetoothDevice device, Lifecycle lifecycle) {
+ super(context, fragment, device, lifecycle);
+ lifecycle.addObserver(this);
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mCachedDevice.isHearingAidDevice();
+ }
+
+ @Override
+ protected void init(PreferenceScreen screen) {
+ if (!mCachedDevice.isHearingAidDevice()) {
+ return;
+ }
+
+ mPreferenceCategory = screen.findPreference(getPreferenceKey());
+ final Preference liveCaptionPreference = screen.findPreference(KEY_LIVE_CAPTION);
+ if (!liveCaptionPreference.isVisible()) {
+ mPreferenceCategory.removePreference(liveCaptionPreference);
+ }
+
+ final List<ComponentName> relatedToolsList = FeatureFactory.getFactory(
+ mContext).getBluetoothFeatureProvider().getRelatedTools();
+ if (!CollectionUtils.isEmpty(relatedToolsList)) {
+ addAccessibilityInstalledRelatedPreference(relatedToolsList);
+ }
+
+ if (mPreferenceCategory.getPreferenceCount() == 0) {
+ screen.removePreference(mPreferenceCategory);
+ }
+ }
+
+ @Override
+ protected void refresh() {}
+
+ @Override
+ public String getPreferenceKey() {
+ return KEY_RELATED_TOOLS_GROUP;
+ }
+
+ private void addAccessibilityInstalledRelatedPreference(
+ @NonNull List<ComponentName> componentNameList) {
+ final AccessibilityManager a11yManager = AccessibilityManager.getInstance(mContext);
+ final RestrictedPreferenceHelper preferenceHelper = new RestrictedPreferenceHelper(
+ mContext);
+
+ final List<AccessibilityServiceInfo> a11yServiceInfoList =
+ a11yManager.getInstalledAccessibilityServiceList().stream()
+ .filter(info -> componentNameList.contains(info.getComponentName()))
+ .collect(Collectors.toList());
+ final List<AccessibilityShortcutInfo> a11yShortcutInfoList =
+ a11yManager.getInstalledAccessibilityShortcutListAsUser(mContext,
+ UserHandle.myUserId()).stream()
+ .filter(info -> componentNameList.contains(info.getComponentName()))
+ .collect(Collectors.toList());
+
+ final List<RestrictedPreference> preferences = Stream.of(
+ preferenceHelper.createAccessibilityServicePreferenceList(a11yServiceInfoList),
+ preferenceHelper.createAccessibilityActivityPreferenceList(a11yShortcutInfoList))
+ .flatMap(Collection::stream)
+ .collect(Collectors.toList());
+
+ for (RestrictedPreference preference : preferences) {
+ preference.setOrder(ORDINAL);
+ mPreferenceCategory.addPreference(preference);
+ }
+ }
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
index 6d443ee..a9ac286 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java
@@ -22,12 +22,18 @@
import android.app.settings.SettingsEnums;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
+import android.net.Uri;
import android.os.Bundle;
import android.provider.DeviceConfig;
+import android.text.TextUtils;
import android.util.Log;
+import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
import androidx.annotation.VisibleForTesting;
@@ -36,12 +42,14 @@
import com.android.settings.dashboard.RestrictedDashboardFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.slices.BlockingSlicePrefController;
+import com.android.settings.slices.SlicePreferenceController;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
import java.util.ArrayList;
+import java.util.IllegalFormatException;
import java.util.List;
public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment {
@@ -61,6 +69,7 @@
@VisibleForTesting
interface TestDataFactory {
CachedBluetoothDevice getDevice(String deviceAddress);
+
LocalBluetoothManager getManager(Context context);
}
@@ -120,13 +129,56 @@
use(LeAudioBluetoothDetailsHeaderController.class).init(mCachedDevice, mManager);
final BluetoothFeatureProvider featureProvider = FeatureFactory.getFactory(
- context).getBluetoothFeatureProvider(context);
+ context).getBluetoothFeatureProvider();
final boolean sliceEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI,
SettingsUIDeviceConfig.BT_SLICE_SETTINGS_ENABLED, true);
use(BlockingSlicePrefController.class).setSliceUri(sliceEnabled
? featureProvider.getBluetoothDeviceSettingsUri(mCachedDevice.getDevice())
: null);
+ updateExtraControlUri(/* viewWidth */ 0);
+ }
+
+ private void updateExtraControlUri(int viewWidth) {
+ BluetoothFeatureProvider featureProvider = FeatureFactory.getFactory(
+ getContext()).getBluetoothFeatureProvider();
+ boolean sliceEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI,
+ SettingsUIDeviceConfig.BT_SLICE_SETTINGS_ENABLED, true);
+ Uri controlUri = null;
+ String uri = featureProvider.getBluetoothDeviceControlUri(mCachedDevice.getDevice());
+ if (!TextUtils.isEmpty(uri)) {
+ try {
+ controlUri = Uri.parse(String.format(uri, viewWidth));
+ } catch (IllegalFormatException | NullPointerException exception) {
+ Log.d(TAG, "unable to parse uri");
+ controlUri = null;
+ }
+ }
+ use(SlicePreferenceController.class).setSliceUri(sliceEnabled ? controlUri : null);
+ }
+
+ private final ViewTreeObserver.OnGlobalLayoutListener mOnGlobalLayoutListener =
+ new ViewTreeObserver.OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ View view = getView();
+ if (view == null) {
+ return;
+ }
+ updateExtraControlUri(view.getWidth());
+ view.getViewTreeObserver().removeOnGlobalLayoutListener(
+ mOnGlobalLayoutListener);
+ }
+ };
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = super.onCreateView(inflater, container, savedInstanceState);
+ if (view != null) {
+ view.getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener);
+ }
+ return view;
}
@Override
@@ -194,6 +246,8 @@
mCachedDevice, lifecycle));
controllers.add(new BluetoothDetailsMacAddressController(context, this, mCachedDevice,
lifecycle));
+ controllers.add(new BluetoothDetailsRelatedToolsController(context, this, mCachedDevice,
+ lifecycle));
}
return controllers;
}
diff --git a/src/com/android/settings/bluetooth/BluetoothFeatureProvider.java b/src/com/android/settings/bluetooth/BluetoothFeatureProvider.java
index 582a26c..648ca30 100644
--- a/src/com/android/settings/bluetooth/BluetoothFeatureProvider.java
+++ b/src/com/android/settings/bluetooth/BluetoothFeatureProvider.java
@@ -17,17 +17,37 @@
package com.android.settings.bluetooth;
import android.bluetooth.BluetoothDevice;
+import android.content.ComponentName;
import android.net.Uri;
+import java.util.List;
+
/**
- * Provider for bluetooth related feature
+ * Provider for bluetooth related features.
*/
public interface BluetoothFeatureProvider {
/**
- * Get the {@link Uri} that represents extra settings for a specific bluetooth device
+ * Gets the {@link Uri} that represents extra settings for a specific bluetooth device
+ *
* @param bluetoothDevice bluetooth device
* @return {@link Uri} for extra settings
*/
Uri getBluetoothDeviceSettingsUri(BluetoothDevice bluetoothDevice);
+
+ /**
+ * Gets the {@link Uri} that represents extra control for a specific bluetooth device
+ *
+ * @param bluetoothDevice bluetooth device
+ * @return {@link String} uri string for extra control
+ */
+ String getBluetoothDeviceControlUri(BluetoothDevice bluetoothDevice);
+
+ /**
+ * Gets the {@link ComponentName} of services or activities that need to be shown in related
+ * tools.
+ *
+ * @return list of {@link ComponentName}
+ */
+ List<ComponentName> getRelatedTools();
}
diff --git a/src/com/android/settings/bluetooth/BluetoothFeatureProviderImpl.java b/src/com/android/settings/bluetooth/BluetoothFeatureProviderImpl.java
index cd75951..5ddf062 100644
--- a/src/com/android/settings/bluetooth/BluetoothFeatureProviderImpl.java
+++ b/src/com/android/settings/bluetooth/BluetoothFeatureProviderImpl.java
@@ -17,19 +17,20 @@
package com.android.settings.bluetooth;
import android.bluetooth.BluetoothDevice;
+import android.content.ComponentName;
import android.content.Context;
import android.net.Uri;
+import com.android.settingslib.bluetooth.BluetoothUtils;
+
+import java.util.List;
+
/**
* Impl of {@link BluetoothFeatureProvider}
*/
public class BluetoothFeatureProviderImpl implements BluetoothFeatureProvider {
- private Context mContext;
-
- public BluetoothFeatureProviderImpl(Context context) {
- mContext = context;
- }
+ public BluetoothFeatureProviderImpl(Context context) {}
@Override
public Uri getBluetoothDeviceSettingsUri(BluetoothDevice bluetoothDevice) {
@@ -37,4 +38,14 @@
BluetoothDevice.METADATA_ENHANCED_SETTINGS_UI_URI);
return uriByte == null ? null : Uri.parse(new String(uriByte));
}
+
+ @Override
+ public String getBluetoothDeviceControlUri(BluetoothDevice bluetoothDevice) {
+ return BluetoothUtils.getControlUriMetaData(bluetoothDevice);
+ }
+
+ @Override
+ public List<ComponentName> getRelatedTools() {
+ return null;
+ }
}
diff --git a/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java b/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java
new file mode 100644
index 0000000..ac48217
--- /dev/null
+++ b/src/com/android/settings/bluetooth/HearingAidPairingDialogFragment.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import android.app.Dialog;
+import android.app.settings.SettingsEnums;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AlertDialog;
+
+import com.android.settings.R;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.HearingAidProfile;
+
+/**
+ * Provides a dialog to pair another side of hearing aid device.
+ */
+public class HearingAidPairingDialogFragment extends InstrumentedDialogFragment {
+ public static final String TAG = "HearingAidPairingDialogFragment";
+ private static final String KEY_CACHED_DEVICE_SIDE = "cached_device_side";
+
+ /**
+ * Creates a new {@link HearingAidPairingDialogFragment} and shows pair another side of hearing
+ * aid device according to {@code CachedBluetoothDevice} side.
+ *
+ * @param device The remote Bluetooth device, that needs to be hearing aid device.
+ * @return a DialogFragment
+ */
+ public static HearingAidPairingDialogFragment newInstance(CachedBluetoothDevice device) {
+ Bundle args = new Bundle(1);
+ args.putInt(KEY_CACHED_DEVICE_SIDE, device.getDeviceSide());
+ final HearingAidPairingDialogFragment fragment = new HearingAidPairingDialogFragment();
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ // TODO(b/225117454): Need to update SettingsEnums later
+ return SettingsEnums.ACCESSIBILITY;
+ }
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ final int deviceSide = getArguments().getInt(KEY_CACHED_DEVICE_SIDE);
+ final int titleId = R.string.bluetooth_pair_other_ear_dialog_title;
+ final int messageId = (deviceSide == HearingAidProfile.DeviceSide.SIDE_LEFT)
+ ? R.string.bluetooth_pair_other_ear_dialog_left_ear_message
+ : R.string.bluetooth_pair_other_ear_dialog_right_ear_message;
+ final int pairBtnId = (deviceSide == HearingAidProfile.DeviceSide.SIDE_LEFT)
+ ? R.string.bluetooth_pair_other_ear_dialog_right_ear_positive_button
+ : R.string.bluetooth_pair_other_ear_dialog_left_ear_positive_button;
+
+ return new AlertDialog.Builder(getActivity())
+ .setTitle(titleId)
+ .setMessage(messageId)
+ .setNegativeButton(
+ android.R.string.cancel, /* listener= */ null)
+ .setPositiveButton(pairBtnId, (dialog, which) -> positiveButtonListener())
+ .create();
+ }
+
+ private void positiveButtonListener() {
+ new SubSettingLauncher(getActivity())
+ .setDestination(BluetoothPairingDetail.class.getName())
+ .setSourceMetricsCategory(SettingsEnums.ACCESSIBILITY)
+ .launch();
+ }
+}
diff --git a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
index ec122df..6623b97 100644
--- a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
+++ b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
@@ -17,22 +17,26 @@
import static com.android.settingslib.Utils.isAudioModeOngoingCall;
+import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.content.pm.PackageManager;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
+import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
+import com.android.settings.accessibility.HearingAidUtils;
import com.android.settings.bluetooth.AvailableMediaBluetoothDeviceUpdater;
import com.android.settings.bluetooth.BluetoothDeviceUpdater;
import com.android.settings.bluetooth.Utils;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settingslib.bluetooth.BluetoothCallback;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
@@ -54,6 +58,7 @@
@VisibleForTesting
LocalBluetoothManager mLocalBluetoothManager;
private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
+ private FragmentManager mFragmentManager;
public AvailableMediaDeviceGroupController(Context context) {
super(context, KEY);
@@ -124,6 +129,7 @@
}
public void init(DashboardFragment fragment) {
+ mFragmentManager = fragment.getParentFragmentManager();
mBluetoothDeviceUpdater = new AvailableMediaBluetoothDeviceUpdater(fragment.getContext(),
fragment, AvailableMediaDeviceGroupController.this);
}
@@ -138,6 +144,18 @@
updateTitle();
}
+ @Override
+ public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) {
+ // exclude inactive device
+ if (activeDevice == null) {
+ return;
+ }
+
+ if (bluetoothProfile == BluetoothProfile.HEARING_AID) {
+ HearingAidUtils.launchHearingAidPairingDialog(mFragmentManager, activeDevice);
+ }
+ }
+
private void updateTitle() {
if (isAudioModeOngoingCall(mContext)) {
// in phone call
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 2ae2057..08692dd 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -422,6 +422,11 @@
private void setPreferenceIcon(Preference preference, Tile tile, boolean forceRoundedIcon,
String iconPackage, Icon icon) {
Drawable iconDrawable = icon.loadDrawable(preference.getContext());
+ if (iconDrawable == null) {
+ Log.w(TAG, "Set null preference icon for: " + iconPackage);
+ preference.setIcon(null);
+ return;
+ }
if (TextUtils.equals(tile.getCategory(), CategoryKey.CATEGORY_HOMEPAGE)) {
iconDrawable.setTint(Utils.getHomepageIconColor(preference.getContext()));
} else if (forceRoundedIcon && !TextUtils.equals(mContext.getPackageName(), iconPackage)) {
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 86b123b..c7bd3b5 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -89,7 +89,6 @@
private TopLevelSettings mMainFragment;
private View mHomepageView;
- private View mAppBar;
private View mSuggestionView;
private View mTwoPaneSuggestionView;
private CategoryMixin mCategoryMixin;
@@ -174,8 +173,7 @@
mSplitController = SplitController.getInstance();
mIsTwoPane = mSplitController.isActivityEmbedded(this);
- mAppBar = findViewById(R.id.app_bar_container);
- mAppBar.setMinimumHeight(getSearchBoxHeight());
+ updateAppBarMinHeight();
initHomepageContainer();
updateHomepageAppBar();
updateHomepageBackground();
@@ -491,12 +489,15 @@
if (!mIsEmbeddingActivityEnabled) {
return;
}
+ updateAppBarMinHeight();
if (mIsTwoPane) {
findViewById(R.id.homepage_app_bar_regular_phone_view).setVisibility(View.GONE);
findViewById(R.id.homepage_app_bar_two_pane_view).setVisibility(View.VISIBLE);
+ findViewById(R.id.suggestion_container_two_pane).setVisibility(View.VISIBLE);
} else {
findViewById(R.id.homepage_app_bar_regular_phone_view).setVisibility(View.VISIBLE);
findViewById(R.id.homepage_app_bar_two_pane_view).setVisibility(View.GONE);
+ findViewById(R.id.suggestion_container_two_pane).setVisibility(View.GONE);
}
}
@@ -507,19 +508,20 @@
if (mIsTwoPane) {
int padding = getResources().getDimensionPixelSize(
R.dimen.homepage_padding_horizontal_two_pane);
- mAppBar.setPaddingRelative(padding, 0, padding, 0);
mMainFragment.setPaddingHorizontal(padding);
} else {
- mAppBar.setPaddingRelative(0, 0, 0, 0);
mMainFragment.setPaddingHorizontal(0);
}
mMainFragment.updatePreferencePadding(mIsTwoPane);
}
- private int getSearchBoxHeight() {
+ private void updateAppBarMinHeight() {
final int searchBarHeight = getResources().getDimensionPixelSize(R.dimen.search_bar_height);
- final int searchBarMargin = getResources().getDimensionPixelSize(R.dimen.search_bar_margin);
- return searchBarHeight + searchBarMargin * 2;
+ final int margin = getResources().getDimensionPixelSize(
+ mIsEmbeddingActivityEnabled && mIsTwoPane
+ ? R.dimen.homepage_app_bar_padding_two_pane
+ : R.dimen.search_bar_margin);
+ findViewById(R.id.app_bar_container).setMinimumHeight(searchBarHeight + margin * 2);
}
private static class SuggestionFragCreator implements FragmentCreator {
diff --git a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
index 4216d87..61682d0 100644
--- a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
+++ b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
@@ -95,6 +95,7 @@
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mCategoryRecentLocationRequests = screen.findPreference(getPreferenceKey());
+ mLocationEnabler.refreshLocationMode();
loadRecentAccesses();
}
diff --git a/src/com/android/settings/location/RecentLocationAccessSeeAllButtonPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessSeeAllButtonPreferenceController.java
index 68cde63..2f1232b 100644
--- a/src/com/android/settings/location/RecentLocationAccessSeeAllButtonPreferenceController.java
+++ b/src/com/android/settings/location/RecentLocationAccessSeeAllButtonPreferenceController.java
@@ -39,6 +39,7 @@
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
+ mLocationEnabler.refreshLocationMode();
}
@Override
diff --git a/src/com/android/settings/notification/SpatialAudioSettings.java b/src/com/android/settings/notification/SpatialAudioSettings.java
index 001c617..3bdb524 100644
--- a/src/com/android/settings/notification/SpatialAudioSettings.java
+++ b/src/com/android/settings/notification/SpatialAudioSettings.java
@@ -17,11 +17,15 @@
package com.android.settings.notification;
import android.app.settings.SettingsEnums;
+import android.content.Intent;
+import android.os.Bundle;
+import android.provider.Settings;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
+import com.android.settingslib.widget.FooterPreference;
/**
* Spatial audio settings located in the sound menu
@@ -30,6 +34,20 @@
public class SpatialAudioSettings extends DashboardFragment {
private static final String TAG = "SpatialAudioSettings";
+ private static final String KEY_FOOTER = "spatial_audio_footer";
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ super.onCreatePreferences(savedInstanceState, rootKey);
+
+ FooterPreference footerPreference = findPreference(KEY_FOOTER);
+ if (footerPreference != null) {
+ footerPreference.setLearnMoreText(
+ getString(R.string.spatial_audio_footer_learn_more_text));
+ footerPreference.setLearnMoreAction(
+ view -> startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS)));
+ }
+ }
@Override
public int getMetricsCategory() {
diff --git a/src/com/android/settings/notification/history/NotificationSbnViewHolder.java b/src/com/android/settings/notification/history/NotificationSbnViewHolder.java
index 166ee5d..1a703eb 100644
--- a/src/com/android/settings/notification/history/NotificationSbnViewHolder.java
+++ b/src/com/android/settings/notification/history/NotificationSbnViewHolder.java
@@ -98,9 +98,7 @@
boolean isSnoozed, UiEventLogger uiEventLogger) {
Intent appIntent = itemView.getContext().getPackageManager()
.getLaunchIntentForPackage(pkg);
- boolean isPendingIntentValid = pi != null && PendingIntent.getActivity(
- itemView.getContext(), 0, pi.getIntent(),
- PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_NO_CREATE) != null;
+ boolean isPendingIntentValid = pi != null && pi.isActivity();
if (isPendingIntentValid || appIntent != null) {
itemView.setOnClickListener(v -> {
uiEventLogger.logWithInstanceIdAndPosition(
diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java
index 8b78882..aff7197 100644
--- a/src/com/android/settings/overlay/FeatureFactory.java
+++ b/src/com/android/settings/overlay/FeatureFactory.java
@@ -148,7 +148,10 @@
public abstract ContextualCardFeatureProvider getContextualCardFeatureProvider(Context context);
- public abstract BluetoothFeatureProvider getBluetoothFeatureProvider(Context context);
+ /**
+ * Retrieves implementation for Bluetooth feature.
+ */
+ public abstract BluetoothFeatureProvider getBluetoothFeatureProvider();
public abstract AwareFeatureProvider getAwareFeatureProvider();
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java
index 4d8dad0..89f74de 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.java
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java
@@ -280,10 +280,9 @@
}
@Override
- public BluetoothFeatureProvider getBluetoothFeatureProvider(Context context) {
+ public BluetoothFeatureProvider getBluetoothFeatureProvider() {
if (mBluetoothFeatureProvider == null) {
- mBluetoothFeatureProvider = new BluetoothFeatureProviderImpl(
- context.getApplicationContext());
+ mBluetoothFeatureProvider = new BluetoothFeatureProviderImpl(getAppContext());
}
return mBluetoothFeatureProvider;
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java
index a455648..affb28b 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java
@@ -18,9 +18,8 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -34,12 +33,16 @@
import android.content.BroadcastReceiver;
import android.content.Intent;
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.FragmentActivity;
import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.bluetooth.Utils;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
+import com.android.settingslib.bluetooth.BluetoothEventManager;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.HearingAidProfile;
@@ -48,7 +51,6 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -62,8 +64,8 @@
import java.util.ArrayList;
import java.util.List;
+/** Tests for {@link AccessibilityHearingAidPreferenceController}. */
@RunWith(RobolectricTestRunner.class)
-@Ignore
@Config(shadows = {ShadowBluetoothAdapter.class, ShadowBluetoothUtils.class})
public class AccessibilityHearingAidPreferenceControllerTest {
private static final String TEST_DEVICE_ADDRESS = "00:A1:A1:A1:A1:A1";
@@ -82,10 +84,14 @@
@Mock
private CachedBluetoothDevice mCachedBluetoothDevice;
@Mock
+ private CachedBluetoothDevice mCachedSubBluetoothDevice;
+ @Mock
private CachedBluetoothDeviceManager mCachedDeviceManager;
@Mock
private LocalBluetoothManager mLocalBluetoothManager;
@Mock
+ private BluetoothEventManager mEventManager;
+ @Mock
private LocalBluetoothProfileManager mLocalBluetoothProfileManager;
@Mock
private HearingAidProfile mHearingAidProfile;
@@ -111,18 +117,54 @@
}
@Test
- public void onHearingAidStateChanged_connected_updateHearingAidSummary() {
+ public void getSummary_connectedHearingAidRightSide_connectedRightSideSummary() {
+ when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
+ HearingAidProfile.DeviceSide.SIDE_RIGHT);
when(mHearingAidProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList());
mPreferenceController.onStart();
Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_CONNECTED);
sendIntent(intent);
- assertThat(mHearingAidPreference.getSummary()).isEqualTo(TEST_DEVICE_NAME);
+ assertThat(mHearingAidPreference.getSummary().toString().contentEquals(
+ "TEST_HEARING_AID_BT_DEVICE_NAME, right only")).isTrue();
}
@Test
- public void onHearingAidStateChanged_disconnected_updateHearingAidSummary() {
+ public void getSummary_connectedHearingAidBothSide_connectedBothSideSummary() {
+ when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
+ HearingAidProfile.DeviceSide.SIDE_LEFT);
+ when(mCachedSubBluetoothDevice.isConnected()).thenReturn(true);
+ when(mCachedBluetoothDevice.getSubDevice()).thenReturn(mCachedSubBluetoothDevice);
+ when(mHearingAidProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList());
+ mPreferenceController.onStart();
+ Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
+ intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_CONNECTED);
+ sendIntent(intent);
+
+ assertThat(mHearingAidPreference.getSummary().toString().contentEquals(
+ "TEST_HEARING_AID_BT_DEVICE_NAME, left and right")).isTrue();
+ }
+
+ @Test
+ public void getSummary_connectedMultipleHearingAids_connectedBothSideSummary() {
+ when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
+ HearingAidProfile.DeviceSide.SIDE_LEFT);
+ when(mCachedSubBluetoothDevice.isConnected()).thenReturn(true);
+ when(mCachedBluetoothDevice.getSubDevice()).thenReturn(mCachedSubBluetoothDevice);
+ when(mHearingAidProfile.getConnectedDevices()).thenReturn(
+ generateMultipleHearingAidDeviceList());
+ mPreferenceController.onStart();
+ Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
+ intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_CONNECTED);
+ sendIntent(intent);
+
+ assertThat(mHearingAidPreference.getSummary().toString().contentEquals(
+ "TEST_HEARING_AID_BT_DEVICE_NAME +1 more")).isTrue();
+ }
+
+ @Test
+ public void getSummary_disconnectedHearingAid_disconnectedSummary() {
mPreferenceController.onStart();
Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_DISCONNECTED);
@@ -133,7 +175,7 @@
}
@Test
- public void onBluetoothStateChanged_bluetoothOff_updateHearingAidSummary() {
+ public void getSummary_bluetoothOff_disconnectedSummary() {
mPreferenceController.onStart();
Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
intent.putExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF);
@@ -168,19 +210,14 @@
}
@Test
- public void onNotSupportHearingAidProfile_doNotDoReceiverOperation() {
+ public void onNotSupportHearingAidProfile_isNotAvailable() {
//clear bluetooth supported profile
mShadowBluetoothAdapter.clearSupportedProfiles();
mPreferenceController = new AccessibilityHearingAidPreferenceController(mContext,
HEARING_AID_PREFERENCE);
mPreferenceController.setPreference(mHearingAidPreference);
- //not call registerReceiver()
- mPreferenceController.onStart();
- verify(mContext, never()).registerReceiver(any(), any());
- //not call unregisterReceiver()
- mPreferenceController.onStop();
- verify(mContext, never()).unregisterReceiver(any());
+ assertThat(mPreferenceController.isAvailable()).isFalse();
}
@Test
@@ -192,6 +229,24 @@
assertThat(mPreferenceController.getConnectedHearingAidDevice()).isNull();
}
+ @Test
+ @Config(shadows = ShadowAlertDialogCompat.class)
+ public void onActiveDeviceChanged_hearingAidProfile_launchHearingAidPairingDialog() {
+ final FragmentActivity mActivity = Robolectric.setupActivity(FragmentActivity.class);
+ when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true);
+ when(mCachedBluetoothDevice.getDeviceMode()).thenReturn(
+ HearingAidProfile.DeviceMode.MODE_BINAURAL);
+ when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
+ HearingAidProfile.DeviceSide.SIDE_LEFT);
+ mPreferenceController.setFragmentManager(mActivity.getSupportFragmentManager());
+
+ mPreferenceController.onActiveDeviceChanged(mCachedBluetoothDevice,
+ BluetoothProfile.HEARING_AID);
+
+ final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog.isShowing()).isTrue();
+ }
+
private void setupBluetoothEnvironment() {
ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager;
mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
@@ -200,6 +255,7 @@
when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager);
when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager);
when(mLocalBluetoothProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile);
+ doReturn(mEventManager).when(mLocalBluetoothManager).getEventManager();
}
private void setupHearingAidEnvironment() {
@@ -210,7 +266,6 @@
mShadowBluetoothAdapter.addSupportedProfiles(BluetoothProfile.HEARING_AID);
when(mCachedDeviceManager.findDevice(mBluetoothDevice)).thenReturn(mCachedBluetoothDevice);
when(mCachedBluetoothDevice.getName()).thenReturn(TEST_DEVICE_NAME);
- when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true);
}
private void sendIntent(Intent intent) {
@@ -224,4 +279,11 @@
deviceList.add(mBluetoothDevice);
return deviceList;
}
+
+ private List<BluetoothDevice> generateMultipleHearingAidDeviceList() {
+ final List<BluetoothDevice> deviceList = new ArrayList<>(2);
+ deviceList.add(mBluetoothDevice);
+ deviceList.add(mBluetoothDevice);
+ return deviceList;
+ }
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
index 7c52754..891439e 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
@@ -58,6 +58,7 @@
import com.android.settings.testutils.shadow.ShadowFragment;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settingslib.RestrictedPreference;
+import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.search.SearchIndexableRaw;
import org.junit.Before;
@@ -93,6 +94,7 @@
private static final String DEFAULT_LABEL = "default label";
private static final Boolean SERVICE_ENABLED = true;
private static final Boolean SERVICE_DISABLED = false;
+
@Rule
public final MockitoRule mocks = MockitoJUnit.rule();
@Spy
@@ -114,6 +116,8 @@
@Mock
private AppOpsManager mAppOpsManager;
+ private Lifecycle mLifecycle;
+
@Before
public void setup() {
mShadowAccessibilityManager = Shadow.extract(AccessibilityManager.getInstance(mContext));
@@ -127,6 +131,8 @@
when(mContext.getSystemService(AppOpsManager.class)).thenReturn(mAppOpsManager);
when(mAppOpsManager.noteOpNoThrow(eq(AppOpsManager.OP_ACCESS_RESTRICTED_SETTINGS),
anyInt(), anyString())).thenReturn(AppOpsManager.MODE_ALLOWED);
+ mLifecycle = new Lifecycle(() -> mLifecycle);
+ when(mFragment.getSettingsLifecycle()).thenReturn(mLifecycle);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
new file mode 100644
index 0000000..5c440d2
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidPairingDialogFragmentTest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.FragmentActivity;
+
+import com.android.settings.SettingsActivity;
+import com.android.settings.bluetooth.BluetoothPairingDetail;
+import com.android.settings.bluetooth.HearingAidPairingDialogFragment;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.HearingAidProfile;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+/** Tests for {@link HearingAidPairingDialogFragment}. */
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = ShadowAlertDialogCompat.class)
+public class HearingAidPairingDialogFragmentTest {
+
+ @Rule
+ public final MockitoRule mockito = MockitoJUnit.rule();
+
+ private static final String KEY_CACHED_DEVICE_SIDE = "cached_device_side";
+
+ @Mock
+ private CachedBluetoothDevice mCachedBluetoothDevice;
+ private FragmentActivity mActivity;
+ private HearingAidPairingDialogFragment mFragment;
+
+ @Before
+ public void setUp() {
+ mFragment = spy(HearingAidPairingDialogFragment.newInstance(mCachedBluetoothDevice));
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
+ when(mFragment.getActivity()).thenReturn(mActivity);
+ }
+
+ @Test
+ public void newInstance_deviceSideRight_argumentSideRight() {
+ when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
+ HearingAidProfile.DeviceSide.SIDE_RIGHT);
+
+ mFragment = HearingAidPairingDialogFragment.newInstance(mCachedBluetoothDevice);
+
+ final Bundle bundle = mFragment.getArguments();
+ assertThat(bundle.getInt(KEY_CACHED_DEVICE_SIDE)).isEqualTo(
+ HearingAidProfile.DeviceSide.SIDE_RIGHT);
+ }
+
+ @Test
+ public void dialogPositiveButtonClick_intentToExpectedClass() {
+ final AlertDialog dialog = (AlertDialog) mFragment.onCreateDialog(Bundle.EMPTY);
+ dialog.show();
+
+ dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+
+ final Intent intent = shadowOf(mActivity).getNextStartedActivity();
+ assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
+ .isEqualTo(BluetoothPairingDetail.class.getName());
+ }
+
+ @Test
+ public void dialogNegativeButtonClick_dismissDialog() {
+ final AlertDialog dialog = (AlertDialog) mFragment.onCreateDialog(Bundle.EMPTY);
+ dialog.show();
+
+ dialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick();
+
+ assertThat(dialog.isShowing()).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java
new file mode 100644
index 0000000..6918fb6
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.HearingAidProfile;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+/** Tests for {@link HearingAidUtils}. */
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = ShadowAlertDialogCompat.class)
+public class HearingAidUtilsTest {
+
+ @Rule
+ public final MockitoRule mockito = MockitoJUnit.rule();
+
+ @Mock
+ private CachedBluetoothDevice mCachedBluetoothDevice;
+ @Mock
+ private CachedBluetoothDevice mSubCachedBluetoothDevice;
+
+ private FragmentManager mFragmentManager;
+
+ @Before
+ public void setUp() {
+ final FragmentActivity mActivity = Robolectric.setupActivity(FragmentActivity.class);
+ mFragmentManager = mActivity.getSupportFragmentManager();
+ }
+
+ @After
+ public void tearDown() {
+ ShadowAlertDialogCompat.reset();
+ }
+ @Test
+ public void launchHearingAidPairingDialog_deviceNotConnectedHearingAid_noDialog() {
+ when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(false);
+
+ HearingAidUtils.launchHearingAidPairingDialog(mFragmentManager, mCachedBluetoothDevice);
+
+ final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNull();
+ }
+
+ @Test
+ public void launchHearingAidPairingDialog_deviceIsModeMonaural_noDialog() {
+ when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true);
+ when(mCachedBluetoothDevice.getDeviceMode()).thenReturn(
+ HearingAidProfile.DeviceMode.MODE_MONAURAL);
+
+ HearingAidUtils.launchHearingAidPairingDialog(mFragmentManager, mCachedBluetoothDevice);
+
+ final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNull();
+ }
+
+ @Test
+ public void launchHearingAidPairingDialog_deviceHasSubDevice_noDialog() {
+ when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true);
+ when(mCachedBluetoothDevice.getDeviceMode()).thenReturn(
+ HearingAidProfile.DeviceMode.MODE_BINAURAL);
+ when(mCachedBluetoothDevice.getSubDevice()).thenReturn(mSubCachedBluetoothDevice);
+
+ HearingAidUtils.launchHearingAidPairingDialog(mFragmentManager, mCachedBluetoothDevice);
+
+ final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNull();
+ }
+
+ @Test
+ public void launchHearingAidPairingDialog_deviceIsInvalidSide_noDialog() {
+ when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true);
+ when(mCachedBluetoothDevice.getDeviceMode()).thenReturn(
+ HearingAidProfile.DeviceMode.MODE_BINAURAL);
+ when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
+ HearingAidProfile.DeviceSide.SIDE_INVALID);
+
+ HearingAidUtils.launchHearingAidPairingDialog(mFragmentManager, mCachedBluetoothDevice);
+
+ final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog).isNull();
+ }
+
+ @Test
+ public void launchHearingAidPairingDialog_dialogShown() {
+ when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true);
+ when(mCachedBluetoothDevice.getDeviceMode()).thenReturn(
+ HearingAidProfile.DeviceMode.MODE_BINAURAL);
+ when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
+ HearingAidProfile.DeviceSide.SIDE_LEFT);
+
+ HearingAidUtils.launchHearingAidPairingDialog(mFragmentManager, mCachedBluetoothDevice);
+
+ final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog.isShowing()).isTrue();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsRelatedToolsControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsRelatedToolsControllerTest.java
new file mode 100644
index 0000000..31d6397
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsRelatedToolsControllerTest.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.content.ComponentName;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.view.accessibility.AccessibilityManager;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+
+import com.android.settings.testutils.FakeFeatureFactory;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowAccessibilityManager;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.List;
+
+/** Tests for {@link BluetoothDetailsRelatedToolsController}. */
+@RunWith(RobolectricTestRunner.class)
+public class BluetoothDetailsRelatedToolsControllerTest extends BluetoothDetailsControllerTestBase {
+ @Rule
+ public final MockitoRule mockito = MockitoJUnit.rule();
+
+ private static final String PACKAGE_NAME = "com.android.test";
+ private static final String PACKAGE_NAME2 = "com.android.test2";
+ private static final String CLASS_NAME = PACKAGE_NAME + ".test_a11y_service";
+ private static final String KEY_RELATED_TOOLS_GROUP = "bluetooth_related_tools";
+ private static final String KEY_LIVE_CAPTION = "live_caption";
+
+
+ private BluetoothDetailsRelatedToolsController mController;
+ private BluetoothFeatureProvider mFeatureProvider;
+ private ShadowAccessibilityManager mShadowAccessibilityManager;
+ private PreferenceCategory mPreferenceCategory;
+
+ @Override
+ public void setUp() {
+ super.setUp();
+ final FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest();
+ mFeatureProvider = fakeFeatureFactory.getBluetoothFeatureProvider();
+ mShadowAccessibilityManager = Shadow.extract(AccessibilityManager.getInstance(mContext));
+ final Preference preference = new Preference(mContext);
+ preference.setKey(KEY_LIVE_CAPTION);
+ mPreferenceCategory = new PreferenceCategory(mContext);
+ mPreferenceCategory.setKey(KEY_RELATED_TOOLS_GROUP);
+ mScreen.addPreference(mPreferenceCategory);
+ mScreen.addPreference(preference);
+
+ mController = new BluetoothDetailsRelatedToolsController(mContext, mFragment, mCachedDevice,
+ mLifecycle);
+ mController.init(mScreen);
+ }
+
+ @Test
+ public void isAvailable_isHearingAidDevice_available() {
+ when(mCachedDevice.isHearingAidDevice()).thenReturn(true);
+
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void isAvailable_notHearingAidDevice_notAvailable() {
+ when(mCachedDevice.isHearingAidDevice()).thenReturn(false);
+
+ assertThat(mController.isAvailable()).isFalse();
+ }
+
+ @Test
+ public void displayPreference_oneRelatedToolsMatchA11yService_showOnePreference() {
+ when(mCachedDevice.isHearingAidDevice()).thenReturn(true);
+ mShadowAccessibilityManager.setInstalledAccessibilityServiceList(
+ List.of(getMockAccessibilityServiceInfo(PACKAGE_NAME, CLASS_NAME)));
+ when(mFeatureProvider.getRelatedTools()).thenReturn(
+ List.of(new ComponentName(PACKAGE_NAME, CLASS_NAME)));
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(1);
+ }
+
+ @Test
+ public void displayPreference_oneRelatedToolsNotMatchA11yService_showNoPreference() {
+ when(mCachedDevice.isHearingAidDevice()).thenReturn(true);
+ mShadowAccessibilityManager.setInstalledAccessibilityServiceList(
+ List.of(getMockAccessibilityServiceInfo(PACKAGE_NAME, CLASS_NAME)));
+ when(mFeatureProvider.getRelatedTools()).thenReturn(
+ List.of(new ComponentName(PACKAGE_NAME2, CLASS_NAME)));
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(0);
+ }
+
+ @Test
+ public void displayPreference_noRelatedTools_showNoPreference() {
+ when(mCachedDevice.isHearingAidDevice()).thenReturn(true);
+ mShadowAccessibilityManager.setInstalledAccessibilityServiceList(
+ List.of(getMockAccessibilityServiceInfo(PACKAGE_NAME, CLASS_NAME)));
+ when(mFeatureProvider.getRelatedTools()).thenReturn(null);
+
+ mController.displayPreference(mScreen);
+
+ assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(0);
+ }
+
+ private AccessibilityServiceInfo getMockAccessibilityServiceInfo(String packageName,
+ String className) {
+ final ApplicationInfo applicationInfo = new ApplicationInfo();
+ final ServiceInfo serviceInfo = new ServiceInfo();
+ applicationInfo.packageName = packageName;
+ serviceInfo.packageName = packageName;
+ serviceInfo.name = className;
+ serviceInfo.applicationInfo = applicationInfo;
+
+ final ResolveInfo resolveInfo = new ResolveInfo();
+ resolveInfo.serviceInfo = serviceInfo;
+
+ try {
+ final AccessibilityServiceInfo info = new AccessibilityServiceInfo(resolveInfo,
+ mContext);
+ ComponentName componentName = ComponentName.unflattenFromString(
+ packageName + "/" + className);
+ info.setComponentName(componentName);
+ return info;
+ } catch (XmlPullParserException | IOException e) {
+ // Do nothing
+ }
+
+ return null;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothFeatureProviderImplTest.java
index 9ab1d87..3d40bfc 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothFeatureProviderImplTest.java
@@ -33,6 +33,11 @@
@RunWith(RobolectricTestRunner.class)
public class BluetoothFeatureProviderImplTest {
private static final String SETTINGS_URI = "content://test.provider/settings_uri";
+ private static final String CONTROL_METADATA =
+ "<HEARABLE_CONTROL_SLICE_WITH_WIDTH>" + SETTINGS_URI
+ + "</HEARABLE_CONTROL_SLICE_WITH_WIDTH>";
+ private static final int METADATA_FAST_PAIR_CUSTOMIZED_FIELDS = 25;
+
private BluetoothFeatureProvider mBluetoothFeatureProvider;
@Mock
@@ -54,4 +59,13 @@
final Uri uri = mBluetoothFeatureProvider.getBluetoothDeviceSettingsUri(mBluetoothDevice);
assertThat(uri.toString()).isEqualTo(SETTINGS_URI);
}
+
+ @Test
+ public void getBluetoothDeviceControlUri_returnsCorrectUri() {
+ when(mBluetoothDevice.getMetadata(METADATA_FAST_PAIR_CUSTOMIZED_FIELDS)).thenReturn(
+ CONTROL_METADATA.getBytes());
+ assertThat(
+ mBluetoothFeatureProvider.getBluetoothDeviceControlUri(mBluetoothDevice)).isEqualTo(
+ SETTINGS_URI);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java
index da1c493..e1a3da6 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java
@@ -27,10 +27,13 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.content.pm.PackageManager;
import android.media.AudioManager;
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.FragmentActivity;
import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager;
@@ -40,25 +43,31 @@
import com.android.settings.bluetooth.AvailableMediaBluetoothDeviceUpdater;
import com.android.settings.bluetooth.Utils;
import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowAudioManager;
+import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
import com.android.settingslib.bluetooth.BluetoothCallback;
import com.android.settingslib.bluetooth.BluetoothEventManager;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.HearingAidProfile;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+/** Tests for {@link AvailableMediaDeviceGroupController}. */
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowAudioManager.class, ShadowBluetoothUtils.class})
+@Config(shadows = {ShadowAudioManager.class, ShadowBluetoothAdapter.class,
+ ShadowBluetoothUtils.class})
public class AvailableMediaDeviceGroupControllerTest {
private static final String PREFERENCE_KEY_1 = "pref_key_1";
@@ -77,6 +86,8 @@
private BluetoothEventManager mEventManager;
@Mock
private LocalBluetoothManager mLocalManager;
+ @Mock
+ private CachedBluetoothDevice mCachedBluetoothDevice;
private PreferenceGroup mPreferenceGroup;
private Context mContext;
@@ -93,27 +104,26 @@
mPreference = new Preference(mContext);
mPreference.setKey(PREFERENCE_KEY_1);
mPreferenceGroup = spy(new PreferenceScreen(mContext, null));
+ final FragmentActivity mActivity = Robolectric.setupActivity(FragmentActivity.class);
when(mPreferenceGroup.getPreferenceManager()).thenReturn(mPreferenceManager);
doReturn(mContext).when(mDashboardFragment).getContext();
doReturn(mPackageManager).when(mContext).getPackageManager();
doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);
+ when(mDashboardFragment.getParentFragmentManager()).thenReturn(
+ mActivity.getSupportFragmentManager());
ShadowBluetoothUtils.sLocalBluetoothManager = mLocalManager;
mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
mAudioManager = mContext.getSystemService(AudioManager.class);
doReturn(mEventManager).when(mLocalBluetoothManager).getEventManager();
- mAvailableMediaDeviceGroupController = new AvailableMediaDeviceGroupController(mContext);
+ mAvailableMediaDeviceGroupController = spy(
+ new AvailableMediaDeviceGroupController(mContext));
mAvailableMediaDeviceGroupController.
setBluetoothDeviceUpdater(mAvailableMediaBluetoothDeviceUpdater);
mAvailableMediaDeviceGroupController.mPreferenceGroup = mPreferenceGroup;
}
- @After
- public void tearDown() {
- ShadowBluetoothUtils.reset();
- }
-
@Test
public void onDeviceAdded_firstAdd_becomeVisibleAndPreferenceAdded() {
mAvailableMediaDeviceGroupController.onDeviceAdded(mPreference);
@@ -222,4 +232,21 @@
// Shouldn't crash
mAvailableMediaDeviceGroupController.onStop();
}
+
+ @Test
+ @Config(shadows = ShadowAlertDialogCompat.class)
+ public void onActiveDeviceChanged_hearingAidProfile_launchHearingAidPairingDialog() {
+ when(mCachedBluetoothDevice.isConnectedHearingAidDevice()).thenReturn(true);
+ when(mCachedBluetoothDevice.getDeviceMode()).thenReturn(
+ HearingAidProfile.DeviceMode.MODE_BINAURAL);
+ when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
+ HearingAidProfile.DeviceSide.SIDE_LEFT);
+ mAvailableMediaDeviceGroupController.init(mDashboardFragment);
+
+ mAvailableMediaDeviceGroupController.onActiveDeviceChanged(mCachedBluetoothDevice,
+ BluetoothProfile.HEARING_AID);
+
+ final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+ assertThat(dialog.isShowing()).isTrue();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
index d430232..518aee9 100644
--- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -239,7 +239,7 @@
}
@Override
- public BluetoothFeatureProvider getBluetoothFeatureProvider(Context context) {
+ public BluetoothFeatureProvider getBluetoothFeatureProvider() {
return mBluetoothFeatureProvider;
}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
index e9764cb..717de79 100644
--- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -225,7 +225,7 @@
}
@Override
- public BluetoothFeatureProvider getBluetoothFeatureProvider(Context context) {
+ public BluetoothFeatureProvider getBluetoothFeatureProvider() {
return mBluetoothFeatureProvider;
}