Merge RP1A.200630.001
Change-Id: Ie24c7b93b2c499b64c68784a347df7df70aa5d99
diff --git a/Android.bp b/Android.bp
index 8e075b6..3d60a85 100644
--- a/Android.bp
+++ b/Android.bp
@@ -61,6 +61,7 @@
"telephony-common",
"ims-common",
"app-compat-annotations",
+ "telephony-ext",
],
}
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 2f53cc1..860683f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -190,7 +190,6 @@
<intent-filter android:priority="1">
<action android:name="android.settings.WIRELESS_SETTINGS" />
<action android:name="android.settings.AIRPLANE_MODE_SETTINGS" />
- <action android:name="com.android.settings.sim.SIM_SUB_INFO_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
@@ -905,6 +904,36 @@
android:value="true" />
</activity>
+ <!-- Keep compatibility with old shortcuts. -->
+ <activity-alias android:name="DisplaySettings"
+ android:label="@string/display_settings"
+ android:exported="true"
+ android:targetActivity="Settings$DisplaySettingsActivity">
+ <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="com.android.settings.DisplaySettings" />
+ </activity-alias>
+ <activity android:name="Settings$SMQQtiFeedbackActivity"
+ android:label="@string/qtifeedback_settings_title"
+ android:icon="@drawable/ic_settings_qti_feedback"
+ android:enabled="false"
+ android:taskAffinity="">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <intent-filter android:priority="250">
+ <action android:name="com.android.settings.action.SETTINGS" />
+ </intent-filter>
+ <meta-data android:name="com.android.settings.category"
+ android:value="com.android.settings.category.ia.system" />
+ <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="@string/qtifeedback_intent_action" />
+ <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+ android:value="true" />
+ <meta-data android:name="com.android.settings.summary"
+ android:resource="@string/qtifeedback_settings_subtitle" />
+ </activity>
+
<activity
android:name="Settings$NightDisplaySettingsActivity"
android:label="@string/night_display_title"
@@ -2697,6 +2726,27 @@
android:exported="false"/>
<activity
+ android:name="Settings$SimSettingsActivity"
+ android:label="@string/sim_settings_title"
+ android:icon="@drawable/ic_settings_sim"
+ android:parentActivityName="Settings">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="com.android.settings.action.SETTINGS" />
+ </intent-filter>
+ <meta-data android:name="com.android.settings.order" android:value="-2"/>
+ <meta-data android:name="com.android.settings.category"
+ android:value="com.android.settings.category.ia.wireless" />
+ <meta-data android:name="com.android.settings.summary"
+ android:resource="@string/summary_empty"/>
+ <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="com.android.settings.sim.SimSettings" />
+ </activity>
+
+ <activity
android:name=".wifi.RequestToggleWiFiActivity"
android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.Alert"
android:excludeFromRecents="true"
@@ -3404,6 +3454,21 @@
android:value="com.android.settings.sound.MediaControlsSettings" />
</activity>
+ <activity android:name=".network.telephony.UserPLMNListActivity"
+ android:label="@string/uplmn_settings_title"
+ android:configChanges="orientation|screenSize|keyboardHidden">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".network.telephony.UserPLMNEditorActivity"
+ android:label="@string/uplmn_settings_title"
+ android:configChanges="orientation|screenSize|keyboardHidden">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ </intent-filter>
+ </activity>
<!-- This is the longest AndroidManifest.xml ever. -->
</application>
</manifest>
diff --git a/NOTICE b/NOTICE
index c5b1efa..97d3f8c 100644
--- a/NOTICE
+++ b/NOTICE
@@ -10,6 +10,35 @@
See the License for the specific language governing permissions and
limitations under the License.
+________________________________________
+
+Copyright (c) 2018, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+______________________________________
Apache License
Version 2.0, January 2004
diff --git a/res/drawable-mdpi/ic_settings_qti_feedback.png b/res/drawable-mdpi/ic_settings_qti_feedback.png
new file mode 100644
index 0000000..e7c0dae
--- /dev/null
+++ b/res/drawable-mdpi/ic_settings_qti_feedback.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_settings_qti_feedback.png b/res/drawable-xhdpi/ic_settings_qti_feedback.png
new file mode 100644
index 0000000..a20f94e
--- /dev/null
+++ b/res/drawable-xhdpi/ic_settings_qti_feedback.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_settings_qti_feedback.png b/res/drawable-xxhdpi/ic_settings_qti_feedback.png
new file mode 100644
index 0000000..5d0ccf6
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_settings_qti_feedback.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_settings_qti_feedback.png b/res/drawable-xxxhdpi/ic_settings_qti_feedback.png
new file mode 100644
index 0000000..3dfb55d
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_settings_qti_feedback.png
Binary files differ
diff --git a/res/layout/bluetooth_audio_codec_dialog.xml b/res/layout/bluetooth_audio_codec_dialog.xml
index 9636427..1fd9de8 100644
--- a/res/layout/bluetooth_audio_codec_dialog.xml
+++ b/res/layout/bluetooth_audio_codec_dialog.xml
@@ -52,8 +52,16 @@
layout="@layout/preference_widget_dialog_radiobutton"/>
<include
+ android:id="@+id/bluetooth_audio_codec_aptx_adaptive"
+ layout="@layout/preference_widget_dialog_radiobutton"/>
+
+ <include
android:id="@+id/bluetooth_audio_codec_ldac"
layout="@layout/preference_widget_dialog_radiobutton"/>
+
+ <include
+ android:id="@+id/bluetooth_audio_codec_aptx_twsp"
+ layout="@layout/preference_widget_dialog_radiobutton"/>
</RadioGroup>
<include
diff --git a/res/layout/wifi_dialog.xml b/res/layout/wifi_dialog.xml
index 45ecd61..d0a4159 100644
--- a/res/layout/wifi_dialog.xml
+++ b/res/layout/wifi_dialog.xml
@@ -141,6 +141,24 @@
android:prompt="@string/wifi_eap_method" />
</LinearLayout>
+ <LinearLayout android:id="@+id/l_sim_card"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ style="@style/wifi_item" >
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ style="@style/wifi_item_label"
+ android:text="@string/select_sim_card" />
+
+ <Spinner android:id="@+id/sim_card"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ style="@style/wifi_item_content"
+ android:prompt="@string/select_sim_card" />
+ </LinearLayout>
+
<LinearLayout android:id="@+id/l_phase2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -393,6 +411,13 @@
android:visibility="gone"/>
</LinearLayout>
+ <CheckBox android:id="@+id/share_this_wifi"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ style="@style/wifi_item_content"
+ android:textSize="14sp"
+ android:text="@string/share_this_wifi" />
+
<LinearLayout android:id="@+id/metered_settings_fields"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/res/values-af/arrays.xml b/res/values-af/arrays.xml
index 5b8ed28..c7f6e5f 100644
--- a/res/values-af/arrays.xml
+++ b/res/values-af/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Interne toestelberging"</item>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index d131aa8..0f4c8a4 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Geen klank of vibrasie nie"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Geen klank of vibrasie nie en verskyn laer in gespreksafdeling"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Kan lui of vibreer op grond van fooninstellings"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Wys prioriteitkennisgewings hieronder. Altyd stil."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Wys prioriteitkennisgewings hieronder. Altyd stil."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Wys prioriteitkennisgewings hieronder. Altyd stil."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Wys kennisgewings as \'n banier boaan die skerm wanneer die toestel ontsluit is"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Alle \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"-kennisgewings"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Alle <xliff:g id="APP_NAME">%1$s</xliff:g>-kennisgewings"</string>
diff --git a/res/values-am/arrays.xml b/res/values-am/arrays.xml
index f44cb48..0d92a25 100644
--- a/res/values-am/arrays.xml
+++ b/res/values-am/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"የውስጥ መሣሪያ ማከማቻ"</item>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index cfca18a..d5c1e75 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"ምንም ድምጽ ወይም ንዝረት የለም"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"ምንም ድምጽ ወይም ንዝረት የለም እና በውይይት ክፍል ላይ አይታይም"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"በእርስዎ የስልክ ቅንብሮች የሚወሰን ሆኖ ሊደውል ወይም ሊነዝር ይችላል"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"ከዚህ በታች ቅድሚያ የሚሰጣቸው ማሳወቂያዎችን ያሳያል። ሁልጊዜ ጸጥ ያለ።"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"ከዚህ በታች ቅድሚያ የሚሰጣቸው ማሳወቂያዎችን ያሳያል። ሁልጊዜ ጸጥ ያለ።"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"ከዚህ በታች ቅድሚያ የሚሰጣቸው ማሳወቂያዎችን ያሳያል። ሁልጊዜ ጸጥ ያለ።"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"መሣሪያ ሲከፈት፣ ማሳወቂያዎችን እንደ ሰንደቅ በማያ ገጹ አናት ላይ እንዳለ አሳይ"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"ሁሉም «<xliff:g id="APP_NAME">%1$s</xliff:g>» ማሳወቂያዎች"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"ሁሉም የ<xliff:g id="APP_NAME">%1$s</xliff:g> ማሳወቂያዎች"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"ተጫዋች አሳይ"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"ምንም ተጫዋቾች አይገኙም"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"ሚዲያ"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"የጣት ምልክትን ይዝለሉ"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"ጸጥታ የጣት ምልክትን ያነቃል"</string>
+ <string name="qtifeedback_settings_title"> ስለ ሃርድዌር ግብረ-መልስ</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc ሪፖርት</string>
</resources>
diff --git a/res/values-ar/arrays.xml b/res/values-ar/arrays.xml
index 4218a24..6091bf8 100644
--- a/res/values-ar/arrays.xml
+++ b/res/values-ar/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"مساحة تخزين الجهاز الداخلية"</item>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 22973cf..6a73633 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -3774,6 +3774,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"بدون صوت أو اهتزاز وتظهر في موضع أسفل في قسم المحادثات"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"يمكن إصدار رنين أو اهتزاز بناءً على إعدادات الهاتف"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"عند فتح قفل الجهاز، تظهر الإشعارات في صورة بانر أعلى الشاشة."</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"يتم عرض هذه الإشعارات أسفل الإشعارات ذات الأولوية. كتم الصوت دائمًا."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"يتم عرض هذه الإشعارات أسفل الإشعارات ذات الأولوية. كتم الصوت دائمًا."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"يتم عرض هذه الإشعارات أسفل الإشعارات ذات الأولوية. كتم الصوت دائمًا."</string>
<string name="notification_switch_label" msgid="8029371325967501557">"جميع إشعارات \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"جميع إشعارات <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"الإشعارات التكيّفية"</string>
@@ -5310,4 +5313,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"إظهار المشغِّل"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"ما مِن مشغِّلات متاحة"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"الوسائط"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"إيماءة التخطي"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"إيماءة كتم صوت التنبيهات"</string>
+ <string name="qtifeedback_settings_title">الإبلاغ عن</string>
+ <string name="qtifeedback_settings_subtitle">ملاحظات حول أجهزة Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 721c410..5822f78 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"কোনো ধ্বনি অথবা কম্পন নাই"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"কোনো ধ্বনি অথবা কম্পন নাই আৰু বাৰ্তালাপ শাখাটোৰ তলৰ অংশত দেখা পোৱা যায়"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"ফ’নৰ ছেটিঙৰ ওপৰত নিৰ্ভৰ কৰি ৰিং কৰিব অথবা কম্পন হ’ব পাৰে"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"অগ্ৰাধিকাৰপ্ৰাপ্ত জাননীসমূহৰ তলত দেখুৱায়। সদায় নীৰৱ।"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"অগ্ৰাধিকাৰপ্ৰাপ্ত জাননীসমূহৰ তলত দেখুৱায়। সদায় নীৰৱ।"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"অগ্ৰাধিকাৰপ্ৰাপ্ত জাননীসমূহৰ তলত দেখুৱায়। সদায় নীৰৱ।"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"ডিভাইচটো আনলক কৰি ৰাখিলে, স্ক্ৰীণৰ ওপৰ অংশত বেনাৰ হিচাপে জাননীসমূহ দেখুৱাওক"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"ৰ সকলো জাননী"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ সকলো জাননী"</string>
diff --git a/res/values-az/arrays.xml b/res/values-az/arrays.xml
index 1a73dd6..e8f42e1 100644
--- a/res/values-az/arrays.xml
+++ b/res/values-az/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Cihazın daxili yaddaşı"</item>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index c7794f4..0ed4b1e 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Səs və ya vibrasiya yoxdur"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Səs və ya vibrasiya yoxdur və söhbət bölməsinin aşağısında görünür"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Telefon ayarlarına əsasən zəng çala və ya vibrasiya edə bilər"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Mühüm bildirişlərin aşağısında göstərilir. Həmişə səssiz."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Mühüm bildirişlərin aşağısında göstərilir. Həmişə səssiz."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Mühüm bildirişlərin aşağısında göstərilir. Həmişə səssiz."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Cihaz kilidli olduğu zaman bildirişlər ekranının yuxarısında baner ilə göstərilsin"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Bütün \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" bildirişləri"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Bütün <xliff:g id="APP_NAME">%1$s</xliff:g> bildirişləri"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Oyunçunu göstərin"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Əlçatan oyunçu yoxdur"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"media"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"İşarəni keçin"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Səssizlik rejimi siqnalları"</string>
+ <string name="qtifeedback_settings_title"> Avadanlığa dair sorğu</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc üçün hesabat</string>
</resources>
diff --git a/res/values-b+sr+Latn/arrays.xml b/res/values-b+sr+Latn/arrays.xml
index 65beb05..d361b80 100644
--- a/res/values-b+sr+Latn/arrays.xml
+++ b/res/values-b+sr+Latn/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Skladište unutrašnjeg uređaja"</item>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 63d00e9..9aa1dea 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -3629,6 +3629,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Bez zvuka i vibriranja"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Bez zvuka i vibriranja i prikazuje se u nastavku odeljka za konverzacije"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Može da zvoni ili vibrira u zavisnosti od podešavanja telefona"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Prikazuje se ispod prioritetnih obaveštenja. Uvek nečujno."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Prikazuje se ispod prioritetnih obaveštenja. Uvek nečujno."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Prikazuje se ispod prioritetnih obaveštenja. Uvek nečujno."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Kada je uređaj otključan, prikazuje obaveštenja kao baner u vrhu ekrana"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Sva obaveštenja aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Sva obaveštenja aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-be/arrays.xml b/res/values-be/arrays.xml
index 0e22b48..67856ab 100644
--- a/res/values-be/arrays.xml
+++ b/res/values-be/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Унутраная памяць прылады"</item>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 77224f9..fd06560 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -3677,6 +3677,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Без гуку ці вібрацыі"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Паказваецца без гуку ці вібрацыі ў раздзеле размоў"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"У залежнасці ад налад тэлефона магчымы званок або вібрацыя"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Паказвае ўнізе апавяшчэнні з высокім прыярытэтам. Заўсёды без гуку."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Паказвае ўнізе апавяшчэнні з высокім прыярытэтам. Заўсёды без гуку."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Паказвае ўнізе апавяшчэнні з высокім прыярытэтам. Заўсёды без гуку."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Калі прылада разблакіравана, паказваць апавяшчэнні ў выглядзе банера ўверсе экрана"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Усе апавяшчэнні праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Усе апавяшчэнні праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
diff --git a/res/values-bg/arrays.xml b/res/values-bg/arrays.xml
index 6960746..5ddc6d1 100644
--- a/res/values-bg/arrays.xml
+++ b/res/values-bg/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Вътрешно хранилище на устройство"</item>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 1ab2669..8dabf4d 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Без звук или вибриране"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Без звук или вибриране и се показва по-долу в секцията с разговори"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Може да звъни или да вибрира въз основа на настройките за телефона"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Показва се под приоритетните известия. Винаги в тих режим."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Показва се под приоритетните известия. Винаги в тих режим."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Показва се под приоритетните известия. Винаги в тих режим."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Когато устройството е отключено, известията се показват като банер в горната част на екрана"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Всички известия от <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Всички известия от <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4428,6 +4431,8 @@
<item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> секунди</item>
<item quantity="one">1 секунда</item>
</plurals>
+ <string name="qtifeedback_settings_title"> Обратна връзка за хардуер</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc доклади</string>
<string name="automatic_storage_manager_settings" msgid="519158151463974656">"Управление на хранилището"</string>
<string name="automatic_storage_manager_text" msgid="6900593059927987273">"За да ви помогне да освободите място за съхранение, мениджърът на хранилището премахва от устройството ви резервните копия на снимки и видеоклипове."</string>
<string name="automatic_storage_manager_days_title" msgid="5077286114860539367">"Премахване на снимките и видеоклиповете"</string>
diff --git a/res/values-bn/arrays.xml b/res/values-bn/arrays.xml
index 8b5aaa1..02d7ffb 100644
--- a/res/values-bn/arrays.xml
+++ b/res/values-bn/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"ইন্টারনাল ডিভাইসের স্টোরেজ"</item>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 0c39a73..4cdbb23 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"আওয়াজ করবে না বা ভাইব্রেট হবে না"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"আওয়াজ করবে না বা ভাইব্রেট হবে না এবং কথোপকথন বিভাগের নিচের দিকে দেখা যাবে"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"ফোনের সেটিংস অনুযায়ী ফোন রিং বা ভাইব্রেট হতে পারে"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"অগ্রাধিকারযুক্ত বিজ্ঞপ্তির নিচে দেখানো হয়। সবসময় সাইলেন্ট।"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"অগ্রাধিকারযুক্ত বিজ্ঞপ্তির নিচে দেখানো হয়। সবসময় সাইলেন্ট।"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"অগ্রাধিকারযুক্ত বিজ্ঞপ্তির নিচে দেখানো হয়। সবসময় সাইলেন্ট।"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"কোনও ডিভাইস আনলক করা হলে বিজ্ঞপ্তি, স্ক্রিনের উপরে একটি ব্যানার হিসেবে দেখানো হয়"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"সমস্ত \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" বিজ্ঞপ্তি"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"সমস্ত <xliff:g id="APP_NAME">%1$s</xliff:g> সংক্রান্ত বিজ্ঞপ্তি"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"প্লেয়ার দেখুন"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"কোনও প্লেয়ার উপলভ্য নেই"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"মিডিয়া"</string>
+ <string name="qtifeedback_settings_title">হার্ডওয়্যার ফিডব্যাক</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc প্রতিবেদন</string>
</resources>
diff --git a/res/values-bs/arrays.xml b/res/values-bs/arrays.xml
index 154723b..61cf7bc 100644
--- a/res/values-bs/arrays.xml
+++ b/res/values-bs/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Interna pohrana uređaja"</item>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 059cb8e..1b7d40e 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -3630,6 +3630,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Bez zvuka ili vibracije i pojavljuje se pri dnu odjeljka za razgovor"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Može zvoniti ili vibrirati na osnovu postavki vašeg telefona"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Kada je uređaj otključan, vidite obavještenja u vidu banera na vrhu ekrana"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Prikazuje se ispod prioritetnih obavještenja. Uvijek nečujno."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Prikazuje se ispod prioritetnih obavještenja. Uvijek nečujno."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Prikazuje se ispod prioritetnih obavještenja. Uvijek nečujno."</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Sva obavještenja iz aplikacije \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Sva obavještenja aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"Prilagodljiva obavještenja"</string>
diff --git a/res/values-ca/arrays.xml b/res/values-ca/arrays.xml
index ac0e8bd..2a0a66a 100644
--- a/res/values-ca/arrays.xml
+++ b/res/values-ca/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Emmagatzematge intern del dispositiu"</item>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 6c655c1..329ea1e 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Sense so ni vibració"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Sense so ni vibració i es mostra més avall a la secció de converses"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Pot sonar o vibrar en funció de la configuració del telèfon"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Es mostra a sota de les notificacions prioritàries. Sempre silenciosa."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Es mostra a sota de les notificacions prioritàries. Sempre silenciosa."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Es mostra a sota de les notificacions prioritàries. Sempre silenciosa."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Quan el dispositiu estigui desbloquejat, mostra les notificacions en forma de bàner a la part superior de la pantalla"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Totes les notificacions de: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Totes les notificacions de l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Mostra el reproductor"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"No hi ha cap reproductor disponible"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"multimèdia"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Omet el gest"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Silencia el gest d\'alertes"</string>
+ <string name="qtifeedback_settings_title">Comentaris sobre el maquinari</string>
+ <string name="qtifeedback_settings_subtitle">Informar Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-cs/arrays.xml b/res/values-cs/arrays.xml
index a28e701..23721c2 100644
--- a/res/values-cs/arrays.xml
+++ b/res/values-cs/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Interní úložiště zařízení"</item>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index ddcc14b..60f5d51 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -3677,6 +3677,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Žádný zvuk ani vibrace"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Žádný zvuk ani vibrace a zobrazovat níže v sekci konverzací"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Může vyzvánět nebo vibrovat v závislosti na nastavení telefonu"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Zobrazí oznámení s nižší prioritou. Vždy tichý režim."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Zobrazí oznámení s nižší prioritou. Vždy tichý režim."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Zobrazí oznámení s nižší prioritou. Vždy tichý režim."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Když je zařízení odemčené, zobrazovat oznámení jako banner v horní části obrazovky"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Všechna oznámení aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Všechna oznámení aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -5128,4 +5131,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Zobrazit přehrávač"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Nejsou k dispozici žádné přehrávače"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"média"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Přeskočit gesto"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Gesto ke ztišení upozornění"</string>
+ <string name="qtifeedback_settings_title">Informace o hardwaru</string>
+ <string name="qtifeedback_settings_subtitle">Odesílání informací společnosti Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-da/arrays.xml b/res/values-da/arrays.xml
index 2aa7c34..1080791 100644
--- a/res/values-da/arrays.xml
+++ b/res/values-da/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Intern lagerplads på enheden"</item>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 1445f30..7a730fd 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Ingen lyd eller vibration"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Ingen lyd eller vibration, og den vises længere nede i samtalesektionen"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Kan ringe eller vibrere baseret på telefonens indstillinger"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Viser notifikationer med lav prioritet. Altid lydløs."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Viser notifikationer med lav prioritet. Altid lydløs."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Viser notifikationer med lav prioritet. Altid lydløs."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Når enheden er låst op, vises notifikationer som et banner øverst på skærmen"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Alle notifikationer fra \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Alle notifikationer for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Vis afspiller"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Der er ingen tilgængelige afspillere"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"Medier"</string>
+ <string name="qtifeedback_settings_title">Hardware-feedback</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Rapportering</string>
</resources>
diff --git a/res/values-de/arrays.xml b/res/values-de/arrays.xml
index 4c32e97..2a68307 100644
--- a/res/values-de/arrays.xml
+++ b/res/values-de/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Interner Gerätespeicher"</item>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index c8e25d9..837718d 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Kein Ton und keine Vibration"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Kein Ton und keine Vibration, erscheint weiter unten im Bereich \"Unterhaltungen\""</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Kann klingeln oder vibrieren, abhängig von den Telefoneinstellungen"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Erscheinen unter den wichtigen Benachrichtigungen. Immer lautlos."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Erscheinen unter den wichtigen Benachrichtigungen. Immer lautlos."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Erscheinen unter den wichtigen Benachrichtigungen. Immer lautlos."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Bei entsperrtem Gerät Benachrichtigungen als Banner oben auf dem Bildschirm anzeigen"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Alle Benachrichtigungen von \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Alle <xliff:g id="APP_NAME">%1$s</xliff:g>-Benachrichtigungen"</string>
@@ -4947,4 +4950,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Player anzeigen"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Es sind keine Player verfügbar."</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"Medien"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Bewegung zum Überspringen"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Bewegung zum Stummschalten von Benachrichtigungen"</string>
+ <string name="qtifeedback_settings_title">Hardware-Feedback</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Berichte</string>
</resources>
diff --git a/res/values-el/arrays.xml b/res/values-el/arrays.xml
index e0d0aa7..d2e7e83 100644
--- a/res/values-el/arrays.xml
+++ b/res/values-el/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Εσωτερικός αποθηκευτικός χώρος της συσκευής"</item>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index e7ef3f3..8f9bf8c 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Χωρίς ήχο ή δόνηση"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Χωρίς ήχο ή δόνηση και εμφανίζεται χαμηλά στην ενότητα συζητήσεων"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Ενδέχεται να κουδουνίζει ή να δονείται βάσει των ρυθμίσεων του τηλεφώνου"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Εμφανίζεται κάτω από ειδοποιήσεις προτεραιότητας. Πάντα σε σίγαση."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Εμφανίζεται κάτω από ειδοποιήσεις προτεραιότητας. Πάντα σε σίγαση."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Εμφανίζεται κάτω από ειδοποιήσεις προτεραιότητας. Πάντα σε σίγαση."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Όταν η συσκευή είναι ξεκλειδωμένη, οι ειδοποιήσεις εμφανίζονται ως banner επάνω στην οθόνη"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Όλες οι ειδοποιήσεις \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Όλες οι ειδοποιήσεις <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Εμφάνιση προγράμματος αναπαραγωγής"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Δεν υπάρχουν διαθέσιμα προγράμματα αναπαραγωγής"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"μέσα"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Κίνηση παράβλεψης"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Κίνηση σίγασης ειδοποιήσεων"</string>
+ <string name="qtifeedback_settings_title">Ανάδραση υλικού</string>
+ <string name="qtifeedback_settings_subtitle">Αναφορά στην Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-en-rAU/arrays.xml b/res/values-en-rAU/arrays.xml
index ec8510a..558fb54 100644
--- a/res/values-en-rAU/arrays.xml
+++ b/res/values-en-rAU/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Internal device storage"</item>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 8c1d75f..cdd385b 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"No sound or vibration"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"No sound or vibration and appears lower in conversation section"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"May ring or vibrate based on phone settings"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Displays below priority notifications. Always silent."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Displays below priority notifications. Always silent."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Displays below priority notifications. Always silent."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"When device is unlocked, show notifications as a banner across the top of the screen"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"All \'<xliff:g id="APP_NAME">%1$s</xliff:g>\' notifications"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"All <xliff:g id="APP_NAME">%1$s</xliff:g> notifications"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 11bbf62..49dbcc7 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"No sound or vibration"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"No sound or vibration and appears lower in conversation section"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"May ring or vibrate based on phone settings"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Displays below priority notifications. Always silent."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Displays below priority notifications. Always silent."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Displays below priority notifications. Always silent."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"When device is unlocked, show notifications as a banner across the top of the screen"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"All \'<xliff:g id="APP_NAME">%1$s</xliff:g>\' notifications"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"All <xliff:g id="APP_NAME">%1$s</xliff:g> notifications"</string>
diff --git a/res/values-en-rGB/arrays.xml b/res/values-en-rGB/arrays.xml
index ec8510a..558fb54 100644
--- a/res/values-en-rGB/arrays.xml
+++ b/res/values-en-rGB/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Internal device storage"</item>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 1124d55..24b842d0 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"No sound or vibration"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"No sound or vibration and appears lower in conversation section"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"May ring or vibrate based on phone settings"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Displays below priority notifications. Always silent."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Displays below priority notifications. Always silent."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Displays below priority notifications. Always silent."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"When device is unlocked, show notifications as a banner across the top of the screen"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"All \'<xliff:g id="APP_NAME">%1$s</xliff:g>\' notifications"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"All <xliff:g id="APP_NAME">%1$s</xliff:g> notifications"</string>
diff --git a/res/values-en-rIN/arrays.xml b/res/values-en-rIN/arrays.xml
index ec8510a..558fb54 100644
--- a/res/values-en-rIN/arrays.xml
+++ b/res/values-en-rIN/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Internal device storage"</item>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index e02427b..8547b9e 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"No sound or vibration"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"No sound or vibration and appears lower in conversation section"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"May ring or vibrate based on phone settings"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Displays below priority notifications. Always silent."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Displays below priority notifications. Always silent."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Displays below priority notifications. Always silent."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"When device is unlocked, show notifications as a banner across the top of the screen"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"All \'<xliff:g id="APP_NAME">%1$s</xliff:g>\' notifications"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"All <xliff:g id="APP_NAME">%1$s</xliff:g> notifications"</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 41a3897..3f1537c 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"No sound or vibration"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"No sound or vibration and appears lower in conversation section"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"May ring or vibrate based on phone settings"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Displays below priority notifications. Always silent."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Displays below priority notifications. Always silent."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Displays below priority notifications. Always silent."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"When device is unlocked, show notifications as a banner across the top of the screen"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"All \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" notifications"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"All <xliff:g id="APP_NAME">%1$s</xliff:g> notifications"</string>
diff --git a/res/values-es-rUS/arrays.xml b/res/values-es-rUS/arrays.xml
index e1c0b85..3fba674 100644
--- a/res/values-es-rUS/arrays.xml
+++ b/res/values-es-rUS/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Dispositivo de almacenamiento interno"</item>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index d64ca14..e4bb9e6 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"No suena ni vibra, y aparece en una parte inferior de la sección de conversaciones"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Puede sonar o vibrar en función de la configuración del teléfono"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Con el dispositivo desbloqueado, mostrar notificaciones como banner en la parte superior de la pantalla"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Se muestra debajo de las notificaciones de prioridad. Siempre en silencio."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Se muestra debajo de las notificaciones de prioridad. Siempre en silencio."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Se muestra debajo de las notificaciones de prioridad. Siempre en silencio."</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Todas las notificaciones de \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Todas las notificaciones de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"Notificaciones adaptables"</string>
@@ -4944,4 +4947,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Mostrar reproductor"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"No hay jugadores disponibles"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"contenido multimedia"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Gesto para omitir"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Gesto para silenciar alertas"</string>
+ <string name="qtifeedback_settings_title">Comentarios sobre el hardware</string>
+ <string name="qtifeedback_settings_subtitle">Informes de Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-es/arrays.xml b/res/values-es/arrays.xml
index 1f2dc1a..cdc7d94 100644
--- a/res/values-es/arrays.xml
+++ b/res/values-es/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Almacenamiento de dispositivo interno"</item>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index da8d1e8..cf61ae8 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Sin sonido ni vibración y se muestra más abajo en la sección de conversaciones"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Es posible que suene o vibre según los ajustes del teléfono"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Cuando el dispositivo está desbloqueado, muestra las notificaciones en la parte superior"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Muestra las notificaciones con prioridad baja. Siempre en silencio."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Muestra las notificaciones con prioridad baja. Siempre en silencio."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Muestra las notificaciones con prioridad baja. Siempre en silencio."</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Todas las notificaciones de \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Todas las notificaciones de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"Notificaciones adaptativas"</string>
@@ -4429,6 +4432,8 @@
<item quantity="one">1 segundo</item>
</plurals>
<string name="automatic_storage_manager_settings" msgid="519158151463974656">"Gestionar almacenamiento"</string>
+ <string name="qtifeedback_settings_title">Comentarios sobre el hardware</string>
+ <string name="qtifeedback_settings_subtitle">Informes de Qualcomm Technologies, Inc</string>
<string name="automatic_storage_manager_text" msgid="6900593059927987273">"Para liberar espacio, el Administrador de Almacenamiento borrará de tu dispositivo las fotos y vídeos que tengan copia de seguridad."</string>
<string name="automatic_storage_manager_days_title" msgid="5077286114860539367">"Borrar fotos y vídeos"</string>
<string name="automatic_storage_manager_preference_title" msgid="3483357910142595444">"Administrador de almacenamiento"</string>
diff --git a/res/values-et/arrays.xml b/res/values-et/arrays.xml
index 036cf5f..6c578d9 100644
--- a/res/values-et/arrays.xml
+++ b/res/values-et/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Seadme sisemine salvestusruum"</item>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index c3b0c12..06f2147 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Ilma heli ja vibreerimiseta"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Ilma heli ja vibreerimiseta, kuvatakse vestluste jaotises allpool"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Võib telefoni seadete põhjal heliseda või vibreerida"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Kuvatakse prioriteetsete märguannete all. Alati vaikne."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Kuvatakse prioriteetsete märguannete all. Alati vaikne."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Kuvatakse prioriteetsete märguannete all. Alati vaikne."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Kui seade on avatud, kuvatakse märguanded bännerina ekraanikuva ülaosas"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Kõik rakenduse „<xliff:g id="APP_NAME">%1$s</xliff:g>” märguanded"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Kõik rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> märguanded"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Kuva pleier"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Ühtegi pleierit pole saadaval"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"meedia"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Vahelejätmise liigutus"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Teatiste vaigistamise liigutus"</string>
+ <string name="qtifeedback_settings_title">Tagasiside</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc riistvara kohta</string>
</resources>
diff --git a/res/values-eu/arrays.xml b/res/values-eu/arrays.xml
index 7bbff21..16b4ac0 100644
--- a/res/values-eu/arrays.xml
+++ b/res/values-eu/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Gailuaren barneko memoria"</item>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index acd7755..8df881a 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Ez du tonurik jotzen edo dar-dar egiten"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Ez du tonurik jotzen edo dar-dar egiten, eta elkarrizketaren atalaren behealdean agertzen da"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Tonua jo edo dar-dar egin dezake, telefonoaren ezarpenen arabera"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Lehentasunik ez duten jakinarazpenak erakusten ditu. Beti isilik."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Lehentasunik ez duten jakinarazpenak erakusten ditu. Beti isilik."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Lehentasunik ez duten jakinarazpenak erakusten ditu. Beti isilik."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Gailua desblokeatuta dagoenean, erakutsi jakinarazpenak banda gisa pantailaren goialdean"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" aplikazioaren jakinarazpen guztiak"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren jakinarazpen guztiak"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Erakutsi erreproduzigailua"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Ez dago erreproduzigailurik erabilgarri"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"multimedia-edukia"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Saltatu keinua"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Alertak isilarazteko keinua"</string>
+ <string name="qtifeedback_settings_title">Hardwareri buruzko iritzia</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc enpresaren txostenak</string>
</resources>
diff --git a/res/values-fa/arrays.xml b/res/values-fa/arrays.xml
index bc7c51d..ac7f483 100644
--- a/res/values-fa/arrays.xml
+++ b/res/values-fa/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"دستگاه ذخیرهسازی داخلی"</item>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 17b2b0a..854dc62 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"بدون صدا یا لرزش"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"بدون صدا و لرزش در پایین بخش مکالمه نشان داده میشود"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"بسته به تنظیمات ممکن است تلفن زنگ بزند یا لرزش داشته باشد"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"اعلانهای با اولویت پایین را نشان میدهد. همیشه بیصدا."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"اعلانهای با اولویت پایین را نشان میدهد. همیشه بیصدا."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"اعلانهای با اولویت پایین را نشان میدهد. همیشه بیصدا."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"وقتی قفل دستگاه باز میشود، اعلانها بهصورت برنمایی در بالای صفحهنمایش نشان داده شود"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"همه اعلانهای «<xliff:g id="APP_NAME">%1$s</xliff:g>»"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"همه اعلانهای <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"نمایش دادن پخشکننده"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"پخشکنندهای دردسترس نیست"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"رسانه"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"اشاره رد کردن"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"اشاره هشدارهای ساکت کردن"</string>
+ <string name="qtifeedback_settings_title">اطلاعات سختافزار</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc گزارش</string>
</resources>
diff --git a/res/values-fi/arrays.xml b/res/values-fi/arrays.xml
index 92a3668..99508cb 100644
--- a/res/values-fi/arrays.xml
+++ b/res/values-fi/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Laitteen sisäinen tallennustila"</item>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index f5aa168..1ec859f 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Ei ääntä tai värinää ja näkyy alempana keskusteluosiossa"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Voi soida tai väristä puhelimen asetuksista riippuen"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Kun laitteen lukitus on avattuna, näytä ilmoitukset bannerina sivun yläreunassa"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Näytetään priorisoitujen ilmoitusten alapuolella. Aina äänetön."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Näytetään priorisoitujen ilmoitusten alapuolella. Aina äänetön."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Näytetään priorisoitujen ilmoitusten alapuolella. Aina äänetön."</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Kaikki ilmoitukset: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Kaikki ilmoitukset: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"Mukautuvat ilmoitukset"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Näytä soitin"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Soittimia ei saatavilla"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"media"</string>
+ <string name="qtifeedback_settings_title">Palaute laitteesta</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc -raportointi</string>
</resources>
diff --git a/res/values-fr-rCA/arrays.xml b/res/values-fr-rCA/arrays.xml
index 70688e9..7746543 100644
--- a/res/values-fr-rCA/arrays.xml
+++ b/res/values-fr-rCA/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Mémoire interne du mobile"</item>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 72c0c2e..fdbddd0 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Aucun son ni vibration, et s\'affiche plus bas dans la section des conversations"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Peut sonner ou vibrer, selon les paramètres du téléphone"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Lorsque l\'appareil est déverrouillé, afficher les notifications dans une bannière dans le haut de l\'écran"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"S\'affiche sous les notifications prioritaires. Toujours silencieux."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"S\'affiche sous les notifications prioritaires. Toujours silencieux."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"S\'affiche sous les notifications prioritaires. Toujours silencieux."</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Toutes les notifications de « <xliff:g id="APP_NAME">%1$s</xliff:g> »"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Toutes les notifications de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"Notifications adaptatives"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Afficher le lecteur"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Aucun lecteur n\'a été trouvé"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"commandes multimédias"</string>
+ <string name="qtifeedback_settings_title">Avis sur le matériel</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Transmission de rapports</string>
</resources>
diff --git a/res/values-fr/arrays.xml b/res/values-fr/arrays.xml
index 93d84fd..e665b35 100644
--- a/res/values-fr/arrays.xml
+++ b/res/values-fr/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Mémoire interne du mobile"</item>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 23a3c0b..2186441 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Aucun son ni vibration"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Aucun son ni vibration, s\'affiche plus bas dans la section des conversations"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Peut sonner ou vibrer en fonction des paramètres du téléphone"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"S\'affiche sous les notifications prioritaires. Toujours silencieux."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"S\'affiche sous les notifications prioritaires. Toujours silencieux."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"S\'affiche sous les notifications prioritaires. Toujours silencieux."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Lorsque l\'appareil est déverrouillé, afficher les notifications dans une bannière en haut de l\'écran"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Toutes les notifications <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Toutes les notifications <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Afficher le lecteur"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Aucun lecteur disponible"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"Multimédia"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Geste permettant d\'ignorer"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Geste permettant de couper le son des alertes"</string>
+ <string name="qtifeedback_settings_title">Avis sur le matériel</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Transmission de rapports</string>
</resources>
diff --git a/res/values-gl/arrays.xml b/res/values-gl/arrays.xml
index 7aa91b8..e6966e0 100644
--- a/res/values-gl/arrays.xml
+++ b/res/values-gl/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Almacenamento interno do dispositivo"</item>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index c29a60c..3e7a5cd 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Sen son nin vibración"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Non soa nin vibra, e aparece máis abaixo na sección de conversas"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Podería soar ou vibrar en función da configuración do teléfono"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Mostra as notificacións con prioridade baixa. Sempre en silencio."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Mostra as notificacións con prioridade baixa. Sempre en silencio."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Mostra as notificacións con prioridade baixa. Sempre en silencio."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Ao desbloquear o dispositivo, as notificacións móstranse nun cartel na parte superior da pantalla"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Todas as notificacións da aplicación <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Todas as notificacións de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Mostrar reprodutor"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Non hai reprodutores dispoñibles"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"contido multimedia"</string>
+ <string name="qtifeedback_settings_title">Comentarios sobre o hardware</string>
+ <string name="qtifeedback_settings_subtitle">Informe de Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-gu/arrays.xml b/res/values-gu/arrays.xml
index f019fd5..845976c 100644
--- a/res/values-gu/arrays.xml
+++ b/res/values-gu/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"આંતરિક ઉપકરણ સંગ્રહ"</item>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 3b071b5..529edd5 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"કોઈપણ સાઉન્ડ અથવા વાઇબ્રેશન નથી"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"કોઈપણ સાઉન્ડ અથવા વાઇબ્રેશન નથી અને વાતચીત વિભાગમાં તે વધુ નીચેની દિશાએ દેખાય છે"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"ફોન સેટિંગના આધારે રિંગ અથવા વાઇબ્રેટ થઈ શકે છે"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"પ્રાધાન્યતાવાળા નોટિફિકેશન નીચે બતાવે છે. હંમેશાં સાઇલન્ટ."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"પ્રાધાન્યતાવાળા નોટિફિકેશન નીચે બતાવે છે. હંમેશાં સાઇલન્ટ."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"પ્રાધાન્યતાવાળા નોટિફિકેશન નીચે બતાવે છે. હંમેશાં સાઇલન્ટ."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"ડિવાઇસ અનલૉક થયેલું હોય ત્યારે, સ્ક્રીનના ઉપરના ભાગ પર બૅનરના સ્વરૂપમાં નોટિફિકેશન બતાવો"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"ના તમામ નોટિફિકેશન"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"<xliff:g id="APP_NAME">%1$s</xliff:g>ના બધા નોટિફિકેશન"</string>
diff --git a/res/values-hi/arrays.xml b/res/values-hi/arrays.xml
index 1b2569a..01f51ed 100644
--- a/res/values-hi/arrays.xml
+++ b/res/values-hi/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"आंतरिक डिवाइस मेमोरी"</item>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index b002d18..df27530 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"किसी तरह की आवाज़ या वाइब्रेशन न हो"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"इससे किसी तरह की आवाज़ या वाइब्रेशन नहीं होता और \'बातचीत\', सेक्शन में सबसे नीचे दिखती है"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"फ़ोन की सेटिंग के आधार पर, सूचना आने पर घंटी बज सकती है या वाइब्रेशन हो सकता है"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"कम ज़रूरी सूचनाएं दिखती हैं. दिखते समय आवाज़ और वाइब्रेशन हमेशा बंद रहते हैं."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"कम ज़रूरी सूचनाएं दिखती हैं. दिखते समय आवाज़ और वाइब्रेशन हमेशा बंद रहते हैं."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"कम ज़रूरी सूचनाएं दिखती हैं. दिखते समय आवाज़ और वाइब्रेशन हमेशा बंद रहते हैं."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"जब डिवाइस अनलॉक हो, तो स्क्रीन के सबसे ऊपर बैनर के रूप में सूचनाएं दिखाएं"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" की सभी सूचनाएं"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"<xliff:g id="APP_NAME">%1$s</xliff:g> की सभी सूचनाएं"</string>
@@ -4946,4 +4949,7 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"मीडिया प्लेयर दिखाएं"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"कोई मीडिया प्लेयर उपलब्ध नहीं है"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"मीडिया"</string>
+ <string name="no_connected_devices" msgid="6657176404588389594">"कोई डिवाइस नहीं जुड़ा है"</string>
+ <string name="qtifeedback_settings_title"> हार्डवेयर प्रतिसाद</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc रिपोर्टिंग</string>
</resources>
diff --git a/res/values-hr/arrays.xml b/res/values-hr/arrays.xml
index 5c322b2..aea4f7d 100644
--- a/res/values-hr/arrays.xml
+++ b/res/values-hr/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Interno pohranjivanje na uređaj"</item>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 4e8aa93..65b6382 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -3629,6 +3629,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Bez zvuka ili vibracije"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Bez zvuka ili vibracije i prikazuje se pri dnu odjeljka razgovora"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Možda će zvoniti ili vibrirati, ovisno o postavkama telefona"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Prikazuje obavijesti nižeg prioriteta. Uvijek bešumno."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Prikazuje obavijesti nižeg prioriteta. Uvijek bešumno."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Prikazuje obavijesti nižeg prioriteta. Uvijek bešumno."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Kad se uređaj otključa, prikaži obavijesti kao natpis pri vrhu zaslona"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Sve obavijesti aplikacije \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Sve obavijesti aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -5037,4 +5040,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Prikaži player"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Nijedan player nije dostupan"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"mediji"</string>
+ <string name="qtifeedback_settings_title">Povratne informacije o hardveru</string>
+ <string name="qtifeedback_settings_subtitle"> Slanje izvještaja tvrtki Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-hu/arrays.xml b/res/values-hu/arrays.xml
index 8ea94c5..f917858 100644
--- a/res/values-hu/arrays.xml
+++ b/res/values-hu/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Belső tárhely"</item>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index daaa18d..60d9667 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Nincs hang és rezgés"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Nincs hang és rezgés, továbbá lejjebb jelenik meg a beszélgetések szakaszában"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"A telefonbeállítások alapján csöröghet és rezeghet"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Az elsőbbségi értesítések alatt jelenik meg. Mindig némítva van."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Az elsőbbségi értesítések alatt jelenik meg. Mindig némítva van."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Az elsőbbségi értesítések alatt jelenik meg. Mindig némítva van."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Feloldott állapotban az értesítések megjelenítése szalag formájában a képernyő felső részén"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"A(z) „<xliff:g id="APP_NAME">%1$s</xliff:g>” összes értesítése"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Az összes <xliff:g id="APP_NAME">%1$s</xliff:g>-értesítés"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Lejátszó megjelenítése"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Nincs rendelkezésre álló lejátszó"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"média"</string>
+ <string name="qtifeedback_settings_title">Hardverrel kapcsolatos visszajelzés</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Jelentésküldés</string>
</resources>
diff --git a/res/values-hy/arrays.xml b/res/values-hy/arrays.xml
index 50238b9..30cf9ca 100644
--- a/res/values-hy/arrays.xml
+++ b/res/values-hy/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Սարքի ներքին պահոց"</item>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 5a3b8e8..d2bed13 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Առանց ձայնի կամ թրթռոցի"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Հայտնվում է զրույցների ցանկի ներքևում, առանց ձայնի և թրթռոցի"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Կարող է զնգալ կամ թրթռալ (հեռախոսի կարգավորումներից կախված)"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Ցուցադրվում են կարևոր ծանուցումների տակ: Միշտ անձայն:"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Ցուցադրվում են կարևոր ծանուցումների տակ: Միշտ անձայն:"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Ցուցադրվում են կարևոր ծանուցումների տակ: Միշտ անձայն:"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Երբ սարքն ապակողպված է, ցույց տալ ծանուցումները էկրանի վերևում ազդերիզի տեսքով"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"«<xliff:g id="APP_NAME">%1$s</xliff:g>» պիտակով բոլոր ծանուցումները"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի բոլոր ծանուցումները"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Ցուցադրել նվագարկիչը"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Հասանելի նվագարկիչներ չկան"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"մեդիա"</string>
+ <string name="qtifeedback_settings_title">Հետադարձ կապ սարքակազմի մասին</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Զեկուցում</string>
</resources>
diff --git a/res/values-in/arrays.xml b/res/values-in/arrays.xml
index 1851f0c..ea40c69 100644
--- a/res/values-in/arrays.xml
+++ b/res/values-in/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Penyimpanan perangkat internal"</item>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 48142e6..8add69b 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Tidak ada suara atau getaran"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Tidak ada suara atau getaran dan ditampilkan lebih rendah di bagian percakapan"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Dapat berdering atau bergetar berdasarkan setelan ponsel"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Ditampilkan di bawah notifikasi prioritas. Selalu senyap."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Ditampilkan di bawah notifikasi prioritas. Selalu senyap."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Ditampilkan di bawah notifikasi prioritas. Selalu senyap."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Jika perangkat dibuka kuncinya, menampilkan notifikasi sebagai banner di bagian atas layar"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Semua notifikasi \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Semua notifikasi <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Menampilkan pemutar"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Tidak ada pemutar yang tersedia"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"media"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Lewati gestur"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Senyapkan gestur notifikasi"</string>
+ <string name="qtifeedback_settings_title">Umpan Balik tentang Perangkat Keras</string>
+ <string name="qtifeedback_settings_subtitle">Laporan Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-is/arrays.xml b/res/values-is/arrays.xml
index 90d6b3b..0f04e0e 100644
--- a/res/values-is/arrays.xml
+++ b/res/values-is/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Innbyggð geymsla tækis"</item>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 3714da6..7ab07d1 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Ekkert hljóð eða titringur"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Ekkert hljóð eða titringur og birtist neðar í samtalshluta"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Gæti hringt eða titrað eftir stillingum símans"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Birtir tilkynningar með lítinn forgang. Alltaf án hljóðs."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Birtir tilkynningar með lítinn forgang. Alltaf án hljóðs."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Birtir tilkynningar með lítinn forgang. Alltaf án hljóðs."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Birta tilkynningar á borða efst á skjánum þegar tækið er opið"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Allar tilkynningar frá „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Allar tilkynningar frá <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Sýna spilara"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Engir spilarar tiltækir"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"margmiðlunarefni"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Sleppa bendingu"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Slökkva á hljóði fyrir tilkynningar"</string>
+ <string name="qtifeedback_settings_title">Svörun vélbúnaðar</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Skýrslugjöf</string>
</resources>
diff --git a/res/values-it/arrays.xml b/res/values-it/arrays.xml
index 5a9f87f..0fdcdef 100644
--- a/res/values-it/arrays.xml
+++ b/res/values-it/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Memorizzazione su dispositivo interno"</item>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index d41f71a..ee819dd 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Nessun suono o vibrazione"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Nessun suono o vibrazione e appare più in basso nella sezione delle conversazioni"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Può suonare o vibrare in base alle impostazioni del telefono"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Vengono mostrate le notifiche con priorità bassa. Sempre silenziose."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Vengono mostrate le notifiche con priorità bassa. Sempre silenziose."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Vengono mostrate le notifiche con priorità bassa. Sempre silenziose."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Quando il dispositivo è sbloccato, mostra le notifiche come banner in cima allo schermo"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Tutte le notifiche \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Tutte le notifiche di <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Mostra lettore multimediale"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Nessun lettore multimediale disponibile"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"contenuti multimediali"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Gesto per ignorare"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Gesto per disattivare gli avvisi"</string>
+ <string name="qtifeedback_settings_title">Feedback sull\'hardware</string>
+ <string name="qtifeedback_settings_subtitle">Invio di rapporti a Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-iw/arrays.xml b/res/values-iw/arrays.xml
index f71da6d..fd0f545 100644
--- a/res/values-iw/arrays.xml
+++ b/res/values-iw/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"אחסון פנימי במכשיר"</item>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 102a845..28dfb75 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -3677,6 +3677,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"ללא צליל או רטט"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"ללא צליל או רטט ומופיעה למטה בקטע התראות השיחה"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"ייתכן שיופעל צלצול או רטט בהתאם להגדרות הטלפון"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"מציגה התראות בעדיפות נמוכה. תמיד שקטה."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"מציגה התראות בעדיפות נמוכה. תמיד שקטה."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"מציגה התראות בעדיפות נמוכה. תמיד שקטה."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"כשהמכשיר לא נעול, יש להציג התראות כבאנר בראש המסך"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"כל ההתראות של \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"כל ההתראות של <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-ja/arrays.xml b/res/values-ja/arrays.xml
index a73bef3..e90a8d6 100644
--- a/res/values-ja/arrays.xml
+++ b/res/values-ja/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"内部デバイスストレージ"</item>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index f79aa75..67c846f 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"着信音もバイブレーションも無効です"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"着信音もバイブレーションも無効になり会話セクションの下に表示されます"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"スマートフォンの設定を基に着信音またはバイブレーションが有効になります"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"優先度の低い通知を表示します。常に通知音は鳴りません。"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"優先度の低い通知を表示します。常に通知音は鳴りません。"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"優先度の低い通知を表示します。常に通知音は鳴りません。"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"デバイスのロックが解除されているとき、画面上部にバナーとして通知を表示します"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」のすべての通知"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"<xliff:g id="APP_NAME">%1$s</xliff:g> のすべての通知"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"プレーヤーを表示"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"プレーヤーなし"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"メディア"</string>
+ <string name="qtifeedback_settings_title"> ハードウェアに関するフィードバック</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Incレポート</string>
</resources>
diff --git a/res/values-ka/arrays.xml b/res/values-ka/arrays.xml
index 077403f..2775f9e 100644
--- a/res/values-ka/arrays.xml
+++ b/res/values-ka/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"შიდა მოწყობილობის მეხსიერება"</item>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 44b502a..cbf25db 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"ხმისა და ვიბრაციის გარეშე"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"ხმისა და ვიბრაციის გარეშე, ჩნდება მიმოწერების სექციის ქვედა ნაწილში"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"დარეკვა ან ვიბრაცია ტელეფონის პარამეტრების მიხედვით"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"აჩვენებს ნაკლებად პრიორიტეტულ შეტყობინებებს. ყოველთვის ჩუმია."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"აჩვენებს ნაკლებად პრიორიტეტულ შეტყობინებებს. ყოველთვის ჩუმია."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"აჩვენებს ნაკლებად პრიორიტეტულ შეტყობინებებს. ყოველთვის ჩუმია."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"როცა მოწყობილობა განბლოკილია, შეტყობინებები გამოჩნდეს ეკრანის ზედა ნაწილზე გადაჭიმული ბანერის სახით"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“-ის ყველა შეტყობინება"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ის ყველა შეტყობინება"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"დამკვრელის ჩვენება"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"დამკვრელები მიუწვდომელია"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"მედია"</string>
+ <string name="qtifeedback_settings_title">აპარატურის შესახებ უკუკავშირი</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc რეპორტინგი</string>
</resources>
diff --git a/res/values-kk/arrays.xml b/res/values-kk/arrays.xml
index 4c744df..a49efc2 100644
--- a/res/values-kk/arrays.xml
+++ b/res/values-kk/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Ішкі құрылғы жады"</item>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 07d3780..075dec8 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Дыбыс не діріл қолданылмайды"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Дыбыс не діріл қолданылмайды, төменде әңгімелер бөлімінде шығады"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Телефон параметрлеріне байланысты шылдырлауы не дірілдеуі мүмкін"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Маңыздылығы төмен хабарландыруларды көрсетеді. Үнемі дыбыссыз режимде болады."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Маңыздылығы төмен хабарландыруларды көрсетеді. Үнемі дыбыссыз режимде болады."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Маңыздылығы төмен хабарландыруларды көрсетеді. Үнемі дыбыссыз режимде болады."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Құрылғының құлпы ашылғанда, хабарландырулар экранның жоғарғы жағында баннер ретінде көрсетіледі"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Барлық \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" хабарландырулары"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Барлық <xliff:g id="APP_NAME">%1$s</xliff:g> хабарландырулары"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Ойнатқышты көрсету"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Ойнатқыштар жоқ"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"мультимeдиа"</string>
+ <string name="qtifeedback_settings_title"> Жабдыққа байланысты пікір</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc хабарламасы</string>
</resources>
diff --git a/res/values-km/arrays.xml b/res/values-km/arrays.xml
index d074efd..ca8dc1f 100644
--- a/res/values-km/arrays.xml
+++ b/res/values-km/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"ឧបករណ៍ផ្ទុកខាងក្នុង"</item>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 989dcb2..8563b53 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"គ្មានសំឡេង ឬការញ័រ និងការបង្ហាញកម្រិតទាបជាងនេះនៅក្នុងផ្នែកសន្ទនាទេ"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"អាចរោទ៍ ឬញ័រ ដោយផ្អែកលើការកំណត់ទូរសព្ទ"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"បង្ហាញការជូនដំណឹងជាផ្ទាំងនៅផ្នែកខាងលើអេក្រង់ នៅពេលឧបករណ៍មិនជាប់សោ"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"បង្ហាញខាងក្រោមការជូនដំណឹងអាទិភាព។ បិទសំឡេងជានិច្ច។"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"បង្ហាញខាងក្រោមការជូនដំណឹងអាទិភាព។ បិទសំឡេងជានិច្ច។"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"បង្ហាញខាងក្រោមការជូនដំណឹងអាទិភាព។ បិទសំឡេងជានិច្ច។"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"ការជូនដំណឹងទាំងអស់អំពី \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"ការជូនដំណឹងទាំងអស់របស់ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"ការជូនដំណឺងដែលមានភាពបត់បែន"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"បង្ហាញកម្មវិធីចាក់"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"មិនមានកម្មវិធីចាក់ទេ"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"មេឌៀ"</string>
+ <string name="qtifeedback_settings_title">មតិតបនៃហាដវែរ</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc ការរាយការណ៍</string>
</resources>
diff --git a/res/values-kn/arrays.xml b/res/values-kn/arrays.xml
index e858ca6..db468d4 100644
--- a/res/values-kn/arrays.xml
+++ b/res/values-kn/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"ಆಂತರಿಕ ಸಾಧನ ಸಂಗ್ರಹಣೆ"</item>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 8b17325..db77c62 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"ಯಾವುದೇ ಧ್ವನಿ ಅಥವಾ ವೈಬ್ರೇಷನ್ ಆಗುವುದಿಲ್ಲ"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"ಯಾವುದೇ ಧ್ವನಿ ಅಥವಾ ವೈಬ್ರೇಷನ್ ಆಗುವುದಿಲ್ಲ, ಸಂಭಾಷಣೆ ವಿಭಾಗದ ಕೆಳಭಾಗದಲ್ಲಿ ಗೋಚರಿಸುತ್ತದೆ"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಆಧರಿಸಿ ಫೋನ್ ರಿಂಗ್ ಅಥವಾ ವೈಬ್ರೇಟ್ ಆಗುತ್ತದೆ"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"ಆದ್ಯತೆಯ ಅಧಿಸೂಚನೆಗಳ ಅಡಿಯಲ್ಲಿ ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತದೆ. ಯಾವಾಗಲೂ ನಿಶ್ಶಬ್ದ."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"ಆದ್ಯತೆಯ ಅಧಿಸೂಚನೆಗಳ ಅಡಿಯಲ್ಲಿ ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತದೆ. ಯಾವಾಗಲೂ ನಿಶ್ಶಬ್ದ."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"ಆದ್ಯತೆಯ ಅಧಿಸೂಚನೆಗಳ ಅಡಿಯಲ್ಲಿ ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತದೆ. ಯಾವಾಗಲೂ ನಿಶ್ಶಬ್ದ."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"ಸಾಧನವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿದಾಗ, ಅಧಿಸೂಚನೆಗಳನ್ನು ಪರದೆಯ ಮೇಲ್ಭಾಗದಲ್ಲಿ ಬ್ಯಾನರ್ನಂತೆ ತೋರಿಸಿ"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"ಎಲ್ಲಾ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" ಅಧಿಸೂಚನೆಗಳು"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"ಎಲ್ಲಾ <xliff:g id="APP_NAME">%1$s</xliff:g> ಅಧಿಸೂಚನೆಗಳು"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"ಪ್ಲೇಯರ್ ತೋರಿಸಿ"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"ಯಾವುದೇ ಪ್ಲೇಯರ್ಗಳು ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"ಮಾಧ್ಯಮ"</string>
+ <string name="qtifeedback_settings_title">ಹಾರ್ಡ್ವೇರ್ ಪ್ರತಿಕ್ರಿಯೆ</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc ವರದಿ</string>
</resources>
diff --git a/res/values-ko/arrays.xml b/res/values-ko/arrays.xml
index 8c61c6b..608f7df 100644
--- a/res/values-ko/arrays.xml
+++ b/res/values-ko/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"내부 기기 저장용량"</item>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 9a820c4..e0b9d0a 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"소리 또는 진동 없음"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"소리나 진동이 울리지 않으며 대화 섹션 하단에 표시됨"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"휴대전화 설정에 따라 벨소리나 진동이 울릴 수 있음"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"우선순위 알림 아래에 표시됩니다. 항상 음소거됩니다."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"우선순위 알림 아래에 표시됩니다. 항상 음소거됩니다."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"우선순위 알림 아래에 표시됩니다. 항상 음소거됩니다."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"기기가 잠금 해제되었을 때 화면 상단에 알림 배너 표시"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"모든 ‘<xliff:g id="APP_NAME">%1$s</xliff:g>’ 알림"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"모든 <xliff:g id="APP_NAME">%1$s</xliff:g> 알림"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"플레이어를 표시합니다."</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"사용 가능한 플레이어가 없습니다."</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"미디어"</string>
+ <string name="qtifeedback_settings_title">하드웨어 피드백</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc 보고</string>
</resources>
diff --git a/res/values-ky/arrays.xml b/res/values-ky/arrays.xml
index 0cd420a..f9fcfe7 100644
--- a/res/values-ky/arrays.xml
+++ b/res/values-ky/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Ички түзмөк эстутуму"</item>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 5bfebd6..03cd6c3 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Үнү чыгып же дирилдебейт жана жазышуу бөлүмүнүн ылдый жагында көрүнөт"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Телефондун жөндөөлөрүнө жараша шыңгырап же дирилдеши мүмкүн"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Телефон кулпуланып турганда, билдирмелер экрандын жогору жагында баннер түрүндө көрүнөт"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Маанилүү билдирмелердин ылдый жагында чагылдырылат. Ар дайым үнсүз."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Маанилүү билдирмелердин ылдый жагында чагылдырылат. Ар дайым үнсүз."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Маанилүү билдирмелердин ылдый жагында чагылдырылат. Ар дайым үнсүз."</string>
<string name="notification_switch_label" msgid="8029371325967501557">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" колдонмосундагы бардык билдирмелер"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунун бардык билдирмелери"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"Ыңгайлаштырылуучу билдирмелер"</string>
diff --git a/res/values-lo/arrays.xml b/res/values-lo/arrays.xml
index 2568a52..5b4951c 100644
--- a/res/values-lo/arrays.xml
+++ b/res/values-lo/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"ພື້ນທີ່ຈັດເກັບຂໍ້ມູນພາຍໃນອຸປະກອນ"</item>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 851e95d..2c11557 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"ບໍ່ມີສຽງ ຫຼື ການສັ່ນເຕືອນ"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"ບໍ່ມີສຽງ ຫຼື ການສັ່ນເຕືອນ ແລະ ປາກົດຢູ່ທາງລຸ່ມຂອງພາກສ່ວນການສົນທະນາ"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"ອາດສົ່ງສຽງ ຫຼື ສັ່ນເຕືອນໂດຍອ້າງອີງຈາກການຕັ້ງຄ່າໂທລະສັບ"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"ສະແດງການແຈ້ງເຕືອນທີ່ຄວາມສຳຄັນຕ່ຳລົງ. ປິດສຽງຕະຫຼອດ."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"ສະແດງການແຈ້ງເຕືອນທີ່ຄວາມສຳຄັນຕ່ຳລົງ. ປິດສຽງຕະຫຼອດ."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"ສະແດງການແຈ້ງເຕືອນທີ່ຄວາມສຳຄັນຕ່ຳລົງ. ປິດສຽງຕະຫຼອດ."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"ເມື່ອປົດລັອກອຸປະກອນແລ້ວ, ໃຫ້ສະແດງການແຈ້ງເຕືອນເປັນປ້າຍຢູ່ເທິງສຸດຂອງໜ້າຈໍ"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"ການສົນທະນາ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" ທັງໝົດ"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"ການແຈ້ງເຕືອນ <xliff:g id="APP_NAME">%1$s</xliff:g> ທັງໝົດ"</string>
diff --git a/res/values-lt/arrays.xml b/res/values-lt/arrays.xml
index d423cd5..e7fff5c 100644
--- a/res/values-lt/arrays.xml
+++ b/res/values-lt/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Vidinė įrenginio saugykla"</item>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index e2a751a..e7c67e2 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -3677,6 +3677,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Neskamba ir nevibruoja"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Neskamba, nevibruoja ir rodoma apatinėje pokalbių skilties dalyje"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Gali skambėti arba vibruoti, atsižvelgiant į telefono nustatymus"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Pateikiami po prioritetiniais pranešimais. Visada nutildyti."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Pateikiami po prioritetiniais pranešimais. Visada nutildyti."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Pateikiami po prioritetiniais pranešimais. Visada nutildyti."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Kai įrenginys atrakintas, pranešimai rodomi kaip reklamjuostė ekrano viršuje"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Visi „<xliff:g id="APP_NAME">%1$s</xliff:g>“ pranešimai"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Visi „<xliff:g id="APP_NAME">%1$s</xliff:g>“ pranešimai"</string>
@@ -5128,4 +5131,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Rodyti leistuvę"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Nėra jokių pasiekiamų leistuvių"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"medija"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Praleisti gestą"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Įspėjimų nutildymo gestas"</string>
+ <string name="qtifeedback_settings_title">Atsiliepimas apie aparatinę įrangą</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Ataskaitų teikimas</string>
</resources>
diff --git a/res/values-lv/arrays.xml b/res/values-lv/arrays.xml
index f3d5006..9959318 100644
--- a/res/values-lv/arrays.xml
+++ b/res/values-lv/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Iekšējā ierīces krātuve"</item>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 5287a8f..e38c107 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -3629,6 +3629,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Nav skaņas signāla vai vibrācijas"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Nav skaņas signāla vai vibrācijas, kā arī atrodas zemāk sarunu sadaļā"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Atkarībā no tālruņa iestatījumiem var zvanīt vai vibrēt"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Tiek rādīts zem prioritārajiem paziņojumiem. Vienmēr bez skaņas."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Tiek rādīts zem prioritārajiem paziņojumiem. Vienmēr bez skaņas."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Tiek rādīts zem prioritārajiem paziņojumiem. Vienmēr bez skaņas."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Rādīt paziņojumus reklāmkarogā ekrāna augšdaļā, ja ierīce ir atbloķēta"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Visi lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> paziņojumi"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Visi lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> paziņojumi"</string>
@@ -5037,4 +5040,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Rādīt atskaņotāju"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Nav pieejams neviens atskaņotājs"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"multivide"</string>
+ <string name="qtifeedback_settings_title"> Atsauksmes par aparatūru</string>
+ <string name="qtifeedback_settings_subtitle">Ziņošana uzņēmumam Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-mk/arrays.xml b/res/values-mk/arrays.xml
index 1517863..ef9eb1f 100644
--- a/res/values-mk/arrays.xml
+++ b/res/values-mk/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Внатрешен капацитет"</item>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 88d7677..789ea27 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Без звук или вибрации и се појавува под делот за разговор"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Може да ѕвони или вибрира во зависност од поставките на телефонот"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Кога уредот е отклучен, прикажувај ги известувањата како рекламен натпис на горниот дел од екранот"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Се прикажува под приоритетните известувања. Секогаш безгласно."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Се прикажува под приоритетните известувања. Секогаш безгласно."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Се прикажува под приоритетните известувања. Секогаш безгласно."</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Сите известувања на „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Сите известувања за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"Приспособливи известувања"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Прикажи го плеерот"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Нема достапни плеери"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"аудиовизуелни содржини"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Прескокни го движењето"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Движење за стишување предупредувања"</string>
+ <string name="qtifeedback_settings_title">Повратни информации за хардверот</string>
+ <string name="qtifeedback_settings_subtitle">Праќање извештаи на компанијата Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-ml/arrays.xml b/res/values-ml/arrays.xml
index 2edb09e..f9add50 100644
--- a/res/values-ml/arrays.xml
+++ b/res/values-ml/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"ആന്തരിക ഉപകരണ സ്റ്റോറേജ്"</item>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 2862a85..5b880a4 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"ശബ്ദമോ വൈബ്രേഷനോ ഇല്ല"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"ശബ്ദമോ വൈബ്രേഷനോ ഇല്ല, സംഭാഷണ വിഭാഗത്തിന് താഴെയായി ദൃശ്യമാകും"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"ഫോൺ ക്രമീകരണം അടിസ്ഥാനമാക്കി റിംഗ് ചെയ്തേക്കാം അല്ലെങ്കിൽ വൈബ്രേറ്റ് ചെയ്തേക്കാം"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"കുറഞ്ഞ പ്രാധാന്യമുള്ള മുൻഗണനാ അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുന്നു. എപ്പോഴും നിശബ്ദം."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"കുറഞ്ഞ പ്രാധാന്യമുള്ള മുൻഗണനാ അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുന്നു. എപ്പോഴും നിശബ്ദം."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"കുറഞ്ഞ പ്രാധാന്യമുള്ള മുൻഗണനാ അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുന്നു. എപ്പോഴും നിശബ്ദം."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"ഉപകരണം അൺലോക്ക് ചെയ്തിരിക്കുമ്പോൾ അറിയിപ്പുകളെ സ്ക്രീനിന്റെ മുകളിൽ ഒരു ബാനറായി കാണിക്കൂ"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"എല്ലാ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" അറിയിപ്പുകളും"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"എല്ലാ <xliff:g id="APP_NAME">%1$s</xliff:g> അറിയിപ്പുകളും"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"പ്ലേയർ കാണിക്കുക"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"പ്ലേയറുകളൊന്നും ലഭ്യമല്ല"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"മീഡിയ"</string>
+ <string name="qtifeedback_settings_title">ഹാർഡ്വെയർ ഫീഡ്ബാക്ക്</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc റിപ്പോർട്ടുചെയ്യൽ</string>
</resources>
diff --git a/res/values-mn/arrays.xml b/res/values-mn/arrays.xml
index 33349a5..2f93616 100644
--- a/res/values-mn/arrays.xml
+++ b/res/values-mn/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Дотоод төхөөрөмжийн сан"</item>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 6f8e3ba..f46fca3 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Дуу эсвэл чичиргээ байхгүй"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Дуу эсвэл чичиргээ байхгүй бөгөөд харицан ярианы хэсгийн доод талд харагдана"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Утасны тохиргоонд тулгуурлан хонх дуугаргах эсвэл чичирхийлж болзошгүй"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Доорх ач холбогдолтой мэдэгдлийг харуулдаг. Үргэлж дуугүй байна."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Доорх ач холбогдолтой мэдэгдлийг харуулдаг. Үргэлж дуугүй байна."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Доорх ач холбогдолтой мэдэгдлийг харуулдаг. Үргэлж дуугүй байна."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Төхөөрөмжийн түгжээг тайлсан үед мэдэгдлүүдийг дэлгэцийн дээд хэсэгт баннер болгож харуулах"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\"-н бүх мэдэгдэл"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н бүх мэдэгдэл"</string>
diff --git a/res/values-mr/arrays.xml b/res/values-mr/arrays.xml
index 290c61f..72d8a32 100644
--- a/res/values-mr/arrays.xml
+++ b/res/values-mr/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"अंतर्गत डिव्हाइस स्टोरेज"</item>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index ca84ab1..400911d 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"आवाज किंवा व्हायब्रेशन नाही"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"आवाज किंवा व्हायब्रेशन नाही आणि संभाषण विभागात सर्वात तळाशी दिसते"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"फोन सेटिंग्जच्या आधारावर रिंग किंवा व्हायब्रेट होऊ शकतो"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"कमी प्राधान्य असलेल्या सूचना दाखवते. नेहमी सायलंट."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"कमी प्राधान्य असलेल्या सूचना दाखवते. नेहमी सायलंट."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"कमी प्राधान्य असलेल्या सूचना दाखवते. नेहमी सायलंट."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"डिव्हाइस अनलॉक असताना, स्क्रीनच्या सर्वात वरती बॅनर म्हणून सूचना दाखवा"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"सर्व \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" सूचना"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"सर्व <xliff:g id="APP_NAME">%1$s</xliff:g> वरील सूचना"</string>
@@ -4947,4 +4950,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"प्लेअर दाखवा"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"कोणताही प्लेअर उपलब्ध नाही"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"मीडिया"</string>
+ <string name="qtifeedback_settings_title">हार्डवेअर फीडबॅक</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc रिपोर्टिंग</string>
</resources>
diff --git a/res/values-ms/arrays.xml b/res/values-ms/arrays.xml
index 9a9aadc..17d1061 100644
--- a/res/values-ms/arrays.xml
+++ b/res/values-ms/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Storan dalaman peranti"</item>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index ef926ac..498ef03 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Tiada bunyi atau getaran dan muncul di sebelah bawah dalam bahagian perbualan"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Mungkin berbunyi atau bergetar berdasarkan tetapan telefon"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Apabila kunci peranti dibuka, tunjukkan pemberitahuan sebagai sepanduk di bahagian atas skrin"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Dipaparkan di bawah pemberitahuan keutamaan. Sentiasa senyap."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Dipaparkan di bawah pemberitahuan keutamaan. Sentiasa senyap."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Dipaparkan di bawah pemberitahuan keutamaan. Sentiasa senyap."</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Semua pemberitahuan \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Semua pemberitahuan <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"Pemberitahuan Boleh Suai"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Tunjukkan pemain"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Tiada pemain tersedia"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"media"</string>
+ <string name="qtifeedback_settings_title">Maklum Balas Perkakasan</string>
+ <string name="qtifeedback_settings_subtitle">Pelaporan Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-my/arrays.xml b/res/values-my/arrays.xml
index 60f8af9..bbd637a 100644
--- a/res/values-my/arrays.xml
+++ b/res/values-my/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"စက်တွင်းသိုလှောင်ကိရိယာ"</item>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 5c0adbc..b1a4d41 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"အသံ သို့မဟုတ် တုန်ခါမှုမရှိပါ"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"အသံ သို့မဟုတ် တုန်ခါမှုမရှိပါ၊ စကားဝိုင်းကဏ္ဍ၏ အောက်ပိုင်းတွင် မြင်ရသည်"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"ဖုန်းဆက်တင်များပေါ် အခြေခံပြီး အသံမြည်နိုင်သည် သို့မဟုတ် တုန်ခါနိုင်သည်"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"ဦးစားပေးအကြောင်းကြားချက်များ၏ အောက်တွင်ဖော်ပြသည်။ အမြဲအသံတိတ်ရန်။"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"ဦးစားပေးအကြောင်းကြားချက်များ၏ အောက်တွင်ဖော်ပြသည်။ အမြဲအသံတိတ်ရန်။"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"ဦးစားပေးအကြောင်းကြားချက်များ၏ အောက်တွင်ဖော်ပြသည်။ အမြဲအသံတိတ်ရန်။"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"စက်ကို လော့ခ်ဖွင့်ထားပါက အကြောင်းကြားချက်များကို မျက်နှာပြင်၏ထိပ်တွင် နဖူးစည်းအဖြစ် ပြသပါ"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" အကြောင်းကြားချက်အားလုံး"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"<xliff:g id="APP_NAME">%1$s</xliff:g> အကြောင်းကြားချက် အားလုံး"</string>
diff --git a/res/values-nb/arrays.xml b/res/values-nb/arrays.xml
index 951578c..45b66ff 100644
--- a/res/values-nb/arrays.xml
+++ b/res/values-nb/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Intern lagringsenhet"</item>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index d011f7c..0e698a3 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Ingen lyd eller vibrering"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Ingen lyd eller vibrering, og vises lavere i samtaledelen"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Kan ringe eller vibrere basert på telefoninnstillingene"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Vises under prioritetsvarsler. Alltid lydløs."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Vises under prioritetsvarsler. Alltid lydløs."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Vises under prioritetsvarsler. Alltid lydløs."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Når enheten låses opp, vises varsler som et banner over toppen av skjermen"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Alle «<xliff:g id="APP_NAME">%1$s</xliff:g>»-varsler"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Alle <xliff:g id="APP_NAME">%1$s</xliff:g>-varsler"</string>
diff --git a/res/values-ne/arrays.xml b/res/values-ne/arrays.xml
index 5151645..91c290a 100644
--- a/res/values-ne/arrays.xml
+++ b/res/values-ne/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"आन्तरिक उपकरण भण्डारण"</item>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 97dded7..7479493 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"न घन्टी बज्छ न त कम्पन नै हुन्छ"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"न घन्टी बज्छ न त कम्पन नै हुन्छ र वार्तालाप खण्डको तलतिर देखा पर्छ"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"फोनको सेटिङका आधारमा घन्टी बज्न वा कम्पन हुन सक्छ"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"न्यून प्राथमिकताका सूचनाहरू देखाउँछ। सधैँ मौन।"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"न्यून प्राथमिकताका सूचनाहरू देखाउँछ। सधैँ मौन।"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"न्यून प्राथमिकताका सूचनाहरू देखाउँछ। सधैँ मौन।"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"यन्त्र अनलक गरिएका बेला सूचना देखाउँदा स्क्रिनको सिरानमा ब्यानरका रूपमा देखाउनुहोस्"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" का सबै सूचनाहरू"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"<xliff:g id="APP_NAME">%1$s</xliff:g> सम्बन्धी सबै सूचनाहरू"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"प्लेयर देखाउनुहोस्"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"कुनै पनि प्लेयर उपलब्ध छैन"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"मिडिया"</string>
+ <string name="qtifeedback_settings_title">हार्डवेयर प्रतिक्रिया</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc रिपोर्टिंङ </string>
</resources>
diff --git a/res/values-nl/arrays.xml b/res/values-nl/arrays.xml
index ab29678..5a22c58 100644
--- a/res/values-nl/arrays.xml
+++ b/res/values-nl/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Interne apparaatopslag"</item>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 9c3ef12..8c20313 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Geen geluid of trilling"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Geen geluid of trilling en wordt op een lagere positie in het gedeelte met gesprekken weergegeven"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Kan overgaan of trillen op basis van de telefooninstellingen"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Wordt weergegeven onder de prioriteitsmeldingen. Altijd stil."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Wordt weergegeven onder de prioriteitsmeldingen. Altijd stil."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Wordt weergegeven onder de prioriteitsmeldingen. Altijd stil."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Wanneer het apparaat is ontgrendeld, worden meldingen als banner bovenaan het scherm weergegeven"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Alle meldingen van \'<xliff:g id="APP_NAME">%1$s</xliff:g>\'"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Alle meldingen van <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Speler weergeven"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Geen spelers beschikbaar"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"media"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Gebaar voor overslaan"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Gebaar voor meldingen dempen"</string>
+ <string name="qtifeedback_settings_title">Feedback over hardware</string>
+ <string name="qtifeedback_settings_subtitle">Rapportage aan Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 224d9ca..f79e893 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"କୌଣସି ସାଉଣ୍ଡ କିମ୍ବା ଭାଇବ୍ରେସନ୍ ନାହିଁ"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"କୌଣସି ସାଉଣ୍ଡ କିମ୍ବା ଭାଇବ୍ରେସନ୍ ନାହିଁ ଏବଂ ବାର୍ତ୍ତାଳାପ ବିଭାଗର ନିମ୍ନରେ ଦେଖାଯାଏ"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"ଫୋନ୍ ସେଟିଂସ୍ ଆଧାରରେ ରିଙ୍ଗ କିମ୍ବା ଭାଇବ୍ରେଟ୍ ହୋଇପାରେ"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"ପ୍ରାଥମିକତା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ତଳେ ପ୍ରଦର୍ଶନ କରିଥାଏ। ସର୍ବଦା ନୀରବ।"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"ପ୍ରାଥମିକତା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ତଳେ ପ୍ରଦର୍ଶନ କରିଥାଏ। ସର୍ବଦା ନୀରବ।"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"ପ୍ରାଥମିକତା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ତଳେ ପ୍ରଦର୍ଶନ କରିଥାଏ। ସର୍ବଦା ନୀରବ।"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"ଡିଭାଇସ୍ ଅନ୍ଲକ୍ ଥିବା ବେଳେ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ସ୍କ୍ରିନ୍ର ଉପର ପାର୍ଶ୍ୱରେ ବ୍ୟାନର୍ ଭଳି ଦେଖାଯିବ"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"ସମସ୍ତ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" ବିଜ୍ଞପ୍ତି"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"ସମସ୍ତ <xliff:g id="APP_NAME">%1$s</xliff:g> ବିଜ୍ଞପ୍ତି"</string>
diff --git a/res/values-pa/arrays.xml b/res/values-pa/arrays.xml
index 8ae37b2..4a3743b 100644
--- a/res/values-pa/arrays.xml
+++ b/res/values-pa/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"ਅੰਦਰੂਨੀ ਡੀਵਾਈਸ ਸਟੋਰੇਜ"</item>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 935446f..ea2997b 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"ਕੋਈ ਧੁਨੀ ਜਾਂ ਥਰਥਰਾਹਟ ਨਹੀਂ"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"ਕੋਈ ਧੁਨੀ ਜਾਂ ਥਰਥਰਾਹਟ ਨਹੀਂ ਅਤੇ ਸੂਚਨਾਵਾਂ ਗੱਲਬਾਤ ਸੈਕਸ਼ਨ ਵਿੱਚ ਹੇਠਲੇ ਪਾਸੇ ਦਿਸਦੀਆਂ ਹਨ"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"ਫ਼ੋਨ ਸੈਟਿੰਗਾਂ ਦੇ ਆਧਾਰ \'ਤੇ ਘੰਟੀ ਵੱਜ ਸਕਦੀ ਹੈ ਜਾਂ ਥਰਥਰਾਹਟ ਹੋ ਸਕਦੀ ਹੈ"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"ਘੱਟ ਤਰਜੀਹ ਵਾਲੀਆਂ ਸੂਚਨਾਵਾਂ ਦਿਖਾਓ। ਹਮੇਸ਼ਾਂ ਖਾਮੋਸ਼।"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"ਘੱਟ ਤਰਜੀਹ ਵਾਲੀਆਂ ਸੂਚਨਾਵਾਂ ਦਿਖਾਓ। ਹਮੇਸ਼ਾਂ ਖਾਮੋਸ਼।"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"ਘੱਟ ਤਰਜੀਹ ਵਾਲੀਆਂ ਸੂਚਨਾਵਾਂ ਦਿਖਾਓ। ਹਮੇਸ਼ਾਂ ਖਾਮੋਸ਼।"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"ਡੀਵਾਈਸ ਅਣਲਾਕ ਕਰਨ \'ਤੇ, ਸਕ੍ਰੀਨ ਦੇ ਸਿਖਰ \'ਤੇ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬੈਨਰ ਵਜੋਂ ਦਿਖਾਓ"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"ਸਾਰੀਆਂ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" ਸੂਚਨਾਵਾਂ"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"ਸਾਰੀਆਂ <xliff:g id="APP_NAME">%1$s</xliff:g> ਸੂਚਨਾਵਾਂ"</string>
diff --git a/res/values-pl/arrays.xml b/res/values-pl/arrays.xml
index c2c4ed0..a4af06d 100644
--- a/res/values-pl/arrays.xml
+++ b/res/values-pl/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Wewnętrzna pamięć urządzenia"</item>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 0f7a834..ae8a99a 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -3677,6 +3677,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Brak dźwięku i wibracji"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Brak dźwięku i wibracji, wyświetla się niżej w sekcji rozmów"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Może włączyć dzwonek lub wibracje w zależności od ustawień telefonu"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Wyświetla się pod powiadomieniami priorytetowymi. Zawsze wyciszone."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Wyświetla się pod powiadomieniami priorytetowymi. Zawsze wyciszone."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Wyświetla się pod powiadomieniami priorytetowymi. Zawsze wyciszone."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Gdy urządzenie jest odblokowane, pokazuj powiadomienia jako pasek u góry ekranu"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Wszystkie powiadomienia z aplikacji „<xliff:g id="APP_NAME">%1$s</xliff:g>”"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Wszystkie powiadomienia z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -5128,4 +5131,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Pokaż odtwarzacz"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Brak dostępnych graczy"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"multimedia"</string>
+ <string name="qtifeedback_settings_title">Informacje zwrotne o urządzeniu</string>
+ <string name="qtifeedback_settings_subtitle">Raportowanie Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-pt-rBR/arrays.xml b/res/values-pt-rBR/arrays.xml
index 389a7d8..a4a8725 100644
--- a/res/values-pt-rBR/arrays.xml
+++ b/res/values-pt-rBR/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Armazenamento do dispositivo interno"</item>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index 1d42b98..e5ed179 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Som e vibração desativados"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"O som e a vibração estão desativados, e o balão aparece na parte inferior da seção de conversa"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Pode vibrar ou tocar com base nas configurações do smartphone"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Exibida abaixo das notificações prioritárias. Sempre silenciosa."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Exibida abaixo das notificações prioritárias. Sempre silenciosa."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Exibida abaixo das notificações prioritárias. Sempre silenciosa."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Quando o dispositivo estiver desbloqueado, mostrar notificações em um banner no topo da tela"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Todas as notificações de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Todas as notificações do app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-pt-rPT/arrays.xml b/res/values-pt-rPT/arrays.xml
index 319ef23..975d671 100644
--- a/res/values-pt-rPT/arrays.xml
+++ b/res/values-pt-rPT/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Armazenamento de dispositivo interno"</item>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index b343582..412d0ef 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Sem som ou vibração e aparece na parte inferior na secção de conversas."</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Pode tocar ou vibrar com base nas definições do telemóvel."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Com o dispositivo desbloqueado, as notificações são apresentadas como uma faixa no topo do ecrã"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"É apresentada abaixo das notificações prioritárias. Sempre silenciosa."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"É apresentada abaixo das notificações prioritárias. Sempre silenciosa."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"É apresentada abaixo das notificações prioritárias. Sempre silenciosa."</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Todas as notificações da app \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Todas as notificações da app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"Notificações adaptáveis"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Mostrar leitor"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Nenhum leitor disponível."</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"multimédia"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Gesto para ignorar"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Gesto para silenciar alertas"</string>
+ <string name="qtifeedback_settings_title">Feedback sobre hardware</string>
+ <string name="qtifeedback_settings_subtitle">Relatório da Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-pt/arrays.xml b/res/values-pt/arrays.xml
index 389a7d8..a4a8725 100644
--- a/res/values-pt/arrays.xml
+++ b/res/values-pt/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Armazenamento do dispositivo interno"</item>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 1d42b98..3ce82db 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Som e vibração desativados"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"O som e a vibração estão desativados, e o balão aparece na parte inferior da seção de conversa"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Pode vibrar ou tocar com base nas configurações do smartphone"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Exibida abaixo das notificações prioritárias. Sempre silenciosa."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Exibida abaixo das notificações prioritárias. Sempre silenciosa."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Exibida abaixo das notificações prioritárias. Sempre silenciosa."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Quando o dispositivo estiver desbloqueado, mostrar notificações em um banner no topo da tela"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Todas as notificações de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Todas as notificações do app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Mostrar player"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Nenhum player disponível"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"mídia"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Gesto de pular"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Silenciar gesto de alertas"</string>
+ <string name="qtifeedback_settings_title">Feedback sobre hardware</string>
+ <string name="qtifeedback_settings_subtitle">Relatório da Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-ro/arrays.xml b/res/values-ro/arrays.xml
index e069752..3bb4aa3 100644
--- a/res/values-ro/arrays.xml
+++ b/res/values-ro/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Stocare internă pe dispozitiv"</item>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index bd9d4cd..8fce040 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -3630,6 +3630,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Fără sunet sau vibrații și apare în partea de jos a secțiunii de conversație"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Poate să sune sau să vibreze, în funcție de setările telefonului"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Când dispozitivul este deblocat, afișează notificările ca un banner în partea de sus a ecranului"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Se afișează sub notificările prioritare. Întotdeauna silențios."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Se afișează sub notificările prioritare. Întotdeauna silențios."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Se afișează sub notificările prioritare. Întotdeauna silențios."</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Toate notificările din „<xliff:g id="APP_NAME">%1$s</xliff:g>”"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Toate notificările din <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"Notificări adaptive"</string>
@@ -5037,4 +5040,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Afișează playerul"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Niciun player disponibil"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"media"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Gestul pentru omitere"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Gestul pentru dezactivarea sunetului alertelor"</string>
+ <string name="qtifeedback_settings_title">Feedback hardware</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Raportare</string>
</resources>
diff --git a/res/values-ru/arrays.xml b/res/values-ru/arrays.xml
index c78d052..e243de2 100644
--- a/res/values-ru/arrays.xml
+++ b/res/values-ru/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Внутренний накопитель устройства"</item>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index f66452e..1d22a38 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -3677,6 +3677,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Без звука или вибрации"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Без звука или вибрации, появляется в нижней части списка разговоров"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Звонок или вибрация в зависимости от настроек телефона"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Показ уведомлений с низким приоритетом. Всегда без звука."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Показ уведомлений с низким приоритетом. Всегда без звука."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Показ уведомлений с низким приоритетом. Всегда без звука."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"При разблокированном устройстве показывать уведомления в виде баннера в верхней части экрана"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Все уведомления приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Показывать все уведомления приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
@@ -5128,4 +5131,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Проигрыватель показан"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Нет доступных проигрывателей"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"Медиа"</string>
+ <string name="qtifeedback_settings_title">Отзывы по оборудованию</string>
+ <string name="qtifeedback_settings_subtitle"> Отчеты Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-si/arrays.xml b/res/values-si/arrays.xml
index e67cd3c..ccbf64e 100644
--- a/res/values-si/arrays.xml
+++ b/res/values-si/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"අභ්යන්තර උපාංග ආචයනය"</item>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index fdd1728..8bf5b4c 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"හඬක් හෝ කම්පනයක් නැත"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"හඬක් හෝ කම්පනයක් නැති අතර සංවාද කොටසේ පහළම දිස් වේ"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"දුරකථන සැකසීම් මත පදනම්ව නාද කිරීමට හෝ කම්පනය කිරීමට හැකිය"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"ප්රමුඛතා දැනුම්දීම්වලට පහළින් සංදර්ශන වෙයි. සැම විටම නිහඬයි."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"ප්රමුඛතා දැනුම්දීම්වලට පහළින් සංදර්ශන වෙයි. සැම විටම නිහඬයි."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"ප්රමුඛතා දැනුම්දීම්වලට පහළින් සංදර්ශන වෙයි. සැම විටම නිහඬයි."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"උපාංගය අඟුලු අරිනු ලැබූ විට, තිරයේ මුදුනින් දැනුම්දීම් බැනරයක් ලෙස පෙන්වන්න"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"සියලු \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" දැනුම් දීම්"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"සියලු <xliff:g id="APP_NAME">%1$s</xliff:g> දැනුම් දීම්"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"වාදකය පෙන්වන්න"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"ලබා ගත හැකි වාදක නැත"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"මාධ්ය"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"අභිනය මඟ හරින්න"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"ඇඟවීම් අභිනය නිහඬ කරන්න"</string>
+ <string name="qtifeedback_settings_title">දෘඩාංග ප්රතිපෝෂණය</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc වාර්තාකරණය</string>
</resources>
diff --git a/res/values-sk/arrays.xml b/res/values-sk/arrays.xml
index 3c68c33..2ed6f0d 100644
--- a/res/values-sk/arrays.xml
+++ b/res/values-sk/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Interné úložisko zariadenia"</item>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index c3ae48b..de1cce1 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -3677,6 +3677,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Žiadny zvuk ani vibrácie"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Žiadny zvuk ani vibrácie a zobrazuje sa nižšie v sekcii konverzácií"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Zvoní či vibruje podľa nastavení telefónu"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Zobrazuje sa pod prioritnými upozorneniami. Vždy potichu."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Zobrazuje sa pod prioritnými upozorneniami. Vždy potichu."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Zobrazuje sa pod prioritnými upozorneniami. Vždy potichu."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Keď je zariadenie odomknuté, zobrazovať upozornenia ako banner v hornej časti obrazovky"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Všetky upozornenia aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Všetky upozornenia aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -5128,4 +5131,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Zobraziť prehrávač"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"K dispozícii nie sú žiadne prehrávače"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"médiá"</string>
+ <string name="qtifeedback_settings_title">Spätná väzba k hardvéru</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Nahlasovanie</string>
</resources>
diff --git a/res/values-sl/arrays.xml b/res/values-sl/arrays.xml
index 635df4d..b19e315 100644
--- a/res/values-sl/arrays.xml
+++ b/res/values-sl/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Notranji pomnilnik naprave"</item>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 3d351be..99b1e57 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -3677,6 +3677,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Brez zvočnega opozarjanja ali vibriranja"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Brez zvočnega opozarjanja ali vibriranja, prikaz nižje v razdelku s pogovorom"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Zvonjenje ali vibriranje je omogočeno na podlagi nastavitev telefona"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Prikaz pod prednostnimi obvestili. Vedno tiho."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Prikaz pod prednostnimi obvestili. Vedno tiho."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Prikaz pod prednostnimi obvestili. Vedno tiho."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Ko je naprava odklenjena, so obvestila prikazana kot pasica na vrhu zaslona"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Vsa obvestila aplikacije »<xliff:g id="APP_NAME">%1$s</xliff:g>«"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Vsa obvestila aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -5128,4 +5131,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Prikaži predvajalnik"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Na voljo ni noben predvajalnik"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"predstavnost"</string>
+ <string name="qtifeedback_settings_title">Povratne informacije o strojni opremi</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Poročilo</string>
</resources>
diff --git a/res/values-sq/arrays.xml b/res/values-sq/arrays.xml
index 305b072..044847e 100644
--- a/res/values-sq/arrays.xml
+++ b/res/values-sq/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Hapësira e brendshme ruajtëse e pajisjes"</item>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index d3770f9..dca73fa 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Asnjë tingull ose dridhje"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Asnjë tingull ose dridhje dhe shfaqet më poshtë në seksionin e bisedave"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Mund të bjerë zilja ose të dridhet në bazë të cilësimeve të telefonit"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Shfaqet nën njoftimet me përparësi. Gjithmonë në heshtje."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Shfaqet nën njoftimet me përparësi. Gjithmonë në heshtje."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Shfaqet nën njoftimet me përparësi. Gjithmonë në heshtje."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Kur pajisja është e shkyçur, shfaq njoftimet si një banderolë përgjatë kreut të ekranit"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Të gjitha njoftimet e \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Të gjitha njoftimet e <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-sr/arrays.xml b/res/values-sr/arrays.xml
index 97ed707..248ef5e 100644
--- a/res/values-sr/arrays.xml
+++ b/res/values-sr/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Складиште унутрашњег уређаја"</item>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 7a4869a..a2c7ccb 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -3629,6 +3629,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Без звука и вибрирања"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Без звука и вибрирања и приказује се у наставку одељка за конверзације"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Може да звони или вибрира у зависности од подешавања телефона"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Приказује се испод приоритетних обавештења. Увек нечујно."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Приказује се испод приоритетних обавештења. Увек нечујно."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Приказује се испод приоритетних обавештења. Увек нечујно."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Када је уређај откључан, приказује обавештења као банер у врху екрана"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Сва обавештења апликације <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Сва обавештења апликације <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -5037,4 +5040,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Прикажи плејер"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Није доступан ниједан плејер"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"медији"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Прескочи покрет"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Покрет за утишавање обавештења"</string>
+ <string name="qtifeedback_settings_title">Повратне информације о хардверу</string>
+ <string name="qtifeedback_settings_subtitle">Слање извештаја компанији Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-sv/arrays.xml b/res/values-sv/arrays.xml
index ef7ebca..868b3d5 100644
--- a/res/values-sv/arrays.xml
+++ b/res/values-sv/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Lagring på intern enhet"</item>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 01a0511..1486eeb 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Inga ljud eller vibrationer"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Inga ljud eller vibrationer och visas längre ned bland konversationerna"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Kan ringa eller vibrera beroende på inställningarna på telefonen"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Aviseringar med låg prioritet visas. Alltid tyst."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Aviseringar med låg prioritet visas. Alltid tyst."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Aviseringar med låg prioritet visas. Alltid tyst."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"När enheten är olåst visas aviseringar i en banner högst upp på skärmen"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Alla aviseringar från <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Alla aviseringar från <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Visa spelare"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Det finns inga tillgängliga spelare"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"media"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Hoppa över rörelse"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Rörelse för att stänga av ljudet för aviseringar"</string>
+ <string name="qtifeedback_settings_title">Maskinvara - Feedback</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Rapportering</string>
</resources>
diff --git a/res/values-sw/arrays.xml b/res/values-sw/arrays.xml
index 53006c7..852828b 100644
--- a/res/values-sw/arrays.xml
+++ b/res/values-sw/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Kifaa cha hifadhi ya ndani"</item>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 4760d2c..18e81a0 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Hakuna sauti wala mtetemo na huonekana upande wa chini katika sehemu ya mazungumzo"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Huenda ikalia au kutetema kulingana na mipangilio ya simu"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Wakati kifaa kimefunguliwa, onyesha arifa kama bango katika sehemu ya juu ya skrini"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Huonyeshwa chini ya arifa za kipaumbele. Kimya kila wakati."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Huonyeshwa chini ya arifa za kipaumbele. Kimya kila wakati."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Huonyeshwa chini ya arifa za kipaumbele. Kimya kila wakati."</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Arifa zote za \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Arifa zote za <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"Arifa Zinazojirekebisha"</string>
@@ -4947,4 +4950,8 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Onyesha kichezaji"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Hakuna vichezaji vinavyopatikana"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"maudhui"</string>
+ <string name="gesture_skip_title" msgid="2092825906479683162">"Ishara ya kuruka"</string>
+ <string name="gesture_silence_title" msgid="8991427657123202574">"Ishara ya kuzima sauti ya arifa"</string>
+ <string name="qtifeedback_settings_title">Maoni ya Maunzi</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Kuripoti</string>
</resources>
diff --git a/res/values-ta/arrays.xml b/res/values-ta/arrays.xml
index 737d835..55802e1 100644
--- a/res/values-ta/arrays.xml
+++ b/res/values-ta/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"சாதன அகச் சேமிப்பு"</item>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 276ed80..13fe23e 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"ஒலி / அதிர்வு இல்லை"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"ஒலி / அதிர்வு இல்லாமல் உரையாடல் பிரிவின் கீழ்ப் பகுதியில் தோன்றும்"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"மொபைல் அமைப்புகளின் அடிப்படையில் ஒலிக்கவோ அதிரவோ செய்யும்"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"முக்கியத்துவம் குறைந்த அறிவிப்புகளைக் காட்டும். எப்போதும் நிசப்தம்."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"முக்கியத்துவம் குறைந்த அறிவிப்புகளைக் காட்டும். எப்போதும் நிசப்தம்."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"முக்கியத்துவம் குறைந்த அறிவிப்புகளைக் காட்டும். எப்போதும் நிசப்தம்."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"மொபைல் அன்லாக் செய்யப்பட்ட நிலையிலிருக்கும்போது அறிவிப்புகளைத் திரையின் மேல் பகுதியில் பேனராகக் காட்டும்"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"அனைத்து \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" அறிவிப்புகளும்"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"அனைத்து <xliff:g id="APP_NAME">%1$s</xliff:g> அறிவிப்புகளும்"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"பிளேயரைக் காட்டு"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"பிளேயர்கள் எதுவுமில்லை"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"மீடியா"</string>
+ <string name="qtifeedback_settings_title">வன்பொருள் பின்னூட்டம்</string>
+ <string name="qtifeedback_settings_subtitle"> Qualcomm Technologies, Inc அறிக்கையிடுதல்</string>
</resources>
diff --git a/res/values-te/arrays.xml b/res/values-te/arrays.xml
index 68d5427..944a735 100644
--- a/res/values-te/arrays.xml
+++ b/res/values-te/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"అంతర్గత పరికర నిల్వ"</item>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 60de246..ad37dd6 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"శబ్దం లేదా వైబ్రేషన్ లేదు, సంభాషణ విభాగం దిగువన కనిపిస్తుంది"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"ఫోన్ సెట్టింగ్ల ఆధారంగా రింగ్ లేదా వైబ్రేట్ కావచ్చు"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"ఫోన్ను అన్లాక్ చేసినప్పుడు స్క్రీన్ పైభాగంలో ఒక బ్యానర్గా నోటిఫికేషన్లను చూపించు"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"తక్కువ ప్రాధాన్యత గల నోటిఫికేషన్లను ప్రదర్శిస్తుంది. ఎల్లప్పుడూ నిశ్శబ్దంగా ఉంచుతుంది."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"తక్కువ ప్రాధాన్యత గల నోటిఫికేషన్లను ప్రదర్శిస్తుంది. ఎల్లప్పుడూ నిశ్శబ్దంగా ఉంచుతుంది."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"తక్కువ ప్రాధాన్యత గల నోటిఫికేషన్లను ప్రదర్శిస్తుంది. ఎల్లప్పుడూ నిశ్శబ్దంగా ఉంచుతుంది."</string>
<string name="notification_switch_label" msgid="8029371325967501557">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" నోటిఫికేషన్లన్నీ"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"అన్ని <xliff:g id="APP_NAME">%1$s</xliff:g> నోటిఫికేషన్లు"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"అనుకూల నోటిఫికేషన్లు"</string>
@@ -4948,4 +4951,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"ప్లేయర్ను చూపించు"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"ప్లేయర్లు ఏవీ అందుబాటులో లేవు"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"మీడియా"</string>
+ <string name="qtifeedback_settings_title">హార్డ్వేర్ అభిప్రాయం</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc నివేదించడం</string>
</resources>
diff --git a/res/values-th/arrays.xml b/res/values-th/arrays.xml
index e7549a6..ed1c0bd 100644
--- a/res/values-th/arrays.xml
+++ b/res/values-th/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"ที่จัดเก็บข้อมูลอุปกรณ์ภายใน"</item>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index e08d626..0ae91b6 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"ไม่มีเสียงหรือการสั่น"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"ไม่มีเสียงหรือการสั่น และปรากฏต่ำลงมาในส่วนการสนทนา"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"อาจส่งเสียงหรือสั่นโดยขึ้นอยู่กับการตั้งค่าโทรศัพท์"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"แสดงใต้การแจ้งเตือนเรื่องสำคัญ ปิดเสียงตลอดเวลา"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"แสดงใต้การแจ้งเตือนเรื่องสำคัญ ปิดเสียงตลอดเวลา"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"แสดงใต้การแจ้งเตือนเรื่องสำคัญ ปิดเสียงตลอดเวลา"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"เมื่ออุปกรณ์ปลดล็อกอยู่ ให้แสดงการแจ้งเตือนเป็นแบนเนอร์ที่ด้านบนของหน้าจอ"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"การแจ้งเตือนทั้งหมดของ \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"การแจ้งเตือนทั้งหมดของ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"แสดงโปรแกรมเล่น"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"ไม่มีโปรแกรมเล่น"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"สื่อ"</string>
+ <string name="qtifeedback_settings_title">ความคิดเห็นเกี่ยวกับฮาร์ดแวร์</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc การรายงาน</string>
</resources>
diff --git a/res/values-tl/arrays.xml b/res/values-tl/arrays.xml
index a8cef12..afacc3f 100644
--- a/res/values-tl/arrays.xml
+++ b/res/values-tl/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Storage ng panloob na device"</item>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 5e930dd..0d00993 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Walang tunog o pag-vibrate"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Walang tunog o pag-vibrate at lumalabas nang mas mababa sa seksyon ng pag-uusap"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Puwedeng mag-ring o mag-vibrate batay sa mga setting ng telepono"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Ipinapakita sa ibaba ng mga priyoridad na notification. Palaging naka-silent."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Ipinapakita sa ibaba ng mga priyoridad na notification. Palaging naka-silent."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Ipinapakita sa ibaba ng mga priyoridad na notification. Palaging naka-silent."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Kapag naka-unlock ang device, ipakita ang mga notification bilang banner sa itaas ng screen"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Lahat ng notification ng \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Lahat ng notification ng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-tr/arrays.xml b/res/values-tr/arrays.xml
index e193a59..a8ef4b5 100644
--- a/res/values-tr/arrays.xml
+++ b/res/values-tr/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Dahili cihaz depolaması"</item>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index bcaa349..27a2fe4 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Sessiz veya titreşim yok"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Sessizdir veya titreşim yoktur ve görüşme bölümünün altında görünür"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Telefon ayarlarına bağlı olarak zili çalabilir veya titreyebilir"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Öncelikli bildirimlerin altında gösterilir. Her zaman sessiz."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Öncelikli bildirimlerin altında gösterilir. Her zaman sessiz."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Öncelikli bildirimlerin altında gösterilir. Her zaman sessiz."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Cihaz kilitli değilken, bildirimleri ekranın üst kısmında banner olarak göster"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Tüm \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" bildirimleri"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Tüm <xliff:g id="APP_NAME">%1$s</xliff:g> bildirimleri"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Oynatıcıyı göster"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Kullanılabilir oynatıcı yok"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"medya"</string>
+ <string name="qtifeedback_settings_title">Donanım Geri Bildirimi</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Raporlama</string>
</resources>
diff --git a/res/values-uk/arrays.xml b/res/values-uk/arrays.xml
index ae6d1cf..e42021d 100644
--- a/res/values-uk/arrays.xml
+++ b/res/values-uk/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Внутрішня пам\'ять пристрою"</item>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index ce6b6ed..b26e92a 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -3677,6 +3677,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Без звуку чи вібрації"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Без звуку чи вібрації, з\'являється нижче в розділі розмов"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Може дзвонити або вібрувати залежно від налаштувань телефона"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Показуються під пріоритетними сповіщеннями. Завжди без звуку."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Показуються під пріоритетними сповіщеннями. Завжди без звуку."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Показуються під пріоритетними сповіщеннями. Завжди без звуку."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Коли пристрій розблоковано, показувати сповіщення як банер угорі екрана"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Усі сповіщення додатка <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Усі сповіщення від додатка <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -5128,4 +5131,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Показати програвач"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Немає доступних програвачів"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"медіа"</string>
+ <string name="qtifeedback_settings_title">Відгук про обладнання</string>
+ <string name="qtifeedback_settings_subtitle">Надсилання звітів Qualcomm Technologies, Inc</string>
</resources>
diff --git a/res/values-ur/arrays.xml b/res/values-ur/arrays.xml
index cee2d51..7b8af20 100644
--- a/res/values-ur/arrays.xml
+++ b/res/values-ur/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"آلہ کا داخلی اسٹوریج"</item>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index b42e53e..3c2b80d 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -3579,6 +3579,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"کوئی آواز یا وائبریشن نہیں"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"کوئی آواز یا وائبریشن نہیں اور گفتگو کے سیکشن میں نیچے ظاہر ہوتا ہے"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"آپ کے آلہ کی ترتیبات کے مطابق وائبریٹ یا گھنٹی بج سکتی ہے"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"کم ترجیحی اطلاعات ڈسپلے کرتا ہے۔ ہمیشہ خاموش۔"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"کم ترجیحی اطلاعات ڈسپلے کرتا ہے۔ ہمیشہ خاموش۔"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"کم ترجیحی اطلاعات ڈسپلے کرتا ہے۔ ہمیشہ خاموش۔"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"آلہ کے غیر مقفل ہو جانے پر، اطلاعات کو اسکرین کے اوپر بینر کے طور پر دکھائيں"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"سبھی \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" کی اطلاعات"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"سبھی <xliff:g id="APP_NAME">%1$s</xliff:g> اطلاعات"</string>
diff --git a/res/values-uz/arrays.xml b/res/values-uz/arrays.xml
index 7b0af94..b0e5dd5 100644
--- a/res/values-uz/arrays.xml
+++ b/res/values-uz/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Ichki xotira qurilmasi"</item>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index fffa890..4f6933f 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Tovush yoki tebranishsiz"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Tovush yoki tebranishsiz hamda suhbatlar ruknining pastida chiqadi"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Telefon sozlamalari asosida jiringlashi yoki tebranishi mumkin"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Muhimlik darajasi past bildirishnomalarning chiqishi. Doim tovushsiz."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Muhimlik darajasi past bildirishnomalarning chiqishi. Doim tovushsiz."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Muhimlik darajasi past bildirishnomalarning chiqishi. Doim tovushsiz."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Telefon qulfi yechilsa, bildirishnomalar ekranning yuqori qismida banner sifatida chiqsin"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Barcha “<xliff:g id="APP_NAME">%1$s</xliff:g>” bildirishnomalari"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Barcha <xliff:g id="APP_NAME">%1$s</xliff:g> bildirishnomalari"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Pleyerni chiqarish"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Hech qanday pleyer mavjud emas"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"media"</string>
+ <string name="qtifeedback_settings_title">Apparat vositalari javobi</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Hisobot berish</string>
</resources>
diff --git a/res/values-vi/arrays.xml b/res/values-vi/arrays.xml
index ced3b5a..7f9c85d 100644
--- a/res/values-vi/arrays.xml
+++ b/res/values-vi/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Bộ nhớ trong của thiết bị"</item>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 1b808ee..c7f7a59 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Không phát âm thanh hoặc rung"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Không phát âm thanh hoặc rung và xuất hiện phía dưới trong phần cuộc trò chuyện"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Có thể đổ chuông hoặc rung tùy theo chế độ cài đặt trên điện thoại"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Hiển thị bên dưới thông báo mức độ ưu tiên. Luôn im lặng."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Hiển thị bên dưới thông báo mức độ ưu tiên. Luôn im lặng."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Hiển thị bên dưới thông báo mức độ ưu tiên. Luôn im lặng."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Hiển thị thông báo ở đầu màn hình khi thiết bị đang mở khóa"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Tất cả các thông báo của ứng dụng \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Tất cả thông báo của <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"Hiện trình phát"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"Không có trình phát nào"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"nội dung nghe nhìn"</string>
+ <string name="qtifeedback_settings_title"> Phản hồi về phần cứng</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Báo cáo</string>
</resources>
diff --git a/res/values-zh-rCN/arrays.xml b/res/values-zh-rCN/arrays.xml
index bb96438..43b6b4f 100644
--- a/res/values-zh-rCN/arrays.xml
+++ b/res/values-zh-rCN/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"内部存储设备"</item>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 4c0643f..040155b 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -3104,6 +3104,8 @@
<string name="contact_discovery_opt_in_dialog_message_no_carrier_defined" msgid="1914894516552445911">"系统会定期将您的联系人电话号码发送给您的运营商。<xliff:g id="EMPTY_LINE">
</xliff:g>此信息可用于识别您的联系人能否使用特定功能,例如视频通话或某些消息传递功能。"</string>
+ <!-- Enabled 5G Mode title. [CHAR LIMIT=50] -->
+ <string name="enabled_5g_mode_title">启用5G</string>
<string name="preferred_network_type_title" msgid="812509938714590857">"首选网络类型"</string>
<string name="preferred_network_type_summary" msgid="8786291927331323061">"LTE(推荐)"</string>
<string name="mms_message_title" msgid="6624505196063391964">"彩信"</string>
@@ -3312,6 +3314,7 @@
<string name="other_sound_settings" msgid="5468360269346162072">"其他提示音"</string>
<string name="dial_pad_tones_title" msgid="3536945335367914892">"拨号键盘提示音"</string>
<string name="screen_locking_sounds_title" msgid="5695030983872787321">"屏幕锁定提示音"</string>
+ <string name="call_connected_tones_title" msgid="1999293510400911558">"通话接通提示音"</string>
<string name="charging_sounds_title" msgid="5261683808537783668">"充电提示音和振动"</string>
<string name="docking_sounds_title" msgid="5341616179210436159">"基座提示音"</string>
<string name="touch_sounds_title" msgid="2200734041857425078">"触摸提示音"</string>
@@ -3581,6 +3584,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"不发出提示音,也不振动"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"不发出提示音,也不振动;显示在对话部分的靠下位置"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"可能会响铃或振动(取决于手机设置)"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"显示在优先通知下方。一律不发出提示音。"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"显示在优先通知下方。一律不发出提示音。"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"显示在优先通知下方。一律不发出提示音。"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"当设备处于解锁状态时,在屏幕顶端以横幅形式显示通知"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"所有“<xliff:g id="APP_NAME">%1$s</xliff:g>”通知"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"<xliff:g id="APP_NAME">%1$s</xliff:g>的所有通知"</string>
@@ -4652,6 +4658,18 @@
<string name="platform_compat_default_disabled_title" msgid="3975847180953793602">"默认停用的应用兼容性变更"</string>
<string name="platform_compat_dialog_title_no_apps" msgid="4387656000745989506">"没有可用的应用"</string>
<string name="platform_compat_dialog_text_no_apps" msgid="5715226015751055812">"只能修改可调试应用的应用兼容性变更。请安装可调试的应用,然后重试。"</string>
+ <!-- apn names for carriers -->
+ <string name="APN_NAME_CMNET">中国移动NET</string>
+ <string name="APN_NAME_CMWAP">中国移动WAP</string>
+ <string name="APN_NAME_CMMMS">中国移动彩信设置</string>
+ <string name="APN_NAME_CUWAP">沃宽带用户手机上网</string>
+ <string name="APN_NAME_CUNET">沃宽带用户连接互联网</string>
+ <string name="APN_NAME_CUMMS">联通彩信</string>
+ <string name="APN_NAME_CUSUPL">联通AGPS</string>
+ <string name="APN_NAME_CTNET">中国电信互联网设置 CTNET</string>
+ <string name="APN_NAME_CTWAP">中国电信WAP设置 CTWAP</string>
+ <string name="APN_NAME_CTLTE">中国电信互联网设置 ctlte</string>
+ <string name="APN_NAME_CTMMS">中国电信彩信设置 CTWAP</string>
<string name="unsupported_setting_summary" product="default" msgid="1085229417771470172">"此手机不支持这项设置"</string>
<string name="unsupported_setting_summary" product="tablet" msgid="7402414129786489664">"此平板电脑不支持这项设置"</string>
<string name="unsupported_setting_summary" product="device" msgid="3422953459122926833">"此设备不支持这项设置"</string>
@@ -4758,6 +4776,7 @@
<string name="mobile_data_settings_title" msgid="3927524078598009792">"移动数据"</string>
<string name="mobile_data_settings_summary" msgid="7323978798199919063">"通过移动网络访问数据"</string>
<string name="mobile_data_settings_summary_auto_switch" msgid="7851549787645698945">"手机会在进入有效范围时自动切换到此运营商"</string>
+ <string name="data_preference">"数据偏好设置"</string>
<string name="calls_preference" msgid="2166481296066890129">"通话偏好设置"</string>
<string name="sms_preference" msgid="7742964962568219351">"短信偏好设置"</string>
<string name="calls_and_sms_ask_every_time" msgid="3178743088737726677">"每次都询问"</string>
@@ -4946,4 +4965,22 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"显示播放器"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"没有可用的播放器"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"媒体"</string>
+ <string name="qtifeedback_settings_title">硬件反馈</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc 报告</string>
+ <string name="ram_total_size">运行内存</string>
+ <string name="rom_total_size">机身存储</string>
+ <string name="software_version">软件版本</string>
+ <string name="model_hardware_summary">"型号:%1$s; 硬件:%2$s"</string>
+ <!-- UPLMN Preference -->
+ <string name="uplmn_list_setting_title">用户控制PLMN</string>
+ <string name="network_id">网络 ID</string>
+ <string name="dialog_network_priority_title">优先级</string>
+ <string name="uplmn_list_setting_add_plmn">新增 PLMN</string>
+ <string name="gsm_umts_network_preferences_title">网络模式</string>
+ <string name="gsm_umts_network_preferences_dialogtitle">网络模式</string>
+ <string name="voicemail_number_not_set">"<未设置>"</string>
+ <string name="reading_settings">"正在读取设置..."</string>
+ <string name="updating_settings">"正在更新设置..."</string>
+ <string name="uplmn_list_setting_summary">"定义PLMN的偏好顺序"</string>
+ <string name="plmn_failure_radio_off">选网失败,原因天线未打开或不可达</string>
</resources>
diff --git a/res/values-zh-rHK/arrays.xml b/res/values-zh-rHK/arrays.xml
index c4ed3db..3007d61 100644
--- a/res/values-zh-rHK/arrays.xml
+++ b/res/values-zh-rHK/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"內部裝置儲存空間"</item>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index ae6abe3..173423a 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -3583,6 +3583,9 @@
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"無音效或震動,並在對話部分的較低位置顯示"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"可能會根據手機設定發出鈴聲或震動"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"裝置處於解鎖狀態時,系統會在螢幕頂部以橫額形式顯示通知"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"顯示不重要的通知。一律靜音。"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"顯示不重要的通知。一律靜音。"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"顯示不重要的通知。一律靜音。"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"所有「<xliff:g id="APP_NAME">%1$s</xliff:g>」通知"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"所有「<xliff:g id="APP_NAME">%1$s</xliff:g>」通知"</string>
<string name="default_notification_assistant" msgid="243718059890346442">"自動調節通知"</string>
@@ -4947,4 +4950,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"顯示播放器"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"沒有可用的播放器"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"媒體"</string>
+ <string name="qtifeedback_settings_title">硬件反饋</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc 報告</string>
</resources>
diff --git a/res/values-zh-rTW/arrays.xml b/res/values-zh-rTW/arrays.xml
index eac14e3..7cb7811 100644
--- a/res/values-zh-rTW/arrays.xml
+++ b/res/values-zh-rTW/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"內部裝置儲存空間"</item>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index b73d322..91652cd 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -3581,6 +3581,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"不震動或發出聲音"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"不震動或發出聲音,並顯示在對話部分的下方"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"根據手機的設定響鈴或震動"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"顯示在優先通知下方,且一律不發出音效。"</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"顯示在優先通知下方,且一律不發出音效。"</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"顯示在優先通知下方,且一律不發出音效。"</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"裝置處於解鎖狀態時,在螢幕頂端以橫幅形式顯示通知"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"所有「<xliff:g id="APP_NAME">%1$s</xliff:g>」通知"</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」的所有通知"</string>
@@ -4946,4 +4949,6 @@
<string name="media_controls_show_player" msgid="8504571042365814021">"顯示播放器"</string>
<string name="media_controls_no_players" msgid="3493023121892175946">"沒有可用的播放器"</string>
<string name="keywords_media_controls" msgid="8345490568291778638">"媒體"</string>
+ <string name="qtifeedback_settings_title">硬體使用情況回報</string>
+ <string name="qtifeedback_settings_subtitle"> Qualcomm Technologies, Inc 報告</string>
</resources>
diff --git a/res/values-zu/arrays.xml b/res/values-zu/arrays.xml
index 81a602b..0b0716b 100644
--- a/res/values-zu/arrays.xml
+++ b/res/values-zu/arrays.xml
@@ -213,6 +213,7 @@
<item msgid="8568003268185342352">"SPN"</item>
<item msgid="1804537219968457989">"IMSI"</item>
<item msgid="3441876902463317017">"GID"</item>
+ <item>ICCID</item>
</string-array>
<string-array name="app_install_location_entries">
<item msgid="3771157789865587832">"Isitoreji sedivaysi yangaphakathi"</item>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 89f7ce2..78f25d8 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -3582,6 +3582,9 @@
<string name="notification_channel_summary_low" msgid="5549662596677692000">"Awukho umsindo noma ukudlidliza"</string>
<string name="notification_conversation_summary_low" msgid="6352818857388412326">"Awukho umsindo noma ukudlidliza futhi ivela ngezansi esigabeni sengxoxo"</string>
<string name="notification_channel_summary_default" msgid="3674057458265438896">"Ingase ikhale noma idlidlize kuya ngamasethingi wefoni yakho"</string>
+ <string name="notification_channel_summary_low_status" msgid="7866565328564018007">"Ibonisa izaziso ezibalulekile ezingezansi. Ihlala ithulile."</string>
+ <string name="notification_channel_summary_low_lock" msgid="4009247523075328235">"Ibonisa izaziso ezibalulekile ezingezansi. Ihlala ithulile."</string>
+ <string name="notification_channel_summary_low_status_lock" msgid="3668028634045057230">"Ibonisa izaziso ezibalulekile ezingezansi. Ihlala ithulile."</string>
<string name="notification_channel_summary_high" msgid="3411637309360617621">"Uma idivayisi ivuliwe, bonisa izaziso njengesibhengezo ngaphezulu kwesikrini"</string>
<string name="notification_switch_label" msgid="8029371325967501557">"Zonke izaziso ze-\"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="notification_app_switch_label" msgid="4422902423925084193">"Zonke izaziso ze-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 1ad3cc3..40cc153 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -293,6 +293,33 @@
<item>@string/wifi_ap_choose_2G</item>
</string-array>
+ <!-- Wi-Fi AP Vendor band settings. Either 2.4GHz, 5GHz or Both. -->
+ <!-- Note that adding/removing/moving the items will need wifi settings code change. -->
+ <string-array translatable="false" name="wifi_ap_band_vendor_config_full">
+ <item>1</item>
+ <item>3</item>
+ <item>8</item>
+ </string-array>
+
+ <string-array translatable="false" name="wifi_ap_band_vendor_summary_full">
+ <item>@string/wifi_ap_choose_2G</item>
+ <item>@string/wifi_ap_prefer_5G</item>
+ <item>@string/wifi_ap_choose_vendor_dual_band</item>
+ </string-array>
+
+ <!-- Wi-Fi AP Vendor band settings for OWE Transition mode. Either 2.4GHz or 5GHz -->
+ <!-- Note: OWE transition mode SAP doesn't support dual band -->
+ <!-- Note: Adding/removing/moving the items will need wifi settings code change. -->
+ <string-array translatable="false" name="wifi_ap_band_vendor_config_no_dual">
+ <item>1</item>
+ <item>2</item>
+ </string-array>
+
+ <string-array translatable="false" name="wifi_ap_band_vendor_summary_no_dual">
+ <item>@string/wifi_ap_choose_2G</item>
+ <item>@string/wifi_ap_choose_5G</item>
+ </string-array>
+
<!-- Wi-Fi WPS setup for p2p connections. -->
<!-- Note that adding/removing/moving the items will need wifi settings code change. -->
<string-array name="wifi_p2p_wps_setup">
@@ -520,6 +547,7 @@
<item translatable="false">SPN</item>
<item translatable="false">IMSI</item>
<item translatable="false">GID</item>
+ <item translatable="false">ICCID</item>
</string-array>
<string-array translatable="false" name="mvno_type_values">
@@ -531,6 +559,8 @@
<item>imsi</item>
<!-- Do not translate. -->
<item>gid</item>
+ <!-- Do not translate. -->
+ <item>iccid</item>
</string-array>
<!-- Apps on SD installation location options in ApplicationSettings -->
@@ -1428,6 +1458,39 @@
</string-array>
+ <!-- String arrays for PrimaryCard LW feature -->
+ <string-array name="preferred_network_mode_gsm_wcdma_choices">
+ <item>GSM only</item>
+ <item>WCDMA only</item>
+ <item>GSM/WCDMA preferred</item>
+ </string-array>
+ <string-array name="preferred_network_mode_gsm_wcdma_values" translatable="false">
+ <item>"1"</item>
+ <item>"2"</item>
+ <item>"0"</item>
+ </string-array>
+
+ <string-array name="enabled_networks_gsm_wcdma_choices">
+ <item>@string/network_2G_only</item>
+ <item>@string/network_3G_only</item>
+ <item>@string/network_2G_3G_preferred</item>
+ </string-array>
+ <string-array name="enabled_networks_gsm_wcdma_values" translatable="false">
+ <item>"1"</item>
+ <item>"2"</item>
+ <item>"0"</item>
+ </string-array>
+
+ <!-- String arrays for Subsidy Lock feature -->
+ <string-array name="enabled_networks_subsidy_locked_choices">
+ <item>LTE Only</item>
+ <item>GSM/WCDMA/LTE</item>
+ </string-array>
+ <string-array name="enabled_networks_subsidy_locked_values" translatable="false">
+ <item>"11"</item>
+ <item>"9"</item>
+ </string-array>
+
<!-- WiFi calling mode array -->
<string-array name="wifi_calling_mode_summaries" translatable="false">
<item>@string/wifi_calling_mode_wifi_preferred_summary</item>
@@ -1435,12 +1498,27 @@
<item>@string/wifi_calling_mode_wifi_only_summary</item>
</string-array>
+ <!-- WiFi calling mode array with ims preferred -->
+ <string-array name="wifi_calling_mode_summaries_with_ims_preferred" translatable="false">
+ <item>@string/wifi_calling_mode_ims_preferred_summary</item>
+ <item>@string/wifi_calling_mode_wifi_preferred_summary</item>
+ <item>@string/wifi_calling_mode_cellular_preferred_summary</item>
+ <item>@string/wifi_calling_mode_wifi_only_summary</item>
+ </string-array>
+
<!-- WiFi calling mode array without wifi only mode -->
<string-array name="wifi_calling_mode_summaries_without_wifi_only" translatable="false">
<item>@string/wifi_calling_mode_wifi_preferred_summary</item>
<item>@string/wifi_calling_mode_cellular_preferred_summary</item>
</string-array>
+ <!-- WiFi calling mode array without wifi only mode with ims preferred -->
+ <string-array name="wifi_calling_mode_summaries_without_wifi_only_with_ims_preferred" translatable="false">
+ <item>@string/wifi_calling_mode_ims_preferred_summary</item>
+ <item>@string/wifi_calling_mode_wifi_preferred_summary</item>
+ <item>@string/wifi_calling_mode_cellular_preferred_summary</item>
+ </string-array>
+
<!-- Carrier variant of Enhaced 4G LTE Mode title. [CHAR LIMIT=NONE] -->
<string-array name="enhanced_4g_lte_mode_title_variant">
<!-- 0: Default -->
@@ -1501,4 +1579,31 @@
<item>@string/rtt_settings_always_visible</item>
</string-array>
+ <!--String arrays for showing user PLMN list -->
+ <string-array name="uplmn_prefer_network_mode_td_choices">
+ <item>GSM</item>
+ <item>TDSCDMA</item>
+ <item>LTE</item>
+ <item>Triple mode</item>
+ </string-array>
+
+ <string-array name="uplmn_prefer_network_mode_w_choices">
+ <item>GSM</item>
+ <item>WCDMA</item>
+ <item>LTE</item>
+ <item>Triple mode</item>
+ </string-array>
+
+ <string-array name="uplmn_prefer_network_mode_values">
+ <item>"0"</item>
+ <item>"1"</item>
+ <item>"2"</item>
+ <item>"3"</item>
+ </string-array>
+
+ <string-array name="uplmn_cu_mcc_mnc_values">
+ <item>"46001"</item>
+ <item>"46006"</item>
+ <item>"46009"</item>
+ </string-array>
</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index 746d3e7..30ca525 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -423,6 +423,12 @@
<!-- Whether or not extra preview panels should be used for screen zoom setting. -->
<bool name="config_enable_extra_screen_zoom_preview">true</bool>
+ <!-- Whether to add AGPS parameter settings -->
+ <bool name="config_agps_enabled">false</bool>
+
+ <!-- Whether to support CT PA requirement or not -->
+ <bool name="config_support_CT_PA">false</bool>
+
<!-- Slice Uri to query nearby devices. -->
<string name="config_nearby_devices_slice_uri" translatable="false">content://com.google.android.gms.nearby.fastpair/device_status_list_item</string>
@@ -462,4 +468,8 @@
<!-- Whether to show Smooth Display feature in Settings Options -->
<bool name="config_show_smooth_display">false</bool>
+
+ <!-- Playing tone setting -->
+ <bool name="config_show_connect_tone_ui">false</bool>
+ <integer name="config_default_tone_after_connected">0</integer>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4acfde3..ebd34c8 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -343,6 +343,8 @@
<string name="connected_device_other_device_title">Other devices</string>
<!-- Title for connected device group [CHAR LIMIT=none]-->
<string name="connected_device_saved_title">Saved devices</string>
+ <!-- Title for connected TWS device group [CHAR LIMIT=none]-->
+ <string name="connected_tws_device_saved_title">Saved Earbuds</string>
<!-- Summary for preference to add a device [CHAR LIMIT=none]-->
<string name="connected_device_add_device_summary">Bluetooth will turn on to pair</string>
<!-- Title for other connection preferences [CHAR LIMIT=none]-->
@@ -1718,6 +1720,8 @@
<string name="wifi_display_settings_title">Cast</string>
<!-- Wifi Display settings. The keywords of the setting. [CHAR LIMIT=NONE] -->
<string name="keywords_wifi_display_settings">mirror</string>
+ <!-- Checkbox title for enabling particual wifi as shared -->
+ <string name="share_this_wifi">Extend Wi-Fi coverage</string>
<!-- Wifi Display settings. The title of a menu item to enable wireless display [CHAR LIMIT=40] -->
<string name="wifi_display_enable_menu_item">Enable wireless display</string>
<!-- Wifi Display settings. Text that appears when scanning for devices is finished and no nearby device was found [CHAR LIMIT=40]-->
@@ -1764,6 +1768,8 @@
<string name="wifi_band_24ghz">2.4 GHz</string>
<!-- Wifi Internal 5GHz as an universal itendifier for 5GHz band -->
<string name="wifi_band_5ghz">5 GHz</string>
+ <!-- Wifi Internal 60GHz as an universal identifier for 60GHz band -->
+ <string name="wifi_band_60ghz">60 GHz</string>
<!-- Wifi Sign in text for button [CHAR LIMIT = 40]-->
<string name="wifi_sign_in_button_text">Sign in</string>
<!-- Text for button to go to Wifi venue information webpage when Wifi is a captive portal [CHAR LIMIT=40]-->
@@ -2028,6 +2034,8 @@
<string name="wifi_ap_choose_2G">2.4 GHz Band</string>
<!-- Label for the radio button to only choose wifi ap 5GHz band -->
<string name="wifi_ap_choose_5G">5.0 GHz Band</string>
+ <!-- Label for the radio button to choose both wifi ap band (2.4GHz + 5GHz) -->
+ <string name="wifi_ap_choose_vendor_dual_band">Dual Band</string>
<!-- Label for the radio button to prefer 5GHz wifi ap band [CHAR LIMIT=80]-->
<string name="wifi_ap_prefer_5G">5.0 GHz Band preferred</string>
<!-- Label for adding to the list of selected bands when 2.4 GHz is selected -->
@@ -2500,28 +2508,61 @@
<item>@*android:string/wfc_mode_cellular_preferred_summary</item>
<item>@*android:string/wfc_mode_wifi_only_summary</item>
</string-array>
+ <string-array name="wifi_calling_mode_choices_with_ims_preferred" translatable="false">
+ <item>@*android:string/wfc_mode_ims_preferred_summary</item>
+ <item>@*android:string/wfc_mode_wifi_preferred_summary</item>
+ <item>@*android:string/wfc_mode_cellular_preferred_summary</item>
+ <item>@*android:string/wfc_mode_wifi_only_summary</item>
+ </string-array>
<string-array name="wifi_calling_mode_choices_v2">
<item>Wi-Fi</item>
<item>Mobile</item>
<item>Wi-Fi only</item>
</string-array>
+ <string-array name="wifi_calling_mode_choices_v2_with_ims_preferred">
+ <item>Ims Preferred</item>
+ <item>Wi-Fi</item>
+ <item>Mobile</item>
+ <item>Wi-Fi only</item>
+ </string-array>
<string-array name="wifi_calling_mode_values" translatable="false">
<item>"2"</item>
<item>"1"</item>
<item>"0"</item>
</string-array>
+ <string-array name="wifi_calling_mode_values_with_ims_preferred" translatable="false">
+ <item>"10"</item>
+ <item>"2"</item>
+ <item>"1"</item>
+ <item>"0"</item>
+ </string-array>
<string-array name="wifi_calling_mode_choices_without_wifi_only" translatable="false">
<item>@*android:string/wfc_mode_wifi_preferred_summary</item>
<item>@*android:string/wfc_mode_cellular_preferred_summary</item>
</string-array>
+ <string-array name="wifi_calling_mode_choices_without_wifi_only_with_ims_preferred" translatable="false">
+ <item>@*android:string/wfc_mode_ims_preferred_summary</item>
+ <item>@*android:string/wfc_mode_wifi_preferred_summary</item>
+ <item>@*android:string/wfc_mode_cellular_preferred_summary</item>
+ </string-array>
<string-array name="wifi_calling_mode_choices_v2_without_wifi_only">
<item>Wi-Fi</item>
<item>Mobile</item>
</string-array>
+ <string-array name="wifi_calling_mode_choices_v2_without_wifi_only_with_ims_preferred">
+ <item>Ims Preferred</item>
+ <item>Wi-Fi</item>
+ <item>Mobile</item>
+ </string-array>
<string-array name="wifi_calling_mode_values_without_wifi_only" translatable="false">
<item>"2"</item>
<item>"1"</item>
</string-array>
+ <string-array name="wifi_calling_mode_values_without_wifi_only_with_ims_preferred" translatable="false">
+ <item>"10"</item>
+ <item>"2"</item>
+ <item>"1"</item>
+ </string-array>
<!-- Summary of WFC preference item on the WFC preference selection dialog. [CHAR LIMIT=70]-->
<string name="wifi_calling_mode_wifi_preferred_summary">If Wi\u2011Fi is unavailable, use mobile network</string>
@@ -2529,6 +2570,8 @@
<string name="wifi_calling_mode_cellular_preferred_summary">If mobile network is unavailable, use Wi\u2011Fi</string>
<!-- Summary of WFC preference item on the WFC preference selection dialog. [CHAR LIMIT=70]-->
<string name="wifi_calling_mode_wifi_only_summary">Call over Wi\u2011Fi. If Wi\u2011Fi is lost, call will end.</string>
+ <!-- Summary of WFC preference item on the WFC preference selection dialog. [CHAR LIMIT=70]-->
+ <string name="wifi_calling_mode_ims_preferred_summary">If LTE and Wi\u2011Fi are unavailabe, use 2G/3G</string>
<!-- Wi-Fi Calling settings. Text displayed when Wi-Fi Calling is off -->
<string name="wifi_calling_off_explanation">When Wi-Fi calling is on, your phone can route calls via Wi-Fi networks or your carrier\u2019s network, depending on your preference and which signal is stronger. Before turning on this feature, check with your carrier regarding fees and other details.<xliff:g id="additional_text" example="Learn More">%1$s</xliff:g></string>
@@ -7326,6 +7369,8 @@
the carrier to determine if your contacts support enhanced features, such as video calling
and RCS messaging. [CHAR LIMIT=NONE]-->
<string name="contact_discovery_opt_in_dialog_message_no_carrier_defined">Your contacts\u2019 phone numbers will be periodically sent to your carrier.<xliff:g id="empty_line" example=" ">\n\n</xliff:g>This info identifies whether your contacts can use certain features, like video calls or some messaging features.</string>
+ <!-- Enabled 5G Mode title. [CHAR LIMIT=50] -->
+ <string name="enabled_5g_mode_title">Enable 5G</string>
<!-- Preferred network type title. [CHAR LIMIT=50] -->
<string name="preferred_network_type_title">Preferred network type</string>
<!-- Preferred network type summary. [CHAR LIMIT=100] -->
@@ -7779,6 +7824,9 @@
<!-- Sound: Other sounds: Title for the option enabling touch sounds for dial pad tones. [CHAR LIMIT=30] -->
<string name="dial_pad_tones_title">Dial pad tones</string>
+ <!-- Sound: Other sounds: Title for the option enabling tones after call connected. [CHAR LIMIT=30] -->
+ <string name="call_connected_tones_title">Call connected tones</string>
+
<!-- Sound: Other sounds: Title for the option enabling touch sounds for screen locking sounds. [CHAR LIMIT=30] -->
<string name="screen_locking_sounds_title">Screen locking sound</string>
@@ -11266,6 +11314,19 @@
<!-- UI debug setting: preference summary - describes the behavior of forcing full raw GNSS satellite measurements [CHAR LIMIT=NONE] -->
<string name="enable_gnss_raw_meas_full_tracking_summary">Track all GNSS constellations and frequencies with no duty cycling</string>
+ <!-- apn names for carriers -->
+ <string name="APN_NAME_CMNET">CMNET</string>
+ <string name="APN_NAME_CMWAP">CMWAP</string>
+ <string name="APN_NAME_CMMMS">CMMMS</string>
+ <string name="APN_NAME_CUWAP">China Unicom WAP</string>
+ <string name="APN_NAME_CUNET">China Unicom NET</string>
+ <string name="APN_NAME_CUMMS">China Unicom MMS</string>
+ <string name="APN_NAME_CUSUPL">China Unicom AGPS</string>
+ <string name="APN_NAME_CTNET">CTNET</string>
+ <string name="APN_NAME_CTWAP">CTWAP</string>
+ <string name="APN_NAME_CTLTE">ctlte</string>
+ <string name="APN_NAME_CTMMS">CTWAP</string>
+
<!-- UI debug setting: preference title - show all crash dialogs [CHAR LIMIT=60] -->
<string name="show_first_crash_dialog">Always show crash dialog</string>
<!-- UI debug setting: preference summary - describes the behavior of showing a dialog every time an app crashes [CHAR LIMIT=NONE] -->
@@ -11584,6 +11645,12 @@
<string name="network_world_mode_cdma_lte" translatable="false">LTE / CDMA</string>
<!-- Text for Network world mode GSM LTE [CHAR LIMIT=NONE] -->
<string name="network_world_mode_gsm_lte" translatable="false">LTE / GSM / UMTS</string>
+ <!-- Text for Network 3g only [CHAR LIMIT=NONE] -->
+ <string name="network_2G_3G_preferred" translatable="false">2G/3G preferred</string>
+ <!-- Text for Network 3g only [CHAR LIMIT=NONE] -->
+ <string name="network_3G_only" translatable="false">3G only</string>
+ <!-- Text for Network 2g only [CHAR LIMIT=NONE] -->
+ <string name="network_2G_only" translatable="false">2G only</string>
<!-- Available networks screen title/heading [CHAR LIMIT=NONE] -->
<string name="label_available">Available networks</string>
@@ -11617,6 +11684,9 @@
</string>
<!-- Mobile network settings screen, title of item showing the name of the default subscription
+ that will be used for data. This only appears in multi-SIM mode. [CHAR LIMIT=NONE] -->
+ <string name="data_preference">Data preference</string>
+ <!-- Mobile network settings screen, title of item showing the name of the default subscription
that will be used for calls. This only appears in multi-SIM mode. [CHAR LIMIT=NONE] -->
<string name="calls_preference">Calls preference</string>
<!-- Mobile network settings screen, title of item showing the name of the default subscription
@@ -11807,6 +11877,13 @@
<!-- Available networks screen, summary when button disallowed due to permanent automatic mode [CHAR LIMIT=NONE] -->
<string name="manual_mode_disallowed_summary">Unavailable when connected to <xliff:g id="carrier" example="verizon">%1$s</xliff:g></string>
+ <string name="select_sim_card">Select SIM card</string>
+ <string name="qtifeedback_settings_title">Hardware Feedback</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Reporting</string>
+ <string name="qtifeedback_intent_action">com.qti.smq.snapdragonSettings</string>
+ <string name="qtifeedback_package">com.qti.smq.Feedback</string>
+ <string name="qtifeedback_activity">com.qti.smq.ui.QtiFeedbackActivity</string>
+
<!-- See more items in contextual homepage [CHAR LIMIT=30]-->
<string name="see_more">See more</string>
<!-- See less items in contextual homepage [CHAR LIMIT=30]-->
@@ -11893,6 +11970,8 @@
<!-- Summary for low storage slice. [CHAR LIMIT=NONE] -->
<string name="low_storage_summary">Storage is low. <xliff:g id="percentage" example="54%">%1$s</xliff:g> used - <xliff:g id="free_space" example="32GB">%2$s</xliff:g> free</string>
+ <string name="reset_default_apn_failed">Failed to reset default apn</string>
+
<!-- Label for button in contextual card feedback dialog for users to send feedback [CHAR LIMIT=30] -->
<string name="contextual_card_feedback_send">Send feedback</string>
<!-- String for contextual card feedback dialog [CHAR LIMIT=NONE] -->
@@ -11951,6 +12030,11 @@
<!-- Warn the user that the phone may share its location with the service provider. [CHAR LIMIT=NONE] -->
<string name="wfc_disclaimer_location_desc_text">Your service provider may collect your location in order to provide this service.\n\nPlease review your service provider\u2019s privacy policy.</string>
+ <!-- String for about phone -->
+ <string name="ram_total_size">RAM total size</string>
+ <string name="rom_total_size">ROM total size</string>
+ <string name="software_version">Software version</string>
+ <string name="model_hardware_summary">Model:%1$s; Hardware:%2$s</string>
<!-- Message for forget passpoint dialog [CHAR LIMIT=none] -->
<string name="forget_passpoint_dialog_message">You may lose access to any remaining time or data. Check with your provider before removing.</string>
@@ -12109,6 +12193,19 @@
<!-- Subtext for showing the option of RTT setting. [CHAR LIMIT=NONE] -->
<string name="rtt_settings_always_visible"></string>
+ <!-- Strings for user PLMN setting. [CHAR LIMIT=NONE] -->
+ <string name="uplmn_settings_title">User Controlled PLMN</string>
+ <string name="network_id">Network ID</string>
+ <string name="dialog_network_priority_title">Priority</string>
+ <string name="uplmn_list_setting_add_plmn">New PLMN</string>
+ <string name="gsm_umts_network_preferences_title">Network Mode</string>
+ <string name="gsm_umts_network_preferences_dialogtitle">Network Mode</string>
+ <string name="voicemail_number_not_set"><Not set></string>
+ <string name="reading_settings">Reading settings\u2026</string>
+ <string name="updating_settings">Updating settings\u2026</string>
+ <string name="uplmn_settings_summary">Define the preferred PLMNs in priority order</string>
+ <string name="plmn_failure_radio_off">Selecting network failure due to radio OFF or unavailable</string>
+
<!-- Button label to stop casting on media device. [CHAR LIMIT=40 -->
<string name="media_output_panel_stop_casting_button">Stop casting</string>
diff --git a/res/xml/connected_devices.xml b/res/xml/connected_devices.xml
index e7e3c2c..644ce03 100644
--- a/res/xml/connected_devices.xml
+++ b/res/xml/connected_devices.xml
@@ -36,6 +36,11 @@
android:title="@string/connected_device_other_device_title"
settings:controller="com.android.settings.connecteddevice.ConnectedDeviceGroupController"/>
+ <PreferenceCategory
+ android:key="saved_tws_device_list"
+ android:title="@string/connected_tws_device_saved_title"
+ settings:controller="com.android.settings.connecteddevice.SavedTwsDeviceGroupController"/>
+
<com.android.settingslib.RestrictedPreference
android:key="add_bt_devices"
android:title="@string/bluetooth_pairing_pref_title"
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index 746a51c..547a1c1 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -278,6 +278,11 @@
android:summary="@string/wifi_display_certification_summary" />
<SwitchPreference
+ android:key="wifi_coverage_extend"
+ android:title="@string/wifi_coverage_extend"
+ android:summary="@string/wifi_coverage_extend_summary" />
+
+ <SwitchPreference
android:key="wifi_verbose_logging"
android:title="@string/wifi_verbose_logging"
android:summary="@string/wifi_verbose_logging_summary" />
diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml
index fb03f4c..36c72ec 100644
--- a/res/xml/location_settings.xml
+++ b/res/xml/location_settings.xml
@@ -33,6 +33,12 @@
android:fragment="com.android.settings.location.RecentLocationRequestSeeAllFragment"
settings:searchable="false"/>
+ <CheckBoxPreference
+ android:key="assisted_gps"
+ android:title="@string/assisted_gps"
+ android:summaryOn="@string/assisted_gps_enabled"
+ android:summaryOff="@string/assisted_gps_disabled"
+ settings:controller="com.android.settings.location.AgpsPreferenceController"/>
<PreferenceCategory
android:key="location_advanced_settings"
android:layout="@layout/preference_category_no_label"
diff --git a/res/xml/mobile_network_settings.xml b/res/xml/mobile_network_settings.xml
old mode 100644
new mode 100755
index f025f70..556a677
--- a/res/xml/mobile_network_settings.xml
+++ b/res/xml/mobile_network_settings.xml
@@ -37,10 +37,15 @@
android:selectable="false"/>
<ListPreference
+ android:key="data_preference"
+ android:title="@string/data_preference"
+ settings:controller="com.android.settings.network.telephony.DataDefaultSubscriptionController"
+ settings:allowDividerAbove="true"/>
+
+ <ListPreference
android:key="calls_preference"
android:title="@string/calls_preference"
- settings:controller="com.android.settings.network.telephony.CallsDefaultSubscriptionController"
- settings:allowDividerAbove="true"/>
+ settings:controller="com.android.settings.network.telephony.CallsDefaultSubscriptionController"/>
<ListPreference
android:key="sms_preference"
@@ -107,7 +112,6 @@
android:summary="@string/enhanced_4g_lte_mode_summary_4g_calling"
settings:keywords="@string/keywords_enhance_4g_lte"
settings:controller="com.android.settings.network.telephony.Enhanced4gCallingPreferenceController"/>
-
<SwitchPreference
android:key="advance_call"
android:title="@string/enhanced_4g_lte_mode_title_advanced_calling"
@@ -115,6 +119,11 @@
android:summary="@string/enhanced_4g_lte_mode_summary"
settings:keywords="@string/keywords_enhance_4g_lte"
settings:controller="com.android.settings.network.telephony.Enhanced4gAdvancedCallingPreferenceController"/>
+ <SwitchPreference
+ android:key="enabled_5g"
+ android:title="@string/enabled_5g_mode_title"
+ android:persistent="true"
+ settings:controller="com.android.settings.network.telephony.Enabled5GPreferenceController"/>
<SwitchPreference
android:key="contact_discovery_opt_in"
@@ -172,7 +181,6 @@
android:title="@string/video_calling_settings_title"
android:persistent="true"
settings:controller="com.android.settings.network.telephony.VideoCallingPreferenceController"/>
-
</PreferenceCategory>
<com.android.settings.network.telephony.cdma.CdmaListPreference
@@ -218,6 +226,15 @@
settings:allowDividerAbove="true"
settings:controller="com.android.settings.network.telephony.ApnPreferenceController"/>
+ <PreferenceScreen
+ android:key="uplmn_settings_key"
+ android:persistent="false"
+ android:title="@string/uplmn_settings_title"
+ android:summary="@string/uplmn_settings_summary"
+ settings:allowDividerAbove="true"
+ settings:controller="com.android.settings.network.telephony.UserPLMNPreferenceController">
+ </PreferenceScreen>
+
<Preference
android:key="carrier_settings_key"
android:title="@string/carrier_settings_title"
diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml
index 5e5fab3..10613f7 100644
--- a/res/xml/my_device_info.xml
+++ b/res/xml/my_device_info.xml
@@ -203,4 +203,22 @@
settings:enableCopying="true"
settings:controller="com.android.settings.deviceinfo.BuildNumberPreferenceController"/>
+ <!-- Software version -->
+ <Preference
+ android:key="software_version"
+ android:order="44"
+ android:title="@string/software_version"
+ android:summary="@string/summary_placeholder"
+ android:selectable="false"
+ settings:enableCopying="true"/>
+
+ <!-- Storage size, including two items: ROM and RAM total size -->
+ <Preference
+ android:key="key_storage_total_size"
+ android:order="45"
+ android:title="@string/ram_total_size"
+ android:summary="@string/summary_placeholder"
+ android:selectable="false"
+ settings:allowDividerAbove="true"
+ settings:enableCopying="true"/>
</PreferenceScreen>
diff --git a/res/xml/other_sound_settings.xml b/res/xml/other_sound_settings.xml
index 7b3f362..d0ddc22 100644
--- a/res/xml/other_sound_settings.xml
+++ b/res/xml/other_sound_settings.xml
@@ -24,6 +24,11 @@
android:key="dial_pad_tones"
android:title="@string/dial_pad_tones_title" />
+ <!-- Call connected tones -->
+ <SwitchPreference
+ android:key="call_connected_tones"
+ android:title="@string/call_connected_tones_title" />
+
<!-- Screen locking sounds -->
<SwitchPreference
android:key="screen_locking_sounds"
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index fc5c3e2..a1b422c 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -165,6 +165,11 @@
android:key="dial_pad_tones"
android:title="@string/dial_pad_tones_title"/>
+ <!-- Call connected tones -->
+ <SwitchPreference
+ android:key="call_connected_tones"
+ android:title="@string/call_connected_tones_title" />
+
<!-- Screen locking sounds -->
<SwitchPreference
android:key="screen_locking_sounds"
diff --git a/res/xml/uplmn_editor.xml b/res/xml/uplmn_editor.xml
new file mode 100755
index 0000000..30199d1
--- /dev/null
+++ b/res/xml/uplmn_editor.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (c) 2020, The Linux Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+ android:title="@string/uplmn_settings_title">
+ <Preference
+ android:title="@string/network_id"
+ android:key="network_id_key" />
+ <EditTextPreference
+ android:title="@string/dialog_network_priority_title"
+ android:dialogTitle="@string/dialog_network_priority_title"
+ android:key="priority_key"
+ android:singleLine="true"
+ android:inputType="number" />
+ <ListPreference
+ android:title="@string/gsm_umts_network_preferences_title"
+ android:dialogTitle="@string/gsm_umts_network_preferences_dialogtitle"
+ android:key="network_mode_key"
+ android:entries="@array/uplmn_prefer_network_mode_td_choices"
+ android:entryValues="@array/uplmn_prefer_network_mode_values" />
+</PreferenceScreen>
diff --git a/res/xml/uplmn_settings.xml b/res/xml/uplmn_settings.xml
new file mode 100755
index 0000000..dfca655
--- /dev/null
+++ b/res/xml/uplmn_settings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (c) 2020, The Linux Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:title="@string/uplmn_settings_title"
+ android:key="button_uplmn_list_key"
+ android:persistent="false">
+</PreferenceScreen>
diff --git a/src/com/android/settings/AllInOneTetherSettings.java b/src/com/android/settings/AllInOneTetherSettings.java
index ed3b5b0..a3a3c2a 100644
--- a/src/com/android/settings/AllInOneTetherSettings.java
+++ b/src/com/android/settings/AllInOneTetherSettings.java
@@ -355,7 +355,18 @@
@Override
public void onTetherConfigUpdated(AbstractPreferenceController controller) {
final SoftApConfiguration config = buildNewConfig();
+ boolean bandEntriesChanged = false;
mPasswordPreferenceController.updateVisibility(config.getSecurityType());
+
+ if (mApBandPreferenceController.isVendorDualApSupported()
+ && mSecurityPreferenceController.isOweSapSupported()) {
+ if ((config.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_OWE)
+ == (mApBandPreferenceController.isBandEntriesHasDualband())) {
+ mApBandPreferenceController.updatePreferenceEntries(config);
+ bandEntriesChanged = true;
+ }
+ }
+
mWifiManager.setSoftApConfiguration(config);
if (mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_ENABLED) {
@@ -365,18 +376,24 @@
mRestartWifiApAfterConfigChange = true;
mTetherEnabler.stopTethering(TETHERING_WIFI);
}
+
+ if (bandEntriesChanged)
+ mApBandPreferenceController.updateDisplay();
}
private SoftApConfiguration buildNewConfig() {
final SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder();
final int securityType = mSecurityPreferenceController.getSecurityType();
+ final int band = mApBandPreferenceController.getBandIndex();
configBuilder.setSsid(mSSIDPreferenceController.getSSID());
- if (securityType == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK) {
- configBuilder.setPassphrase(
- mPasswordPreferenceController.getPasswordValidated(securityType),
- SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
+ configBuilder.setPassphrase(mPasswordPreferenceController.getPasswordValidated(securityType),
+ securityType);
+ if (securityType == SoftApConfiguration.SECURITY_TYPE_OWE
+ && band == SoftApConfiguration.BAND_DUAL) {
+ configBuilder.setBand(SoftApConfiguration.BAND_2GHZ);
+ } else {
+ configBuilder.setBand(band);
}
- configBuilder.setBand(mApBandPreferenceController.getBandIndex());
return configBuilder.build();
}
diff --git a/src/com/android/settings/DBReadAsyncTask.java b/src/com/android/settings/DBReadAsyncTask.java
new file mode 100644
index 0000000..6cb5429
--- /dev/null
+++ b/src/com/android/settings/DBReadAsyncTask.java
@@ -0,0 +1,108 @@
+/*
+Copyright (c) 2016, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.android.settings;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.AsyncTask;
+
+public class DBReadAsyncTask extends AsyncTask<Void, Void, Boolean> {
+
+ /**
+ * SMQ preferences key.
+ */
+ public static final String SMQ_KEY_VALUE = "app_status";
+
+ /**
+ * The authority of the provider.
+ */
+ public static final String AUTHORITY = "com.qti.smq.Feedback.provider";
+ /**
+ * The content URI.
+ */
+ final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
+ /**
+ * The Content URI for this table.
+ */
+ final Uri SNAP_CONTENT_URI = Uri.withAppendedPath(
+ CONTENT_URI, "smq_settings");
+
+ Context mContext;
+
+ public static final String KEY_VALUE = "app_status";
+
+ public DBReadAsyncTask(Context mContext) {
+ super();
+ this.mContext = mContext;
+ }
+
+ @Override
+ protected Boolean doInBackground(final Void... params) {
+ final String whereClause = "key" + "=?";
+ final String[] selectionArgs = { KEY_VALUE };
+
+ final Cursor c = mContext.getContentResolver().query(
+ SNAP_CONTENT_URI, null, whereClause,
+ selectionArgs, null);
+ final SharedPreferences sharedPreferences = mContext
+ .getSharedPreferences(SmqSettings.SMQ_PREFS_NAME, Context.MODE_PRIVATE);
+
+ if (c!= null && c.getCount() > 0) {
+ c.moveToFirst();
+ final int value = c.getInt(1);
+
+ final int appStatus = sharedPreferences.getInt(KEY_VALUE, 0);
+ if (appStatus == value) {
+ // Do nothing
+ } else {
+ //Save preference and notify.
+ final SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putInt(KEY_VALUE, value);
+ editor.commit();
+
+ }
+
+ }
+ else{
+ //No such table. don't show menu.
+ final SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putInt(KEY_VALUE, 0);
+ editor.commit();
+ }
+ if(c != null){
+ c.close();
+ }
+
+ return true;
+ }
+
+}
\ No newline at end of file
diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index 77cc03e..1a1a87b 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -331,6 +331,11 @@
final SubscriptionInfo sir = getVisibleSubscriptionInfoForSimSlotIndex(mSlotId);
final int subId = (sir != null) ? sir.getSubscriptionId()
: SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+ mTelephonyManager = mTelephonyManager.createForSubscriptionId(mSubId);
+
+ int cardState = mTelephonyManager.getSimState();
+ boolean canInteract = cardState == TelephonyManager.SIM_STATE_READY ||
+ cardState == TelephonyManager.SIM_STATE_LOADED;
if (mSubId != subId) {
mSubId = subId;
@@ -341,10 +346,10 @@
}
if (mPinDialog != null) {
- mPinDialog.setEnabled(sir != null);
+ mPinDialog.setEnabled(sir != null && canInteract);
}
if (mPinToggle != null) {
- mPinToggle.setEnabled(sir != null);
+ mPinToggle.setEnabled(sir != null && canInteract);
if (sir != null) {
mPinToggle.setChecked(isIccLockEnabled());
diff --git a/src/com/android/settings/ResetNetworkConfirm.java b/src/com/android/settings/ResetNetworkConfirm.java
index 6856a5a..6e2e898 100644
--- a/src/com/android/settings/ResetNetworkConfirm.java
+++ b/src/com/android/settings/ResetNetworkConfirm.java
@@ -19,6 +19,7 @@
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import android.app.Activity;
+import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.app.settings.SettingsEnums;
import android.bluetooth.BluetoothAdapter;
@@ -45,12 +46,13 @@
import android.widget.Toast;
import androidx.annotation.VisibleForTesting;
-import androidx.appcompat.app.AlertDialog;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.enterprise.ActionDisabledByAdminDialogHelper;
import com.android.settings.network.ApnSettings;
import com.android.settingslib.RestrictedLockUtilsInternal;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
/**
* Confirm and execute a reset of the network settings to a clean "just out of the box"
@@ -121,6 +123,13 @@
BluetoothAdapter btAdapter = btManager.getAdapter();
if (btAdapter != null) {
btAdapter.factoryReset();
+ LocalBluetoothManager mLocalBtManager =
+ LocalBluetoothManager.getInstance(mContext, null);
+ if (mLocalBtManager != null) {
+ CachedBluetoothDeviceManager cachedDeviceManager =
+ mLocalBtManager.getCachedDeviceManager();
+ cachedDeviceManager.clearAllDevices();
+ }
}
}
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 2f23c84..7c886df 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -37,6 +37,7 @@
public static class CreateShortcutActivity extends SettingsActivity { /* empty */ }
public static class FaceSettingsActivity extends SettingsActivity { /* empty */ }
public static class FingerprintSettingsActivity extends SettingsActivity { /* empty */ }
+ public static class SimSettingsActivity extends SettingsActivity { /* empty */ }
public static class TetherSettingsActivity extends SettingsActivity {
// TODO(b/147675042): Clean the override up when we enable the new Fragment persistently.
@Override
@@ -234,6 +235,8 @@
public static class StorageDashboardActivity extends SettingsActivity {}
public static class AccountDashboardActivity extends SettingsActivity {}
public static class SystemDashboardActivity extends SettingsActivity {}
+ public static class SupportDashboardActivity extends SettingsActivity {}
+ public static class SMQQtiFeedbackActivity extends SettingsActivity { /* empty */ }
/**
* Activity for MediaControlsSettings
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 1c2952a..bfec3be 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -33,6 +33,8 @@
import android.graphics.drawable.Icon;
import android.os.AsyncTask;
import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.text.TextUtils;
@@ -60,6 +62,7 @@
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.homepage.TopLevelSettings;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.Utils;
import com.android.settings.wfd.WifiDisplaySettings;
import com.android.settings.widget.SwitchBar;
import com.android.settingslib.core.instrumentation.Instrumentable;
@@ -72,6 +75,8 @@
import java.util.ArrayList;
import java.util.List;
+import org.codeaurora.internal.IExtTelephony;
+
public class SettingsActivity extends SettingsBaseActivity
implements PreferenceManager.OnPreferenceTreeClickListener,
@@ -153,6 +158,7 @@
private CharSequence mInitialTitle;
private int mInitialTitleResId;
+ private SmqSettings mSMQ;
private BroadcastReceiver mDevelopmentSettingsListener;
@@ -245,6 +251,8 @@
getWindow().setUiOptions(intent.getIntExtra(EXTRA_UI_OPTIONS, 0));
}
+ mSMQ = new SmqSettings(getApplicationContext());
+
// Getting Intent properties can only be done after the super.onCreate(...)
final String initialFragmentName = intent.getStringExtra(EXTRA_SHOW_FRAGMENT);
@@ -569,7 +577,29 @@
*/
private Fragment switchToFragment(String fragmentName, Bundle args, boolean validate,
int titleResId, CharSequence title) {
+ if (fragmentName.equals(getString(R.string.qtifeedback_intent_action))){
+ final Intent newIntent = new Intent(getString(R.string.qtifeedback_intent_action));
+ newIntent.addCategory("android.intent.category.DEFAULT");
+ startActivity(newIntent);
+ finish();
+ return null;
+ }
+
Log.d(LOG_TAG, "Switching to fragment " + fragmentName);
+
+ if (fragmentName.equals("com.android.settings.sim.SimSettings")) {
+ if(Utils.isSimSettingsApkAvailable()) {
+ Log.i(LOG_TAG, "switchToFragment, launch simSettings");
+ Intent provisioningIntent =
+ new Intent("com.android.settings.sim.SIM_SUB_INFO_SETTINGS");
+ if (!getPackageManager().queryIntentActivities(provisioningIntent, 0).isEmpty()) {
+ startActivity(provisioningIntent);
+ }
+ }
+ finish();
+ return null;
+ }
+
if (validate && !isValidFragment(fragmentName)) {
throw new IllegalArgumentException("Invalid fragment for this activity: "
+ fragmentName);
@@ -611,6 +641,10 @@
pm.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH), isAdmin)
|| somethingChanged;
+ if(mSMQ.isShowSmqSettings()){
+ somethingChanged = setTileEnabled(changedList, new ComponentName(packageName, Settings.SMQQtiFeedbackActivity.class.getName()), mSMQ.isShowSmqSettings(), isAdmin) || somethingChanged;
+ }
+
// Enable DataUsageSummaryActivity if the data plan feature flag is turned on otherwise
// enable DataPlanUsageSummaryActivity.
somethingChanged = setTileEnabled(changedList,
@@ -625,6 +659,11 @@
isAdmin) || somethingChanged;
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
+ Settings.SimSettingsActivity.class.getName()),
+ Utils.showSimCardTile(this), isAdmin)
+ || somethingChanged;
+
+ somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.PowerUsageSummaryActivity.class.getName()),
mBatteryPresent, isAdmin) || somethingChanged;
diff --git a/src/com/android/settings/SmqSettings.java b/src/com/android/settings/SmqSettings.java
new file mode 100644
index 0000000..65f8703
--- /dev/null
+++ b/src/com/android/settings/SmqSettings.java
@@ -0,0 +1,65 @@
+/*
+Copyright (c) 2017, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.android.settings;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+public class SmqSettings {
+
+ /**
+ * The application context.
+ */
+ private Context mContext;
+ private SharedPreferences mSmqPreferences;
+
+ /**
+ * SMQ preferences key.
+ */
+ public static final String SMQ_KEY_VALUE = "app_status";
+
+ /**
+ * Shared preferences name.
+ */
+ public static final String SMQ_PREFS_NAME = "smqpreferences";
+
+ public SmqSettings(final Context context) {
+ mContext = context;
+ new DBReadAsyncTask(mContext).execute();
+ mSmqPreferences = mContext.getSharedPreferences(
+ SMQ_PREFS_NAME, Context.MODE_PRIVATE);
+ }
+
+ public boolean isShowSmqSettings() {
+ final int iShowSmq = mSmqPreferences.getInt(SMQ_KEY_VALUE, 0);
+ final boolean showSmq = iShowSmq > 0 ? true : false;
+ return showSmq;
+ }
+
+}
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
old mode 100644
new mode 100755
index 0325842..f389b4b
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -149,7 +149,7 @@
final Activity activity = getActivity();
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
- if (adapter != null) {
+ if (adapter != null && adapter.getState() == BluetoothAdapter.STATE_ON) {
adapter.getProfileProxy(activity.getApplicationContext(), mProfileServiceListener,
BluetoothProfile.PAN);
}
@@ -263,12 +263,20 @@
mUsbConnected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);
updateState();
} else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
+ int status = intent
+ .getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
if (mBluetoothEnableForTether) {
- switch (intent
- .getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)) {
+ switch (status) {
case BluetoothAdapter.STATE_ON:
startTethering(TETHERING_BLUETOOTH);
mBluetoothEnableForTether = false;
+ if (mBluetoothPan.get() == null) {
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ if (adapter != null) {
+ adapter.getProfileProxy(getActivity().getApplicationContext(),
+ mProfileServiceListener, BluetoothProfile.PAN);
+ }
+ }
break;
case BluetoothAdapter.STATE_OFF:
@@ -279,7 +287,20 @@
default:
// ignore transition states
}
+ } else {
+ switch (status) {
+ case BluetoothAdapter.STATE_ON:
+ if (mBluetoothPan.get() == null) {
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ if (adapter != null) {
+ adapter.getProfileProxy(getActivity().getApplicationContext(),
+ mProfileServiceListener, BluetoothProfile.PAN);
+ }
+ }
+ break;
+ }
}
+
updateState();
}
}
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 64919d9..0bb3613 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -45,6 +45,7 @@
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
+import android.content.res.Resources.NotFoundException;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@@ -68,6 +69,7 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.StorageManager;
+import android.os.SystemProperties;
import android.os.storage.VolumeInfo;
import android.preference.PreferenceFrameLayout;
import android.provider.ContactsContract.CommonDataKinds;
@@ -75,6 +77,9 @@
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.Profile;
import android.provider.ContactsContract.RawContacts;
+import android.provider.Settings;
+import android.provider.Telephony;
+import android.service.persistentdata.PersistentDataBlockManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.Spannable;
@@ -115,6 +120,8 @@
import java.util.List;
import java.util.Locale;
+import org.codeaurora.internal.IExtTelephony;
+
public final class Utils extends com.android.settingslib.Utils {
private static final String TAG = "Settings";
@@ -130,6 +137,14 @@
public static final String OS_PKG = "os";
+ public static final String KEY_SOFTWARE_VERSION = "ext_meta_software_version";
+ public static final String KEY_MODEL = "ext_model_name_from_meta";
+ public static final String KEY_HARDWARE_VERSION = "ext_hardware_version";
+ public static final String KEY_WIFI_MAC_ADDRESS = "ext_wifi_mac_address";
+ public static final String KEY_DEVICE_NAME = "ext_device_name";
+ public static final String KEY_ROM_TOTAL_SIZE = "ext_rom_total_size";
+ public static final String KEY_RAM_TOTAL_SIZE = "ext_ram_total_size";
+
/**
* Whether to disable the new device identifier access restrictions.
*/
@@ -860,6 +875,17 @@
}
/**
+ * Return whether or not the user should have a SIM Cards option in Settings.
+ */
+ public static boolean showSimCardTile(Context context) {
+ boolean isPrimaryCardEnabled = SystemProperties.getBoolean(
+ "persist.vendor.radio.primarycard", false);
+ final TelephonyManager tm =
+ (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+ return isPrimaryCardEnabled && (tm.getSimCount() > 1);
+ }
+
+ /**
* Tries to initalize a volume with the given bundle. If it is a valid, private, and readable
* {@link VolumeInfo}, it is returned. If it is not valid, null is returned.
*/
@@ -1030,6 +1056,105 @@
return false;
}
+ public static String getLocalizedName(Context context, String resName) {
+ if(context == null){
+ return null;
+ }
+ // If can find a localized name, replace the APN name with it
+ String localizedName = null;
+ if (resName != null && !resName.isEmpty()) {
+ int resId = context.getResources().getIdentifier(resName, "string",
+ context.getPackageName());
+ if(resId > 0){
+ try {
+ localizedName = context.getResources().getString(resId);
+ Log.d(TAG, "Replaced apn name with localized name");
+ } catch (NotFoundException e) {
+ Log.e(TAG, "Got execption while getting the localized apn name.", e);
+ }
+ }
+ }
+ return localizedName;
+ }
+
+ public static boolean carrierTableFieldValidate(String field){
+ if(field == null)
+ return false;
+ if(Telephony.Carriers.AUTH_TYPE.equalsIgnoreCase(field)
+ || Telephony.Carriers.SUBSCRIPTION_ID.equalsIgnoreCase(field))
+ return true;
+ field = field.toUpperCase();
+ Class clazz = Telephony.Carriers.class;
+ try{
+ clazz.getDeclaredField(field);
+ }catch(NoSuchFieldException e){
+ Log.w(TAG, field + "is not a valid field in class Telephony.Carriers");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Checks whether SimSettings apk exists on the device. If yes, returns true, else
+ * returns false.
+ */
+ public static boolean isSimSettingsApkAvailable() {
+ IExtTelephony extTelephony =
+ IExtTelephony.Stub.asInterface(ServiceManager.getService("qti.radio.extphone"));
+ try {
+ if (extTelephony != null &&
+ extTelephony.isVendorApkAvailable("com.qualcomm.qti.simsettings")) {
+ return true;
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Got exception in isSimSettingsApkAvailable.", e);
+ }
+ return false;
+ }
+
+ /**
+ * check whether NetworkSetting apk exist in system, if yes, return true, else
+ * return false.
+ */
+ public static boolean isNetworkSettingsApkAvailable() {
+ // check whether the target handler exist in system
+ IExtTelephony extTelephony =
+ IExtTelephony.Stub.asInterface(ServiceManager.getService("qti.radio.extphone"));
+ try {
+ if (extTelephony != null &&
+ extTelephony.isVendorApkAvailable("com.qualcomm.qti.networksetting")) {
+ // Use Vendor NetworkSetting to handle the selection intent
+ return true;
+ }
+ } catch (RemoteException e) {
+ // Use aosp NetworkSetting to handle the selection intent
+ Log.e(TAG, "Got exception in isNetworkSettingsApkAvailable.", e);
+ }
+ return false;
+ }
+
+ public static boolean isAdvancedPlmnScanSupported() {
+ boolean propVal = false;
+ IExtTelephony extTelephony = IExtTelephony.Stub
+ .asInterface(ServiceManager.getService("qti.radio.extphone"));
+ try {
+ propVal = extTelephony
+ .getPropertyValueBool("persist.vendor.radio.enableadvancedscan", true);
+ } catch (RemoteException | NullPointerException ex) {
+ Log.e(TAG, "isAdvancedPlmnScanSupported Exception: ", ex);
+ }
+ return propVal;
+ }
+
+ public static boolean isSupportCTPA(Context context) {
+ Context appContext = context.getApplicationContext();
+ return appContext.getResources().getBoolean(R.bool.config_support_CT_PA);
+ }
+
+ public static String getString(Context context, String key) {
+ return Settings.Global.getString(context.getContentResolver(), key);
+ }
+
/** Get {@link Resources} by subscription id if subscription id is valid. */
public static Resources getResourcesForSubId(Context context, int subId) {
if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
diff --git a/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java b/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java
index 270a5c8..97ee5c9 100644
--- a/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java
+++ b/src/com/android/settings/applications/manageapplications/ResetAppsHelper.java
@@ -21,6 +21,8 @@
import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.INotificationManager;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.ApplicationInfo;
diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java
index 2da9eea..7358d93 100644
--- a/src/com/android/settings/bluetooth/BluetoothEnabler.java
+++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java
@@ -134,19 +134,19 @@
mSwitchController.setEnabled(false);
break;
case BluetoothAdapter.STATE_ON:
- setChecked(true);
mSwitchController.setEnabled(true);
+ setChecked(true);
break;
case BluetoothAdapter.STATE_TURNING_OFF:
mSwitchController.setEnabled(false);
break;
case BluetoothAdapter.STATE_OFF:
- setChecked(false);
mSwitchController.setEnabled(true);
+ setChecked(false);
break;
default:
- setChecked(false);
mSwitchController.setEnabled(true);
+ setChecked(false);
}
}
diff --git a/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java b/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
index 74c39b6..7848fa4 100644
--- a/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
@@ -89,7 +89,7 @@
.setTitle(getDialogTitle())
.setView(createDialogView(deviceName))
.setPositiveButton(R.string.bluetooth_rename_button, (dialog, which) -> {
- setDeviceName(mDeviceNameView.getText().toString());
+ setDeviceName(mDeviceNameView.getText().toString().trim());
})
.setNegativeButton(android.R.string.cancel, null);
mAlertDialog = builder.create();
@@ -133,7 +133,11 @@
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
- setDeviceName(v.getText().toString());
+ // Rejecting Empty String
+ if (v.length() != 0 && !(v.getText().toString().trim().isEmpty()))
+ {
+ setDeviceName(v.getText().toString());
+ }
if (mAlertDialog != null && mAlertDialog.isShowing()) {
mAlertDialog.dismiss();
}
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingController.java b/src/com/android/settings/bluetooth/BluetoothPairingController.java
index a1d86be..27ac742 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingController.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingController.java
@@ -62,7 +62,6 @@
private int mPasskey;
private String mDeviceName;
private LocalBluetoothProfile mPbapClientProfile;
- private boolean mPbapAllowed;
/**
* Creates an instance of a BluetoothPairingController.
@@ -92,20 +91,14 @@
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
- mPbapAllowed = true;
+ mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
} else {
- mPbapAllowed = false;
+ mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_REJECTED);
}
}
@Override
public void onDialogPositiveClick(BluetoothPairingDialogFragment dialog) {
- if (mPbapAllowed) {
- mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
- } else {
- mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_REJECTED);
- }
-
if (getDialogType() == USER_ENTRY_DIALOG) {
onPair(mUserInput);
} else {
diff --git a/src/com/android/settings/bluetooth/DevicePickerFragment.java b/src/com/android/settings/bluetooth/DevicePickerFragment.java
index 02625bb..328673a 100644
--- a/src/com/android/settings/bluetooth/DevicePickerFragment.java
+++ b/src/com/android/settings/bluetooth/DevicePickerFragment.java
@@ -187,11 +187,13 @@
}
private void sendDevicePickedIntent(BluetoothDevice device) {
+ android.util.Log.d("Devicepicker", "sendDevicePickedIntent");
Intent intent = new Intent(BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
if (mLaunchPackage != null && mLaunchClass != null) {
intent.setClassName(mLaunchPackage, mLaunchClass);
}
+ intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
getActivity().sendBroadcast(intent);
}
}
diff --git a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
index 466d60e..224f4a9 100644
--- a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java
@@ -1,4 +1,37 @@
/*
+ *Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -99,9 +132,10 @@
if (DBG) {
Log.d(TAG, "isFilterMatched() device name : " + cachedDevice.getName() +
", is connected : " + device.isConnected() + ", is profile connected : "
- + cachedDevice.isConnected());
+ + cachedDevice.isConnected() +
+ ", is twsplusdevice : " + device.isTwsPlusDevice());
}
- return device.getBondState() == BluetoothDevice.BOND_BONDED && !device.isConnected();
+ return device.getBondState() == BluetoothDevice.BOND_BONDED && !device.isConnected() && !device.isTwsPlusDevice();
}
@Override
diff --git a/src/com/android/settings/bluetooth/SavedBluetoothTwsDeviceUpdater.java b/src/com/android/settings/bluetooth/SavedBluetoothTwsDeviceUpdater.java
new file mode 100644
index 0000000..f4a5638
--- /dev/null
+++ b/src/com/android/settings/bluetooth/SavedBluetoothTwsDeviceUpdater.java
@@ -0,0 +1,90 @@
+/*
+ *Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.bluetooth;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothProfile;
+import android.content.Context;
+
+import com.android.settings.connecteddevice.DevicePreferenceCallback;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+/**
+ * Maintain and update saved TWS+ bluetooth devices(bonded but not connected)
+ */
+public class SavedBluetoothTwsDeviceUpdater extends BluetoothDeviceUpdater {
+
+ private static final String PREF_KEY = "saved_bt_tws";
+
+ public SavedBluetoothTwsDeviceUpdater(Context context, DashboardFragment fragment,
+ DevicePreferenceCallback devicePreferenceCallback) {
+ super(context, fragment, devicePreferenceCallback);
+ }
+
+ SavedBluetoothTwsDeviceUpdater(Context context, DashboardFragment fragment,
+ DevicePreferenceCallback devicePreferenceCallback,
+ LocalBluetoothManager localBluetoothManager) {
+ super(context, fragment, devicePreferenceCallback, localBluetoothManager);
+ }
+
+ @Override
+ public boolean isFilterMatched(CachedBluetoothDevice cachedDevice) {
+ final BluetoothDevice device = cachedDevice.getDevice();
+ return device.getBondState() == BluetoothDevice.BOND_BONDED &&
+ !device.isConnected() && device.isTwsPlusDevice();
+ }
+
+ @Override
+ protected String getPreferenceKey() {
+ return PREF_KEY;
+ }
+}
diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
index 5dd769d..f857be3 100644
--- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
@@ -1,4 +1,37 @@
/*
+ *Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -71,6 +104,7 @@
SettingsUIDeviceConfig.BT_NEAR_BY_SUGGESTION_ENABLED, true);
use(AvailableMediaDeviceGroupController.class).init(this);
use(ConnectedDeviceGroupController.class).init(this);
+ use(SavedTwsDeviceGroupController.class).init(this);
use(PreviouslyConnectedDevicePreferenceController.class).init(this);
use(SlicePreferenceController.class).setSliceUri(nearbyEnabled
? Uri.parse(getString(R.string.config_nearby_devices_slice_uri))
diff --git a/src/com/android/settings/connecteddevice/SavedTwsDeviceGroupController.java b/src/com/android/settings/connecteddevice/SavedTwsDeviceGroupController.java
new file mode 100644
index 0000000..1e1f0ac
--- /dev/null
+++ b/src/com/android/settings/connecteddevice/SavedTwsDeviceGroupController.java
@@ -0,0 +1,157 @@
+/*
+ *Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted (subject to the limitations in the
+ * disclaimer below) provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+ * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.connecteddevice;
+
+import android.content.pm.PackageManager;
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.bluetooth.BluetoothDeviceUpdater;
+import com.android.settings.bluetooth.SavedBluetoothTwsDeviceUpdater;
+import com.android.settings.connecteddevice.dock.DockUpdater;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.overlay.DockUpdaterFeatureProvider;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
+
+/**
+ * Controller to maintain the {@link PreferenceGroup} for all
+ * saved TWS+ devices. It uses {@link DevicePreferenceCallback} to add/remove {@link Preference}
+ */
+public class SavedTwsDeviceGroupController extends BasePreferenceController
+ implements PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop,
+ DevicePreferenceCallback {
+
+ private static final String KEY = "saved_tws_device_list";
+
+ PreferenceGroup mPreferenceGroup;
+ private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
+ private DockUpdater mSavedDockUpdater;
+
+ public SavedTwsDeviceGroupController(Context context) {
+ super(context, KEY);
+
+ DockUpdaterFeatureProvider dockUpdaterFeatureProvider =
+ FeatureFactory.getFactory(context).getDockUpdaterFeatureProvider();
+ mSavedDockUpdater =
+ dockUpdaterFeatureProvider.getSavedDockUpdater(context, this);
+ }
+
+ @Override
+ public void onStart() {
+ mBluetoothDeviceUpdater.registerCallback();
+ mSavedDockUpdater.registerCallback();
+ }
+
+ @Override
+ public void onStop() {
+ mBluetoothDeviceUpdater.unregisterCallback();
+ mSavedDockUpdater.unregisterCallback();
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ if (isAvailable()) {
+ mPreferenceGroup = (PreferenceGroup) screen.findPreference(KEY);
+ mPreferenceGroup.setVisible(false);
+ mBluetoothDeviceUpdater.setPrefContext(screen.getContext());
+ mBluetoothDeviceUpdater.forceUpdate();
+ mSavedDockUpdater.forceUpdate();
+ }
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)
+ ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return KEY;
+ }
+
+ @Override
+ public void onDeviceAdded(Preference preference) {
+ if (mPreferenceGroup.getPreferenceCount() == 0) {
+ mPreferenceGroup.setVisible(true);
+ }
+ mPreferenceGroup.addPreference(preference);
+ }
+
+ @Override
+ public void onDeviceRemoved(Preference preference) {
+ mPreferenceGroup.removePreference(preference);
+ if (mPreferenceGroup.getPreferenceCount() == 0) {
+ mPreferenceGroup.setVisible(false);
+ }
+ }
+
+ public void init(DashboardFragment fragment) {
+ mBluetoothDeviceUpdater = new SavedBluetoothTwsDeviceUpdater(fragment.getContext(),
+ fragment, SavedTwsDeviceGroupController.this);
+ }
+
+ public void setBluetoothDeviceUpdater(BluetoothDeviceUpdater bluetoothDeviceUpdater) {
+ mBluetoothDeviceUpdater = bluetoothDeviceUpdater;
+ }
+
+ public void setSavedDockUpdater(DockUpdater savedDockUpdater) {
+ mSavedDockUpdater = savedDockUpdater;
+ }
+}
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index ad4da08..a423b39 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -329,6 +329,7 @@
Settings.WifiSettingsActivity.class.getName(),
Settings.WifiSettings2Activity.class.getName(),
Settings.DataUsageSummaryActivity.class.getName(),
+ Settings.SimSettingsActivity.class.getName(),
// Home page > Connected devices
Settings.BluetoothSettingsActivity.class.getName(),
Settings.WifiDisplaySettingsActivity.class.getName(),
diff --git a/src/com/android/settings/datausage/BillingCyclePreference.java b/src/com/android/settings/datausage/BillingCyclePreference.java
index 116ed89..6fc403b 100644
--- a/src/com/android/settings/datausage/BillingCyclePreference.java
+++ b/src/com/android/settings/datausage/BillingCyclePreference.java
@@ -72,6 +72,7 @@
setSummary(null);
setIntent(getIntent());
+ updateEnabled();
}
private void updateEnabled() {
diff --git a/src/com/android/settings/datausage/CellDataPreference.java b/src/com/android/settings/datausage/CellDataPreference.java
index 6dc40e8..9a4e7b7 100644
--- a/src/com/android/settings/datausage/CellDataPreference.java
+++ b/src/com/android/settings/datausage/CellDataPreference.java
@@ -64,7 +64,6 @@
final CellDataState state = (CellDataState) s;
super.onRestoreInstanceState(state.getSuperState());
mChecked = state.mChecked;
- mMultiSimDialog = state.mMultiSimDialog;
if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
mSubId = state.mSubId;
setKey(getKey() + mSubId);
@@ -76,7 +75,6 @@
protected Parcelable onSaveInstanceState() {
final CellDataState state = new CellDataState(super.onSaveInstanceState());
state.mChecked = mChecked;
- state.mMultiSimDialog = mMultiSimDialog;
state.mSubId = mSubId;
return state;
}
@@ -137,6 +135,7 @@
@Override
protected void performClick(View view) {
final Context context = getContext();
+ // TODO (b/123905421): Clean up dead code path
FeatureFactory.getFactory(context).getMetricsFeatureProvider()
.action(context, SettingsEnums.ACTION_CELL_DATA_TOGGLE, !mChecked);
final SubscriptionInfo currentSir = getActiveSubscriptionInfo(mSubId);
@@ -177,11 +176,7 @@
@Override
protected void onPrepareDialogBuilder(Builder builder,
DialogInterface.OnClickListener listener) {
- if (mMultiSimDialog) {
- showMultiSimDialog(builder, listener);
- } else {
- showDisableDialog(builder, listener);
- }
+ showDisableDialog(builder, listener);
}
private void showDisableDialog(Builder builder,
@@ -192,6 +187,7 @@
.setNegativeButton(android.R.string.cancel, null);
}
+ // TODO (b/123905421): Clean up dead code path
private void showMultiSimDialog(Builder builder,
DialogInterface.OnClickListener listener) {
final SubscriptionInfo currentSir = getActiveSubscriptionInfo(mSubId);
@@ -223,14 +219,8 @@
if (which != DialogInterface.BUTTON_POSITIVE) {
return;
}
- if (mMultiSimDialog) {
- getProxySubscriptionManager().get().setDefaultDataSubId(mSubId);
- setMobileDataEnabled(true);
- disableDataForOtherSubscriptions(mSubId);
- } else {
- // TODO: extend to modify policy enabled flag.
- setMobileDataEnabled(false);
- }
+ // TODO: extend to modify policy enabled flag.
+ setMobileDataEnabled(false);
}
@VisibleForTesting
@@ -256,7 +246,6 @@
public static class CellDataState extends BaseSavedState {
public int mSubId;
public boolean mChecked;
- public boolean mMultiSimDialog;
public CellDataState(Parcelable base) {
super(base);
@@ -265,7 +254,6 @@
public CellDataState(Parcel source) {
super(source);
mChecked = source.readByte() != 0;
- mMultiSimDialog = source.readByte() != 0;
mSubId = source.readInt();
}
@@ -273,7 +261,6 @@
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeByte((byte) (mChecked ? 1 : 0));
- dest.writeByte((byte) (mMultiSimDialog ? 1 : 0));
dest.writeInt(mSubId);
}
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index 9d9bf9c..af841b5 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -27,6 +27,7 @@
import android.text.TextUtils;
import android.text.format.Formatter;
import android.text.style.RelativeSizeSpan;
+import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
@@ -95,7 +96,19 @@
}
boolean hasWifiRadio = DataUsageUtils.hasWifiRadio(context);
if (hasMobileData) {
- addMobileSection(defaultSubId);
+ List<SubscriptionInfo> subscriptions =
+ services.mSubscriptionManager.getActiveSubscriptionInfoList();
+ if (subscriptions == null || subscriptions.size() == 0) {
+ addMobileSection(defaultSubId);
+ }
+ for (int i = 0; subscriptions != null && i < subscriptions.size(); i++) {
+ SubscriptionInfo subInfo = subscriptions.get(i);
+ if (subscriptions.size() > 1) {
+ addMobileSection(subInfo.getSubscriptionId(), subInfo);
+ } else {
+ addMobileSection(subInfo.getSubscriptionId());
+ }
+ }
if (hasActiveSubscription() && hasWifiRadio) {
// If the device has active SIM, the data usage section shows usage for mobile,
// and the WiFi section is added if there is a WiFi radio - legacy behavior.
diff --git a/src/com/android/settings/development/BluetoothSnoopLogPreferenceController.java b/src/com/android/settings/development/BluetoothSnoopLogPreferenceController.java
index d698436..58550c9 100644
--- a/src/com/android/settings/development/BluetoothSnoopLogPreferenceController.java
+++ b/src/com/android/settings/development/BluetoothSnoopLogPreferenceController.java
@@ -44,6 +44,11 @@
@VisibleForTesting
static final int BTSNOOP_LOG_MODE_FULL_INDEX = 2;
@VisibleForTesting
+ static final int BTSNOOP_LOG_MODE_SNOOPHEADERSFILTERED_INDEX = 3;
+ @VisibleForTesting
+ static final int BTSNOOP_LOG_MODE_MEDIAPKTSFILTERED_INDEX = 4;
+ @VisibleForTesting
+
static final String BLUETOOTH_BTSNOOP_LOG_MODE_PROPERTY = "persist.bluetooth.btsnooplogmode";
private final String[] mListValues;
@@ -97,8 +102,13 @@
break;
}
}
- listPreference.setValue(mListValues[index]);
- listPreference.setSummary(mListEntries[index]);
+ if( index < mListValues.length && index < mListEntries.length ) {
+ listPreference.setValue(mListValues[index]);
+ listPreference.setSummary(mListEntries[index]);
+ } else {
+ Log.e(TAG, "missing some entries in xml file"
+ + "\t some options in developer options will not be shown until added in xml file");
+ }
}
@Override
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 945970e..43e9b4d 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -467,6 +467,7 @@
controllers.add(new LogPersistPreferenceController(context, fragment, lifecycle));
controllers.add(new CameraLaserSensorPreferenceController(context));
controllers.add(new WifiDisplayCertificationPreferenceController(context));
+ controllers.add(new WifiCoverageExtendPreferenceController(context));
controllers.add(new WifiVerboseLoggingPreferenceController(context));
controllers.add(new WifiScanThrottlingPreferenceController(context));
controllers.add(new WifiEnhancedMacRandomizationPreferenceController(context));
@@ -563,6 +564,7 @@
@Override
public void onBluetoothHDAudioEnabled(boolean enabled) {
+ Log.d(TAG, "onBluetoothHDAudioEnabled: " + enabled);
for (AbstractPreferenceController controller : mPreferenceControllers) {
if (controller instanceof AbstractBluetoothDialogPreferenceController) {
((AbstractBluetoothDialogPreferenceController) controller).onHDAudioEnabled(
diff --git a/src/com/android/settings/development/WifiCoverageExtendPreferenceController.java b/src/com/android/settings/development/WifiCoverageExtendPreferenceController.java
new file mode 100644
index 0000000..9f974ca
--- /dev/null
+++ b/src/com/android/settings/development/WifiCoverageExtendPreferenceController.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.android.settings.development;
+
+import android.content.Context;
+import android.net.wifi.WifiManager;
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.SwitchPreference;
+import androidx.preference.Preference;
+
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+
+public class WifiCoverageExtendPreferenceController extends DeveloperOptionsPreferenceController
+ implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
+
+ private static final String WIFI_COVERAGE_EXTEND_KEY = "wifi_coverage_extend";
+
+ private final WifiManager mWifiManager;
+
+ public WifiCoverageExtendPreferenceController(Context context) {
+ super(context);
+
+ mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return WIFI_COVERAGE_EXTEND_KEY;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ final boolean isEnabled = (Boolean) newValue;
+ mWifiManager.enableWifiCoverageExtendFeature(isEnabled);
+ return true;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ final boolean enabled = mWifiManager.isWifiCoverageExtendFeatureEnabled();
+ ((SwitchPreference) mPreference).setChecked(enabled);
+
+ }
+
+ @Override
+ protected void onDeveloperOptionsSwitchDisabled() {
+ super.onDeveloperOptionsSwitchDisabled();
+ mWifiManager.enableWifiCoverageExtendFeature(false);
+ ((SwitchPreference) mPreference).setChecked(false);
+ }
+}
diff --git a/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java b/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java
index 6bc9175..5e6b806 100644
--- a/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java
+++ b/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java
@@ -36,7 +36,9 @@
private static final String TAG = "AbstractBtDlgCtr";
- protected static final int[] CODEC_TYPES = {BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC,
+ protected static final int[] CODEC_TYPES = {BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_TWSP,
+ BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC,
+ BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_ADAPTIVE,
BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD,
BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX,
BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC,
@@ -222,6 +224,7 @@
Log.d(TAG, "Unable to get highest codec. Configs are empty");
return BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID;
}
+ Log.d(TAG, "CODEC_TYPES len: " + CODEC_TYPES.length + " codec_config len: " + configs.length);
for (int i = 0; i < CODEC_TYPES.length; i++) {
for (int j = 0; j < configs.length; j++) {
if ((configs[j].getCodecType() == CODEC_TYPES[i])) {
diff --git a/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreference.java b/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreference.java
index 6a733f3..6178ed1 100644
--- a/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreference.java
+++ b/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreference.java
@@ -22,12 +22,16 @@
import com.android.settings.R;
+import android.util.Log;
+
/**
* Dialog preference to set the Bluetooth A2DP config of codec
*/
public class BluetoothCodecDialogPreference extends BaseBluetoothDialogPreference implements
RadioGroup.OnCheckedChangeListener {
+ private static final String TAG = "BtCodecDlgPref";
+
public BluetoothCodecDialogPreference(Context context) {
super(context);
initialize(context);
@@ -60,13 +64,19 @@
mRadioButtonIds.add(R.id.bluetooth_audio_codec_aac);
mRadioButtonIds.add(R.id.bluetooth_audio_codec_aptx);
mRadioButtonIds.add(R.id.bluetooth_audio_codec_aptx_hd);
+ mRadioButtonIds.add(R.id.bluetooth_audio_codec_aptx_adaptive);
mRadioButtonIds.add(R.id.bluetooth_audio_codec_ldac);
+ mRadioButtonIds.add(R.id.bluetooth_audio_codec_aptx_twsp);
String[] stringArray = context.getResources().getStringArray(
R.array.bluetooth_a2dp_codec_titles);
+
+ Log.e(TAG, "a2dp_codec_titles array length: " + stringArray.length);
for (int i = 0; i < stringArray.length; i++) {
mRadioButtonStrings.add(stringArray[i]);
}
+
stringArray = context.getResources().getStringArray(R.array.bluetooth_a2dp_codec_summaries);
+ Log.e(TAG, "a2dp_codec_summaries array length: " + stringArray.length);
for (int i = 0; i < stringArray.length; i++) {
mSummaryStrings.add(stringArray[i]);
}
diff --git a/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java b/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java
index a0af268..dc326fe 100644
--- a/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java
+++ b/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java
@@ -62,6 +62,7 @@
@Override
public void onHDAudioEnabled(boolean enabled) {
+ Log.d(TAG, " onHDAudioEnabled: " + enabled);
if (!enabled) {
// If option codec is disabled, SBC is the only only one available codec.
onIndexUpdated(convertCfgToBtnIndex(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC));
@@ -125,6 +126,14 @@
codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC;
codecPriorityValue = BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST;
break;
+ case 6:
+ codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_ADAPTIVE;
+ codecPriorityValue = BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST;
+ break;
+ case 7:
+ codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_TWSP;
+ codecPriorityValue = BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST;
+ break;
default:
break;
}
@@ -179,9 +188,15 @@
case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD:
index = 4;
break;
+ case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_ADAPTIVE:
+ index = 6;
+ break;
case BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC:
index = 5;
break;
+ case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_TWSP:
+ index = 7;
+ break;
default:
Log.e(TAG, "Unsupported config:" + config);
break;
diff --git a/src/com/android/settings/development/bluetooth/BluetoothHDAudioPreferenceController.java b/src/com/android/settings/development/bluetooth/BluetoothHDAudioPreferenceController.java
index d4ca4e5..6481c75 100644
--- a/src/com/android/settings/development/bluetooth/BluetoothHDAudioPreferenceController.java
+++ b/src/com/android/settings/development/bluetooth/BluetoothHDAudioPreferenceController.java
@@ -81,6 +81,7 @@
return true;
}
final boolean enabled = (Boolean) newValue;
+ Log.e(TAG, "onPreferenceChange: " + enabled);
final int prefValue = enabled
? BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED
: BluetoothA2dp.OPTIONAL_CODECS_PREF_DISABLED;
diff --git a/src/com/android/settings/development/bluetooth/BluetoothQualityDialogPreferenceController.java b/src/com/android/settings/development/bluetooth/BluetoothQualityDialogPreferenceController.java
index 4b38e11..f4d6857 100644
--- a/src/com/android/settings/development/bluetooth/BluetoothQualityDialogPreferenceController.java
+++ b/src/com/android/settings/development/bluetooth/BluetoothQualityDialogPreferenceController.java
@@ -105,7 +105,8 @@
@Override
public void onHDAudioEnabled(boolean enabled) {
- mPreference.setEnabled(false);
+ Log.d(TAG, "onHDAudioEnabled: " + enabled);
+ mPreference.setEnabled(enabled);
}
@VisibleForTesting
diff --git a/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
index 6ada11b..42aeede 100644
--- a/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
@@ -29,6 +29,7 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
+import com.android.settings.Utils;
import com.android.settings.bluetooth.BluetoothLengthDeviceNameFilter;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.widget.ValidatedEditTextPreference;
@@ -75,6 +76,9 @@
private void initializeDeviceName() {
mDeviceName = Settings.Global.getString(mContext.getContentResolver(),
Settings.Global.DEVICE_NAME);
+ if (Utils.isSupportCTPA(mContext)) {
+ mDeviceName = Utils.getString(mContext, Utils.KEY_DEVICE_NAME);
+ }
if (mDeviceName == null) {
mDeviceName = Build.MODEL;
}
@@ -135,6 +139,10 @@
private void setSettingsGlobalDeviceName(String deviceName) {
Settings.Global.putString(mContext.getContentResolver(), Settings.Global.DEVICE_NAME,
deviceName);
+ if (Utils.isSupportCTPA(mContext)) {
+ Settings.Global.putString(mContext.getContentResolver(), Utils.KEY_DEVICE_NAME,
+ deviceName);
+ }
}
private void setBluetoothDeviceName(String deviceName) {
diff --git a/src/com/android/settings/deviceinfo/HardwareInfoPreferenceController.java b/src/com/android/settings/deviceinfo/HardwareInfoPreferenceController.java
index 7ee6f89..6913f93 100644
--- a/src/com/android/settings/deviceinfo/HardwareInfoPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/HardwareInfoPreferenceController.java
@@ -22,6 +22,7 @@
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
+import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.DeviceInfoUtils;
@@ -49,6 +50,19 @@
@Override
public CharSequence getSummary() {
+ if (Utils.isSupportCTPA(mContext)) {
+ String modelName = Utils.getString(mContext, Utils.KEY_MODEL);
+ if (null == modelName || modelName.isEmpty()) {
+ modelName = getDeviceModel();
+ }
+ String hardwareVersion = Utils.getString(mContext, Utils.KEY_HARDWARE_VERSION);
+ if (null == hardwareVersion || hardwareVersion.isEmpty()) {
+ hardwareVersion = mContext.getResources().getString(R.string.device_info_default);
+ }
+ return mContext.getResources().getString(R.string.model_hardware_summary,
+ modelName, hardwareVersion);
+ }
+
return mContext.getResources().getString(R.string.model_summary, getDeviceModel());
}
diff --git a/src/com/android/settings/deviceinfo/SoftwareVersionPreferenceController.java b/src/com/android/settings/deviceinfo/SoftwareVersionPreferenceController.java
new file mode 100755
index 0000000..79482c0
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/SoftwareVersionPreferenceController.java
@@ -0,0 +1,73 @@
+/*
+Copyright (c) 2019, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.android.settings.deviceinfo;
+
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.core.BasePreferenceController;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+public class SoftwareVersionPreferenceController extends BasePreferenceController {
+ private static final String PREF_KEY = "software_version";
+
+ public SoftwareVersionPreferenceController(Context context) {
+ super(context, PREF_KEY);
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ Preference preference = screen.findPreference(PREF_KEY);
+ final CharSequence version = getSummary();
+ preference.setSummary(version);
+ }
+
+ @Override
+ public CharSequence getSummary() {
+ String summary = mContext.getString(R.string.device_info_default);
+ String softwareVersion = Utils.getString(mContext, Utils.KEY_SOFTWARE_VERSION);
+ if (null != softwareVersion && !softwareVersion.isEmpty()) {
+ summary = softwareVersion;
+ }
+ return summary;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return Utils.isSupportCTPA(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return PREF_KEY;
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/deviceinfo/StorageSizePreferenceController.java b/src/com/android/settings/deviceinfo/StorageSizePreferenceController.java
new file mode 100755
index 0000000..36f078d
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/StorageSizePreferenceController.java
@@ -0,0 +1,93 @@
+/*
+Copyright (c) 2019, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.android.settings.deviceinfo;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.AbstractPreferenceController;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+public class StorageSizePreferenceController extends AbstractPreferenceController implements
+ PreferenceControllerMixin {
+ private static final String LOG_TAG = "StorageSizePreferenceController";
+ private final static String KEY_STORAGE_TOTAL_SIZE = "key_storage_total_size";
+
+ public StorageSizePreferenceController(Context context) {
+ super(context);
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return KEY_STORAGE_TOTAL_SIZE;
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return Utils.isSupportCTPA(mContext);
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ Preference ramSizePreference = screen.findPreference(getPreferenceKey());
+ if (!isAvailable() || null == ramSizePreference || !ramSizePreference.isVisible()) {
+ return;
+ }
+ String ramSize = Utils.getString(mContext, Utils.KEY_RAM_TOTAL_SIZE);
+ Log.d(LOG_TAG, "displayPreference: ramSize = " + ramSize);
+ if (null != ramSize && !ramSize.isEmpty()) {
+ ramSizePreference.setSummary(ramSize);
+ } else {
+ ramSizePreference.setSummary(mContext.getString(R.string.device_info_default));
+ }
+
+ final Preference romSizePreference = createNewPreference(screen.getContext());
+ romSizePreference.setOrder(ramSizePreference.getOrder() + 1);
+ romSizePreference.setKey(KEY_STORAGE_TOTAL_SIZE + 1);
+ screen.addPreference(romSizePreference);
+ romSizePreference.setVisible(true);
+ romSizePreference.setTitle(mContext.getResources().getString(R.string.rom_total_size));
+ String romSize = Utils.getString(mContext, Utils.KEY_ROM_TOTAL_SIZE);
+ Log.d(LOG_TAG, "displayPreference: romSize = " + romSize);
+ if (null != romSize && !romSize.isEmpty()) {
+ romSizePreference.setSummary(romSize);
+ } else {
+ romSizePreference.setSummary(mContext.getString(R.string.device_info_default));
+ }
+ }
+
+ private Preference createNewPreference(Context context) {
+ return new Preference(context);
+ }
+}
diff --git a/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java b/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
old mode 100644
new mode 100755
index 88968b3..b6266b3
--- a/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java
@@ -93,21 +93,24 @@
storage.partitionPrivate(activity.mDisk.getId());
publishProgress(40);
- final VolumeInfo privateVol = activity.findFirstVolume(TYPE_PRIVATE, 25);
+ final VolumeInfo privateVol = activity.findFirstVolume(TYPE_PRIVATE, 50);
final CompletableFuture<PersistableBundle> result = new CompletableFuture<>();
- storage.benchmark(privateVol.getId(), new IVoldTaskListener.Stub() {
- @Override
- public void onStatus(int status, PersistableBundle extras) {
- // Map benchmark 0-100% progress onto 40-80%
- publishProgress(40 + ((status * 40) / 100));
- }
+ if(null != privateVol) {
+ storage.benchmark(privateVol.getId(), new IVoldTaskListener.Stub() {
+ @Override
+ public void onStatus(int status, PersistableBundle extras) {
+ // Map benchmark 0-100% progress onto 40-80%
+ publishProgress(40 + ((status * 40) / 100));
+ }
- @Override
- public void onFinished(int status, PersistableBundle extras) {
- result.complete(extras);
- }
- });
- mPrivateBench = result.get(60, TimeUnit.SECONDS).getLong("run", Long.MAX_VALUE);
+ @Override
+ public void onFinished(int status, PersistableBundle extras) {
+ result.complete(extras);
+ }
+ });
+ mPrivateBench = result.get(60, TimeUnit.SECONDS).getLong("run",
+ Long.MAX_VALUE);
+ }
// If we just adopted the device that had been providing
// physical storage, then automatically move storage to the
diff --git a/src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java b/src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java
index c700596..8b0b4ec 100644
--- a/src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/WifiMacAddressPreferenceController.java
@@ -17,11 +17,16 @@
package com.android.settings.deviceinfo;
import android.content.Context;
+import android.net.wifi.WifiInfo;
+import android.util.Log;
import com.android.settings.R;
+import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.deviceinfo.AbstractWifiMacAddressPreferenceController;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
/**
* Concrete subclass of WIFI MAC address preference controller
@@ -37,5 +42,25 @@
return mContext.getResources().getBoolean(R.bool.config_show_wifi_mac_address);
}
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ if (Utils.isSupportCTPA(mContext)) {
+ Preference macAddressPreference = screen.findPreference(getPreferenceKey());
+ CharSequence oldValue = macAddressPreference.getSummary();
+ String macAddress = Utils.getString(mContext, Utils.KEY_WIFI_MAC_ADDRESS);
+ String unAvailable = mContext.getString(
+ com.android.settingslib.R.string.status_unavailable);
+ Log.d(TAG, "displayPreference: macAddress = " + macAddress
+ + " oldValue = " + oldValue + " unAvailable = " + unAvailable);
+ if (null == macAddress || macAddress.isEmpty()) {
+ macAddress = unAvailable;
+ }
+ if (null != oldValue && (WifiInfo.DEFAULT_MAC_ADDRESS.equals(oldValue) ||
+ unAvailable.equals(oldValue))) {
+ macAddressPreference.setSummary(macAddress);
+ }
+ }
+ }
// This space intentionally left blank
}
diff --git a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
index 4af5d79..31c4f54 100644
--- a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
+++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
@@ -37,6 +37,8 @@
import com.android.settings.deviceinfo.ManualPreferenceController;
import com.android.settings.deviceinfo.RegulatoryInfoPreferenceController;
import com.android.settings.deviceinfo.SafetyInfoPreferenceController;
+import com.android.settings.deviceinfo.SoftwareVersionPreferenceController;
+import com.android.settings.deviceinfo.StorageSizePreferenceController;
import com.android.settings.deviceinfo.UptimePreferenceController;
import com.android.settings.deviceinfo.WifiMacAddressPreferenceController;
import com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController;
@@ -113,6 +115,8 @@
controllers.add(new FeedbackPreferenceController(fragment, context));
controllers.add(new FccEquipmentIdPreferenceController(context));
controllers.add(new UptimePreferenceController(context, lifecycle));
+ controllers.add(new SoftwareVersionPreferenceController(context));
+ controllers.add(new StorageSizePreferenceController(context));
return controllers;
}
diff --git a/src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionPreferenceController.java b/src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionPreferenceController.java
index dd3d560..1507ddc 100644
--- a/src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/firmwareversion/BasebandVersionPreferenceController.java
@@ -29,9 +29,11 @@
@VisibleForTesting
static final String BASEBAND_PROPERTY = "gsm.version.baseband";
+ private final Context mContext;
public BasebandVersionPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
+ mContext = context;
}
@Override
@@ -41,6 +43,16 @@
@Override
public CharSequence getSummary() {
+ if (Utils.isSupportCTPA(mContext.getApplicationContext())) {
+ String baseBands = SystemProperties.get(BASEBAND_PROPERTY,
+ mContext.getString(R.string.device_info_default));
+ if (null != baseBands) {
+ String[] baseBandArray = baseBands.split(",");
+ if ((baseBandArray != null) && (baseBandArray.length > 0)) {
+ return baseBandArray[0];
+ }
+ }
+ }
return SystemProperties.get(BASEBAND_PROPERTY,
mContext.getString(R.string.device_info_default));
}
diff --git a/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceController.java b/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceController.java
index 955c60c..dc02b1d 100644
--- a/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceController.java
@@ -20,6 +20,7 @@
import android.os.SystemProperties;
import com.android.settings.R;
+import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.slices.Sliceable;
@@ -48,6 +49,12 @@
@Override
public CharSequence getSummary() {
+ if (Utils.isSupportCTPA(mContext)) {
+ String hardwareVersion = Utils.getString(mContext, Utils.KEY_HARDWARE_VERSION);
+ if (null != hardwareVersion && !hardwareVersion.isEmpty()) {
+ return hardwareVersion;
+ }
+ }
return SystemProperties.get("ro.boot.hardware.revision");
}
}
diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
old mode 100644
new mode 100755
index 967eea6..caee987
--- a/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoPreferenceController.java
@@ -32,7 +32,7 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.slices.Sliceable;
-import com.android.settingslib.Utils;
+import com.android.settings.Utils;
import java.util.ArrayList;
import java.util.List;
@@ -76,6 +76,53 @@
mPreferenceList.add(multiSimPreference);
updatePreference(multiSimPreference, simSlotNumber);
}
+
+ final int phoneCount = mTelephonyManager.getPhoneCount();
+ if (Utils.isSupportCTPA(mContext) && phoneCount >= 2) {
+ final int slot0PhoneType = mTelephonyManager.getCurrentPhoneTypeForSlot(0);
+ final int slot1PhoneType = mTelephonyManager.getCurrentPhoneTypeForSlot(1);
+ if (PHONE_TYPE_CDMA != slot0PhoneType && PHONE_TYPE_CDMA != slot1PhoneType) {
+ addPreferenceNotInList(screen, 0, imeiPreferenceOrder + phoneCount,
+ getPreferenceKey() + phoneCount, true);
+ } else if (PHONE_TYPE_CDMA == slot0PhoneType){
+ addPreferenceNotInList(screen, 0, imeiPreferenceOrder + phoneCount,
+ getPreferenceKey() + phoneCount, false);
+ } else if (PHONE_TYPE_CDMA == slot1PhoneType) {
+ addPreferenceNotInList(screen, 1, imeiPreferenceOrder + phoneCount,
+ getPreferenceKey() + phoneCount, false);
+ }
+ }
+ }
+
+ private void addPreferenceNotInList(PreferenceScreen screen, int slotNumber, int order,
+ String key, boolean isCDMAPhone) {
+ final Preference multiSimPreference = createNewPreference(screen.getContext());
+ multiSimPreference.setOrder(order);
+ multiSimPreference.setKey(key);
+ screen.addPreference(multiSimPreference);
+ if (isCDMAPhone) {
+ multiSimPreference.setTitle(getTitleForCdmaPhone(slotNumber));
+ multiSimPreference.setSummary(mTelephonyManager.getMeid(slotNumber));
+ } else {
+ multiSimPreference.setTitle(getTitleForGsmPhone(slotNumber));
+ multiSimPreference.setSummary(mTelephonyManager.getImei(slotNumber));
+ }
+ }
+
+ private void addPreference(PreferenceScreen screen, int slotNumber, int order,
+ String key, boolean isCDMAPhone) {
+ final Preference multiSimPreference = createNewPreference(screen.getContext());
+ multiSimPreference.setOrder(order);
+ multiSimPreference.setKey(key);
+ screen.addPreference(multiSimPreference);
+ mPreferenceList.add(multiSimPreference);
+ if (isCDMAPhone) {
+ multiSimPreference.setTitle(getTitleForCdmaPhone(slotNumber));
+ multiSimPreference.setSummary(mTelephonyManager.getMeid(slotNumber));
+ } else {
+ multiSimPreference.setTitle(getTitleForGsmPhone(slotNumber));
+ multiSimPreference.setSummary(mTelephonyManager.getImei(slotNumber));
+ }
}
@Override
@@ -97,6 +144,12 @@
private CharSequence getSummary(int simSlot) {
final int phoneType = getPhoneType(simSlot);
+ if (Utils.isSupportCTPA(mContext)) {
+ // only can obtain the MEID by slot 0
+ if (PHONE_TYPE_CDMA == phoneType) {
+ simSlot = 0;
+ }
+ }
return phoneType == PHONE_TYPE_CDMA ? mTelephonyManager.getMeid(simSlot)
: mTelephonyManager.getImei(simSlot);
}
@@ -108,6 +161,10 @@
return false;
}
+ if (Utils.isSupportCTPA(mContext)) {
+ return true;
+ }
+
ImeiInfoDialogFragment.show(mFragment, simSlot, preference.getTitle().toString());
return true;
}
@@ -150,6 +207,9 @@
}
private int getPhoneType(int slotIndex) {
+ if (Utils.isSupportCTPA(mContext)) {
+ return mTelephonyManager.getCurrentPhoneTypeForSlot(slotIndex);
+ }
SubscriptionInfo subInfo = SubscriptionManager.from(mContext)
.getActiveSubscriptionInfoForSimSlotIndex(slotIndex);
return mTelephonyManager.getCurrentPhoneType(subInfo != null ? subInfo.getSubscriptionId()
diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
index 370bdfb..9858ad2 100644
--- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
+++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
@@ -152,6 +152,7 @@
private final Context mContext;
private boolean mShowLatestAreaInfo;
+ private boolean mIsRegisteredListener = false;
private final BroadcastReceiver mAreaInfoReceiver = new BroadcastReceiver() {
@Override
@@ -282,11 +283,22 @@
mContext.registerReceiver(mAreaInfoReceiver,
new IntentFilter(CellBroadcastIntents.ACTION_AREA_INFO_UPDATED));
}
+
+ mIsRegisteredListener = true;
}
@Override
public void onPause() {
if (mSubscriptionInfo == null) {
+ if (mIsRegisteredListener) {
+ mSubscriptionManager.removeOnSubscriptionsChangedListener(
+ mOnSubscriptionsChangedListener);
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+ if (mShowLatestAreaInfo) {
+ mContext.unregisterReceiver(mAreaInfoReceiver);
+ }
+ mIsRegisteredListener = false;
+ }
return;
}
diff --git a/src/com/android/settings/location/AgpsPreferenceController.java b/src/com/android/settings/location/AgpsPreferenceController.java
new file mode 100755
index 0000000..1504668
--- /dev/null
+++ b/src/com/android/settings/location/AgpsPreferenceController.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.location;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.provider.Settings;
+
+import androidx.preference.CheckBoxPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+
+public class AgpsPreferenceController extends LocationBasePreferenceController {
+ private static final String KEY_ASSISTED_GPS = "assisted_gps";
+
+ private CheckBoxPreference mAgpsPreference;
+
+ public AgpsPreferenceController(Context context, String key) {
+ super(context, key);
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return KEY_ASSISTED_GPS;
+ }
+
+ @AvailabilityStatus
+ public int getAvailabilityStatus() {
+ return mContext.getResources().getBoolean(R.bool.config_agps_enabled)
+ ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mAgpsPreference =
+ (CheckBoxPreference) screen.findPreference(KEY_ASSISTED_GPS);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ if (mAgpsPreference != null) {
+ mAgpsPreference.setChecked(Settings.Global.getInt(
+ mContext.getContentResolver(), Settings.Global.ASSISTED_GPS_ENABLED, 0) == 1);
+ }
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(Preference preference) {
+ if (KEY_ASSISTED_GPS.equals(preference.getKey())) {
+ final ContentResolver cr = mContext.getContentResolver();
+ final boolean switchState = mAgpsPreference.isChecked();
+ Settings.Global.putInt(cr, Settings.Global.ASSISTED_GPS_ENABLED,
+ switchState ? 1 : 0);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onLocationModeChanged(int mode, boolean restricted) {}
+}
diff --git a/src/com/android/settings/location/AppSettingsInjector.java b/src/com/android/settings/location/AppSettingsInjector.java
index bea623e..88a9a2f 100644
--- a/src/com/android/settings/location/AppSettingsInjector.java
+++ b/src/com/android/settings/location/AppSettingsInjector.java
@@ -19,9 +19,19 @@
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
+import android.content.pm.ResolveInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.os.UserHandle;
+
+import android.location.SettingInjectorService;
import androidx.preference.Preference;
+import java.io.IOException;
+
+import org.xmlpull.v1.XmlPullParserException;
+
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.RestrictedAppPreference;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -43,11 +53,30 @@
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
}
+ /**
+ * Returns the settings parsed from the attributes of the
+ * {@link SettingInjectorService#META_DATA_NAME} tag, or null.
+ *
+ * Duplicates some code from {@link android.content.pm.RegisteredServicesCache}.
+ */
+ @Override
+ protected InjectedSetting parseServiceInfo(ResolveInfo service, UserHandle userHandle,
+ PackageManager pm) throws XmlPullParserException, IOException {
+ InjectedSetting res = super.parseServiceInfo(service, userHandle, pm);
+ ServiceInfo si = service.serviceInfo;
+
+ if ((null != res) && (!DimmableIZatIconPreference.showIzat(mContext, si.packageName))) {
+ res = null;
+ }
+
+ return res;
+ }
+
@Override
protected Preference createPreference(Context prefContext, InjectedSetting setting) {
return TextUtils.isEmpty(setting.userRestriction)
- ? new AppPreference(prefContext)
- : new RestrictedAppPreference(prefContext, setting.userRestriction);
+ ? DimmableIZatIconPreference.getAppPreference(prefContext, setting)
+ : DimmableIZatIconPreference.getRestrictedAppPreference(prefContext, setting);
}
@Override
diff --git a/src/com/android/settings/location/DimmableIZatIconPreference.java b/src/com/android/settings/location/DimmableIZatIconPreference.java
new file mode 100644
index 0000000..be4f91b
--- /dev/null
+++ b/src/com/android/settings/location/DimmableIZatIconPreference.java
@@ -0,0 +1,227 @@
+/* Copyright (c) 2016, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
+
+package com.android.settings.location;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import androidx.preference.PreferenceViewHolder;
+import com.android.settingslib.location.InjectedSetting;
+import android.util.Log;
+import com.android.settingslib.widget.apppreference.AppPreference;
+import com.android.settings.widget.RestrictedAppPreference;
+import dalvik.system.DexClassLoader;
+import java.lang.ClassNotFoundException;
+import java.lang.ExceptionInInitializerError;
+import java.lang.IllegalAccessException;
+import java.lang.IllegalArgumentException;
+import java.lang.LinkageError;
+import java.lang.NoSuchFieldException;
+import java.lang.NoSuchMethodException;
+import java.lang.NullPointerException;
+import java.lang.SecurityException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import com.android.settings.R;
+
+public class DimmableIZatIconPreference {
+ private static final String TAG = "DimmableIZatIconPreference";
+ private static Class mXtProxyClz;
+ private static Class mNotifierClz;
+ private static Method mGetXtProxyMethod;
+ private static Method mGetConsentMethod;
+ private static Method mShowIzatMethod;
+ private static String mIzatPackage;
+ private static DexClassLoader mLoader;
+
+ private static void load(Context context) {
+ if (mLoader == null) {
+ try {
+ if (mXtProxyClz == null || mNotifierClz == null) {
+ mLoader = new DexClassLoader("/system_ext/framework/izat.xt.srv.jar",
+ context.getFilesDir().getAbsolutePath(),
+ null,
+ ClassLoader.getSystemClassLoader());
+ mXtProxyClz = Class.forName("com.qti.izat.XTProxy",
+ true,
+ mLoader);
+ mNotifierClz = Class.forName("com.qti.izat.XTProxy$Notifier",
+ true,
+ mLoader);
+ mIzatPackage = (String)mXtProxyClz.getField("IZAT_XT_PACKAGE").get(null);
+ mGetXtProxyMethod = mXtProxyClz.getMethod("getXTProxy",
+ Context.class,
+ mNotifierClz);
+ mGetConsentMethod = mXtProxyClz.getMethod("getUserConsent");
+ mShowIzatMethod = mXtProxyClz.getMethod("showIzat",
+ Context.class,
+ String.class);
+ }
+ } catch (NoSuchMethodException | NullPointerException | SecurityException |
+ NoSuchFieldException | LinkageError | IllegalAccessException |
+ ClassNotFoundException e) {
+ mXtProxyClz = null;
+ mNotifierClz = null;
+ mIzatPackage = null;
+ mGetXtProxyMethod = null;
+ mGetConsentMethod = null;
+ mShowIzatMethod = null;
+ e.printStackTrace();
+ }
+ }
+ }
+
+ static boolean showIzat(Context context, String packageName) {
+ load(context);
+ boolean show = true;
+ try {
+ if (mShowIzatMethod != null) {
+ show = (Boolean)mShowIzatMethod.invoke(null, context, packageName);
+ }
+ } catch (IllegalAccessException | IllegalArgumentException |
+ InvocationTargetException | ExceptionInInitializerError e) {
+ e.printStackTrace();
+ }
+ return show;
+ }
+
+ private static boolean isIzatPackage(Context context, InjectedSetting info) {
+ return (mIzatPackage != null && mIzatPackage.equals(info.packageName));
+ }
+
+ private static final int ICON_ALPHA_ENABLED = 255;
+ private static final int ICON_ALPHA_DISABLED = 102;
+
+ private static void dimIcon(AppPreference pref, boolean dimmed) {
+ Drawable icon = pref.getIcon();
+ if (icon != null) {
+ icon.mutate().setAlpha(dimmed ? ICON_ALPHA_DISABLED : ICON_ALPHA_ENABLED);
+ pref.setIcon(icon);
+ }
+ }
+
+ private static class IZatAppPreference extends AppPreference {
+ private boolean mChecked;
+ private Context mContext;
+ private IZatAppPreference(Context context) {
+ super(context);
+ mContext = context;
+ Object notifier = Proxy.newProxyInstance(mLoader,
+ new Class[] { mNotifierClz },
+ new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable {
+ if (method.getName().equals("userConsentNotify") &&
+ args[0] != null && args[0] instanceof Boolean) {
+ boolean consent = (Boolean)args[0];
+ if (mChecked != consent) {
+ mChecked = consent;
+ dimIcon(IZatAppPreference.this, !isEnabled() || !mChecked);
+ }
+ }
+ return null;
+ }});
+
+ try {
+ Object xt = mGetXtProxyMethod.invoke(null, context, notifier);
+ mChecked = (Boolean)mGetConsentMethod.invoke(xt);
+ } catch (IllegalAccessException | IllegalArgumentException |
+ InvocationTargetException | ExceptionInInitializerError e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public CharSequence getSummary() {
+ int resId;
+ if (!isEnabled() || !mChecked) {
+ resId = R.string.notification_toggle_off;
+ } else {
+ resId = R.string.notification_toggle_on;
+ }
+ return mContext.getString(resId);
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder view) {
+ super.onBindViewHolder(view);
+ DimmableIZatIconPreference.dimIcon(this, !isEnabled() || !mChecked);
+ }
+ }
+
+ private static class IZatRestrictedAppPreference extends RestrictedAppPreference {
+ private boolean mChecked;
+ private IZatRestrictedAppPreference(Context context, String userRestriction) {
+ super(context, userRestriction);
+ Object notifier = Proxy.newProxyInstance(mLoader,
+ new Class[] { mNotifierClz },
+ new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable {
+ if (method.getName().equals("userConsentNotify") &&
+ args[0] != null && args[0] instanceof Boolean) {
+ boolean consent = (Boolean)args[0];
+ if (mChecked != consent) {
+ mChecked = consent;
+ dimIcon(IZatRestrictedAppPreference.this, !isEnabled() || !mChecked);
+ }
+ }
+ return null;
+ }});
+
+ try {
+ Object xt = mGetXtProxyMethod.invoke(null, context, notifier);
+ mChecked = (Boolean)mGetConsentMethod.invoke(xt);
+ } catch (IllegalAccessException | IllegalArgumentException |
+ InvocationTargetException | ExceptionInInitializerError e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder view) {
+ super.onBindViewHolder(view);
+ DimmableIZatIconPreference.dimIcon(this, !isEnabled() || !mChecked);
+ }
+ }
+
+ static AppPreference getAppPreference(Context context, InjectedSetting info) {
+ return isIzatPackage(context, info) ?
+ new IZatAppPreference(context) :
+ new AppPreference(context);
+ }
+
+ static RestrictedAppPreference getRestrictedAppPreference(Context context, InjectedSetting info) {
+ return isIzatPackage(context, info) ?
+ new IZatRestrictedAppPreference(context, info.userRestriction) :
+ new RestrictedAppPreference(context, info.userRestriction);
+ }
+}
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index 26a4afd..f5de174 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -88,6 +88,7 @@
use(LocationFooterPreferenceController.class).init(this);
use(LocationForWorkPreferenceController.class).init(this);
use(LocationServiceForWorkPreferenceController.class).init(this);
+ use(AgpsPreferenceController.class).init(this);
}
@Override
diff --git a/src/com/android/settings/network/ApnEditor.java b/src/com/android/settings/network/ApnEditor.java
index f9eccfa..9ab30cc 100644
--- a/src/com/android/settings/network/ApnEditor.java
+++ b/src/com/android/settings/network/ApnEditor.java
@@ -54,6 +54,7 @@
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.utils.ThreadUtils;
+import com.android.settings.Utils;
import java.util.Arrays;
import java.util.HashSet;
@@ -148,6 +149,8 @@
private boolean mReadOnlyApn;
private Uri mCarrierUri;
+ private static final String APN_DEFALUT_VALUES_STRING_ARRAY = "apn_default_values_strings_array";
+
/**
* APN types for data connections. These are usage categories for an APN
* entry. One APN entry may support multiple APN types, eg, a single APN
@@ -228,6 +231,26 @@
Telephony.Carriers.USER_EDITABLE //24
};
+ private static final String[] sUIConfigurableItems = new String[] {
+ Telephony.Carriers.NAME,
+ Telephony.Carriers.APN,
+ Telephony.Carriers.PROXY,
+ Telephony.Carriers.PORT,
+ Telephony.Carriers.USER,
+ Telephony.Carriers.SERVER,
+ Telephony.Carriers.PASSWORD,
+ Telephony.Carriers.MMSC,
+ Telephony.Carriers.MMSPROXY,
+ Telephony.Carriers.MMSPORT,
+ Telephony.Carriers.AUTH_TYPE,
+ Telephony.Carriers.TYPE,
+ Telephony.Carriers.PROTOCOL,
+ Telephony.Carriers.CARRIER_ENABLED,
+ Telephony.Carriers.BEARER,
+ Telephony.Carriers.BEARER_BITMASK,
+ Telephony.Carriers.ROAMING_PROTOCOL,
+ };
+
private static final int ID_INDEX = 0;
@VisibleForTesting
static final int NAME_INDEX = 1;
@@ -309,6 +332,9 @@
mApnData = getApnDataFromUri(uri);
} else {
mApnData = new ApnData(sProjection.length);
+ if (action.equals(Intent.ACTION_INSERT)) {
+ setDefaultData();
+ }
}
final boolean isUserEdited = mApnData.getInteger(EDITED_INDEX,
@@ -596,6 +622,10 @@
mMvnoType.setValue(mMvnoTypeStr);
mMvnoMatchData.setText(mMvnoMatchDataStr);
}
+ String localizedName = Utils.getLocalizedName(getActivity(), mApnData.getString(NAME_INDEX));
+ if (!TextUtils.isEmpty(localizedName)) {
+ mName.setText(localizedName);
+ }
}
mName.setSummary(checkNull(mName.getText()));
@@ -726,6 +756,11 @@
telephonyManager = telephonyManagerForSubId;
}
mMvnoMatchData.setText(telephonyManager.getGroupIdLevel1());
+ } else if (values[mvnoIndex].equals("ICCID")) {
+ if (mMvnoMatchDataStr != null) {
+ Log.d(TAG, "mMvnoMatchDataStr: " + mMvnoMatchDataStr);
+ mMvnoMatchData.setText(mMvnoMatchDataStr);
+ }
}
}
@@ -1214,6 +1249,51 @@
return sNotSet.equals(value) ? null : value;
}
+ private void setDefaultData() {
+ CarrierConfigManager configManager = (CarrierConfigManager)
+ getSystemService(Context.CARRIER_CONFIG_SERVICE);
+ if (configManager != null) {
+ PersistableBundle b = configManager.getConfigForSubId(mSubId);
+ if (b != null) {
+ PersistableBundle defaultValues = b.getPersistableBundle(
+ APN_DEFALUT_VALUES_STRING_ARRAY);
+ if (defaultValues != null && !defaultValues.isEmpty()) {
+ Set<String> keys = defaultValues.keySet();
+ for (String key : keys) {
+ if (fieldValidate(key)) {
+ setAppData(key, defaultValues.get(key));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void setAppData(String key, Object object) {
+ int index = findIndexOfKey(key);
+ if (index >= 0) {
+ mApnData.setObject(index, object);
+ }
+ }
+
+ private int findIndexOfKey(String key) {
+ for(int i = 0; i < sProjection.length; i++) {
+ if (sProjection[i].equals(key)) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ private boolean fieldValidate(String field){
+ for(String tableField : sUIConfigurableItems){
+ if(tableField.equalsIgnoreCase(field))
+ return true;
+ }
+ Log.w(TAG, field + " is not configurable");
+ return false;
+ }
+
@VisibleForTesting
String getUserEnteredApnType() {
// if user has not specified a type, map it to "ALL APN TYPES THAT ARE NOT READ-ONLY"
@@ -1443,6 +1523,10 @@
String getString(int index) {
return (String) mData[index];
}
+
+ void setObject(int index, Object value) {
+ mData[index] = value;
+ }
}
private static int getBitmaskForTech(int radioTech) {
diff --git a/src/com/android/settings/network/ApnPreference.java b/src/com/android/settings/network/ApnPreference.java
index 63e2838..898a507 100755
--- a/src/com/android/settings/network/ApnPreference.java
+++ b/src/com/android/settings/network/ApnPreference.java
@@ -108,6 +108,13 @@
mSelectedKey = getKey();
}
+
+ // ApnPreference.mSelectedKey static variable is shared for MSim case,
+ // need be initialized according to preferred apn id per sub
+ public static void setSelectedKey(String preferredApnKey) {
+ mSelectedKey = preferredApnKey;
+ }
+
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.i(TAG, "ID: " + getKey() + " :" + isChecked);
if (mProtectFromCheckedChange) {
diff --git a/src/com/android/settings/network/ApnSettings.java b/src/com/android/settings/network/ApnSettings.java
index f7617fc..f5786b3 100755
--- a/src/com/android/settings/network/ApnSettings.java
+++ b/src/com/android/settings/network/ApnSettings.java
@@ -26,6 +26,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.res.Resources.NotFoundException;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
@@ -40,6 +41,7 @@
import android.telephony.CarrierConfigManager;
import android.telephony.PhoneStateListener;
import android.telephony.PreciseDataConnectionState;
+import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -53,12 +55,18 @@
import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
+import com.android.ims.ImsManager;
import com.android.settings.R;
import com.android.settings.RestrictedSettingsFragment;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+import com.android.settings.Utils;
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
public class ApnSettings extends RestrictedSettingsFragment
implements Preference.OnPreferenceChangeListener {
@@ -83,6 +91,8 @@
Telephony.Carriers.MVNO_TYPE,
Telephony.Carriers.MVNO_MATCH_DATA,
Telephony.Carriers.EDITED_STATUS,
+ Telephony.Carriers.BEARER,
+ Telephony.Carriers.BEARER_BITMASK,
};
private static final int ID_INDEX = 0;
@@ -92,6 +102,8 @@
private static final int MVNO_TYPE_INDEX = 4;
private static final int MVNO_MATCH_DATA_INDEX = 5;
private static final int EDITED_INDEX = 6;
+ private static final int BEARER_INDEX = 7;
+ private static final int BEARER_BITMASK_INDEX = 8;
private static final int MENU_NEW = Menu.FIRST;
private static final int MENU_RESTORE = Menu.FIRST + 1;
@@ -127,6 +139,16 @@
private boolean mAllowAddingApns;
private boolean mHidePresetApnDetails;
+ private String[] mHideApnsWithRule;
+ private String[] mHideApnsWithIccidRule;
+ private PersistableBundle mHideApnsGroupByIccid;
+ private final static String INCLUDE_COMMON_RULES = "include_common_rules";
+ private final static String APN_HIDE_RULE_STRINGS_ARRAY= "apn_hide_rule_strings_array";
+ private final static String APN_HIDE_RULE_STRINGS_WITH_ICCIDS_ARRAY = "apn_hide_rule_strings_with_iccids_array";
+
+ private final static String ACTION_VOLTE_ENABLED_STATE_CHANGED
+ = "org.codeaurora.intent.action.ACTION_ENHANCE_4G_SWITCH";
+
public ApnSettings() {
super(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS);
}
@@ -164,6 +186,12 @@
restartPhoneStateListener(mSubId);
}
fillList();
+ } else if (intent.getAction().equals(ACTION_VOLTE_ENABLED_STATE_CHANGED)) {
+ if (!mRestoreDefaultApnMode) {
+ fillList();
+ } else {
+ showDialog(DIALOG_RESTORE_DEFAULTAPN);
+ }
}
}
};
@@ -200,6 +228,9 @@
mPhoneId = SubscriptionUtil.getPhoneId(activity, mSubId);
mIntentFilter = new IntentFilter(
TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED);
+ if (Utils.isSupportCTPA(getActivity().getApplicationContext())) {
+ mIntentFilter.addAction(ACTION_VOLTE_ENABLED_STATE_CHANGED);
+ }
setIfOnlyAvailableForAdmins(true);
@@ -211,6 +242,14 @@
final PersistableBundle b = configManager.getConfigForSubId(mSubId);
mHideImsApn = b.getBoolean(CarrierConfigManager.KEY_HIDE_IMS_APN_BOOL);
mAllowAddingApns = b.getBoolean(CarrierConfigManager.KEY_ALLOW_ADDING_APNS_BOOL);
+
+ mHideApnsWithRule = b.getStringArray(APN_HIDE_RULE_STRINGS_ARRAY);
+ mHideApnsWithIccidRule = b.getStringArray(APN_HIDE_RULE_STRINGS_WITH_ICCIDS_ARRAY);
+ if(mSubscriptionInfo != null){
+ String iccid = mSubscriptionInfo.getIccId();
+ Log.d(TAG, "iccid: " + iccid);
+ mHideApnsGroupByIccid = b.getPersistableBundle(iccid);
+ }
if (mAllowAddingApns) {
final String[] readOnlyApnTypes = b.getStringArray(
CarrierConfigManager.KEY_READ_ONLY_APN_TYPES_STRING_ARRAY);
@@ -303,10 +342,18 @@
new StringBuilder("NOT (type='ia' AND (apn=\"\" OR apn IS NULL)) AND "
+ "user_visible!=0");
- if (mHideImsApn) {
+ int phoneId = SubscriptionManager.getPhoneId(subId);
+ Context appContext = getActivity().getApplicationContext();
+ boolean isVoLTEEnabled = ImsManager.getInstance(appContext, phoneId)
+ .isEnhanced4gLteModeSettingEnabledByUser();
+ if (mHideImsApn || (Utils.isSupportCTPA(appContext) && !isVoLTEEnabled)) {
where.append(" AND NOT (type='ims')");
}
+ appendFilter(where);
+
+ Log.d(TAG, "where = " + where.toString());
+
final Cursor cursor = getContentResolver().query(simApnUri,
CARRIERS_PROJECTION, where.toString(), null,
Telephony.Carriers.DEFAULT_SORT_ORDER);
@@ -319,9 +366,13 @@
final ArrayList<ApnPreference> mmsApnList = new ArrayList<ApnPreference>();
mSelectedKey = getSelectedApnKey();
+
+ // ApnPreference.mSelectedKey static variable is shared for MSim case,
+ // need be initialized according to preferred apn id per sub
+ ApnPreference.setSelectedKey(mSelectedKey);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
- final String name = cursor.getString(NAME_INDEX);
+ String name = cursor.getString(NAME_INDEX);
final String apn = cursor.getString(APN_INDEX);
final String key = cursor.getString(ID_INDEX);
final String type = cursor.getString(TYPES_INDEX);
@@ -329,6 +380,26 @@
mMvnoType = cursor.getString(MVNO_TYPE_INDEX);
mMvnoMatchData = cursor.getString(MVNO_MATCH_DATA_INDEX);
+ //Special requirement of some operators, need change APN name follow language.
+ String localizedName = Utils.getLocalizedName(getActivity(), cursor.getString(NAME_INDEX));
+
+ if (!TextUtils.isEmpty(localizedName)) {
+ name = localizedName;
+ }
+ int bearer = cursor.getInt(BEARER_INDEX);
+ int bearerBitMask = cursor.getInt(BEARER_BITMASK_INDEX);
+ int fullBearer = ServiceState.getBitmaskForTech(bearer) | bearerBitMask;
+ int radioTech = networkTypeToRilRidioTechnology(TelephonyManager.getDefault()
+ .getDataNetworkType(subId));
+ if (!ServiceState.bitmaskHasTech(fullBearer, radioTech)
+ && (bearer != 0 || bearerBitMask != 0)) {
+ // In OOS, show APN with bearer as default
+ if ((radioTech != ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) || (bearer == 0
+ && radioTech == ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN)) {
+ cursor.moveToNext();
+ continue;
+ }
+ }
final ApnPreference pref = new ApnPreference(getPrefContext());
pref.setKey(key);
@@ -342,7 +413,10 @@
pref.setSummary(apn);
}
- final boolean selectable = ((type == null) || !type.equals("mms"));
+ boolean selectable = ((type == null) || !type.equals("mms"));
+ if (isVoLTEEnabled && selectable && Utils.isSupportCTPA(appContext)) {
+ selectable = ((type == null) || !type.equals("ims"));
+ }
pref.setSelectable(selectable);
if (selectable) {
if ((mSelectedKey != null) && mSelectedKey.equals(key)) {
@@ -365,6 +439,150 @@
}
}
+ private void appendFilter(StringBuilder where){
+ boolean includeCommon = true;
+ if(mHideApnsGroupByIccid != null && !mHideApnsGroupByIccid.isEmpty()){
+ // APN hidden rules according to the specified iccid,
+ // it should be configured in CarrierConfig as below.
+ // <map name="12345">
+ // <string name="type">fota</string>
+ // <boolean name="include_common_rules" value="true"/>
+ // </map>
+ includeCommon = mHideApnsGroupByIccid.getBoolean(INCLUDE_COMMON_RULES, true);
+ Log.d(TAG, "apn hidden rules specified iccid, include common rule: " + includeCommon);
+ Set<String> keys = mHideApnsGroupByIccid.keySet();
+ for(String key : keys){
+ if(Utils.carrierTableFieldValidate(key)){
+ String value = mHideApnsGroupByIccid.getString(key);
+ if(value != null){
+ where.append(" AND " + key + " <> \"" + value + "\"");
+ }
+ }
+ }
+ }
+
+ // Some operator have special APN hidden rules group by iccids,
+ // it should be configured in CarrierConfig as below,
+ // it maybe overwrite some rules defined in common rules.
+ // <string-array name="apn_hide_rule_strings_with_iccids_array" num="6">
+ // <item value="iccid"/>
+ // <item value="1111,2222"/>
+ // <item value="type"/>
+ // <item value="ims,emergency"/>
+ // <item value="include_common_rules"/>
+ // <item value="true"/>
+ // </string-array>
+ if(mHideApnsWithIccidRule != null){
+ HashMap<String, String> ruleWithIccid = getApnRuleMap(mHideApnsWithIccidRule);
+ final String iccid = mSubscriptionInfo == null ? "" : mSubscriptionInfo.getIccId();
+ if(isOperatorIccid(ruleWithIccid, iccid)){
+ String s = ruleWithIccid.get(INCLUDE_COMMON_RULES);
+ includeCommon = !(s != null && s.equalsIgnoreCase(String.valueOf(false)));
+ Log.d(TAG, "apn hidden rules in iccids, include common rule: " + includeCommon);
+ filterWithKey(ruleWithIccid, where);
+ }
+ }
+
+ if(includeCommon){
+ // Common APN hidden rules,
+ // it should be configured in CarrierConfig as below.
+ // <string-array name="apn_default_values_strings_array" num="2">
+ // <item value="type"/>
+ // <item value="fota"/>
+ // </string-array>
+ if(mHideApnsWithRule != null){
+ HashMap<String, String> rule = getApnRuleMap(mHideApnsWithRule);
+ filterWithKey(rule, where);
+ }
+ }
+ }
+
+ private void filterWithKey(Map<String, String> rules, StringBuilder where) {
+ Set<String> fields = rules.keySet();
+ for(String field : fields){
+ if(Utils.carrierTableFieldValidate(field)){
+ String value = rules.get(field);
+ if(!TextUtils.isEmpty(value)){
+ String[] subValues = value.split(",");
+ for(String subValue : subValues){
+ where.append(" AND " + field + " <> \"" + subValue + "\"");
+ }
+ }
+ }
+ }
+ }
+
+ private HashMap<String, String> getApnRuleMap(String[] ruleArray) {
+ HashMap<String, String> rules = new HashMap<String, String>();
+ if (ruleArray != null) {
+ int length = ruleArray.length;
+ Log.d(TAG, "ruleArray size = " + length);
+ if (length > 0 && (length % 2 == 0)) {
+ for (int i = 0; i < length;) {
+ rules.put(ruleArray[i].toLowerCase(), ruleArray[i + 1]);
+ i += 2;
+ }
+ }
+ }
+ return rules;
+ }
+
+ private boolean isOperatorIccid(HashMap<String, String> ruleMap, String iccid) {
+ String valuesOfIccid = ruleMap.get("iccid");
+ if (!TextUtils.isEmpty(valuesOfIccid)) {
+ String[] iccids = valuesOfIccid.split(",");
+ for (String subIccid : iccids) {
+ if (iccid.startsWith(subIccid.trim())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private int networkTypeToRilRidioTechnology(int nt) {
+ switch(nt) {
+ case TelephonyManager.NETWORK_TYPE_GPRS:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_GPRS;
+ case TelephonyManager.NETWORK_TYPE_EDGE:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_EDGE;
+ case TelephonyManager.NETWORK_TYPE_UMTS:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_UMTS;
+ case TelephonyManager.NETWORK_TYPE_HSDPA:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA;
+ case TelephonyManager.NETWORK_TYPE_HSUPA:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA;
+ case TelephonyManager.NETWORK_TYPE_HSPA:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_HSPA;
+ case TelephonyManager.NETWORK_TYPE_CDMA:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_IS95B;
+ case TelephonyManager.NETWORK_TYPE_1xRTT:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT;
+ case TelephonyManager.NETWORK_TYPE_EVDO_0:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0;
+ case TelephonyManager.NETWORK_TYPE_EVDO_A:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A;
+ case TelephonyManager.NETWORK_TYPE_EVDO_B:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B;
+ case TelephonyManager.NETWORK_TYPE_EHRPD:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD;
+ case TelephonyManager.NETWORK_TYPE_LTE:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_LTE;
+ case TelephonyManager.NETWORK_TYPE_HSPAP:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP;
+ case TelephonyManager.NETWORK_TYPE_GSM:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_GSM;
+ case TelephonyManager.NETWORK_TYPE_TD_SCDMA:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA;
+ case TelephonyManager.NETWORK_TYPE_IWLAN:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN;
+ case TelephonyManager.NETWORK_TYPE_LTE_CA:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA;
+ default:
+ return ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN;
+ }
+ }
+
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (!mUnavailable) {
diff --git a/src/com/android/settings/network/MobileNetworkPreferenceController.java b/src/com/android/settings/network/MobileNetworkPreferenceController.java
index 5612d2e..b479b02 100644
--- a/src/com/android/settings/network/MobileNetworkPreferenceController.java
+++ b/src/com/android/settings/network/MobileNetworkPreferenceController.java
@@ -19,6 +19,7 @@
import static android.os.UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS;
import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -26,6 +27,8 @@
import android.provider.Settings;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import androidx.annotation.VisibleForTesting;
@@ -37,12 +40,14 @@
import com.android.settings.network.telephony.MobileNetworkUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.RestrictedPreference;
-import com.android.settingslib.Utils;
+import com.android.settings.Utils;
import com.android.settingslib.core.AbstractPreferenceController;
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.List;
+
public class MobileNetworkPreferenceController extends AbstractPreferenceController
implements PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop {
@@ -55,9 +60,12 @@
private Preference mPreference;
@VisibleForTesting
PhoneStateListener mPhoneStateListener;
+ private SubscriptionManager mSubscriptionManager;
private BroadcastReceiver mAirplanModeChangedReceiver;
+ private String mSummary;
+
public MobileNetworkPreferenceController(Context context) {
super(context);
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
@@ -67,9 +75,11 @@
mAirplanModeChangedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
+ updateDisplayName();
updateState(mPreference);
}
};
+ mSubscriptionManager = SubscriptionManager.from(context);
}
@Override
@@ -98,11 +108,14 @@
@Override
public void onStart() {
+ if (mSubscriptionManager != null)
+ mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
if (isAvailable()) {
if (mPhoneStateListener == null) {
mPhoneStateListener = new PhoneStateListener() {
@Override
public void onServiceStateChanged(ServiceState serviceState) {
+ updateDisplayName();
updateState(mPreference);
}
};
@@ -115,11 +128,53 @@
}
}
+ private void updateDisplayName() {
+ if (mPreference != null) {
+ List<SubscriptionInfo> list = mSubscriptionManager.getActiveSubscriptionInfoList();
+ if (list != null && !list.isEmpty()) {
+ boolean useSeparator = false;
+ StringBuilder builder = new StringBuilder();
+ for (SubscriptionInfo subInfo : list) {
+ if (isSubscriptionInService(subInfo.getSubscriptionId())) {
+ if (useSeparator) builder.append(", ");
+ builder.append(mTelephonyManager.getNetworkOperatorName
+ (subInfo.getSubscriptionId()));
+ useSeparator = true;
+ }
+ }
+ mSummary = builder.toString();
+ } else {
+ mSummary = mTelephonyManager.getNetworkOperatorName();
+ }
+ }
+ }
+
+ private boolean isSubscriptionInService(int subId) {
+ if (mTelephonyManager != null) {
+ if (mTelephonyManager.getServiceStateForSubscriber(subId).getState()
+ == ServiceState.STATE_IN_SERVICE) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private final SubscriptionManager.OnSubscriptionsChangedListener mOnSubscriptionsChangeListener
+ = new SubscriptionManager.OnSubscriptionsChangedListener() {
+ @Override
+ public void onSubscriptionsChanged() {
+ updateDisplayName();
+ updateState(mPreference);
+ }
+ };
+
@Override
public void onStop() {
if (mPhoneStateListener != null) {
mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
}
+ mSubscriptionManager
+ .removeOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener);
if (mAirplanModeChangedReceiver != null) {
mContext.unregisterReceiver(mAirplanModeChangedReceiver);
}
@@ -149,6 +204,6 @@
@Override
public CharSequence getSummary() {
- return MobileNetworkUtils.getCurrentCarrierNameForDisplay(mContext);
+ return mSummary;
}
}
diff --git a/src/com/android/settings/network/TetherPreferenceController.java b/src/com/android/settings/network/TetherPreferenceController.java
index 2409544..cf7a719 100644
--- a/src/com/android/settings/network/TetherPreferenceController.java
+++ b/src/com/android/settings/network/TetherPreferenceController.java
@@ -71,7 +71,11 @@
}
public void onServiceDisconnected(int profile) {
- mBluetoothPan.set(null);
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ BluetoothProfile currentProfile = mBluetoothPan.getAndSet(null);
+ if (currentProfile != null && adapter != null) {
+ adapter.closeProfileProxy(BluetoothProfile.PAN, currentProfile);
+ }
}
};
@@ -128,15 +132,20 @@
@Override
public void onCreate(Bundle savedInstanceState) {
- if (mBluetoothAdapter != null &&
- mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) {
- mBluetoothAdapter.getProfileProxy(mContext, mBtProfileServiceListener,
- BluetoothProfile.PAN);
- }
}
@Override
public void onResume() {
+ if (mBluetoothAdapter != null &&
+ mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) {
+ final BluetoothProfile profile = mBluetoothPan.get();
+
+ if (profile == null) {
+ mBluetoothAdapter.getProfileProxy(mContext, mBtProfileServiceListener,
+ BluetoothProfile.PAN);
+ }
+ }
+
if (mAirplaneModeObserver == null) {
mAirplaneModeObserver = new SettingObserver();
}
@@ -151,6 +160,10 @@
@Override
public void onPause() {
+ final BluetoothProfile profile = mBluetoothPan.getAndSet(null);
+ if (profile != null && mBluetoothAdapter != null) {
+ mBluetoothAdapter.closeProfileProxy(BluetoothProfile.PAN, profile);
+ }
if (mAirplaneModeObserver != null) {
mContext.getContentResolver().unregisterContentObserver(mAirplaneModeObserver);
}
@@ -161,10 +174,6 @@
@Override
public void onDestroy() {
- final BluetoothProfile profile = mBluetoothPan.getAndSet(null);
- if (profile != null && mBluetoothAdapter != null) {
- mBluetoothAdapter.closeProfileProxy(BluetoothProfile.PAN, profile);
- }
}
public static boolean isTetherConfigDisallowed(Context context) {
diff --git a/src/com/android/settings/network/telephony/CellInfoUtil.java b/src/com/android/settings/network/telephony/CellInfoUtil.java
index d7d2b18..396a35d 100644
--- a/src/com/android/settings/network/telephony/CellInfoUtil.java
+++ b/src/com/android/settings/network/telephony/CellInfoUtil.java
@@ -16,6 +16,7 @@
package com.android.settings.network.telephony;
+import android.telephony.AccessNetworkConstants.AccessNetworkType;
import android.telephony.CellIdentity;
import android.telephony.CellIdentityGsm;
import android.telephony.CellIdentityLte;
@@ -29,6 +30,7 @@
import android.telephony.CellInfoNr;
import android.telephony.CellInfoTdscdma;
import android.telephony.CellInfoWcdma;
+import android.telephony.ServiceState;
import android.text.BidiFormatter;
import android.text.TextDirectionHeuristics;
import android.text.TextUtils;
@@ -132,6 +134,139 @@
return ci;
}
+ /**
+ * Creates a CellInfo object from OperatorInfo for Legacy Incremental Scan results.
+ */
+ public static CellInfo convertLegacyIncrScanOperatorInfoToCellInfo(OperatorInfo operatorInfo) {
+ final String operatorNumeric = operatorInfo.getOperatorNumeric();
+ String mcc = null;
+ String mnc = null;
+ String ran = String.valueOf(AccessNetworkType.UNKNOWN);
+
+ if (operatorNumeric != null) {
+ if (operatorNumeric.matches("^[0-9]{5,6}$")) {
+ mcc = operatorNumeric.substring(0, 3);
+ mnc = operatorNumeric.substring(3);
+ } else if (operatorNumeric.matches("^[0-9]{5,6}[+][0-9]{1,2}$")) {
+ // If the operator numeric contains the RAN, then parse the MCC-MNC accordingly
+ String values[] = operatorNumeric.split("\\+");
+ mcc = values[0].substring(0, 3);
+ mnc = values[0].substring(3);
+ ran = values[1];
+ }
+ }
+
+ CellInfoNr cellInfoNr = null;
+ CellInfoLte cellInfoLte = null;
+ CellInfoWcdma cellInfoWcdma = null;
+ CellInfoGsm cellInfoGsm = null;
+ CellInfoGsm cellInfoDefault = null;
+
+ // Convert RadioAccessNetwork(ran) to AccessNetworkType
+ int accessNetworkType = AccessNetworkType.convertRanToAnt(Integer.parseInt(ran));
+
+ switch(accessNetworkType) {
+ case AccessNetworkType.NGRAN:
+ // 5G
+ CellIdentityNr cellIdentityNr = new CellIdentityNr(
+ Integer.MAX_VALUE /* pci */,
+ Integer.MAX_VALUE /* tac */,
+ Integer.MAX_VALUE /* nrArfcn */,
+ null /* bands */,
+ mcc,
+ mnc,
+ Integer.MAX_VALUE /* nci */,
+ operatorInfo.getOperatorAlphaLong() + " 5G",
+ operatorInfo.getOperatorAlphaShort() + " 5G",
+ Collections.emptyList());
+ cellInfoNr = new CellInfoNr();
+ cellInfoNr.setCellIdentity(cellIdentityNr);
+ break;
+
+ case AccessNetworkType.EUTRAN:
+ // 4G
+ CellIdentityLte cellIdentityLte = new CellIdentityLte(
+ Integer.MAX_VALUE /* ci */,
+ Integer.MAX_VALUE /* pci */,
+ Integer.MAX_VALUE /* tac */,
+ Integer.MAX_VALUE /* earfcn */,
+ null /* bands */,
+ Integer.MAX_VALUE /* bandwidth */,
+ mcc,
+ mnc,
+ operatorInfo.getOperatorAlphaLong() + " 4G",
+ operatorInfo.getOperatorAlphaShort() + " 4G",
+ Collections.emptyList(),
+ null /* csgInfo */);
+ cellInfoLte = new CellInfoLte();
+ cellInfoLte.setCellIdentity(cellIdentityLte);
+ break;
+
+ case AccessNetworkType.UTRAN:
+ CellIdentityWcdma cellIdentityWcdma = new CellIdentityWcdma(
+ Integer.MAX_VALUE /* lac */,
+ Integer.MAX_VALUE /* cid */,
+ Integer.MAX_VALUE /* psc */,
+ Integer.MAX_VALUE /* uarfcn */,
+ mcc,
+ mnc,
+ operatorInfo.getOperatorAlphaLong() + " 3G",
+ operatorInfo.getOperatorAlphaShort() + " 3G",
+ Collections.emptyList(),
+ null /* csgInfo */);
+ cellInfoWcdma = new CellInfoWcdma();
+ cellInfoWcdma.setCellIdentity(cellIdentityWcdma);
+ break;
+
+ case AccessNetworkType.GERAN:
+ // 2G
+ CellIdentityGsm cellIdentityGsm = new CellIdentityGsm(
+ Integer.MAX_VALUE /* lac */,
+ Integer.MAX_VALUE /* cid */,
+ Integer.MAX_VALUE /* arfcn */,
+ Integer.MAX_VALUE /* bsic */,
+ mcc,
+ mnc,
+ operatorInfo.getOperatorAlphaLong() + " 2G",
+ operatorInfo.getOperatorAlphaShort() + " 2G",
+ Collections.emptyList());
+ cellInfoGsm = new CellInfoGsm();
+ cellInfoGsm.setCellIdentity(cellIdentityGsm);
+ break;
+
+ default:
+ // This is when RAT info is not present with the PLMN.
+ // Do not add any network class to the operator name.
+ CellIdentityGsm cellIdentityDefault = new CellIdentityGsm(
+ Integer.MAX_VALUE /* lac */,
+ Integer.MAX_VALUE /* cid */,
+ Integer.MAX_VALUE /* arfcn */,
+ Integer.MAX_VALUE /* bsic */,
+ mcc,
+ mnc,
+ operatorInfo.getOperatorAlphaLong(),
+ operatorInfo.getOperatorAlphaShort(),
+ Collections.emptyList());
+ cellInfoDefault = new CellInfoGsm();
+ cellInfoDefault.setCellIdentity(cellIdentityDefault);
+ break;
+ }
+
+ CellInfo cellInfo = null;
+ if (cellInfoNr != null) cellInfo = cellInfoNr;
+ else if (cellInfoLte != null) cellInfo = cellInfoLte;
+ else if (cellInfoWcdma != null) cellInfo = cellInfoWcdma;
+ else if (cellInfoGsm != null) cellInfo = cellInfoGsm;
+ else cellInfo = cellInfoDefault;
+
+ if (operatorInfo.getState() == OperatorInfo.State.CURRENT) {
+ // Unlike the legacy full scan, legacy incremental scanning using qcril hooks
+ // sends the results containing the info about the currently registered operator.
+ cellInfo.setRegistered(true);
+ }
+ return cellInfo;
+ }
+
/** Convert a list of cellInfos to readable string without sensitive info. */
public static String cellInfoListToString(List<CellInfo> cellInfos) {
return cellInfos.stream()
diff --git a/src/com/android/settings/network/telephony/DataDefaultSubscriptionController.java b/src/com/android/settings/network/telephony/DataDefaultSubscriptionController.java
new file mode 100644
index 0000000..f4dfbc6
--- /dev/null
+++ b/src/com/android/settings/network/telephony/DataDefaultSubscriptionController.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved
+ * Not a contribution
+ *
+ * Copyright (C) 2019 The Android Open Source Project
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ package com.android.settings.network.telephony;
+
+ import android.content.Context;
+ import android.telephony.SubscriptionInfo;
+ import android.telephony.SubscriptionManager;
+
+public class DataDefaultSubscriptionController extends DefaultSubscriptionController {
+
+ private static final String SETTING_USER_PREF_DATA_SUB = "user_preferred_data_sub";
+
+ public DataDefaultSubscriptionController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ }
+
+ @Override
+ protected SubscriptionInfo getDefaultSubscriptionInfo() {
+ return mManager.getActiveSubscriptionInfo(getDefaultSubscriptionId());
+ }
+
+ @Override
+ protected int getDefaultSubscriptionId() {
+ return SubscriptionManager.getDefaultDataSubscriptionId();
+ }
+
+ @Override
+ protected void setDefaultSubscription(int subscriptionId) {
+ mManager.setDefaultDataSubId(subscriptionId);
+ setUserPrefDataSubIdInDb(subscriptionId);
+ }
+
+ private void setUserPrefDataSubIdInDb(int subId) {
+ android.provider.Settings.Global.putInt(mContext.getContentResolver(),
+ SETTING_USER_PREF_DATA_SUB, subId);
+ }
+}
diff --git a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java
old mode 100644
new mode 100755
index 1d82f65..0ee844c
--- a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java
+++ b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java
@@ -24,8 +24,12 @@
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
+import android.telephony.PhoneStateListener;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.Log;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
@@ -36,12 +40,15 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
+import com.android.settings.Utils;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.network.SubscriptionsChangeListener;
import java.util.ArrayList;
import java.util.List;
+import org.codeaurora.internal.IExtTelephony;
+
/**
* This implements common controller functionality for a Preference letting the user see/change
* what mobile network subscription is used by default for some service controlled by the
@@ -62,10 +69,27 @@
new ComponentName("com.android.phone",
"com.android.services.telephony.TelephonyConnectionService");
+ protected TelephonyManager mTelephonyManager;
+
+ //String keys for data preference lookup
+ private static final String LIST_DATA_PREFERENCE_KEY = "data_preference";
+
+ private int mPhoneCount;
+ private PhoneStateListener[] mPhoneStateListener;
+ private int[] mCallState;
+ private ArrayList<SubscriptionInfo> mSelectableSubs;
+
public DefaultSubscriptionController(Context context, String preferenceKey) {
super(context, preferenceKey);
mManager = context.getSystemService(SubscriptionManager.class);
mChangeListener = new SubscriptionsChangeListener(context, this);
+
+ mTelephonyManager = (TelephonyManager) mContext
+ .getSystemService(Context.TELEPHONY_SERVICE);
+ mPhoneCount = mTelephonyManager.getPhoneCount();
+ mPhoneStateListener = new PhoneStateListener[mPhoneCount];
+ mCallState = new int[mPhoneCount];
+ mSelectableSubs = new ArrayList<SubscriptionInfo>();
}
public void init(Lifecycle lifecycle) {
@@ -85,23 +109,27 @@
@Override
public int getAvailabilityStatus(int subId) {
- final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mManager);
- if (subs.size() > 1) {
- return AVAILABLE;
+ boolean visible = false;
+ if (mSelectableSubs != null && mSelectableSubs.size() > 1) {
+ visible = true;
} else {
- return CONDITIONALLY_UNAVAILABLE;
+ visible = false;
}
+
+ return visible ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@OnLifecycleEvent(ON_RESUME)
public void onResume() {
mChangeListener.start();
+ registerPhoneStateListener();
updateEntries();
}
@OnLifecycleEvent(ON_PAUSE)
public void onPause() {
mChangeListener.stop();
+ unRegisterPhoneStateListener();
}
@Override
@@ -131,6 +159,13 @@
if (mPreference == null) {
return;
}
+
+ updateSubStatus();
+ if (mSelectableSubs.isEmpty()) {
+ Log.d(TAG, "updateEntries: mSelectable subs is empty");
+ return;
+ }
+
if (!isAvailable()) {
mPreference.setVisible(false);
return;
@@ -142,8 +177,6 @@
// getAvailabilityStatus returned CONDITIONALLY_UNAVAILABLE at the time.
mPreference.setOnPreferenceChangeListener(this);
- final List<SubscriptionInfo> subs = SubscriptionUtil.getActiveSubscriptions(mManager);
-
// We'll have one entry for each available subscription, plus one for a "ask me every
// time" entry at the end.
final ArrayList<CharSequence> displayNames = new ArrayList<>();
@@ -152,7 +185,7 @@
final int serviceDefaultSubId = getDefaultSubscriptionId();
boolean subIsAvailable = false;
- for (SubscriptionInfo sub : subs) {
+ for (SubscriptionInfo sub : mSelectableSubs) {
if (sub.isOpportunistic()) {
continue;
}
@@ -163,9 +196,13 @@
subIsAvailable = true;
}
}
- // Add the extra "Ask every time" value at the end.
- displayNames.add(mContext.getString(R.string.calls_and_sms_ask_every_time));
- subscriptionIds.add(Integer.toString(SubscriptionManager.INVALID_SUBSCRIPTION_ID));
+ if (TextUtils.equals(getPreferenceKey(), LIST_DATA_PREFERENCE_KEY)) {
+ mPreference.setEnabled(isCallStateIdle());
+ } else {
+ // Add the extra "Ask every time" value at the end.
+ displayNames.add(mContext.getString(R.string.calls_and_sms_ask_every_time));
+ subscriptionIds.add(Integer.toString(SubscriptionManager.INVALID_SUBSCRIPTION_ID));
+ }
mPreference.setEntries(displayNames.toArray(new CharSequence[0]));
mPreference.setEntryValues(subscriptionIds.toArray(new CharSequence[0]));
@@ -247,6 +284,16 @@
return (label != null) ? label : "";
}
+ private boolean isCallStateIdle() {
+ boolean callStateIdle = true;
+ for (int i = 0; i < mPhoneCount; i++) {
+ if (TelephonyManager.CALL_STATE_IDLE != mCallState[i]) {
+ callStateIdle = false;
+ }
+ }
+ return callStateIdle;
+ }
+
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
final int subscriptionId = Integer.parseInt((String) newValue);
@@ -261,9 +308,64 @@
@Override
public void onSubscriptionsChanged() {
+ if (mSelectableSubs != null) mSelectableSubs.clear();
+ updateSubStatus();
+
if (mPreference != null) {
updateEntries();
refreshSummary(mPreference);
}
}
+
+ private void registerPhoneStateListener() {
+ //To make sure subinfo is added, before registering for call state change
+ updateSubStatus();
+
+ for (int i = 0; i < mSelectableSubs.size(); i++) {
+ int subId = mSelectableSubs.get(i).getSubscriptionId();
+ TelephonyManager tm = mTelephonyManager.createForSubscriptionId(subId);
+ tm.listen(getPhoneStateListener(i),
+ PhoneStateListener.LISTEN_CALL_STATE);
+ }
+ }
+
+ private void unRegisterPhoneStateListener() {
+ for (int i = 0; i < mPhoneCount; i++) {
+ if (mPhoneStateListener[i] != null) {
+ mTelephonyManager.listen(mPhoneStateListener[i], PhoneStateListener.LISTEN_NONE);
+ mPhoneStateListener[i] = null;
+ }
+ }
+ }
+
+ private PhoneStateListener getPhoneStateListener(int phoneId) {
+ // Disable Sim selection for Data when voice call is going on as changing the default data
+ // sim causes a modem reset currently and call gets disconnected
+ final int i = phoneId;
+ mPhoneStateListener[phoneId] = new PhoneStateListener() {
+ @Override
+ public void onCallStateChanged(int state, String incomingNumber) {
+ mCallState[i] = state;
+ updateEntries();
+ }
+ };
+ return mPhoneStateListener[phoneId];
+ }
+
+ private void updateSubStatus() {
+ if (!mSelectableSubs.isEmpty()) {
+ return;
+ }
+
+ for (int i = 0; i < mPhoneCount; ++i) {
+ final SubscriptionInfo sir = mManager
+ .getActiveSubscriptionInfoForSimSlotIndex(i);
+ if (sir != null) {
+ int subStatus = PrimaryCardAndSubsidyLockUtils.getUiccCardProvisioningStatus(i);
+ if (subStatus == PrimaryCardAndSubsidyLockUtils.CARD_PROVISIONED) {
+ mSelectableSubs.add(sir);
+ }
+ }
+ }
+ }
}
diff --git a/src/com/android/settings/network/telephony/Enabled5GPreferenceController.java b/src/com/android/settings/network/telephony/Enabled5GPreferenceController.java
new file mode 100755
index 0000000..08b3c18
--- /dev/null
+++ b/src/com/android/settings/network/telephony/Enabled5GPreferenceController.java
@@ -0,0 +1,212 @@
+/**
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+package com.android.settings.network.telephony;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.PersistableBundle;
+import android.provider.Settings;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
+
+import com.android.settings.R;
+import com.android.settings.network.telephony.MobileNetworkUtils;
+
+
+/**
+ * Preference controller for "Enabled 5G Switch"
+*/
+
+public class Enabled5GPreferenceController extends TelephonyTogglePreferenceController
+ implements LifecycleObserver, OnStart, OnStop {
+ private static final String TAG = "Enable5g";
+
+ Preference mPreference;
+ private CarrierConfigManager mCarrierConfigManager;
+ private PersistableBundle mCarrierConfig;
+ private TelephonyManager mTelephonyManager;
+
+ private ContentObserver mPreferredNetworkModeObserver;
+ private ContentObserver mSubsidySettingsObserver;
+
+ private final BroadcastReceiver mDefaultDataChangedReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (mPreference != null) {
+ Log.d(TAG,"DDS is changed");
+ updateState(mPreference);
+ }
+ }
+ };
+ public Enabled5GPreferenceController(Context context, String key) {
+ super(context, key);
+ mPreferredNetworkModeObserver = new ContentObserver(new Handler(Looper.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange) {
+ if (mPreference != null) {
+ Log.d(TAG, "mPreferredNetworkModeObserver#onChange");
+ updateState(mPreference);
+ }
+ }
+ };
+ mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
+ }
+
+ public Enabled5GPreferenceController init(int subId) {
+ if (SubscriptionManager.isValidSubscriptionId(mSubId) && mSubId == subId) {
+ return this;
+ }
+ mSubId = subId;
+ mCarrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId);
+ mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
+ .createForSubscriptionId(mSubId);
+ return this;
+ }
+
+ @Override
+ public int getAvailabilityStatus(int subId) {
+ init(subId);
+ final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId);
+ if (carrierConfig == null || mTelephonyManager == null) {
+ return CONDITIONALLY_UNAVAILABLE;
+ }
+ int defaultDdsSubId = SubscriptionManager.getDefaultDataSubscriptionId();
+ final boolean isDds = defaultDdsSubId == subId;
+ final boolean is5gEnabledByCarrier = (mTelephonyManager.getAllowedNetworkTypes()
+ & TelephonyManager.NETWORK_TYPE_BITMASK_NR) > 0;
+ final boolean isVisible = SubscriptionManager.isValidSubscriptionId(subId)
+ && !carrierConfig.getBoolean(CarrierConfigManager.KEY_HIDE_ENABLED_5G_BOOL)
+ && is5gEnabledByCarrier
+ && isDds;
+ return isVisible ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+ }
+
+ @Override
+ public void onStart() {
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.PREFERRED_NETWORK_MODE + mSubId), true,
+ mPreferredNetworkModeObserver);
+ mContext.registerReceiver(mDefaultDataChangedReceiver,
+ new IntentFilter(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED));
+ }
+
+ @Override
+ public void onStop() {
+ if (mPreferredNetworkModeObserver != null) {
+ mContext.getContentResolver().unregisterContentObserver(mPreferredNetworkModeObserver);
+ }
+ if (mDefaultDataChangedReceiver != null) {
+ mContext.unregisterReceiver(mDefaultDataChangedReceiver);
+ }
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ super.updateState(preference);
+ final SwitchPreference switchPreference = (SwitchPreference) preference;
+ switchPreference.setVisible(isAvailable());
+ long preferredNetworkBitMask = MobileNetworkUtils.getRafFromNetworkType(
+ Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.PREFERRED_NETWORK_MODE + mSubId,
+ TelephonyManager.DEFAULT_PREFERRED_NETWORK_MODE));
+ switchPreference.setChecked(isNrNetworkModeType(preferredNetworkBitMask));
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
+ return false;
+ }
+ int preNetworkMode = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.PREFERRED_NETWORK_MODE + mSubId,
+ TelephonyManager.DEFAULT_PREFERRED_NETWORK_MODE);
+ long newNetworkBitMask;
+ if (TelephonyManager.NETWORK_MODE_NR_ONLY != preNetworkMode) {
+ long preNetworkBitMask = MobileNetworkUtils.getRafFromNetworkType(preNetworkMode);
+ newNetworkBitMask = isChecked ?
+ (preNetworkBitMask | TelephonyManager.NETWORK_TYPE_BITMASK_NR)
+ : (preNetworkBitMask & ~TelephonyManager.NETWORK_TYPE_BITMASK_NR);
+ } else {
+ newNetworkBitMask = MobileNetworkUtils
+ .getRafFromNetworkType(TelephonyManager.NETWORK_MODE_LTE_ONLY);
+ }
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.PREFERRED_NETWORK_MODE + mSubId,
+ MobileNetworkUtils.getNetworkTypeFromRaf((int)newNetworkBitMask));
+ if (mTelephonyManager.setPreferredNetworkTypeBitmask(newNetworkBitMask)) {
+ Log.d(TAG, "setPreferredNetworkTypeBitmask");
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isChecked(){
+ long preNetworkBitMask = MobileNetworkUtils.getRafFromNetworkType(
+ Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.PREFERRED_NETWORK_MODE + mSubId,
+ TelephonyManager.DEFAULT_PREFERRED_NETWORK_MODE));
+ return isNrNetworkModeType(preNetworkBitMask);
+ }
+
+ private boolean isNrNetworkModeType(long currentRadioBitmask) {
+ return checkSupportedRadioBitmask(currentRadioBitmask,
+ TelephonyManager.NETWORK_TYPE_BITMASK_NR);
+ }
+
+ boolean checkSupportedRadioBitmask(long supportedRadioBitmask, long targetBitmask) {
+ Log.d(TAG, "supportedRadioBitmask: " + supportedRadioBitmask);
+ if ((targetBitmask & supportedRadioBitmask) > 0) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
index 6327375..1504fe5 100644
--- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
+++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
@@ -20,6 +20,7 @@
import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
import android.content.Context;
+import android.database.ContentObserver;
import android.os.Handler;
import android.os.Looper;
import android.os.PersistableBundle;
@@ -54,12 +55,20 @@
private static final String LOG_TAG = "EnabledNetworkMode";
private PreferredNetworkModeContentObserver mPreferredNetworkModeObserver;
+ private ContentObserver mSubsidySettingsObserver;
private Preference mPreference;
private PreferenceScreen mPreferenceScreen;
private TelephonyManager mTelephonyManager;
private CarrierConfigManager mCarrierConfigManager;
private PreferenceEntriesBuilder mBuilder;
+ // Local cache for Primary Card and Subsidy Lock related vendor properties. Reading these
+ // properties are a costly affair since they involve two IPC calls, an AIDL and another HIDL.
+ // So we cache these and reuse them as and when applicable.
+ boolean mIsPrimaryCardEnabled = false;
+ boolean mIsPrimaryCardLWEnabled = false;
+ boolean mIsSubsidyLockFeatureEnabled = false;
+
public EnabledNetworkModePreferenceController(Context context, String key) {
super(context, key);
}
@@ -88,10 +97,16 @@
@OnLifecycleEvent(ON_START)
public void onStart() {
- if (mPreferredNetworkModeObserver == null) {
+ if (mPreferredNetworkModeObserver == null || mSubsidySettingsObserver == null) {
return;
}
+ loadPrimaryCardAndSubsidyLockValues();
mPreferredNetworkModeObserver.register(mContext, mSubId);
+ if (mIsSubsidyLockFeatureEnabled) {
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Secure.getUriFor(PrimaryCardAndSubsidyLockUtils.SUBSIDY_STATUS), false,
+ mSubsidySettingsObserver);
+ }
}
@OnLifecycleEvent(ON_STOP)
@@ -100,6 +115,9 @@
return;
}
mPreferredNetworkModeObserver.unregister(mContext);
+ if (mSubsidySettingsObserver != null) {
+ mContext.getContentResolver().unregisterContentObserver(mSubsidySettingsObserver);
+ }
}
@Override
@@ -151,6 +169,19 @@
mPreferredNetworkModeObserver.setPreferredNetworkModeChangedListener(
() -> updatePreference());
}
+ if (mSubsidySettingsObserver == null) {
+ mSubsidySettingsObserver = new ContentObserver(new Handler(Looper.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange) {
+ if (mPreference != null) {
+ if (PrimaryCardAndSubsidyLockUtils.DBG) {
+ Log.d(LOG_TAG, "mSubsidySettingsObserver#onChange");
+ }
+ updateState(mPreference);
+ }
+ }
+ };
+ }
lifecycle.addObserver(this);
}
@@ -362,6 +393,69 @@
default:
throw new IllegalArgumentException("Not supported enabled network types.");
}
+
+ /* TODO(b/151744192) - Update Primary Card and Subsidy Lock for 75867d8f634ce62f4787dbf2aef71312308dd415
+ // Primary Card Feature
+ // If the current SIM is not the primary card
+ // 1. If PrimaryCardL_W is enabled, restrict mode selection to GSM and WCDMA options.
+ // 2. If the current mode is GSM_only, disable the network mode preference on the UI.
+ final int currentPrimarySlot = Settings.Global.getInt(mContext.getContentResolver(),
+ PrimaryCardAndSubsidyLockUtils.CONFIG_CURRENT_PRIMARY_SUB,
+ SubscriptionManager.INVALID_SIM_SLOT_INDEX);
+
+ boolean isCurrentPrimarySlotValid = currentPrimarySlot >= 0
+ && currentPrimarySlot < mTelephonyManager.getActiveModemCount();
+
+ int currentPhoneId = SubscriptionManager.getPhoneId(mSubId);
+
+ Log.d(LOG_TAG, "currentPrimarySlot: " + currentPrimarySlot
+ + ", isCurrentPrimarySlotValid: " + isCurrentPrimarySlotValid
+ + ", currentPhoneId: " + currentPhoneId);
+
+ if (mIsPrimaryCardEnabled) {
+ if (PrimaryCardAndSubsidyLockUtils.DBG) {
+ Log.d(LOG_TAG, "isPrimaryCardEnabled: true");
+ }
+ if (isCurrentPrimarySlotValid
+ && currentPhoneId != currentPrimarySlot) {
+ if (mIsPrimaryCardLWEnabled) {
+ Log.d(LOG_TAG, "Primary card LW is enabled");
+ preference.setEntries(R.array.enabled_networks_gsm_wcdma_choices);
+ preference.setEntryValues(R.array.enabled_networks_gsm_wcdma_values);
+ } else if (getPreferredNetworkMode() == TelephonyManager.NETWORK_MODE_GSM_ONLY) {
+ Log.d(LOG_TAG, "Network mode is GSM only, disabling the preference");
+ preference.setEnabled(false);
+ }
+ }
+ }
+
+ // Subsidy Lock Feature
+ // If subsidy is unlocked,
+ // 1. Change the entries in the network mode choices for the primary sub.
+ // 2. Disable the network mode preference on the UI for the non-primary sub.
+ if (PrimaryCardAndSubsidyLockUtils.DBG) {
+ Log.d(LOG_TAG, "isSubsidyLockFeatureEnabled: " + mIsSubsidyLockFeatureEnabled);
+ Log.d(LOG_TAG, "isSubsidyUnlocked: "
+ + PrimaryCardAndSubsidyLockUtils.isSubsidyUnlocked(mContext));
+ }
+
+ if (mIsSubsidyLockFeatureEnabled
+ && PrimaryCardAndSubsidyLockUtils.isSubsidyUnlocked(mContext)) {
+ if (PrimaryCardAndSubsidyLockUtils.DBG) {
+ Log.d(LOG_TAG, "Subsidy is unlocked");
+ }
+ if (isCurrentPrimarySlotValid) {
+ if (currentPhoneId == currentPrimarySlot) {
+ Log.d(LOG_TAG, "Primary sub, change to subsidy choices");
+ preference.setEntries(R.array.enabled_networks_subsidy_locked_choices);
+ preference.setEntryValues(R.array.enabled_networks_subsidy_locked_values);
+ } else {
+ Log.d(LOG_TAG, "Non-primary sub, disable the preference");
+ preference.setEnabled(false);
+ }
+ }
+ }
+ */
}
private int getPreferredNetworkMode() {
@@ -772,4 +866,17 @@
}
}
+
+ private void loadPrimaryCardAndSubsidyLockValues() {
+ Log.d(LOG_TAG, "loadPrimaryCardAndSubsidyLockValues");
+ mIsPrimaryCardEnabled = PrimaryCardAndSubsidyLockUtils.isPrimaryCardEnabled();
+ mIsPrimaryCardLWEnabled = PrimaryCardAndSubsidyLockUtils.isPrimaryCardLWEnabled();
+ mIsSubsidyLockFeatureEnabled = PrimaryCardAndSubsidyLockUtils.isSubsidyLockFeatureEnabled();
+
+ if (PrimaryCardAndSubsidyLockUtils.DBG) {
+ Log.d(LOG_TAG, "mIsPrimaryCardEnabled: " + mIsPrimaryCardEnabled);
+ Log.d(LOG_TAG, "mIsPrimaryCardLWEnabled: " + mIsPrimaryCardLWEnabled);
+ Log.d(LOG_TAG, "mIsSubsidyLockFeatureEnabled: " + mIsSubsidyLockFeatureEnabled);
+ }
+ }
}
diff --git a/src/com/android/settings/network/telephony/LegacyIncrementalScanBroadcastReceiver.java b/src/com/android/settings/network/telephony/LegacyIncrementalScanBroadcastReceiver.java
new file mode 100644
index 0000000..a72f691
--- /dev/null
+++ b/src/com/android/settings/network/telephony/LegacyIncrementalScanBroadcastReceiver.java
@@ -0,0 +1,220 @@
+/**
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package com.android.settings.network.telephony;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.telephony.CellInfo;
+import android.telephony.CellInfoGsm;
+import android.telephony.NetworkScan;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.telephony.TelephonyScanManager;
+import android.util.Log;
+
+import com.android.internal.telephony.OperatorInfo;
+import com.android.settings.Utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This class receives the incremental scan results intent from QCRIL Message Tunnel, processes it
+ * and sends them to the network search results activity {@link NetworkSelectSettings.java}.
+ */
+
+public class LegacyIncrementalScanBroadcastReceiver extends BroadcastReceiver {
+ private static final String TAG = "LegacyIncrementalScanBroadcastReceiver";
+ private static final String ACTION_INCREMENTAL_NW_SCAN_IND
+ = "qualcomm.intent.action.ACTION_INCREMENTAL_NW_SCAN_IND";
+
+ private static final String EXTRA_SCAN_RESULT = "scan_result";
+ private static final String EXTRA_INCREMENTAL_SCAN_DATA = "incr_nw_scan_data";
+ private static final String EXTRA_INSTANCE_ID = "sub_id";
+
+ private static final int QUERY_EXCEPTION = -1;
+
+ // Network scan was successful and complete
+ private static final int NAS_QUERY_COMPLETE = 0;
+ // Network scan was partial
+ private static final int NAS_QUERY_PARTIAL = 1;
+ // Network scan was aborted
+ private static final int NAS_QUERY_ABORT = 2;
+ // Network scan did not complete due to a radio link failure recovery in progress
+ private static final int NAS_QUERY_REJ_IN_RLF = 3;
+ // Sending incremental network scan errors
+ private static final int NAS_QUERY_INCREMENT_ERROR = 4;
+ // Periodic network scan gave partial results
+ private static final int NAS_QUERY_PARTIAL_PERIODIC = 5;
+
+ private static int sPhoneCount;
+ private Context mContext;
+
+ // QueryDetails for each phoneId
+ private QueryDetails[] mQueryDetails;
+
+ private final TelephonyScanManager.NetworkScanCallback mNetworkScanCallback;
+
+ // TODO: This class may not be required since handling of incremental results is already
+ // being taken care of in {@link NetworkSelectSettings} class.
+ class QueryDetails {
+ String[] storedScanInfo;
+
+ QueryDetails() {
+ storedScanInfo = null;
+ }
+
+ void concatScanInfo(String[] scanInfo) {
+ String[] concatScanInfo = new String[storedScanInfo.length + scanInfo.length];
+ System.arraycopy(storedScanInfo, 0, concatScanInfo, 0, storedScanInfo.length);
+ System.arraycopy(scanInfo, 0, concatScanInfo, storedScanInfo.length,
+ scanInfo.length);
+ storedScanInfo = concatScanInfo;
+ }
+
+ void reset() {
+ storedScanInfo = null;
+ }
+ }
+
+ public LegacyIncrementalScanBroadcastReceiver(Context context,
+ TelephonyScanManager.NetworkScanCallback mInternalNetworkScanCallback) {
+ mContext = context;
+ TelephonyManager tm =
+ (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+ sPhoneCount = tm.getActiveModemCount();
+ mQueryDetails = new QueryDetails[sPhoneCount];
+ for (int i = 0; i < sPhoneCount; i++) {
+ mQueryDetails[i] = new QueryDetails();
+ }
+ mNetworkScanCallback = mInternalNetworkScanCallback;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(TAG, "onReceive " + intent);
+ if (ACTION_INCREMENTAL_NW_SCAN_IND.equals(intent.getAction())) {
+ broadcastIncrementalQueryResults(intent);
+ }
+ }
+
+ private void onResults(List<CellInfo> results) {
+ mNetworkScanCallback.onResults(results);
+ }
+
+ private void onComplete() {
+ mNetworkScanCallback.onComplete();
+ }
+
+ private void onError(int error) {
+ mNetworkScanCallback.onError(error);
+ }
+
+ private void broadcastIncrementalQueryResults(Intent intent) {
+ int result = intent.getIntExtra(EXTRA_SCAN_RESULT, QUERY_EXCEPTION);
+ int phoneId = intent.getIntExtra(EXTRA_INSTANCE_ID,
+ SubscriptionManager.INVALID_SIM_SLOT_INDEX);
+
+ Log.d(TAG, "broadcastIncrementalQueryResults: phoneid: " + phoneId + ", result: " + result);
+
+ if (phoneId < 0 || phoneId >= sPhoneCount) {
+ // Invalid phoneId
+ onError(NetworkScan.ERROR_INVALID_SCAN);
+ return;
+ }
+
+ if (result == NAS_QUERY_REJ_IN_RLF) {
+ onError(NetworkScan.ERROR_RADIO_INTERFACE_ERROR);
+ return;
+ }
+
+ if (result == NAS_QUERY_ABORT) {
+ onError(NetworkScan.ERROR_MODEM_ERROR);
+ return;
+ }
+
+ if (result == NAS_QUERY_COMPLETE || result == NAS_QUERY_PARTIAL) {
+ String[] scanInfo = intent.getStringArrayExtra(EXTRA_INCREMENTAL_SCAN_DATA);
+ QueryDetails queryDetails = mQueryDetails[phoneId];
+
+ Log.d(TAG, "broadcastIncrementalQueryResults"
+ + ", scanInfo.length: " + (scanInfo == null ? 0 : scanInfo.length));
+
+ if (queryDetails.storedScanInfo != null && scanInfo != null) {
+ queryDetails.concatScanInfo(scanInfo);
+ } else {
+ queryDetails.storedScanInfo = scanInfo;
+ }
+
+ if (queryDetails.storedScanInfo != null) {
+ List<CellInfo> cellInfos = getCellInfosFromScanResult(queryDetails.storedScanInfo);
+ onResults(cellInfos);
+ }
+
+ if (result == NAS_QUERY_COMPLETE) {
+ // Clear the cache, otherwise the results for the next scan will be combined with
+ // the current one.
+ queryDetails.reset();
+ onComplete();
+ }
+ }
+ }
+
+ private List<CellInfo> getCellInfosFromScanResult(String[] scanInfos) {
+ Log.d(TAG, "Number of operators: " + (scanInfos.length)/4);
+ List<CellInfo> cellInfoList = new ArrayList<CellInfo>();
+ if (scanInfos.length >= 4 && (scanInfos.length % 4 == 0)) {
+ // The scan results are grouped into four elements per operator.
+ for (int i = 0; i < scanInfos.length / 4; i++) {
+ int j = 4 * i;
+ String operatorAlphaLong = scanInfos[0 + j];
+ String operatorAlphaShort = scanInfos[1 + j];
+ String operatorNumeric = scanInfos[2 + j];
+ String operatorStateString = scanInfos[3 + j];
+
+ OperatorInfo operatorInfo = new OperatorInfo(operatorAlphaLong,
+ operatorAlphaShort,
+ operatorNumeric,
+ operatorStateString);
+
+ CellInfo cellinfo =
+ CellInfoUtil.convertLegacyIncrScanOperatorInfoToCellInfo(operatorInfo);
+
+ Log.d(TAG, "OperatorInfo: " + operatorInfo.toString()
+ + " CellInfo: " + CellInfoUtil.cellInfoToString(cellinfo));
+
+ cellInfoList.add(cellinfo);
+ }
+ }
+ return cellInfoList;
+ }
+}
diff --git a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
index c35eef6..be61a9b 100644
--- a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
+++ b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
@@ -31,6 +31,7 @@
import androidx.preference.SwitchPreference;
import com.android.settings.R;
+import com.android.settings.Utils;
import com.android.settings.network.MobileDataContentObserver;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
@@ -147,8 +148,13 @@
final boolean enableData = !isChecked();
final boolean isMultiSim = (mTelephonyManager.getActiveModemCount() > 1);
final int defaultSubId = mSubscriptionManager.getDefaultDataSubscriptionId();
- final boolean needToDisableOthers = mSubscriptionManager
+ boolean needToDisableOthers = mSubscriptionManager
.isActiveSubscriptionId(defaultSubId) && defaultSubId != mSubId;
+ if (Utils.isSimSettingsApkAvailable()) {
+ // If vendor SimSettings app is present on the device, then DDS will be controlled
+ // by that app, and there is no need to disable mobile data for other subscriptions.
+ needToDisableOthers = false;
+ }
if (enableData && isMultiSim && needToDisableOthers) {
mDialogType = MobileDataDialogFragment.TYPE_MULTI_SIM_DIALOG;
return true;
diff --git a/src/com/android/settings/network/telephony/MobileNetworkActivity.java b/src/com/android/settings/network/telephony/MobileNetworkActivity.java
index 7f7dc3a..94adf14 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkActivity.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkActivity.java
@@ -170,8 +170,8 @@
protected void onStart() {
getProxySubscriptionManager().setLifecycle(getLifecycle());
super.onStart();
- // updateSubscriptions doesn't need to be called, onChanged will always be called after we
- // register a listener.
+ // call updateSubscriptions when start MobileNetworkActivity
+ updateSubscriptions(getSubscription());
}
@Override
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index 528e5c7..7f17fe4 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -18,10 +18,15 @@
import android.app.Activity;
import android.app.settings.SettingsEnums;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.UserManager;
+import android.provider.SearchIndexableResource;
import android.provider.Settings;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -34,6 +39,8 @@
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
+import com.android.internal.telephony.IccCardConstants;
+import com.android.internal.telephony.TelephonyIntents;
import com.android.settings.R;
import com.android.settings.datausage.BillingCyclePreferenceController;
import com.android.settings.datausage.DataUsageSummaryPreferenceController;
@@ -47,6 +54,8 @@
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.utils.ThreadUtils;
+import org.codeaurora.internal.IExtTelephony;
+
import java.util.Arrays;
import java.util.List;
@@ -59,12 +68,17 @@
@VisibleForTesting
static final String KEY_CLICKED_PREF = "key_clicked_pref";
+ // UICC provisioning status
+ public static final int CARD_NOT_PROVISIONED = 0;
+ public static final int CARD_PROVISIONED = 1;
+
//String keys for preference lookup
private static final String BUTTON_CDMA_SYSTEM_SELECT_KEY = "cdma_system_select_key";
private static final String BUTTON_CDMA_SUBSCRIPTION_KEY = "cdma_subscription_key";
private TelephonyManager mTelephonyManager;
private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+ private int mPhoneId = SubscriptionManager.INVALID_PHONE_INDEX;
private CdmaSystemSelectPreferenceController mCdmaSystemSelectPreferenceController;
private CdmaSubscriptionPreferenceController mCdmaSubscriptionPreferenceController;
@@ -76,6 +90,36 @@
private boolean mDropFirstSubscriptionChangeNotify;
private int mActiveSubsciptionsListenerCount;
+ private final BroadcastReceiver mSimStateReceiver = new BroadcastReceiver() {
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) {
+ String state = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
+ Log.d(LOG_TAG, "Received ACTION_SIM_STATE_CHANGED: " + state);
+ setScreenState();
+ }
+ }
+ };
+
+ private void setScreenState() {
+ int simState = mTelephonyManager.getSimState();
+ boolean screenState = simState != TelephonyManager.SIM_STATE_ABSENT;
+ if (screenState) {
+ int provStatus = CARD_NOT_PROVISIONED;
+ IExtTelephony extTelephony = IExtTelephony.Stub
+ .asInterface(ServiceManager.getService("qti.radio.extphone"));
+ try {
+ provStatus = extTelephony.getCurrentUiccCardProvisioningStatus(mPhoneId);
+ } catch (RemoteException | NullPointerException ex) {
+ Log.e(LOG_TAG, "getUiccCardProvisioningStatus: " + mPhoneId + ", Exception: ", ex);
+ }
+ screenState = provStatus != CARD_NOT_PROVISIONED;
+ Log.d(LOG_TAG, "Provisioning Status: " + provStatus + ", screenState: " + screenState);
+ }
+ Log.d(LOG_TAG, "Setting screen state to: " + screenState);
+ getPreferenceScreen().setEnabled(screenState);
+ }
+
public MobileNetworkSettings() {
super(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS);
}
@@ -115,7 +159,8 @@
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID,
MobileNetworkUtils.getSearchableSubscriptionId(context));
- Log.i(LOG_TAG, "display subId: " + mSubId);
+ mPhoneId = SubscriptionManager.getPhoneId(mSubId);
+ Log.i(LOG_TAG, "display subId: " + mSubId + ", phoneId: " + mPhoneId);
if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
return Arrays.asList();
@@ -134,6 +179,7 @@
if (dataUsageSummaryPreferenceController != null) {
dataUsageSummaryPreferenceController.init(mSubId);
}
+ use(DataDefaultSubscriptionController.class).init(getLifecycle());
use(CallsDefaultSubscriptionController.class).init(getLifecycle());
use(SmsDefaultSubscriptionController.class).init(getLifecycle());
use(MobileNetworkSwitchController.class).init(getLifecycle(), mSubId);
@@ -149,9 +195,10 @@
use(MobileDataPreferenceController.class).init(getFragmentManager(), mSubId);
use(RoamingPreferenceController.class).init(getFragmentManager(), mSubId);
use(ApnPreferenceController.class).init(mSubId);
+ use(UserPLMNPreferenceController.class).init(mSubId);
use(CarrierPreferenceController.class).init(mSubId);
use(DataUsagePreferenceController.class).init(mSubId);
- use(PreferredNetworkModePreferenceController.class).init(mSubId);
+ use(PreferredNetworkModePreferenceController.class).init(getLifecycle(), mSubId);
use(EnabledNetworkModePreferenceController.class).init(getLifecycle(), mSubId);
use(DataServiceSetupPreferenceController.class).init(mSubId);
@@ -173,6 +220,7 @@
final VideoCallingPreferenceController videoCallingPreferenceController =
use(VideoCallingPreferenceController.class).init(mSubId);
+ use(Enabled5GPreferenceController.class).init(mSubId);
use(CallingPreferenceCategoryController.class).setChildren(
Arrays.asList(wifiCallingPreferenceController, videoCallingPreferenceController));
use(Enhanced4gLtePreferenceController.class).init(mSubId)
@@ -205,6 +253,7 @@
@Override
public void onResume() {
+ Log.i(LOG_TAG, "onResume:+");
super.onResume();
if (mActiveSubsciptionsListener == null) {
mActiveSubsciptionsListener = new ActiveSubsciptionsListener(
@@ -216,6 +265,14 @@
mDropFirstSubscriptionChangeNotify = true;
}
mActiveSubsciptionsListener.start();
+
+ Context context = getContext();
+ if (context != null) {
+ context.registerReceiver(mSimStateReceiver,
+ new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED));
+ } else {
+ Log.i(LOG_TAG, "context is null, not registering SimStateReceiver");
+ }
}
private void onSubscriptionDetailChanged() {
@@ -243,6 +300,18 @@
super.onDestroy();
}
+ @Override
+ public void onPause() {
+ Log.i(LOG_TAG, "onPause:+");
+ super.onPause();
+ Context context = getContext();
+ if (context != null) {
+ context.unregisterReceiver(mSimStateReceiver);
+ } else {
+ Log.i(LOG_TAG, "context already null, not unregistering SimStateReceiver");
+ }
+ }
+
@VisibleForTesting
void onRestoreInstance(Bundle icicle) {
if (icicle != null) {
@@ -319,6 +388,11 @@
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.mobile_network_settings) {
+ @Override
+ public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
+ boolean enabled) {
+ return super.getXmlResourcesToIndex(context, enabled);
+ }
/** suppress full page if user is not admin */
@Override
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java b/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java
index 46c5234..4fbd569 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java
@@ -20,8 +20,11 @@
import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
import android.content.Context;
+import android.telephony.PhoneStateListener;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.Log;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
@@ -43,28 +46,38 @@
private int mSubId;
private SubscriptionsChangeListener mChangeListener;
private SubscriptionManager mSubscriptionManager;
+ private TelephonyManager mTelephonyManager;
+ private PhoneStateListener mPhoneStateListener;
+ private SubscriptionInfo mSubInfo = null;
+ private int mPhoneId;
+ private int mCallState;
public MobileNetworkSwitchController(Context context, String preferenceKey) {
super(context, preferenceKey);
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class);
mChangeListener = new SubscriptionsChangeListener(context, this);
+ mTelephonyManager = (TelephonyManager) mContext
+ .getSystemService(Context.TELEPHONY_SERVICE);
}
public void init(Lifecycle lifecycle, int subId) {
lifecycle.addObserver(this);
mSubId = subId;
+ mPhoneId = mSubscriptionManager.getSlotIndex(mSubId);
}
@OnLifecycleEvent(ON_RESUME)
public void onResume() {
mChangeListener.start();
+ registerPhoneStateListener();
update();
}
@OnLifecycleEvent(ON_PAUSE)
public void onPause() {
mChangeListener.stop();
+ unRegisterPhoneStateListener();
}
@Override
@@ -78,8 +91,12 @@
mSwitchBar.getSwitch().setOnBeforeCheckedChangeListener((toggleSwitch, isChecked) -> {
// TODO b/135222940: re-evaluate whether to use
// mSubscriptionManager#isSubscriptionEnabled
- if (mSubscriptionManager.isActiveSubscriptionId(mSubId) != isChecked
- && (!mSubscriptionManager.setSubscriptionEnabled(mSubId, isChecked))) {
+ int uiccStatus = PrimaryCardAndSubsidyLockUtils.getUiccCardProvisioningStatus(mPhoneId);
+ Log.d(TAG, "displayPreference: mSubId=" + mSubId + ", mSubInfo=" + mSubInfo +
+ ", uiccStatus=" + uiccStatus);
+ if ((mSubInfo != null &&
+ (uiccStatus == PrimaryCardAndSubsidyLockUtils.CARD_PROVISIONED) != isChecked) &&
+ (!mSubscriptionManager.setSubscriptionEnabled(mSubId, isChecked))) {
return true;
}
return false;
@@ -92,22 +109,29 @@
return;
}
- SubscriptionInfo subInfo = null;
for (SubscriptionInfo info : SubscriptionUtil.getAvailableSubscriptions(mContext)) {
if (info.getSubscriptionId() == mSubId) {
- subInfo = info;
+ mSubInfo = info;
break;
}
}
+ if (TelephonyManager.CALL_STATE_IDLE != mCallState) {
+ Log.d(TAG, "update: disable switchbar, callstate=" + mCallState);
+ mSwitchBar.setEnabled(false);
+ return;
+ } else {
+ mSwitchBar.setEnabled(true);
+ }
+
// For eSIM, we always want the toggle. If telephony stack support disabling a pSIM
// directly, we show the toggle.
- if (subInfo == null || (!subInfo.isEmbedded() && !SubscriptionUtil.showToggleForPhysicalSim(
- mSubscriptionManager))) {
+ if (mSubInfo == null) {
mSwitchBar.hide();
} else {
mSwitchBar.show();
- mSwitchBar.setCheckedInternal(mSubscriptionManager.isActiveSubscriptionId(mSubId));
+ int uiccStatus = PrimaryCardAndSubsidyLockUtils.getUiccCardProvisioningStatus(mPhoneId);
+ mSwitchBar.setCheckedInternal(uiccStatus == PrimaryCardAndSubsidyLockUtils.CARD_PROVISIONED);
}
}
@@ -124,4 +148,32 @@
public void onSubscriptionsChanged() {
update();
}
+
+ private void registerPhoneStateListener() {
+ TelephonyManager tm = mTelephonyManager.createForSubscriptionId(mSubId);
+ tm.listen(getPhoneStateListener(),
+ PhoneStateListener.LISTEN_CALL_STATE);
+ }
+
+ private void unRegisterPhoneStateListener() {
+ if (mPhoneStateListener != null) {
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+ mPhoneStateListener = null;
+ }
+ }
+
+ private PhoneStateListener getPhoneStateListener() {
+ // Disable Sim selection for Data when voice call is going on as changing the default data
+ // sim causes a modem reset currently and call gets disconnected
+ // ToDo : Add subtext on disabled preference to let user know that default data sim cannot
+ // be changed while call is going on
+ mPhoneStateListener = new PhoneStateListener() {
+ @Override
+ public void onCallStateChanged(int state, String incomingNumber) {
+ mCallState = state;
+ update();
+ }
+ };
+ return mPhoneStateListener;
+ }
}
diff --git a/src/com/android/settings/network/telephony/NetworkOperatorPreference.java b/src/com/android/settings/network/telephony/NetworkOperatorPreference.java
index 97894b1..3e1e0dc 100644
--- a/src/com/android/settings/network/telephony/NetworkOperatorPreference.java
+++ b/src/com/android/settings/network/telephony/NetworkOperatorPreference.java
@@ -19,6 +19,7 @@
import static android.telephony.SignalStrength.NUM_SIGNAL_STRENGTH_BINS;
import android.content.Context;
+import android.telephony.AccessNetworkConstants.AccessNetworkType;
import android.telephony.CellIdentity;
import android.telephony.CellIdentityGsm;
import android.telephony.CellIdentityLte;
@@ -38,6 +39,7 @@
import androidx.preference.Preference;
import com.android.settings.R;
+import com.android.settings.Utils;
import java.util.List;
import java.util.Objects;
@@ -57,7 +59,7 @@
private List<String> mForbiddenPlmns;
private int mLevel = LEVEL_NONE;
private boolean mShow4GForLTE;
- private boolean mUseNewApi;
+ private boolean mIsAdvancedScanSupported;
public NetworkOperatorPreference(Context context, CellInfo cellinfo,
List<String> forbiddenPlmns, boolean show4GForLTE) {
@@ -76,8 +78,7 @@
super(context);
mForbiddenPlmns = forbiddenPlmns;
mShow4GForLTE = show4GForLTE;
- mUseNewApi = context.getResources().getBoolean(
- com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI);
+ mIsAdvancedScanSupported = Utils.isAdvancedPlmnScanSupported();
}
/**
@@ -125,10 +126,8 @@
final CellSignalStrength signalStrength = getCellSignalStrength(mCellInfo);
final int level = signalStrength != null ? signalStrength.getLevel() : LEVEL_NONE;
if (DBG) Log.d(TAG, "refresh level: " + String.valueOf(level));
- if (mLevel != level) {
- mLevel = level;
- updateIcon(mLevel);
- }
+ mLevel = level;
+ updateIcon(mLevel);
}
/**
@@ -218,11 +217,33 @@
}
private void updateIcon(int level) {
- if (!mUseNewApi || level < 0 || level >= NUM_SIGNAL_STRENGTH_BINS) {
+ if (!mIsAdvancedScanSupported || level < 0 || level >= NUM_SIGNAL_STRENGTH_BINS) {
return;
}
final Context context = getContext();
setIcon(MobileNetworkUtils.getSignalStrengthIcon(context, level, NUM_SIGNAL_STRENGTH_BINS,
getIconIdForCell(mCellInfo), false));
}
+
+ public int getAccessNetworkType() {
+ int cellInfoType = mCellId == null ? CellInfo.TYPE_UNKNOWN : mCellId.getType();
+ int ant;
+ switch (cellInfoType) {
+ case CellInfo.TYPE_GSM: ant = AccessNetworkType.GERAN;
+ break;
+ case CellInfo.TYPE_LTE: ant = AccessNetworkType.EUTRAN;
+ break;
+ case CellInfo.TYPE_WCDMA: // fallthrough
+ case CellInfo.TYPE_TDSCDMA: ant = AccessNetworkType.UTRAN;
+ break;
+ case CellInfo.TYPE_NR: ant = AccessNetworkType.NGRAN;
+ break;
+ default: ant = AccessNetworkType.UNKNOWN;
+ }
+
+ Log.d(TAG, "AccessNetworkType: " + AccessNetworkType.toString(ant)
+ + " (" + ant + ")"
+ + ", mCellId: " + mCellId.toString());
+ return ant;
+ }
}
diff --git a/src/com/android/settings/network/telephony/NetworkScanHelper.java b/src/com/android/settings/network/telephony/NetworkScanHelper.java
index 524a737..2cddb40 100644
--- a/src/com/android/settings/network/telephony/NetworkScanHelper.java
+++ b/src/com/android/settings/network/telephony/NetworkScanHelper.java
@@ -17,6 +17,10 @@
package com.android.settings.network.telephony;
import android.annotation.IntDef;
+import android.content.Context;
+import android.content.IntentFilter;
+import android.os.RemoteException;
+import android.os.ServiceManager;
import android.telephony.AccessNetworkConstants.AccessNetworkType;
import android.telephony.CellInfo;
import android.telephony.NetworkScan;
@@ -26,13 +30,7 @@
import android.telephony.TelephonyScanManager;
import android.util.Log;
-import com.android.internal.telephony.CellNetworkScanResult;
-
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
-import com.google.common.util.concurrent.SettableFuture;
+import org.codeaurora.internal.IExtTelephony;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -84,20 +82,10 @@
}
@Retention(RetentionPolicy.SOURCE)
- @IntDef({NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS, NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS})
+ @IntDef({NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS, NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS_LEGACY})
public @interface NetworkQueryType {}
/**
- * Performs the network scan using {@link TelephonyManager#getAvailableNetworks()}. The network
- * scan results won't be returned to the caller until the network scan is completed.
- *
- * <p> This is typically used when the modem doesn't support the new network scan api
- * {@link TelephonyManager#requestNetworkScan(
- * NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)}.
- */
- public static final int NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS = 1;
-
- /**
* Performs the network scan using {@link TelephonyManager#requestNetworkScan(
* NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)} The network scan
* results will be returned to the caller periodically in a small time window until the network
@@ -108,29 +96,45 @@
* {@link TelephonyManager#requestNetworkScan(
* NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)}
*/
- public static final int NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS = 2;
+ public static final int NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS = 1;
+
+ /**
+ * Performs the network scan using {@link IExtTelephony#performIncrementalScan(int)}
+ * The network scan is triggered using QcRil hooks, and the results will be returned to the
+ * caller periodically in a small time window until the network scan is completed.
+ *
+ * <p> This is recommended to be used if modem does not support the new network scan api
+ * {@link TelephonyManager#requestNetworkScan(
+ * NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)}.
+ */
+ public static final int NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS_LEGACY = 2;
/** The constants below are used in the async network scan. */
private static final boolean INCREMENTAL_RESULTS = true;
private static final int SEARCH_PERIODICITY_SEC = 5;
- private static final int MAX_SEARCH_TIME_SEC = 300;
+ private static final int MAX_SEARCH_TIME_SEC = 254;
private static final int INCREMENTAL_RESULTS_PERIODICITY_SEC = 3;
private final NetworkScanCallback mNetworkScanCallback;
private final TelephonyManager mTelephonyManager;
private final TelephonyScanManager.NetworkScanCallback mInternalNetworkScanCallback;
private final Executor mExecutor;
-
+ private final LegacyIncrementalScanBroadcastReceiver mLegacyIncrScanReceiver;
+ private Context mContext;
private NetworkScan mNetworkScanRequester;
+ private IExtTelephony mExtTelephony;
+ private IntentFilter filter =
+ new IntentFilter("qualcomm.intent.action.ACTION_INCREMENTAL_NW_SCAN_IND");
- /** Callbacks for sync network scan */
- private ListenableFuture<List<CellInfo>> mNetworkScanFuture;
-
- public NetworkScanHelper(TelephonyManager tm, NetworkScanCallback callback, Executor executor) {
+ public NetworkScanHelper(Context context, TelephonyManager tm, NetworkScanCallback callback,
+ Executor executor) {
+ mContext = context;
mTelephonyManager = tm;
mNetworkScanCallback = callback;
mInternalNetworkScanCallback = new NetworkScanCallbackImpl();
mExecutor = executor;
+ mLegacyIncrScanReceiver =
+ new LegacyIncrementalScanBroadcastReceiver(mContext, mInternalNetworkScanCallback);
}
private NetworkScanRequest createNetworkScanForPreferredAccessNetworks() {
@@ -156,19 +160,11 @@
radioAccessSpecifiers.add(
new RadioAccessSpecifier(AccessNetworkType.EUTRAN, null, null));
}
- // If a device supports 5G stand-alone then the code below should be re-enabled; however
- // a device supporting only non-standalone mode cannot perform PLMN selection and camp on
- // a 5G network, which means that it shouldn't scan for 5G at the expense of battery as
- // part of the manual network selection process.
- //
- // FIXME(b/151119451): re-enable this code once there is a way to distinguish SA from NSA
- // support in the modem.
- //
- // if (networkTypeBitmap3gpp == 0
- // || (networkTypeBitmap3gpp & TelephonyManager.NETWORK_CLASS_BITMASK_5G) != 0) {
- // radioAccessSpecifiers.add(
- // new RadioAccessSpecifier(AccessNetworkType.NGRAN, null, null));
- // }
+ if (networkTypeBitmap3gpp == 0
+ || (networkTypeBitmap3gpp & TelephonyManager.NETWORK_CLASS_BITMASK_5G) != 0) {
+ radioAccessSpecifiers.add(
+ new RadioAccessSpecifier(AccessNetworkType.NGRAN, null, null));
+ }
return new NetworkScanRequest(
NetworkScanRequest.SCAN_TYPE_ONE_SHOT,
@@ -190,27 +186,8 @@
* @param type used to tell which network scan API should be used.
*/
public void startNetworkScan(@NetworkQueryType int type) {
- if (type == NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS) {
- mNetworkScanFuture = SettableFuture.create();
- Futures.addCallback(mNetworkScanFuture, new FutureCallback<List<CellInfo>>() {
- @Override
- public void onSuccess(List<CellInfo> result) {
- onResults(result);
- onComplete();
- }
-
- @Override
- public void onFailure(Throwable t) {
- if (t instanceof CancellationException) {
- return;
- }
- int errCode = Integer.parseInt(t.getMessage());
- onError(errCode);
- }
- }, MoreExecutors.directExecutor());
- mExecutor.execute(new NetworkScanSyncTask(
- mTelephonyManager, (SettableFuture) mNetworkScanFuture));
- } else if (type == NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS) {
+ Log.d(TAG, "startNetworkScan: " + type);
+ if (type == NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS) {
if (mNetworkScanRequester != null) {
return;
}
@@ -221,6 +198,21 @@
if (mNetworkScanRequester == null) {
onError(NetworkScan.ERROR_RADIO_INTERFACE_ERROR);
}
+ } else if (type == NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS_LEGACY) {
+ mContext.registerReceiver(mLegacyIncrScanReceiver, filter);
+ boolean success = false;
+ mExtTelephony = IExtTelephony.Stub
+ .asInterface(ServiceManager.getService("qti.radio.extphone"));
+ try {
+ success = mExtTelephony.performIncrementalScan(mTelephonyManager.getSlotIndex());
+ } catch (RemoteException | NullPointerException ex) {
+ Log.e(TAG, "performIncrementalScan Exception: ", ex);
+ }
+
+ Log.d(TAG, "success: " + success);
+ if (!success) {
+ onError(NetworkScan.ERROR_RADIO_INTERFACE_ERROR);
+ }
}
}
@@ -235,9 +227,21 @@
mNetworkScanRequester = null;
}
- if (mNetworkScanFuture != null) {
- mNetworkScanFuture.cancel(true /* mayInterruptIfRunning */);
- mNetworkScanFuture = null;
+ try {
+ if (mExtTelephony != null) {
+ int slotIndex = mTelephonyManager.getSlotIndex();
+ if (slotIndex >= 0 && slotIndex < mTelephonyManager.getActiveModemCount()) {
+ mExtTelephony.abortIncrementalScan(slotIndex);
+ } else {
+ Log.d(TAG, "slotIndex is invalid, skipping abort");
+ }
+ mExtTelephony = null;
+ mContext.unregisterReceiver(mLegacyIncrScanReceiver);
+ }
+ } catch (RemoteException | NullPointerException ex) {
+ Log.e(TAG, "abortIncrementalScan Exception: ", ex);
+ } catch (IllegalArgumentException ex) {
+ Log.e(TAG, "IllegalArgumentException");
}
}
@@ -253,23 +257,6 @@
mNetworkScanCallback.onError(errCode);
}
- /**
- * Converts the status code of {@link CellNetworkScanResult} to one of the
- * {@link NetworkScan.ScanErrorCode}.
- * @param errCode status code from {@link CellNetworkScanResult}.
- *
- * @return one of the scan error code from {@link NetworkScan.ScanErrorCode}.
- */
- private static int convertToScanErrorCode(int errCode) {
- switch (errCode) {
- case CellNetworkScanResult.STATUS_RADIO_NOT_AVAILABLE:
- return NetworkScan.ERROR_RADIO_INTERFACE_ERROR;
- case CellNetworkScanResult.STATUS_RADIO_GENERIC_FAILURE:
- default:
- return NetworkScan.ERROR_MODEM_ERROR;
- }
- }
-
private final class NetworkScanCallbackImpl extends TelephonyScanManager.NetworkScanCallback {
public void onResults(List<CellInfo> results) {
Log.d(TAG, "Async scan onResults() results = "
@@ -287,35 +274,4 @@
NetworkScanHelper.this.onError(errCode);
}
}
-
- private static final class NetworkScanSyncTask implements Runnable {
- private final SettableFuture<List<CellInfo>> mCallback;
- private final TelephonyManager mTelephonyManager;
-
- NetworkScanSyncTask(
- TelephonyManager telephonyManager, SettableFuture<List<CellInfo>> callback) {
- mTelephonyManager = telephonyManager;
- mCallback = callback;
- }
-
- @Override
- public void run() {
- final CellNetworkScanResult result = mTelephonyManager.getAvailableNetworks();
- if (result.getStatus() == CellNetworkScanResult.STATUS_SUCCESS) {
- final List<CellInfo> cellInfos = result.getOperators()
- .stream()
- .map(operatorInfo
- -> CellInfoUtil.convertOperatorInfoToCellInfo(operatorInfo))
- .collect(Collectors.toList());
- Log.d(TAG, "Sync network scan completed, cellInfos = "
- + CellInfoUtil.cellInfoListToString(cellInfos));
- mCallback.set(cellInfos);
- } else {
- final Throwable error = new Throwable(
- Integer.toString(convertToScanErrorCode(result.getStatus())));
- mCallback.setException(error);
- Log.d(TAG, "Sync network scan error, ex = " + error);
- }
- }
- }
}
diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
index 3f18928..f409285 100644
--- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java
+++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
@@ -28,6 +28,10 @@
import android.telephony.CarrierConfigManager;
import android.telephony.CellIdentity;
import android.telephony.CellInfo;
+import android.telephony.CellInfoCdma;
+import android.telephony.CellInfoGsm;
+import android.telephony.CellInfoLte;
+import android.telephony.CellInfoWcdma;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
@@ -41,6 +45,7 @@
import androidx.preference.PreferenceCategory;
import com.android.settings.R;
+import com.android.settings.Utils;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -49,6 +54,8 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -83,6 +90,7 @@
private final ExecutorService mNetworkScanExecutor = Executors.newFixedThreadPool(1);
private MetricsFeatureProvider mMetricsFeatureProvider;
private boolean mUseNewApi;
+ private boolean mIsAdvancedScanSupported;
private long mRequestIdManualNetworkSelect;
private long mRequestIdManualNetworkScan;
private long mWaitingForNumberOfScanResults;
@@ -93,8 +101,8 @@
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
- mUseNewApi = getContext().getResources().getBoolean(
- com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI);
+ mIsAdvancedScanSupported = Utils.isAdvancedPlmnScanSupported();
+ Log.d(TAG, "mIsAdvancedScanSupported: " + mIsAdvancedScanSupported);
mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID);
mPreferenceCategory = findPreference(PREF_KEY_NETWORK_OPERATORS);
@@ -104,7 +112,7 @@
mTelephonyManager = getContext().getSystemService(TelephonyManager.class)
.createForSubscriptionId(mSubId);
mNetworkScanHelper = new NetworkScanHelper(
- mTelephonyManager, mCallback, mNetworkScanExecutor);
+ getContext(), mTelephonyManager, mCallback, mNetworkScanExecutor);
PersistableBundle bundle = ((CarrierConfigManager) getContext().getSystemService(
Context.CARRIER_CONFIG_SERVICE)).getConfigForSubId(mSubId);
if (bundle != null) {
@@ -131,6 +139,7 @@
@Override
public void onStart() {
+ Log.d(TAG, "onStart()");
super.onStart();
updateForbiddenPlmns();
@@ -138,6 +147,8 @@
return;
}
if (mWaitingForNumberOfScanResults <= 0) {
+ // Clear the selected preference whenever the scan starts
+ mSelectedPreference = null;
startNetworkQuery();
}
}
@@ -155,6 +166,7 @@
@Override
public void onStop() {
+ Log.d(TAG, "onStop() mWaitingForNumberOfScanResults: " + mWaitingForNumberOfScanResults);
super.onStop();
if (mWaitingForNumberOfScanResults <= 0) {
stopNetworkQuery();
@@ -186,11 +198,14 @@
mRequestIdManualNetworkSelect = getNewRequestId();
mWaitingForNumberOfScanResults = MIN_NUMBER_OF_SCAN_REQUIRED;
final String operatorNumeric = mSelectedPreference.getOperatorNumeric();
+ final int accessNetworkType = mSelectedPreference.getAccessNetworkType();
ThreadUtils.postOnBackgroundThread(() -> {
final Message msg = mHandler.obtainMessage(
EVENT_SET_NETWORK_SELECTION_MANUALLY_DONE);
+ // Send accessNetworkType as a parameter.
+ // This is converted to RadioAccessNetwork in the Telephony Framework.
msg.obj = mTelephonyManager.setNetworkSelectionModeManual(
- operatorNumeric, true /* persistSelection */);
+ operatorNumeric, true /* persistSelection */, accessNetworkType);
msg.sendToTarget();
});
}
@@ -216,10 +231,10 @@
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
+ Log.d(TAG, "handleMessage, msg.what: " + msg.what);
switch (msg.what) {
case EVENT_SET_NETWORK_SELECTION_MANUALLY_DONE:
final boolean isSucceed = (boolean) msg.obj;
- stopNetworkQuery();
setProgressBarVisible(false);
getPreferenceScreen().setEnabled(true);
@@ -240,6 +255,7 @@
}
mCellInfoList = new ArrayList<>(results);
+ Log.d(TAG, "CellInfoList size: " + mCellInfoList.size());
Log.d(TAG, "CellInfoList: " + CellInfoUtil.cellInfoListToString(mCellInfoList));
if (mCellInfoList != null && mCellInfoList.size() != 0) {
final NetworkOperatorPreference connectedPref =
@@ -406,20 +422,31 @@
if (networkList == null || networkList.size() == 0) {
return;
}
+
+ Set<CellIdentity> cellIdentitySet = new HashSet<CellIdentity>();
for (NetworkRegistrationInfo regInfo : networkList) {
+ Log.d(TAG, "regInfo: " + regInfo.toString());
+ // There can be multiple NetworkRegistrationInfos for the same CellIdentity,
+ // e.g., one each for CS and PS. In such cases, show show only one entry,
+ // otherwise it would be quite confusing to the user to see multiple entries for
+ // the same CellIdentity instance.
final CellIdentity cellIdentity = regInfo.getCellIdentity();
if (cellIdentity != null) {
- final NetworkOperatorPreference pref = new NetworkOperatorPreference(
- getPrefContext(), cellIdentity, mForbiddenPlmns, mShow4GForLTE);
- pref.setSummary(R.string.network_connected);
- // Update the signal strength icon, since the default signalStrength value
- // would be zero
- // (it would be quite confusing why the connected network has no signal)
- pref.setIcon(SignalStrength.NUM_SIGNAL_STRENGTH_BINS - 1);
- mPreferenceCategory.addPreference(pref);
- break;
+ // Add each valid CellIdentity to a HashSet so that only unique values remain.
+ cellIdentitySet.add(cellIdentity);
}
}
+
+ for (CellIdentity cellIdentity : cellIdentitySet) {
+ final NetworkOperatorPreference pref = new NetworkOperatorPreference(
+ getPrefContext(), cellIdentity, mForbiddenPlmns, mShow4GForLTE);
+ pref.setSummary(R.string.network_connected);
+ // Update the signal strength icon, since the default signalStrength value
+ // would be zero
+ // (it would be quite confusing why the connected network has no signal)
+ pref.setIcon(SignalStrength.NUM_SIGNAL_STRENGTH_BINS - 1);
+ mPreferenceCategory.addPreference(pref);
+ }
}
}
@@ -466,10 +493,11 @@
if (mNetworkScanHelper != null) {
mRequestIdManualNetworkScan = getNewRequestId();
mWaitingForNumberOfScanResults = MIN_NUMBER_OF_SCAN_REQUIRED;
+
mNetworkScanHelper.startNetworkScan(
- mUseNewApi
+ mIsAdvancedScanSupported
? NetworkScanHelper.NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS
- : NetworkScanHelper.NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS);
+ : NetworkScanHelper.NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS_LEGACY);
}
}
@@ -483,6 +511,7 @@
@Override
public void onDestroy() {
+ Log.d(TAG, "onDestroy()");
stopNetworkQuery();
mNetworkScanExecutor.shutdown();
super.onDestroy();
diff --git a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java
index 83fa208..7a4b05e 100644
--- a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java
+++ b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java
@@ -16,15 +16,26 @@
package com.android.settings.network.telephony;
+import static androidx.lifecycle.Lifecycle.Event.ON_START;
+import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
+
import android.content.Context;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.os.Looper;
import android.os.PersistableBundle;
import android.provider.Settings;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import android.util.Log;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants;
@@ -33,16 +44,47 @@
* Preference controller for "Preferred network mode"
*/
public class PreferredNetworkModePreferenceController extends TelephonyBasePreferenceController
- implements ListPreference.OnPreferenceChangeListener {
+ implements ListPreference.OnPreferenceChangeListener, LifecycleObserver {
+ private static final String LOG_TAG = "PreferredNetworkMode";
private CarrierConfigManager mCarrierConfigManager;
+ private ContentObserver mPreferredNetworkModeObserver;
+ private ContentObserver mSubsidySettingsObserver;
private TelephonyManager mTelephonyManager;
private PersistableBundle mPersistableBundle;
private boolean mIsGlobalCdma;
+ private Preference mPreference;
+
+ // Local cache for Primary Card and Subsidy Lock related vendor properties. Reading these
+ // properties are a costly affair since they involve two IPC calls, an AIDL and another HIDL.
+ // So we cache these and reuse them as and when applicable.
+ boolean mIsPrimaryCardEnabled = false;
+ boolean mIsPrimaryCardLWEnabled = false;
+ boolean mIsSubsidyLockFeatureEnabled = false;
public PreferredNetworkModePreferenceController(Context context, String key) {
super(context, key);
mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
+ mSubsidySettingsObserver = new ContentObserver(new Handler(Looper.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange) {
+ if (mPreference != null) {
+ if (PrimaryCardAndSubsidyLockUtils.DBG) {
+ Log.d(LOG_TAG, "mSubsidySettingsObserver#onChange");
+ }
+ updateState(mPreference);
+ }
+ }
+ };
+ mPreferredNetworkModeObserver = new ContentObserver(new Handler(Looper.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange) {
+ if (mPreference != null) {
+ Log.d(LOG_TAG, "mPreferredNetworkModeObserver#onChange");
+ updateState(mPreference);
+ }
+ }
+ };
}
@Override
@@ -67,11 +109,41 @@
return visible ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
+ @OnLifecycleEvent(ON_START)
+ public void onStart() {
+ loadPrimaryCardAndSubsidyLockValues();
+ if (mIsSubsidyLockFeatureEnabled) {
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Secure.getUriFor(PrimaryCardAndSubsidyLockUtils.SUBSIDY_STATUS), false,
+ mSubsidySettingsObserver);
+ }
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.PREFERRED_NETWORK_MODE + mSubId), true,
+ mPreferredNetworkModeObserver);
+ }
+
+ @OnLifecycleEvent(ON_STOP)
+ public void onStop() {
+ if (mSubsidySettingsObserver != null) {
+ mContext.getContentResolver().unregisterContentObserver(mSubsidySettingsObserver);
+ }
+ if (mPreferredNetworkModeObserver != null) {
+ mContext.getContentResolver().unregisterContentObserver(mPreferredNetworkModeObserver);
+ }
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+ }
+
@Override
public void updateState(Preference preference) {
super.updateState(preference);
final ListPreference listPreference = (ListPreference) preference;
final int networkMode = getPreferredNetworkMode();
+ updatePreferenceEntries(listPreference);
listPreference.setValue(Integer.toString(networkMode));
listPreference.setSummary(getPreferredNetworkModeSummaryResId(networkMode));
}
@@ -93,7 +165,7 @@
return false;
}
- public void init(int subId) {
+ public void init(Lifecycle lifecycle, int subId) {
mSubId = subId;
final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId);
mTelephonyManager = mContext.getSystemService(TelephonyManager.class)
@@ -101,6 +173,8 @@
mIsGlobalCdma = mTelephonyManager.isLteCdmaEvdoGsmWcdmaEnabled()
&& carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_CDMA_CHOICES_BOOL);
+
+ lifecycle.addObserver(this);
}
private int getPreferredNetworkMode() {
@@ -191,4 +265,84 @@
return R.string.preferred_network_mode_global_summary;
}
}
+
+ private void updatePreferenceEntries(ListPreference preference) {
+ // Default values
+ preference.setEntries(R.array.preferred_network_mode_choices);
+ preference.setEntryValues(R.array.preferred_network_mode_values);
+
+ // Primary Card Feature
+ // If the current SIM is not the primary card
+ // 1. If PrimaryCardL_W is enabled, restrict mode selection to GSM and WCDMA options.
+ // 2. If the current mode is GSM_only, disable the network mode preference on the UI.
+ final int currentPrimarySlot = Settings.Global.getInt(mContext.getContentResolver(),
+ PrimaryCardAndSubsidyLockUtils.CONFIG_CURRENT_PRIMARY_SUB,
+ SubscriptionManager.INVALID_SIM_SLOT_INDEX);
+
+ boolean isCurrentPrimarySlotValid = currentPrimarySlot >= 0
+ && currentPrimarySlot < mTelephonyManager.getActiveModemCount();
+
+ int currentPhoneId = SubscriptionManager.getPhoneId(mSubId);
+
+ Log.d(LOG_TAG, "currentPrimarySlot: " + currentPrimarySlot
+ + ", isCurrentPrimarySlotValid: " + isCurrentPrimarySlotValid
+ + ", currentPhoneId: " + currentPhoneId);
+
+ if (mIsPrimaryCardEnabled) {
+ if (PrimaryCardAndSubsidyLockUtils.DBG) {
+ Log.d(LOG_TAG, "isPrimaryCardEnabled: true");
+ }
+ if (isCurrentPrimarySlotValid
+ && currentPhoneId != currentPrimarySlot) {
+ if (mIsPrimaryCardLWEnabled) {
+ Log.d(LOG_TAG, "Primary card LW is enabled");
+ preference.setEntries(R.array.preferred_network_mode_gsm_wcdma_choices);
+ preference.setEntryValues(R.array.preferred_network_mode_gsm_wcdma_values);
+ } else if (getPreferredNetworkMode() == TelephonyManager.NETWORK_MODE_GSM_ONLY) {
+ Log.d(LOG_TAG, "Network mode is GSM only, disabling the preference");
+ preference.setEnabled(false);
+ }
+ }
+ }
+
+ // Subsidy Lock Feature
+ // If subsidy is unlocked,
+ // 1. Change the entries in the network mode choices for the primary sub.
+ // 2. Disable the network mode preference on the UI for the non-primary sub.
+ if (PrimaryCardAndSubsidyLockUtils.DBG) {
+ Log.d(LOG_TAG, "isSubsidyLockFeatureEnabled: " + mIsSubsidyLockFeatureEnabled);
+ Log.d(LOG_TAG, "isSubsidyUnlocked: "
+ + PrimaryCardAndSubsidyLockUtils.isSubsidyUnlocked(mContext));
+ }
+
+ if (mIsSubsidyLockFeatureEnabled
+ && PrimaryCardAndSubsidyLockUtils.isSubsidyUnlocked(mContext)) {
+ if (PrimaryCardAndSubsidyLockUtils.DBG) {
+ Log.d(LOG_TAG, "Subsidy is unlocked");
+ }
+ if (isCurrentPrimarySlotValid) {
+ if (currentPhoneId == currentPrimarySlot) {
+ Log.d(LOG_TAG, "Primary sub, change to subsidy choices");
+ preference.setEntries(R.array.enabled_networks_subsidy_locked_choices);
+ preference.setEntryValues(R.array.enabled_networks_subsidy_locked_values);
+ } else {
+ Log.d(LOG_TAG, "Non-primary sub, disable the preference");
+ preference.setEnabled(false);
+ }
+ }
+ }
+ }
+
+ private void loadPrimaryCardAndSubsidyLockValues() {
+ Log.d(LOG_TAG, "loadPrimaryCardAndSubsidyLockValues");
+ mIsPrimaryCardEnabled = PrimaryCardAndSubsidyLockUtils.isPrimaryCardEnabled();
+ mIsPrimaryCardLWEnabled = PrimaryCardAndSubsidyLockUtils.isPrimaryCardLWEnabled();
+ mIsSubsidyLockFeatureEnabled = PrimaryCardAndSubsidyLockUtils.isSubsidyLockFeatureEnabled();
+
+ if (PrimaryCardAndSubsidyLockUtils.DBG) {
+ Log.d(LOG_TAG, "mIsPrimaryCardEnabled: " + mIsPrimaryCardEnabled);
+ Log.d(LOG_TAG, "mIsPrimaryCardLWEnabled: " + mIsPrimaryCardLWEnabled);
+ Log.d(LOG_TAG, "mIsSubsidyLockFeatureEnabled: " + mIsSubsidyLockFeatureEnabled);
+ }
+ }
}
diff --git a/src/com/android/settings/network/telephony/PrimaryCardAndSubsidyLockUtils.java b/src/com/android/settings/network/telephony/PrimaryCardAndSubsidyLockUtils.java
new file mode 100644
index 0000000..1d184b5
--- /dev/null
+++ b/src/com/android/settings/network/telephony/PrimaryCardAndSubsidyLockUtils.java
@@ -0,0 +1,136 @@
+/**
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package com.android.settings.network.telephony;
+
+import android.content.Context;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+import android.util.Log;
+
+import org.codeaurora.internal.IExtTelephony;
+
+/**
+ * Add static utility functions to get information about Primary Card and Subsidy Lock features.
+ */
+public final class PrimaryCardAndSubsidyLockUtils {
+
+ private static final String TAG = "PrimaryCardAndSubsidyLockUtils";
+
+ // Flag to control debug logging for primary card and subsidy lock features
+ public static boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
+
+ // Primary card and subsidy lock related system properties
+ private static final String PROPERTY_PRIMARY_CARD = "persist.vendor.radio.primarycard";
+ private static final String PROPERTY_DETECT_4G_CARD = "persist.vendor.radio.detect4gcard";
+ private static final String PROPERTY_L_W_ENABLED = "persist.vendor.radio.lw_enabled";
+ private static final String PROPERTY_SUBSIDY_LOCK = "ro.vendor.radio.subsidylock";
+
+ // Settings database configurations
+ public static final String CONFIG_CURRENT_PRIMARY_SUB = "config_current_primary_sub";
+ public static final String SUBSIDY_STATUS = "subsidy_status";
+
+ // Subsidy lock resticted states
+ private static final int SUBSIDYLOCK_UNLOCKED = 103;
+ private static final int PERMANENTLY_UNLOCKED = 100;
+
+ // UICC provisioning status
+ public static final int CARD_NOT_PROVISIONED = 0;
+ public static final int CARD_PROVISIONED = 1;
+ public static final int CARD_INVALID_STATE = -1;
+
+ private PrimaryCardAndSubsidyLockUtils() {
+ }
+
+ public static boolean isPrimaryCardEnabled() {
+ return isVendorPropertyEnabled(PROPERTY_PRIMARY_CARD);
+ }
+
+ public static boolean isDetect4gCardEnabled() {
+ return isVendorPropertyEnabled(PROPERTY_DETECT_4G_CARD);
+ }
+
+ public static boolean isPrimaryCardLWEnabled() {
+ return isVendorPropertyEnabled(PROPERTY_L_W_ENABLED);
+ }
+
+ public static boolean isSubsidyLockFeatureEnabled() {
+ return (getVendorPropertyInt(PROPERTY_SUBSIDY_LOCK) == 1);
+ }
+
+ public static boolean isSubsidyUnlocked(Context context) {
+ return getSubsidyStatus(context) == SUBSIDYLOCK_UNLOCKED;
+ }
+
+ public static boolean isSubsidyPermanentlyUnlocked(Context context) {
+ return getSubsidyStatus(context) == SUBSIDYLOCK_UNLOCKED;
+ }
+
+ private static int getSubsidyStatus(Context context) {
+ return Settings.Secure.getInt(context.getContentResolver(), SUBSIDY_STATUS, -1);
+ }
+
+ private static boolean isVendorPropertyEnabled(String propertyName) {
+ boolean propVal = false;
+ IExtTelephony extTelephony = IExtTelephony.Stub
+ .asInterface(ServiceManager.getService("qti.radio.extphone"));
+ try {
+ propVal = extTelephony.getPropertyValueBool(propertyName, false);
+ } catch (RemoteException | NullPointerException ex) {
+ Log.e(TAG, "isVendorPropertyEnabled: " + propertyName + ", Exception: ", ex);
+ }
+ return propVal;
+ }
+
+ private static int getVendorPropertyInt(String propertyName) {
+ int propVal = -1;
+ IExtTelephony extTelephony = IExtTelephony.Stub
+ .asInterface(ServiceManager.getService("qti.radio.extphone"));
+ try {
+ propVal = extTelephony.getPropertyValueInt(propertyName, -1);
+ } catch (RemoteException | NullPointerException ex) {
+ Log.e(TAG, "getVendorPropertyInt: " + propertyName + ", Exception: ", ex);
+ }
+ return propVal;
+ }
+
+ public static int getUiccCardProvisioningStatus(int phoneId) {
+ int provStatus = CARD_NOT_PROVISIONED;
+ IExtTelephony extTelephony = IExtTelephony.Stub
+ .asInterface(ServiceManager.getService("qti.radio.extphone"));
+ try {
+ provStatus = extTelephony.getCurrentUiccCardProvisioningStatus(phoneId);
+ } catch (RemoteException | NullPointerException ex) {
+ Log.e(TAG, "getUiccCardProvisioningStatus: " + phoneId + ", Exception: ", ex);
+ }
+ return provStatus;
+ }
+}
diff --git a/src/com/android/settings/network/telephony/UserPLMNEditorActivity.java b/src/com/android/settings/network/telephony/UserPLMNEditorActivity.java
new file mode 100755
index 0000000..47e0836
--- /dev/null
+++ b/src/com/android/settings/network/telephony/UserPLMNEditorActivity.java
@@ -0,0 +1,403 @@
+/**
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package com.android.settings.network.telephony;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.text.InputType;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.WindowManager;
+import android.widget.EditText;
+import android.preference.EditTextPreference;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.settings.R;
+
+import java.util.List;
+
+/**
+ * Editor activity for "User Controlled PLMN"
+ */
+public class UserPLMNEditorActivity extends PreferenceActivity implements
+ Preference.OnPreferenceChangeListener, TextWatcher {
+ private static final String LOG_TAG = "UserPLMNEditorActivity";
+ private static final int MENU_DELETE_OPTION = Menu.FIRST;
+ private static final int MENU_SAVE_OPTION = Menu.FIRST + 1;
+ private static final int MENU_CANCEL_OPTION = Menu.FIRST + 2;
+ private static final int NWID_DIALOG_ID = 0;
+
+ private static final String BUTTON_NETWORK_ID_KEY = "network_id_key";
+ private static final String BUTTON_PRIORITY_KEY = "priority_key";
+ private static final String BUTTON_NEWWORK_MODE_KEY = "network_mode_key";
+
+ public static final String UPLMN_CODE = "uplmn_code";
+ public static final String UPLMN_PRIORITY = "uplmn_priority";
+ public static final String UPLMN_SERVICE = "uplmn_service";
+ public static final String UPLMN_SIZE = "uplmn_size";
+ public static final String UPLMN_ADD = "uplmn_add";
+
+ public static final int RESULT_CODE_EDIT = 101;
+ public static final int RESULT_CODE_DELETE = 102;
+
+ private static final int GSM = 0;
+ private static final int WCDMA_TDSCDMA = 1;
+ private static final int LTE = 2;
+ private static final int TRIPLE_MODE = 3;
+ private static final int MODE_2G = 0x1;
+ private static final int MODE_3G = 0x4;
+ private static final int MODE_LTE = 0x8;
+ private static final int MODE_TRIPLE = 0xd;
+
+ private String mNoSet = null;
+ private boolean mAirplaneModeOn = false;
+ private IntentFilter mIntentFilter;
+ private Preference mNWIDPref = null;
+ private EditTextPreference mPRIpref = null;
+ private ListPreference mNWMPref = null;
+ private EditText mNWIDText;
+ private AlertDialog mNWIDDialog = null;
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
+ mAirplaneModeOn = intent.getBooleanExtra("state", false);
+ setScreenEnabled();
+ }
+ }
+ };
+
+ private OnClickListener mNWIDPrefListener = new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (which == DialogInterface.BUTTON_POSITIVE) {
+ String summary = genText(mNWIDText.getText().toString());
+ Log.d(LOG_TAG, "input network id is " + summary);
+ mNWIDPref.setSummary(summary);
+ mNWMPref.setEntries(getResources().getTextArray(
+ selectNetworkChoices(summary)));
+ }
+ }
+ };
+
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ addPreferencesFromResource(R.xml.uplmn_editor);
+ mNoSet = getResources().getString(R.string.voicemail_number_not_set);
+
+ mNWIDPref = (Preference) findPreference(BUTTON_NETWORK_ID_KEY);
+ mPRIpref = (EditTextPreference) findPreference(BUTTON_PRIORITY_KEY);
+ mNWMPref = (ListPreference) findPreference(BUTTON_NEWWORK_MODE_KEY);
+
+ mPRIpref.setOnPreferenceChangeListener(this);
+ mNWMPref.setOnPreferenceChangeListener(this);
+
+ mIntentFilter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+ registerReceiver(mReceiver, mIntentFilter);
+ }
+
+ protected void onResume() {
+ super.onResume();
+ displayNetworkInfo(getIntent());
+ mAirplaneModeOn =
+ Settings.System.getInt(
+ getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) == 1;
+ setScreenEnabled();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ unregisterReceiver(mReceiver);
+ }
+
+ public boolean onPreferenceChange(Preference preference, Object object) {
+ String value = object.toString();
+ if (preference == mPRIpref) {
+ mPRIpref.setSummary(genText(value));
+ } else if (preference == mNWMPref) {
+ mNWMPref.setValue(value);
+ String summary = "";
+ int index = Integer.parseInt(value);
+ summary = getResources().getStringArray(
+ selectNetworkChoices(mNWIDPref.getSummary().toString()))[index];
+ mNWMPref.setSummary(summary);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ if (!getIntent().getBooleanExtra(UPLMN_ADD, false)) {
+ menu.add(0, MENU_DELETE_OPTION, 0,
+ com.android.internal.R.string.delete);
+ }
+ menu.add(0, MENU_SAVE_OPTION, 0, R.string.save);
+ menu.add(0, MENU_CANCEL_OPTION, 0, com.android.internal.R.string.cancel);
+ return true;
+ }
+
+ @Override
+ public boolean onMenuOpened(int featureId, Menu menu) {
+ super.onMenuOpened(featureId, menu);
+ boolean isEmpty = mNoSet.equals(mNWIDPref.getSummary())
+ || mNoSet.equals(mPRIpref.getSummary());
+ if (menu != null) {
+ menu.setGroupEnabled(0, !mAirplaneModeOn);
+ //only show the save and delete option menu when radio on
+ //and edit text is not empty.
+ if (getIntent().getBooleanExtra(UPLMN_ADD, true)) {
+ menu.getItem(0).setEnabled((!mAirplaneModeOn) && !isEmpty);
+ } else {
+ menu.getItem(1).setEnabled((!mAirplaneModeOn) && !isEmpty);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_SAVE_OPTION:
+ setSavedNWInfo();
+ break;
+ case MENU_DELETE_OPTION:
+ setRemovedNWInfo();
+ break;
+ case MENU_CANCEL_OPTION:
+ break;
+ case android.R.id.home:
+ finish();
+ return true;
+ default:
+ break;
+ }
+ finish();
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void setSavedNWInfo() {
+ Intent intent = new Intent(this, UserPLMNListActivity.class);
+ genNWInfoToIntent(intent);
+ setResult(RESULT_CODE_EDIT, intent);
+ }
+
+ private void genNWInfoToIntent(Intent intent) {
+ int priority = 0;
+ int plmnListSize = getIntent().getIntExtra(UPLMN_SIZE, 0);
+ try {
+ priority = Integer.parseInt(String.valueOf(mPRIpref.getSummary()));
+ } catch (NumberFormatException e) {
+ Log.d(LOG_TAG, "parse value of basband error");
+ }
+ if (getIntent().getBooleanExtra(UPLMN_ADD, false)) {
+ if (priority > plmnListSize) {
+ priority = plmnListSize;
+ }
+ } else {
+ if (priority >= plmnListSize) {
+ priority = plmnListSize - 1;
+ }
+ }
+ intent.putExtra(UPLMN_PRIORITY, priority);
+
+ try {
+ intent.putExtra(UPLMN_SERVICE, convertApMode2EF(Integer
+ .parseInt(String.valueOf(mNWMPref.getValue()))));
+ } catch (NumberFormatException e) {
+ intent.putExtra(UPLMN_SERVICE, convertApMode2EF(0));
+ }
+
+ intent.putExtra(UPLMN_CODE, mNWIDPref.getSummary());
+ }
+
+ private void setRemovedNWInfo() {
+ Intent intent = new Intent(this, UserPLMNListActivity.class);
+ genNWInfoToIntent(intent);
+ setResult(RESULT_CODE_DELETE, intent);
+ }
+
+ public static int convertEFMode2Ap(int mode) {
+ int result = 0;
+ if (mode == MODE_TRIPLE) {
+ result = TRIPLE_MODE;
+ } else if (mode == MODE_3G) {
+ result = WCDMA_TDSCDMA;
+ } else if (mode == MODE_LTE) {
+ result = LTE;
+ } else {
+ result = GSM;
+ }
+ return result;
+ }
+
+ public static int convertApMode2EF(int mode) {
+ int result = 0;
+ if (mode == TRIPLE_MODE) {
+ result = MODE_TRIPLE;
+ } else if (mode == LTE) {
+ result = MODE_LTE;
+ } else if (mode == WCDMA_TDSCDMA) {
+ result = MODE_3G;
+ } else {
+ result = MODE_2G;
+ }
+ return result;
+ }
+
+ private void displayNetworkInfo(Intent intent) {
+ String number = intent.getStringExtra(UPLMN_CODE);
+ mNWIDPref.setSummary(genText(number));
+ int priority = intent.getIntExtra(UPLMN_PRIORITY, 0);
+ mPRIpref.setSummary(String.valueOf(priority));
+ mPRIpref.setText(String.valueOf(priority));
+ int act = intent.getIntExtra(UPLMN_SERVICE, 0);
+
+ Log.d(LOG_TAG, "act = " + act);
+
+ act = convertEFMode2Ap(act);
+ if (act < GSM || act > TRIPLE_MODE) {
+ act = GSM;
+ }
+ String summary = "";
+ mNWMPref.setEntries(getResources().getTextArray(
+ selectNetworkChoices(number)));
+ summary = getResources().getStringArray(
+ selectNetworkChoices(number))[act];
+ mNWMPref.setSummary(summary);
+ mNWMPref.setValue(String.valueOf(act));
+ }
+
+ public int selectNetworkChoices(String plmn) {
+ Log.d(LOG_TAG, "plmn = " + plmn);
+ String[] CuPlmnArray = getResources().getStringArray(R.array.uplmn_cu_mcc_mnc_values);
+ for (String CuPlmn : CuPlmnArray) {
+ if (plmn.equals(CuPlmn)) return R.array.uplmn_prefer_network_mode_w_choices;
+ }
+ return R.array.uplmn_prefer_network_mode_td_choices;
+ }
+
+ private String genText(String value) {
+ if (value == null || value.length() == 0) {
+ return mNoSet;
+ } else {
+ return value;
+ }
+ }
+
+ public void buttonEnabled() {
+ int len = mNWIDText.getText().toString().length();
+ boolean state = true;
+ if (len <5 || len > 6) {
+ state = false;
+ }
+ if (mNWIDDialog != null) {
+ mNWIDDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(
+ state);
+ }
+ }
+
+ private void setScreenEnabled() {
+ getPreferenceScreen().setEnabled(!mAirplaneModeOn);
+ invalidateOptionsMenu();
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen screen,
+ Preference preference) {
+ if (preference == mNWIDPref) {
+ removeDialog(NWID_DIALOG_ID);
+ showDialog(NWID_DIALOG_ID);
+ buttonEnabled();
+ }
+ return super.onPreferenceTreeClick(screen, preference);
+ }
+
+ @Override
+ public Dialog onCreateDialog(int id) {
+ if (id == NWID_DIALOG_ID) {
+ mNWIDText = new EditText(this);
+ if (!mNoSet.equals(mNWIDPref.getSummary())) {
+ mNWIDText.setText(mNWIDPref.getSummary());
+ }
+ mNWIDText.addTextChangedListener(this);
+ mNWIDText.setInputType(InputType.TYPE_CLASS_NUMBER);
+ mNWIDDialog = new AlertDialog.Builder(this)
+ .setTitle(getResources().getString(R.string.network_id))
+ .setView(mNWIDText)
+ .setPositiveButton(
+ getResources().getString(
+ com.android.internal.R.string.ok),
+ mNWIDPrefListener)
+ .setNegativeButton(
+ getResources().getString(
+ com.android.internal.R.string.cancel), null)
+ .create();
+ mNWIDDialog.getWindow().setSoftInputMode(
+ WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ return mNWIDDialog;
+ }
+ return null;
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count,
+ int after) {
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ buttonEnabled();
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ }
+
+}
diff --git a/src/com/android/settings/network/telephony/UserPLMNListActivity.java b/src/com/android/settings/network/telephony/UserPLMNListActivity.java
new file mode 100755
index 0000000..283b1b4
--- /dev/null
+++ b/src/com/android/settings/network/telephony/UserPLMNListActivity.java
@@ -0,0 +1,746 @@
+/**
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package com.android.settings.network.telephony;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.ProgressDialog;
+import android.content.DialogInterface;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.AsyncResult;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
+import android.telephony.SubscriptionManager;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.util.Log;
+
+import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.telephony.uicc.IccConstants;
+import com.android.internal.telephony.uicc.IccUtils;
+import com.android.internal.telephony.uicc.PlmnActRecord;
+import com.android.internal.telephony.uicc.UiccController;
+import com.android.settings.R;
+
+import org.codeaurora.internal.IExtTelephony;
+
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * List the MCCMNC and the priority for "User Controlled PLMN"
+ */
+public class UserPLMNListActivity extends PreferenceActivity
+ implements DialogInterface.OnCancelListener {
+ private static final String LOG_TAG = "UserPLMNListActivity";
+ private static final boolean DBG = true;
+
+ private static final int BUSY_READING_DIALOG = 99;
+ private static final int BUSY_SAVING_DIALOG = 100;
+ private static final int UPLMNLIST_ADD = 101;
+ private static final int UPLMNLIST_EDIT = 102;
+ private static final int MENU_ADD_OPTIION = Menu.FIRST;
+
+ /* 5n bytes:
+ 1 to 3 nth PLMN (highest priority)
+ 4 to 5 nth PLMN Access Technology Identifier */
+ private static final int UPLMN_SEL_DATA_LEN = 5;
+ private static final int GSM_MASK = 1;
+ /**
+ * GSM compact access technology.
+ */
+ private static final int GSM_COMPACT_MASK = 2;
+ /**
+ * UMTS radio access technology.
+ */
+ private static final int UMTS_MASK = 4;
+ /**
+ * LTE radio access technology.
+ */
+ private static final int LTE_MASK = 8;
+
+ private List<UPLMNInfoWithEf> mUPLMNList;
+ private PreferenceScreen mUPLMNListContainer;
+ private static final String BUTTON_UPLMN_LIST_KEY = "button_uplmn_list_key";
+ private Map<Preference, UPLMNInfoWithEf> mPreferenceMap
+ = new LinkedHashMap<Preference, UPLMNInfoWithEf>();
+ private UPLMNInfoWithEf mOldInfo;
+ private int mNumRec = 0;
+ private boolean mAirplaneModeOn = false;
+ private int mPhoneId = 0;
+ protected boolean mIsForeground = false;
+
+ private MyHandler mHandler = new MyHandler();
+ private IExtTelephony mExtTelephony;
+ private static final String ACTION_READ_EF_BROADCAST =
+ "com.qualcomm.qti.intent.action.ACTION_READ_EF_RESULT";
+ private static final String ACTION_WRITE_EF_BROADCAST =
+ "com.qualcomm.qti.intent.action.ACTION_WRITE_EF_RESULT";
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
+ mAirplaneModeOn = intent.getBooleanExtra("state", false);
+ setScreenEnabled();
+ } else if (ACTION_READ_EF_BROADCAST.equals(action)) {
+ if (intent.getBooleanExtra("exception", false)) {
+ log("ACTION_READ_EF_BROADCAST with exception");
+ Message message = mHandler.obtainMessage();
+ message.what = mHandler.MESSAGE_GET_UPLMN_LIST;
+ message.obj = new AsyncResult(null, null, new Exception());
+ // trigger tone stop after timeout duration
+ mHandler.sendMessage(message);
+ } else {
+ handleGetEFDone(intent.getByteArrayExtra("payload"));
+ }
+ } else if (ACTION_WRITE_EF_BROADCAST.equals(action)) {
+ if (intent.getBooleanExtra("exception", false)) {
+ log("ACTION_WRITE_EF_BROADCAST with exception");
+ } else {
+ log("handleSetEFDone: with OK result!");
+ }
+ getUPLMNInfoFromEf();
+ }
+ }
+ };
+
+ @Override
+ protected Dialog onCreateDialog(int id) {
+ ProgressDialog dialog = new ProgressDialog(this);
+ dialog.setTitle(getText(R.string.uplmn_settings_title));
+ dialog.setIndeterminate(true);
+ switch(id) {
+ case BUSY_READING_DIALOG:
+ dialog.setCancelable(true);
+ dialog.setOnCancelListener(this);
+ dialog.setMessage(getText(R.string.reading_settings));
+ return dialog;
+ case BUSY_SAVING_DIALOG:
+ dialog.setCancelable(false);
+ dialog.setMessage(getText(R.string.updating_settings));
+ return dialog;
+ }
+ return null;
+ }
+
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ finish();
+ }
+
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ addPreferencesFromResource(R.xml.uplmn_settings);
+ mUPLMNListContainer = (PreferenceScreen) findPreference(BUTTON_UPLMN_LIST_KEY);
+ int subId = getIntent().getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX,
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ mPhoneId = SubscriptionManager.getPhoneId(subId);
+
+ mExtTelephony
+ = IExtTelephony.Stub
+ .asInterface(ServiceManager.getService("qti.radio.extphone"));
+
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
+ intentFilter.addAction(ACTION_WRITE_EF_BROADCAST);
+ intentFilter.addAction(ACTION_READ_EF_BROADCAST);
+ registerReceiver(mReceiver, intentFilter);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ unregisterReceiver(mReceiver);
+ }
+
+ public void onResume() {
+ super.onResume();
+ mIsForeground = true;
+ getUPLMNInfoFromEf();
+ showReadingDialog();
+ mAirplaneModeOn = Settings.System.getInt(getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_ON, 0) == 1;
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mIsForeground = false;
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ menu.add(0, MENU_ADD_OPTIION, 0, R.string.uplmn_list_setting_add_plmn)
+ .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ if (menu != null) {
+ menu.setGroupEnabled(0, !mAirplaneModeOn);
+ }
+ return super.onPrepareOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_ADD_OPTIION:
+ if (!hasGetIccFileHandler()) return true;
+ Intent intent = new Intent(this, UserPLMNEditorActivity.class);
+ intent.putExtra(UserPLMNEditorActivity.UPLMN_CODE, "");
+ intent.putExtra(UserPLMNEditorActivity.UPLMN_PRIORITY, 0);
+ intent.putExtra(UserPLMNEditorActivity.UPLMN_SERVICE, 0);
+ intent.putExtra(UserPLMNEditorActivity.UPLMN_ADD, true);
+ intent.putExtra(UserPLMNEditorActivity.UPLMN_SIZE, mUPLMNList.size());
+ startActivityForResult(intent, UPLMNLIST_ADD);
+ break;
+ case android.R.id.home:
+ finish();
+ return true;
+ default:
+ break;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void showReadingDialog() {
+ if (mIsForeground && hasGetIccFileHandler()) {
+ showDialog(BUSY_READING_DIALOG);
+ }
+ }
+
+ private void showSavingDialog() {
+ if (mIsForeground) {
+ showDialog(BUSY_SAVING_DIALOG);
+ }
+ }
+
+ private void dismissDialogSafely(int id) {
+ try {
+ dismissDialog(id);
+ } catch (IllegalArgumentException e) {
+ // This is expected in the case where we were in the background
+ // at the time we would normally have shown the dialog, so we didn't
+ // show it.
+ }
+ }
+
+ public void onFinished(Preference preference, boolean reading) {
+ log("onFinished reading: " + reading);
+ if (reading) {
+ dismissDialogSafely(BUSY_READING_DIALOG);
+ } else {
+ dismissDialogSafely(BUSY_SAVING_DIALOG);
+ }
+ preference.setEnabled(true);
+ setScreenEnabled();
+ }
+
+ private void getUPLMNInfoFromEf() {
+ log("UPLMNInfoFromEf Start read...");
+ if (!readEfFromIcc(IccConstants.EF_PLMN_W_ACT)) {
+ Log.w(LOG_TAG, "mIccFileHandler is null");
+ }
+ }
+
+ private boolean hasGetIccFileHandler() {
+ boolean success = false;
+ try {
+ if (mExtTelephony != null) {
+ success = mExtTelephony.hasGetIccFileHandler(mPhoneId, UiccController.APP_FAM_3GPP);
+ }
+ } catch (RemoteException | NullPointerException ex) {
+ Log.e(LOG_TAG, "hasGetIccFileHandler Exception: ", ex);
+
+ }
+ return success;
+ }
+
+ private boolean readEfFromIcc(int efid) {
+ boolean success = false;
+ try {
+ if (mExtTelephony != null) {
+ success = mExtTelephony.readEfFromIcc(mPhoneId, UiccController.APP_FAM_3GPP, efid);
+ }
+ } catch (RemoteException | NullPointerException ex) {
+ Log.e(LOG_TAG, "readEfFromIcc Exception: ", ex);
+
+ }
+ return success;
+ }
+
+ private boolean writeEfToIcc(byte[] efdata, int efid) {
+ boolean success = false;
+ try {
+ if (mExtTelephony != null) {
+ success = mExtTelephony.writeEfToIcc(mPhoneId, UiccController.APP_FAM_3GPP,
+ efid, efdata);
+ }
+ } catch (RemoteException | NullPointerException ex) {
+ Log.e(LOG_TAG, "writeEfToIcc Exception: ", ex);
+
+ }
+ return success;
+ }
+
+ private void refreshUPLMNListPreference(ArrayList<UPLMNInfoWithEf> list) {
+ if (mUPLMNListContainer.getPreferenceCount() != 0) {
+ mUPLMNListContainer.removeAll();
+ }
+
+ if (this.mPreferenceMap != null) {
+ mPreferenceMap.clear();
+ }
+
+ if (mUPLMNList != null) {
+ mUPLMNList.clear();
+ }
+ mUPLMNList = list;
+ if (list == null) {
+ log("refreshUPLMNListPreference : NULL UPLMN list!");
+ } else {
+ log("refreshUPLMNListPreference : list.size()" + list.size());
+ }
+
+ if (list == null || list.size() == 0) {
+ if (DBG) {
+ log("refreshUPLMNListPreference : NULL UPLMN list!");
+ }
+ if (list == null) {
+ mUPLMNList = new ArrayList<UPLMNInfoWithEf>();
+ }
+ return;
+ }
+
+ for (UPLMNInfoWithEf network : list) {
+ addUPLMNPreference(network);
+ if (DBG) {
+ log(network.toString());
+ }
+ }
+ }
+
+ class UPLMNInfoWithEf {
+
+ private String mOperatorNumeric;
+
+ private int mNetworkMode;
+ private int mPriority; // priority is the index of the plmn in the list.
+
+ public String getOperatorNumeric() {
+ return mOperatorNumeric;
+ }
+
+ public int getNetworMode() {
+ return mNetworkMode;
+ }
+
+ public int getPriority() {
+ return mPriority;
+ }
+
+ public void setOperatorNumeric(String operatorNumeric) {
+ this.mOperatorNumeric = operatorNumeric;
+ }
+
+ public void setPriority(int index) {
+ this.mPriority = index;
+ }
+
+ public UPLMNInfoWithEf(String operatorNumeric, int mNetworkMode,
+ int mPriority) {
+ this.mOperatorNumeric = operatorNumeric;
+ this.mNetworkMode = mNetworkMode;
+ this.mPriority = mPriority;
+ }
+
+ public String toString() {
+ return "UPLMNInfoWithEf " + mOperatorNumeric + "/" + mNetworkMode
+ + "/" + mPriority;
+ }
+ }
+
+ class PriorityCompare implements Comparator<UPLMNInfoWithEf> {
+
+ public int compare(UPLMNInfoWithEf object1, UPLMNInfoWithEf object2) {
+ return (object1.getPriority() - object2.getPriority());
+ }
+ }
+
+ private void addUPLMNPreference(UPLMNInfoWithEf network) {
+ Preference pref = new Preference(this);
+ String plmnName = network.getOperatorNumeric();
+ String extendName = getNetworkModeString(network.getNetworMode(), plmnName);
+ pref.setTitle(plmnName + "(" + extendName + ")");
+ mUPLMNListContainer.addPreference(pref);
+ mPreferenceMap.put(pref, network);
+ }
+
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
+ Preference preference) {
+ Intent intent = new Intent(this, UserPLMNEditorActivity.class);
+ UPLMNInfoWithEf info = this.mPreferenceMap.get(preference);
+ mOldInfo = info;
+
+ intent.putExtra(UserPLMNEditorActivity.UPLMN_CODE, info.getOperatorNumeric());
+ intent.putExtra(UserPLMNEditorActivity.UPLMN_PRIORITY, info.getPriority());
+ intent.putExtra(UserPLMNEditorActivity.UPLMN_SERVICE, info.getNetworMode());
+ intent.putExtra(UserPLMNEditorActivity.UPLMN_ADD, false);
+ intent.putExtra(UserPLMNEditorActivity.UPLMN_SIZE, mUPLMNList.size());
+ startActivityForResult(intent, UPLMNLIST_EDIT);
+ return true;
+ }
+
+ protected void onActivityResult(final int requestCode,
+ final int resultCode, final Intent intent) {
+ log("resultCode = " + resultCode + ", requestCode = " + requestCode);
+
+ if (intent != null) {
+ UPLMNInfoWithEf newInfo = createNetworkInfofromIntent(intent);
+ if (resultCode == UserPLMNEditorActivity.RESULT_CODE_DELETE) {
+ handleSetUPLMN(handleDeleteList(mOldInfo));
+ } else if (resultCode == UserPLMNEditorActivity.RESULT_CODE_EDIT) {
+ if (requestCode == UPLMNLIST_ADD) {
+ handleAddList(newInfo);
+ } else if (requestCode == UPLMNLIST_EDIT) {
+ handleSetUPLMN(handleModifiedList(newInfo, mOldInfo));
+ }
+ }
+ }
+ }
+
+ private UPLMNInfoWithEf createNetworkInfofromIntent(Intent intent) {
+ String numberName = intent.getStringExtra(UserPLMNEditorActivity.UPLMN_CODE);
+ int priority = intent.getIntExtra(UserPLMNEditorActivity.UPLMN_PRIORITY, 0);
+ int act = intent.getIntExtra(UserPLMNEditorActivity.UPLMN_SERVICE, 0);
+ return new UPLMNInfoWithEf(numberName, act, priority);
+ }
+
+ public static byte[] stringToBcdPlmn(String str) {
+ if (str.length() == 5) {
+ str = str + "f";
+ }
+
+ byte[] trans = IccUtils.hexStringToBytes(str);
+
+ byte[] data = new byte[3];;
+ data[0] = (byte) ((trans[0] >> 4) | ((trans[0] << 4) & 0xF0));
+ data[1] = (byte) ((trans[1] >> 4) | ((trans[2] << 4) & 0xF0));
+ data[2] = (byte) ((trans[2] & 0xF0) | (trans[1] & 0xF));
+
+ return data;
+ }
+
+ private void handleSetUPLMN(ArrayList<UPLMNInfoWithEf> list) {
+ showSavingDialog();
+ byte[] data = new byte[mNumRec * UPLMN_SEL_DATA_LEN];
+ byte[] mccmnc = new byte[6];
+ for (int i = 0; i < mNumRec; i++) {
+ data[i * UPLMN_SEL_DATA_LEN] = (byte) 0xFF;
+ data[i * UPLMN_SEL_DATA_LEN + 1] = (byte) 0xFF;
+ data[i * UPLMN_SEL_DATA_LEN + 2] = (byte) 0xFF;
+
+ data[i * UPLMN_SEL_DATA_LEN + 3] = 0;
+ data[i * UPLMN_SEL_DATA_LEN + 4] = 0;
+ }
+ for (int i = 0; ((i < list.size()) && (i < mNumRec)); i++) {
+ UPLMNInfoWithEf ni = list.get(i);
+ String strOperNumeric = ni.getOperatorNumeric();
+ if (TextUtils.isEmpty(strOperNumeric)) {
+ break;
+ }
+ log("strOperNumeric = " + strOperNumeric);
+
+ System.arraycopy(stringToBcdPlmn(strOperNumeric),
+ 0, data, i * UPLMN_SEL_DATA_LEN, 3);
+ log("data[0] = " + data[i * UPLMN_SEL_DATA_LEN]);
+ log("data[1] = " + data[i * UPLMN_SEL_DATA_LEN +1]);
+ log("data[2] = " + data[i * UPLMN_SEL_DATA_LEN +2]);
+
+ int accessTech = convertNetworkMode2AccessTech(ni.getNetworMode());
+ data[i * UPLMN_SEL_DATA_LEN + 3] = (byte) (accessTech >> 8);
+ data[i * UPLMN_SEL_DATA_LEN + 4] = (byte) (accessTech & 0xFF);
+ log("accessTech = " + accessTech);
+ log("data[3] = " + data[i * UPLMN_SEL_DATA_LEN +3]);
+ log("data[4] = " + data[i * UPLMN_SEL_DATA_LEN +4]);
+ }
+
+ log("update EFuplmn Start.");
+ writeEfToIcc(data, IccConstants.EF_PLMN_W_ACT);
+ }
+
+ private void handleAddList(UPLMNInfoWithEf newInfo) {
+ log("handleAddList: add new network: " + newInfo);
+ dumpUPLMNInfo(mUPLMNList);
+ ArrayList<UPLMNInfoWithEf> list = new ArrayList<UPLMNInfoWithEf>();
+ for (int i = 0; i < mUPLMNList.size(); i++) {
+ list.add(mUPLMNList.get(i));
+ }
+ PriorityCompare pc = new PriorityCompare();
+ int position = Collections.binarySearch(mUPLMNList, newInfo, pc);
+ if (position >= 0)
+ list.add(position, newInfo);
+ else
+ list.add(newInfo);
+ updateListPriority(list);
+ dumpUPLMNInfo(list);
+ handleSetUPLMN(list);
+ }
+
+ private void dumpUPLMNInfo(List<UPLMNInfoWithEf> list) {
+ if (!DBG) {
+ return;
+ }
+ for (int i = 0; i < list.size(); i++) {
+ log("dumpUPLMNInfo : " + list.get(i).toString());
+ }
+ }
+
+ private ArrayList<UPLMNInfoWithEf> handleModifiedList(
+ UPLMNInfoWithEf newInfo, UPLMNInfoWithEf oldInfo) {
+ log("handleModifiedList: change old info: " + oldInfo.toString()
+ + " new info: " + newInfo.toString());
+ dumpUPLMNInfo(mUPLMNList);
+
+ PriorityCompare pc = new PriorityCompare();
+ int oldposition = Collections.binarySearch(mUPLMNList, oldInfo, pc);
+ int newposition = Collections.binarySearch(mUPLMNList, newInfo, pc);
+
+ ArrayList<UPLMNInfoWithEf> list = new ArrayList<UPLMNInfoWithEf>();
+ for (int i = 0; i < mUPLMNList.size(); i++) {
+ list.add(mUPLMNList.get(i));
+ }
+
+ if (oldposition > newposition) {
+ list.remove(oldposition);
+ list.add(newposition, newInfo);
+ } else if (oldposition < newposition) {
+ list.add(newposition + 1, newInfo);
+ list.remove(oldposition);
+ } else {
+ list.remove(oldposition);
+ list.add(oldposition, newInfo);
+ }
+
+ updateListPriority(list);
+ dumpUPLMNInfo(list);
+ return list;
+ }
+
+ private void updateListPriority(ArrayList<UPLMNInfoWithEf> list) {
+ int priority = 0;
+ for (UPLMNInfoWithEf info : list) {
+ info.setPriority(priority++);
+ }
+ }
+
+ private ArrayList<UPLMNInfoWithEf> handleDeleteList(UPLMNInfoWithEf network) {
+ log("handleDeleteList : " + network.toString());
+ dumpUPLMNInfo(mUPLMNList);
+
+ ArrayList<UPLMNInfoWithEf> list = new ArrayList<UPLMNInfoWithEf>();
+ PriorityCompare pc = new PriorityCompare();
+ int position = Collections.binarySearch(mUPLMNList, network, pc);
+
+ for (int i = 0; i < mUPLMNList.size(); i++) {
+ list.add(mUPLMNList.get(i));
+ }
+
+ list.remove(position);
+ network.setOperatorNumeric(null);
+ list.add(network);
+
+ updateListPriority(list);
+ dumpUPLMNInfo(list);
+
+ return list;
+ }
+
+ private class MyHandler extends Handler {
+ private static final int MESSAGE_GET_UPLMN_LIST = 0;
+
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MESSAGE_GET_UPLMN_LIST:
+ handleGetUPLMNList(msg);
+ break;
+ default:
+ break;
+ }
+ }
+
+ public void handleGetUPLMNList(Message msg) {
+ if (DBG) {
+ log("handleGetUPLMNList: done");
+ }
+
+ if (msg.arg2 == MyHandler.MESSAGE_GET_UPLMN_LIST) {
+ onFinished(mUPLMNListContainer, true);
+ } else {
+ onFinished(mUPLMNListContainer, false);
+ }
+
+ AsyncResult ar = (AsyncResult) msg.obj;
+ if (ar.exception != null) {
+ log("handleGetUPLMNList with exception = "
+ + ar.exception);
+ if (mUPLMNList == null) {
+ mUPLMNList = new ArrayList<UPLMNInfoWithEf>();
+ }
+ } else {
+ refreshUPLMNListPreference((ArrayList<UPLMNInfoWithEf>) ar.result);
+ }
+ }
+ }
+
+ public void handleGetEFDone(byte[] data) {
+ if (DBG) {
+ log("handleGetEFDone: done");
+ }
+
+ mNumRec = data.length / UPLMN_SEL_DATA_LEN;
+ log("Received a PlmnActRecord, raw=" + IccUtils.bytesToHexString(data));
+
+ PlmnActRecord[] plmnActRecords = PlmnActRecord.getRecords(data);
+ log("PlmnActRecords=" + Arrays.toString(plmnActRecords));
+
+ ArrayList<UPLMNInfoWithEf> ret = new ArrayList<UPLMNInfoWithEf>();
+ int i = 0;
+ String INVALID_PLMN_PREFIX = "FFFFF";
+ for (PlmnActRecord record : plmnActRecords) {
+ if(!record.plmn.regionMatches(
+ true, 0, INVALID_PLMN_PREFIX, 0, INVALID_PLMN_PREFIX.length())
+ && record.accessTechs != -1 && !TextUtils.isEmpty(record.plmn)
+ && record.plmn.length() >= 5){
+ ret.add(new UPLMNInfoWithEf(
+ record.plmn,
+ convertAccessTech2NetworkMode(record.accessTechs),
+ i));
+ }
+ i++;
+ }
+
+ Message message = mHandler.obtainMessage();
+ message.what = MyHandler.MESSAGE_GET_UPLMN_LIST;
+ if (ret == null) {
+ log("handleGetEFDone : NULL ret list!");
+ } else {
+ log("handleGetEFDone : ret.size()" + ret.size());
+ }
+
+ message.obj = new AsyncResult(message.obj, (Object) ret, null);
+ mHandler.sendMessage(message);
+ }
+
+ private int convertAccessTech2NetworkMode(int accessTechs) {
+ int networkMode = 0;
+
+ if ((accessTechs & PlmnActRecord.ACCESS_TECH_EUTRAN) != 0) {
+ networkMode = networkMode | LTE_MASK;
+ }
+ if ((accessTechs & PlmnActRecord.ACCESS_TECH_UTRAN) != 0) {
+ networkMode = networkMode | UMTS_MASK;
+ }
+ if ((accessTechs & PlmnActRecord.ACCESS_TECH_GSM) != 0) {
+ networkMode = networkMode | GSM_MASK;
+ }
+ if ((accessTechs & PlmnActRecord.ACCESS_TECH_GSM_COMPACT) != 0) {
+ networkMode = networkMode | GSM_COMPACT_MASK;
+ }
+
+ return networkMode;
+ }
+
+ private int convertNetworkMode2AccessTech(int networkMode) {
+ int accessTechs = 0;
+
+ if ((networkMode & LTE_MASK) != 0) {
+ accessTechs = accessTechs | PlmnActRecord.ACCESS_TECH_EUTRAN;
+ }
+ if ((networkMode & UMTS_MASK) != 0) {
+ accessTechs = accessTechs | PlmnActRecord.ACCESS_TECH_UTRAN;
+ }
+ if ((networkMode & GSM_MASK) != 0) {
+ accessTechs = accessTechs | PlmnActRecord.ACCESS_TECH_GSM;
+ }
+ if ((networkMode & GSM_COMPACT_MASK) != 0) {
+ accessTechs = accessTechs | PlmnActRecord.ACCESS_TECH_GSM_COMPACT;
+ }
+
+ return accessTechs;
+ }
+
+ private String getNetworkModeString(int EFNWMode, String plmn) {
+ Log.d(LOG_TAG, "plmn = " + plmn);
+ int index = UserPLMNEditorActivity.convertEFMode2Ap(EFNWMode);
+ String[] CuPlmnArray = getResources().getStringArray(R.array.uplmn_cu_mcc_mnc_values);
+ for (String CuPlmn : CuPlmnArray) {
+ if (plmn.equals(CuPlmn)) {
+ return getResources().getStringArray
+ (R.array.uplmn_prefer_network_mode_w_choices)[index];
+ }
+ }
+ return getResources().getStringArray(R.array.uplmn_prefer_network_mode_td_choices)[index];
+ }
+
+ private void setScreenEnabled() {
+ getPreferenceScreen().setEnabled(!mAirplaneModeOn);
+ invalidateOptionsMenu();
+ }
+
+ private static void log(String msg) {
+ Log.d(LOG_TAG, msg);
+ }
+}
diff --git a/src/com/android/settings/network/telephony/UserPLMNPreferenceController.java b/src/com/android/settings/network/telephony/UserPLMNPreferenceController.java
new file mode 100755
index 0000000..76008cd
--- /dev/null
+++ b/src/com/android/settings/network/telephony/UserPLMNPreferenceController.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+package com.android.settings.network.telephony;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+
+import com.android.settings.network.telephony.UserPLMNListActivity;
+
+/**
+ * Preference controller for "User PLMN Settings"
+ */
+public class UserPLMNPreferenceController extends TelephonyBasePreferenceController {
+
+ @VisibleForTesting
+ CarrierConfigManager mCarrierConfigManager;
+
+ public UserPLMNPreferenceController(Context context, String key) {
+ super(context, key);
+ mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
+ }
+
+ public void init(int subId) {
+ mSubId = subId;
+ }
+
+ @Override
+ public int getAvailabilityStatus(int subId) {
+ return SubscriptionManager.isValidSubscriptionId(subId)
+ ? AVAILABLE
+ : CONDITIONALLY_UNAVAILABLE;
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(Preference preference) {
+ if (getPreferenceKey().equals(preference.getKey())) {
+ final Intent intent = new Intent(mContext, UserPLMNListActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, mSubId);
+ mContext.startActivity(intent);
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/src/com/android/settings/notification/CallConnectedTonePreferenceController.java b/src/com/android/settings/notification/CallConnectedTonePreferenceController.java
new file mode 100644
index 0000000..9498485
--- /dev/null
+++ b/src/com/android/settings/notification/CallConnectedTonePreferenceController.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.notification;
+
+import static com.android.settings.notification.SettingPref.TYPE_SYSTEM;
+
+import android.content.Context;
+import android.provider.Settings.System;
+
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.Utils;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+
+public class CallConnectedTonePreferenceController extends SettingPrefController {
+
+ private static final String KEY_CALL_CONNECTED_TONES = "call_connected_tones";
+
+ public CallConnectedTonePreferenceController(Context context, SettingsPreferenceFragment parent,
+ Lifecycle lifecycle) {
+ super(context, parent, lifecycle);
+
+ int defaultOn = mContext.getResources().getInteger(R.integer.
+ config_default_tone_after_connected);
+ mPreference = new SettingPref(
+ TYPE_SYSTEM, KEY_CALL_CONNECTED_TONES, System.CALL_CONNECTED_TONE_ENABLED,
+ defaultOn) {
+ @Override
+ public boolean isApplicable(Context context) {
+ return context.getResources().getBoolean(R.bool.config_show_connect_tone_ui);
+ }
+ };
+ }
+
+}
diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java
index 9e7f3ed..040948b 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -241,6 +241,8 @@
// === Other Sound Settings ===
final DialPadTonePreferenceController dialPadTonePreferenceController =
new DialPadTonePreferenceController(context, fragment, lifecycle);
+ final CallConnectedTonePreferenceController callConnectedTonePreferenceController =
+ new CallConnectedTonePreferenceController(context, fragment, lifecycle);
final ScreenLockSoundPreferenceController screenLockSoundPreferenceController =
new ScreenLockSoundPreferenceController(context, fragment, lifecycle);
final ChargingSoundPreferenceController chargingSoundPreferenceController =
@@ -259,6 +261,7 @@
new EmergencyTonePreferenceController(context, fragment, lifecycle);
controllers.add(dialPadTonePreferenceController);
+ controllers.add(callConnectedTonePreferenceController);
controllers.add(screenLockSoundPreferenceController);
controllers.add(chargingSoundPreferenceController);
controllers.add(dockingSoundPreferenceController);
@@ -270,6 +273,7 @@
controllers.add(new PreferenceCategoryController(context,
"other_sounds_and_vibrations_category").setChildren(
Arrays.asList(dialPadTonePreferenceController,
+ callConnectedTonePreferenceController,
screenLockSoundPreferenceController,
chargingSoundPreferenceController,
dockingSoundPreferenceController,
@@ -310,4 +314,4 @@
mDialogFragment.onListPreferenceUpdated(preference);
}
}
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index 04ee1b8..d27f46c 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -203,6 +203,7 @@
mLockPatternUtils = new LockPatternUtils(activity);
mIsSetNewPassword = ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(chooseLockAction)
|| ACTION_SET_NEW_PASSWORD.equals(chooseLockAction);
+ mLockPatternUtils.sanitizePassword();
// Defaults to needing to confirm credentials
final boolean confirmCredentials = intent
@@ -821,6 +822,7 @@
@Override
public void onDestroy() {
super.onDestroy();
+ mLockPatternUtils.sanitizePassword();
if (mUserPassword != null) {
mUserPassword.zeroize();
}
diff --git a/src/com/android/settings/sim/SimSelectNotification.java b/src/com/android/settings/sim/SimSelectNotification.java
index ae36f35..a36fa33 100644
--- a/src/com/android/settings/sim/SimSelectNotification.java
+++ b/src/com/android/settings/sim/SimSelectNotification.java
@@ -52,6 +52,8 @@
import com.android.settings.network.telephony.MobileNetworkActivity;
import com.android.settingslib.HelpUtils;
+import org.codeaurora.internal.IExtTelephony;
+
public class SimSelectNotification extends BroadcastReceiver {
private static final String TAG = "SimSelectNotification";
@VisibleForTesting
diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
index f179df0..e11a845 100644
--- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
+++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
@@ -270,9 +270,12 @@
final PreferenceImageView imageView = view.findViewById(android.R.id.icon);
final int level = accessPoint.getLevel();
+ final int standard = accessPoint.getWifiStandard();
+ final boolean isReady = accessPoint.isHe8ssCapableAp()
+ && accessPoint.isVhtMax8SpatialStreamsSupported();
if (imageView != null) {
final Drawable drawable = getContext().getDrawable(
- Utils.getWifiIconResource(level));
+ Utils.getWifiIconResource(level, standard, isReady));
drawable.setTintList(
Utils.getColorAttr(getContext(), android.R.attr.colorControlNormal));
imageView.setImageDrawable(drawable);
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index 1579188..9553804 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -28,6 +28,7 @@
import android.net.StaticIpConfiguration;
import android.net.Uri;
import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.wifi.WifiEnterpriseConfig;
import android.net.wifi.WifiEnterpriseConfig.Eap;
import android.net.wifi.WifiEnterpriseConfig.Phase2;
@@ -35,8 +36,10 @@
import android.net.wifi.WifiManager;
import android.os.IBinder;
import android.os.UserManager;
+import android.provider.Settings;
import android.security.Credentials;
import android.security.KeyStore;
+import android.telephony.TelephonyManager;
import android.text.Editable;
import android.text.InputType;
import android.text.SpannableString;
@@ -65,6 +68,8 @@
import android.widget.Spinner;
import android.widget.TextView;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
import androidx.annotation.VisibleForTesting;
import com.android.settings.ProxySelector;
@@ -76,6 +81,9 @@
import com.android.settingslib.utils.ThreadUtils;
import com.android.settingslib.wifi.AccessPoint;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Collections;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.util.ArrayList;
@@ -174,6 +182,9 @@
private TextView mEapIdentityView;
private TextView mEapAnonymousView;
+ private Spinner mSimCardSpinner;
+ private ArrayList<String> mSimDisplayNames;
+
private Spinner mIpSettingsSpinner;
private TextView mIpAddressView;
private TextView mGatewayView;
@@ -191,6 +202,7 @@
private TextView mProxyExclusionListView;
private TextView mProxyPacView;
private CheckBox mSharedCheckBox;
+ private CheckBox mShareThisWifiCheckBox;
private IpAssignment mIpAssignment = IpAssignment.UNASSIGNED;
private ProxySettings mProxySettings = ProxySettings.UNASSIGNED;
@@ -208,6 +220,9 @@
Integer mSecurityInPosition[];
private final WifiManager mWifiManager;
+ private TelephonyManager mTelephonyManager;
+ private SubscriptionManager mSubscriptionManager = null;
+ private int selectedSimCardNumber;
public WifiConfigController(WifiConfigUiBase parent, View view, AccessPoint accessPoint,
int mode) {
@@ -248,6 +263,8 @@
final Resources res = mContext.getResources();
+ mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+ mSimDisplayNames = new ArrayList<String>();
mLevels = res.getStringArray(R.array.wifi_signal);
if (Utils.isWifiOnly(mContext) || !mContext.getResources().getBoolean(
com.android.internal.R.bool.config_eap_sim_based_auth_supported)) {
@@ -287,12 +304,21 @@
mHiddenSettingsSpinner.getSelectedItemPosition() == NOT_HIDDEN_NETWORK
? View.GONE
: View.VISIBLE);
+ mShareThisWifiCheckBox = (CheckBox) mView.findViewById(R.id.share_this_wifi);
mSecurityInPosition = new Integer[AccessPoint.SECURITY_MAX_VAL];
if (mAccessPoint == null) { // new network
configureSecuritySpinner();
mConfigUi.setSubmitButton(res.getString(R.string.wifi_save));
} else {
+
+ if (!mWifiManager.isWifiCoverageExtendFeatureEnabled()
+ || (mAccessPoint.getSecurity() != AccessPoint.SECURITY_NONE
+ && mAccessPoint.getSecurity() != AccessPoint.SECURITY_PSK)) {
+ mShareThisWifiCheckBox.setChecked(false);
+ mShareThisWifiCheckBox.setVisibility(View.GONE);
+ }
+
mConfigUi.setTitle(mAccessPoint.getTitle());
ViewGroup group = (ViewGroup) mView.findViewById(R.id.info);
@@ -328,7 +354,7 @@
} else {
mIpSettingsSpinner.setSelection(DHCP);
}
-
+ mShareThisWifiCheckBox.setChecked(config.shareThisAp);
mSharedCheckBox.setEnabled(config.shared);
if (!config.shared) {
showAdvancedFields = true;
@@ -425,6 +451,9 @@
} else if (frequency >= AccessPoint.LOWER_FREQ_5GHZ
&& frequency < AccessPoint.HIGHER_FREQ_5GHZ) {
band = res.getString(R.string.wifi_band_5ghz);
+ } else if (frequency >= AccessPoint.LOWER_FREQ_60GHZ
+ && frequency < AccessPoint.HIGHER_FREQ_60GHZ) {
+ band = res.getString(R.string.wifi_band_60ghz);
} else {
Log.e(TAG, "Unexpected frequency " + frequency);
}
@@ -637,6 +666,7 @@
}
config.shared = mSharedCheckBox.isChecked();
+ config.shareThisAp = mShareThisWifiCheckBox.isChecked();
switch (mAccessPointSecurity) {
case AccessPoint.SECURITY_NONE:
@@ -728,6 +758,12 @@
break;
}
break;
+ case Eap.SIM:
+ case Eap.AKA:
+ case Eap.AKA_PRIME:
+ selectedSimCardNumber = mSimCardSpinner.getSelectedItemPosition() + 1;
+ config.enterpriseConfig.setSimNum(selectedSimCardNumber);
+ break;
default:
break;
}
@@ -809,6 +845,11 @@
config.enterpriseConfig.setPassword(mPasswordView.getText().toString());
}
break;
+
+ case AccessPoint.SECURITY_DPP:
+ config.allowedKeyManagement.set(KeyMgmt.DPP);
+ config.requirePmf = true;
+ break;
case AccessPoint.SECURITY_SAE:
config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE);
if (mPasswordView.length() != 0) {
@@ -981,7 +1022,8 @@
private void showSecurityFields(boolean refreshEapMethods, boolean refreshCertificates) {
if (mAccessPointSecurity == AccessPoint.SECURITY_NONE ||
- mAccessPointSecurity == AccessPoint.SECURITY_OWE) {
+ mAccessPointSecurity == AccessPoint.SECURITY_OWE ||
+ mAccessPointSecurity == AccessPoint.SECURITY_DPP) {
mView.findViewById(R.id.security_fields).setVisibility(View.GONE);
return;
}
@@ -1003,6 +1045,11 @@
if (mAccessPointSecurity != AccessPoint.SECURITY_EAP &&
mAccessPointSecurity != AccessPoint.SECURITY_EAP_SUITE_B) {
mView.findViewById(R.id.eap).setVisibility(View.GONE);
+ // Make sure password fields are visible when PSK security is selected.
+ // Password fields are not re-enabled in some cases like when security
+ // type is changed from EAP TLS to PSK
+ mView.findViewById(R.id.password_layout).setVisibility(View.VISIBLE);
+ mView.findViewById(R.id.show_password_layout).setVisibility(View.VISIBLE);
return;
}
mView.findViewById(R.id.eap).setVisibility(View.VISIBLE);
@@ -1010,9 +1057,16 @@
// TODO (b/140541213): Maybe we can remove initiateEnterpriseNetworkUi by moving code block
boolean initiateEnterpriseNetworkUi = false;
if (mEapMethodSpinner == null) {
+ getSIMInfo();
initiateEnterpriseNetworkUi = true;
mEapMethodSpinner = (Spinner) mView.findViewById(R.id.method);
mEapMethodSpinner.setOnItemSelectedListener(this);
+
+ if (mAccessPointSecurity == AccessPoint.SECURITY_EAP_SUITE_B) {
+ mEapMethodSpinner.setSelection(WIFI_EAP_METHOD_TLS);
+ mEapMethodSpinner.setEnabled(false);
+ }
+
mPhase2Spinner = (Spinner) mView.findViewById(R.id.phase2);
mPhase2Spinner.setOnItemSelectedListener(this);
mEapCaCertSpinner = (Spinner) mView.findViewById(R.id.ca_cert);
@@ -1022,6 +1076,7 @@
mEapDomainView.addTextChangedListener(this);
mEapUserCertSpinner = (Spinner) mView.findViewById(R.id.user_cert);
mEapUserCertSpinner.setOnItemSelectedListener(this);
+ mSimCardSpinner = (Spinner) mView.findViewById(R.id.sim_card);
mEapIdentityView = (TextView) mView.findViewById(R.id.identity);
mEapAnonymousView = (TextView) mView.findViewById(R.id.anonymous);
@@ -1117,6 +1172,17 @@
break;
}
break;
+ case Eap.SIM:
+ case Eap.AKA:
+ case Eap.AKA_PRIME:
+ if (enterpriseConfig.getSimNum() != null
+ && !enterpriseConfig.getSimNum().isEmpty()) {
+ int mSimNum = Integer.parseInt(enterpriseConfig.getSimNum());
+ mSimCardSpinner.setSelection(mSimNum - 1);
+ } else {
+ mSimCardSpinner.setSelection(0);
+ }
+ break;
default:
break;
}
@@ -1150,6 +1216,12 @@
mEapIdentityView.setText(enterpriseConfig.getIdentity());
mEapAnonymousView.setText(enterpriseConfig.getAnonymousIdentity());
} else {
+ if (mAccessPointSecurity == AccessPoint.SECURITY_EAP_SUITE_B) {
+ mEapMethodSpinner.setSelection(WIFI_EAP_METHOD_TLS);
+ mEapMethodSpinner.setEnabled(false);
+ } else {
+ mEapMethodSpinner.setEnabled(true);
+ }
showEapFieldsByMethod(mEapMethodSpinner.getSelectedItemPosition());
}
}
@@ -1218,12 +1290,14 @@
setDomainInvisible();
setAnonymousIdentInvisible();
setUserCertInvisible();
+ setSimCardInvisible();
break;
case WIFI_EAP_METHOD_TLS:
mView.findViewById(R.id.l_user_cert).setVisibility(View.VISIBLE);
setPhase2Invisible();
setAnonymousIdentInvisible();
setPasswordInvisible();
+ setSimCardInvisible();
break;
case WIFI_EAP_METHOD_PEAP:
// Reset adapter if needed
@@ -1235,6 +1309,7 @@
mView.findViewById(R.id.l_anonymous).setVisibility(View.VISIBLE);
showPeapFields();
setUserCertInvisible();
+ setSimCardInvisible();
break;
case WIFI_EAP_METHOD_TTLS:
// Reset adapter if needed
@@ -1245,10 +1320,32 @@
mView.findViewById(R.id.l_phase2).setVisibility(View.VISIBLE);
mView.findViewById(R.id.l_anonymous).setVisibility(View.VISIBLE);
setUserCertInvisible();
+ setSimCardInvisible();
break;
case WIFI_EAP_METHOD_SIM:
case WIFI_EAP_METHOD_AKA:
case WIFI_EAP_METHOD_AKA_PRIME:
+ WifiConfiguration config = null;
+ if (mAccessPoint != null) {
+ config = mAccessPoint.getConfig();
+ }
+ ArrayAdapter<String> eapSimAdapter = new ArrayAdapter<String>(
+ mContext, android.R.layout.simple_spinner_item,
+ mSimDisplayNames.toArray(new String[mSimDisplayNames.size()])
+ );
+ eapSimAdapter.setDropDownViewResource(
+ android.R.layout.simple_spinner_dropdown_item);
+ mSimCardSpinner.setAdapter(eapSimAdapter);
+ mView.findViewById(R.id.l_sim_card).setVisibility(View.VISIBLE);
+ if (config != null) {
+ if (config.enterpriseConfig.getSimNum() != null
+ && !config.enterpriseConfig.getSimNum().isEmpty()) {
+ int mSimNum = Integer.parseInt(config.enterpriseConfig.getSimNum());
+ mSimCardSpinner.setSelection(mSimNum - 1);
+ } else {
+ mSimCardSpinner.setSelection(0);
+ }
+ }
setPhase2Invisible();
setAnonymousIdentInvisible();
setCaCertInvisible();
@@ -1290,6 +1387,10 @@
}
}
+ private void setSimCardInvisible() {
+ mView.findViewById(R.id.l_sim_card).setVisibility(View.GONE);
+ }
+
private void setIdentityInvisible() {
mView.findViewById(R.id.l_identity).setVisibility(View.GONE);
}
@@ -1582,6 +1683,16 @@
if (parent == mSecuritySpinner) {
// Convert menu position to actual Wi-Fi security type
mAccessPointSecurity = mSecurityInPosition[position];
+
+ if (!mWifiManager.isWifiCoverageExtendFeatureEnabled()
+ || (mAccessPointSecurity != AccessPoint.SECURITY_NONE
+ && mAccessPointSecurity != AccessPoint.SECURITY_PSK)) {
+ mShareThisWifiCheckBox.setChecked(false);
+ mShareThisWifiCheckBox.setVisibility(View.GONE);
+ } else {
+ mShareThisWifiCheckBox.setVisibility(View.VISIBLE);
+ }
+
showSecurityFields(/* refreshEapMethods */ true, /* refreshCertificates */ true);
if (WifiDppUtils.isSupportEnrolleeQrCodeScanner(mContext, mAccessPointSecurity)) {
@@ -1628,6 +1739,22 @@
return mAccessPoint;
}
+ private void getSIMInfo() {
+ int numOfSims;
+ String displayname;
+ mSubscriptionManager = SubscriptionManager.from(mContext);
+ for(int i = 0; i < mTelephonyManager.getSimCount(); i++) {
+ final SubscriptionInfo sir = mSubscriptionManager.
+ getActiveSubscriptionInfoForSimSlotIndex(i);
+ if (sir != null) {
+ displayname = String.valueOf(sir.getDisplayName());
+ } else {
+ displayname = mContext.getString(R.string.sim_editor_title, i + 1);
+ }
+ mSimDisplayNames.add(displayname);
+ }
+ }
+
private void configureSecuritySpinner() {
mConfigUi.setTitle(R.string.wifi_add_network);
diff --git a/src/com/android/settings/wifi/WifiConfigController2.java b/src/com/android/settings/wifi/WifiConfigController2.java
index 99907f3..8d90517 100644
--- a/src/com/android/settings/wifi/WifiConfigController2.java
+++ b/src/com/android/settings/wifi/WifiConfigController2.java
@@ -188,6 +188,7 @@
private TextView mProxyExclusionListView;
private TextView mProxyPacView;
private CheckBox mSharedCheckBox;
+ private CheckBox mShareThisWifiCheckBox;
private IpAssignment mIpAssignment = IpAssignment.UNASSIGNED;
private ProxySettings mProxySettings = ProxySettings.UNASSIGNED;
@@ -277,11 +278,19 @@
? View.GONE
: View.VISIBLE);
mSecurityInPosition = new Integer[WifiEntry.NUM_SECURITY_TYPES];
+ mShareThisWifiCheckBox = (CheckBox) mView.findViewById(R.id.share_this_wifi);
if (mWifiEntry == null) { // new network
configureSecuritySpinner();
mConfigUi.setSubmitButton(res.getString(R.string.wifi_save));
} else {
+ if (!mWifiManager.isWifiCoverageExtendFeatureEnabled()
+ || (mWifiEntry.getSecurity() != WifiEntry.SECURITY_NONE
+ && mWifiEntry.getSecurity() != WifiEntry.SECURITY_PSK)) {
+ mShareThisWifiCheckBox.setChecked(false);
+ mShareThisWifiCheckBox.setVisibility(View.GONE);
+ }
+
mConfigUi.setTitle(mWifiEntry.getTitle());
ViewGroup group = (ViewGroup) mView.findViewById(R.id.info);
@@ -289,6 +298,7 @@
boolean showAdvancedFields = false;
if (mWifiEntry.isSaved()) {
WifiConfiguration config = mWifiEntry.getWifiConfiguration();
+ mShareThisWifiCheckBox.setChecked(config.shareThisAp);
mMeteredSettingsSpinner.setSelection(config.meteredOverride);
mHiddenSettingsSpinner.setSelection(config.hiddenSSID
? HIDDEN_NETWORK
@@ -619,6 +629,7 @@
}
config.shared = mSharedCheckBox.isChecked();
+ config.shareThisAp = mShareThisWifiCheckBox.isChecked();
switch (mWifiEntrySecurity) {
case WifiEntry.SECURITY_NONE:
@@ -1565,6 +1576,16 @@
if (parent == mSecuritySpinner) {
// Convert menu position to actual Wi-Fi security type
mWifiEntrySecurity = mSecurityInPosition[position];
+
+ if (!mWifiManager.isWifiCoverageExtendFeatureEnabled()
+ || (mWifiEntrySecurity != WifiEntry.SECURITY_NONE
+ && mWifiEntrySecurity != WifiEntry.SECURITY_PSK)) {
+ mShareThisWifiCheckBox.setChecked(false);
+ mShareThisWifiCheckBox.setVisibility(View.GONE);
+ } else {
+ mShareThisWifiCheckBox.setVisibility(View.VISIBLE);
+ }
+
showSecurityFields(/* refreshEapMethods */ true, /* refreshCertificates */ true);
if (WifiDppUtils.isSupportEnrolleeQrCodeScanner(mContext, mWifiEntrySecurity)) {
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
index 735fecc..7f6ecb6 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
@@ -343,6 +343,7 @@
final CarrierConfigManager configManager = (CarrierConfigManager)
getSystemService(Context.CARRIER_CONFIG_SERVICE);
boolean isWifiOnlySupported = true;
+ boolean isImsPreferredSupported = false;
if (configManager != null) {
final PersistableBundle b = configManager.getConfigForSubId(mSubId);
@@ -356,6 +357,8 @@
false);
isWifiOnlySupported = b.getBoolean(
CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, true);
+ isImsPreferredSupported = b.getBoolean(
+ CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_IMS_PREFERRED_BOOL, false);
}
}
@@ -366,37 +369,72 @@
mButtonWfcRoamingMode.setDialogTitle(
res.getString(R.string.wifi_calling_roaming_mode_dialog_title));
+ Log.d(TAG, "isWifiOnlySupported = " + isWifiOnlySupported + " isImsPreferredSupported = "
+ + isImsPreferredSupported);
+
if (isWifiOnlySupported) {
- // Set string resources WITH option wifi only in mButtonWfcMode.
- mButtonWfcMode.setEntries(
- res.getStringArray(R.array.wifi_calling_mode_choices));
- mButtonWfcMode.setEntryValues(res.getStringArray(R.array.wifi_calling_mode_values));
- mButtonWfcMode.setEntrySummaries(
- res.getStringArray(R.array.wifi_calling_mode_summaries));
+ if (isImsPreferredSupported) {
+ mButtonWfcMode.setEntries(res.getStringArray(
+ R.array.wifi_calling_mode_choices_with_ims_preferred));
+ mButtonWfcMode.setEntryValues(res.getStringArray(
+ R.array.wifi_calling_mode_values_with_ims_preferred));
+ mButtonWfcMode.setEntrySummaries(res.getStringArray(
+ R.array.wifi_calling_mode_summaries_with_ims_preferred));
- // Set string resources WITH option wifi only in mButtonWfcRoamingMode.
- mButtonWfcRoamingMode.setEntries(
- res.getStringArray(R.array.wifi_calling_mode_choices_v2));
- mButtonWfcRoamingMode.setEntryValues(
- res.getStringArray(R.array.wifi_calling_mode_values));
- mButtonWfcRoamingMode.setEntrySummaries(
- res.getStringArray(R.array.wifi_calling_mode_summaries));
+ mButtonWfcRoamingMode.setEntries(res.getStringArray(
+ R.array.wifi_calling_mode_choices_v2_with_ims_preferred));
+ mButtonWfcRoamingMode.setEntryValues(res.getStringArray(
+ R.array.wifi_calling_mode_values_with_ims_preferred));
+ mButtonWfcRoamingMode.setEntrySummaries(res.getStringArray(
+ R.array.wifi_calling_mode_summaries_with_ims_preferred));
+ } else {
+ // Set string resources WITH option wifi only in mButtonWfcMode.
+ mButtonWfcMode.setEntries(
+ res.getStringArray(R.array.wifi_calling_mode_choices));
+ mButtonWfcMode.setEntryValues(res.getStringArray(R.array.wifi_calling_mode_values));
+ mButtonWfcMode.setEntrySummaries(
+ res.getStringArray(R.array.wifi_calling_mode_summaries));
+
+ // Set string resources WITH option wifi only in mButtonWfcRoamingMode.
+ mButtonWfcRoamingMode.setEntries(
+ res.getStringArray(R.array.wifi_calling_mode_choices_v2));
+ mButtonWfcRoamingMode.setEntryValues(
+ res.getStringArray(R.array.wifi_calling_mode_values));
+ mButtonWfcRoamingMode.setEntrySummaries(
+ res.getStringArray(R.array.wifi_calling_mode_summaries));
+ }
} else {
- // Set string resources WITHOUT option wifi only in mButtonWfcMode.
- mButtonWfcMode.setEntries(
- res.getStringArray(R.array.wifi_calling_mode_choices_without_wifi_only));
- mButtonWfcMode.setEntryValues(
- res.getStringArray(R.array.wifi_calling_mode_values_without_wifi_only));
- mButtonWfcMode.setEntrySummaries(
- res.getStringArray(R.array.wifi_calling_mode_summaries_without_wifi_only));
+ if (isImsPreferredSupported) {
+ mButtonWfcMode.setEntries(res.getStringArray(
+ R.array.wifi_calling_mode_choices_without_wifi_only_with_ims_preferred));
+ mButtonWfcMode.setEntryValues(res.getStringArray(
+ R.array.wifi_calling_mode_values_without_wifi_only_with_ims_preferred));
+ mButtonWfcMode.setEntrySummaries(res.getStringArray(
+ R.array.wifi_calling_mode_summaries_without_wifi_only_with_ims_preferred));
- // Set string resources WITHOUT option wifi only in mButtonWfcRoamingMode.
- mButtonWfcRoamingMode.setEntries(
- res.getStringArray(R.array.wifi_calling_mode_choices_v2_without_wifi_only));
- mButtonWfcRoamingMode.setEntryValues(
- res.getStringArray(R.array.wifi_calling_mode_values_without_wifi_only));
- mButtonWfcRoamingMode.setEntrySummaries(
- res.getStringArray(R.array.wifi_calling_mode_summaries_without_wifi_only));
+ mButtonWfcRoamingMode.setEntries(res.getStringArray(
+ R.array.wifi_calling_mode_choices_v2_without_wifi_only_with_ims_preferred));
+ mButtonWfcRoamingMode.setEntryValues(res.getStringArray(
+ R.array.wifi_calling_mode_values_without_wifi_only_with_ims_preferred));
+ mButtonWfcRoamingMode.setEntrySummaries(res.getStringArray(
+ R.array.wifi_calling_mode_summaries_without_wifi_only_with_ims_preferred));
+ } else {
+ // Set string resources WITHOUT option wifi only in mButtonWfcMode.
+ mButtonWfcMode.setEntries(
+ res.getStringArray(R.array.wifi_calling_mode_choices_without_wifi_only));
+ mButtonWfcMode.setEntryValues(
+ res.getStringArray(R.array.wifi_calling_mode_values_without_wifi_only));
+ mButtonWfcMode.setEntrySummaries(
+ res.getStringArray(R.array.wifi_calling_mode_summaries_without_wifi_only));
+
+ // Set string resources WITHOUT option wifi only in mButtonWfcRoamingMode.
+ mButtonWfcRoamingMode.setEntries(
+ res.getStringArray(R.array.wifi_calling_mode_choices_v2_without_wifi_only));
+ mButtonWfcRoamingMode.setEntryValues(
+ res.getStringArray(R.array.wifi_calling_mode_values_without_wifi_only));
+ mButtonWfcRoamingMode.setEntrySummaries(
+ res.getStringArray(R.array.wifi_calling_mode_summaries_without_wifi_only));
+ }
}
// NOTE: Buttons will be enabled/disabled in mPhoneStateListener
@@ -636,6 +674,9 @@
case ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED:
resId = com.android.internal.R.string.wfc_mode_wifi_preferred_summary;
break;
+ case ImsConfig.WfcModeFeatureValueConstants.IMS_PREFERRED:
+ resId = com.android.internal.R.string.wfc_mode_ims_preferred_summary;
+ break;
default:
Log.e(TAG, "Unexpected WFC mode value: " + wfcMode);
}
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 8dd8d7a..7669147 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -44,6 +44,7 @@
import android.net.RouteInfo;
import android.net.Uri;
import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.CountDownTimer;
@@ -167,6 +168,8 @@
private NetworkInfo mNetworkInfo;
private NetworkCapabilities mNetworkCapabilities;
private int mRssiSignalLevel = -1;
+ private int mWifiStandard;
+ private boolean mIsReady;
private String[] mSignalStr;
private WifiConfiguration mWifiConfig;
private WifiInfo mWifiInfo;
@@ -453,6 +456,13 @@
mIpv6Category = screen.findPreference(KEY_IPV6_CATEGORY);
mIpv6AddressPref = screen.findPreference(KEY_IPV6_ADDRESSES_PREF);
+ if (mAccessPoint.getSecurityString(false).equals("SAE")
+ && mAccessPoint.getConfig().allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
+ mSecurityPref.setSummary(mContext.getString(R.string.wifi_security_wpa_wpa2));
+ }
+ else
+ mSecurityPref.setSummary(mAccessPoint.getSecurityString(false /* concise */));
+
mSecurityPref.setSummary(mAccessPoint.getSecurityString(/* concise */ false));
}
@@ -683,6 +693,9 @@
private void refreshRssiViews() {
int signalLevel = mAccessPoint.getLevel();
+ int wifiStandard = mAccessPoint.getWifiStandard();
+ boolean isReady = (mAccessPoint.isVhtMax8SpatialStreamsSupported()
+ && mAccessPoint.isHe8ssCapableAp());
// Disappears signal view if not in range. e.g. for saved networks.
if (mIsOutOfRange) {
@@ -691,11 +704,15 @@
return;
}
- if (mRssiSignalLevel == signalLevel) {
+ if (mRssiSignalLevel == signalLevel
+ && mWifiStandard == wifiStandard
+ && mIsReady == isReady) {
return;
}
mRssiSignalLevel = signalLevel;
- Drawable wifiIcon = mIconInjector.getIcon(mRssiSignalLevel);
+ mWifiStandard = wifiStandard;
+ mIsReady = isReady;
+ Drawable wifiIcon = mIconInjector.getIcon(mRssiSignalLevel, mWifiStandard, mIsReady);
if (mEntityHeaderController != null) {
mEntityHeaderController
@@ -751,6 +768,9 @@
} else if (frequency >= AccessPoint.LOWER_FREQ_5GHZ
&& frequency < AccessPoint.HIGHER_FREQ_5GHZ) {
band = mContext.getResources().getString(R.string.wifi_band_5ghz);
+ } else if (frequency >= AccessPoint.LOWER_FREQ_60GHZ
+ && frequency < AccessPoint.HIGHER_FREQ_60GHZ) {
+ band = mContext.getResources().getString(R.string.wifi_band_60ghz);
} else {
Log.e(TAG, "Unexpected frequency " + frequency);
// Connecting state is unstable, make it disappeared if unexpected
@@ -1079,6 +1099,10 @@
public Drawable getIcon(int level) {
return mContext.getDrawable(Utils.getWifiIconResource(level)).mutate();
}
+
+ public Drawable getIcon(int level, int standard, boolean isReady) {
+ return mContext.getDrawable(Utils.getWifiIconResource(level, standard, isReady)).mutate();
+ }
}
@VisibleForTesting
diff --git a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
index 5c48dfd..c7701c0 100644
--- a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
+++ b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
@@ -156,6 +156,8 @@
private NetworkInfo mNetworkInfo;
private NetworkCapabilities mNetworkCapabilities;
private int mRssiSignalLevel = -1;
+ private int mWifiStandard;
+ private boolean mIsReady;
private String[] mSignalStr;
private WifiInfo mWifiInfo;
private final WifiManager mWifiManager;
@@ -513,6 +515,9 @@
private void refreshRssiViews() {
int signalLevel = mWifiEntry.getLevel();
+ int wifiStandard = mWifiEntry.getWifiStandard();
+ boolean isReady = mWifiEntry.isVhtMax8SpatialStreamsSupported() &&
+ mWifiEntry.isHe8ssCapableAp();
// Disappears signal view if not in range. e.g. for saved networks.
if (signalLevel == WifiEntry.WIFI_LEVEL_UNREACHABLE) {
@@ -521,11 +526,15 @@
return;
}
- if (mRssiSignalLevel == signalLevel) {
+ if (mRssiSignalLevel == signalLevel &&
+ mWifiStandard == wifiStandard &&
+ mIsReady == isReady) {
return;
}
mRssiSignalLevel = signalLevel;
- Drawable wifiIcon = mIconInjector.getIcon(mRssiSignalLevel);
+ mWifiStandard = wifiStandard;
+ mIsReady = isReady;
+ Drawable wifiIcon = mIconInjector.getIcon(mRssiSignalLevel, mWifiStandard, mIsReady);
if (mEntityHeaderController != null) {
mEntityHeaderController
@@ -910,6 +919,10 @@
public Drawable getIcon(int level) {
return mContext.getDrawable(Utils.getWifiIconResource(level)).mutate();
}
+
+ public Drawable getIcon(int level, int standard, boolean isReady) {
+ return mContext.getDrawable(Utils.getWifiIconResource(level, standard, isReady)).mutate();
+ }
}
@VisibleForTesting
diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
index b3bd9c6..688e135 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
@@ -221,6 +221,10 @@
private boolean isReachableWifiNetwork(WifiConfiguration wifiConfiguration) {
final List<AccessPoint> scannedAccessPoints = mWifiTracker.getAccessPoints();
+ // hidden network visibility is known at later stage (next scan)
+ if (wifiConfiguration.hiddenSSID)
+ return true;
+
for (AccessPoint scannedAccessPoint : scannedAccessPoints) {
if (scannedAccessPoint.matches(wifiConfiguration) &&
scannedAccessPoint.isReachable()) {
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
index 9578c80..7001ca7 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
@@ -69,7 +69,7 @@
implements PersistentGroupInfoListener, PeerListListener, DeviceInfoListener {
private static final String TAG = "WifiP2pSettings";
- private static final boolean DBG = false;
+ private static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
@VisibleForTesting static final int MENU_ID_SEARCH = Menu.FIRST;
@VisibleForTesting static final int MENU_ID_RENAME = Menu.FIRST + 1;
diff --git a/src/com/android/settings/wifi/slice/WifiSlice.java b/src/com/android/settings/wifi/slice/WifiSlice.java
index a489b05..8189944 100644
--- a/src/com/android/settings/wifi/slice/WifiSlice.java
+++ b/src/com/android/settings/wifi/slice/WifiSlice.java
@@ -211,7 +211,11 @@
}
final Drawable drawable = mContext.getDrawable(
- com.android.settingslib.Utils.getWifiIconResource(accessPoint.getLevel()));
+ com.android.settingslib.Utils.getWifiIconResource(
+ accessPoint.getLevel(),
+ accessPoint.getWifiStandard(),
+ accessPoint.isHe8ssCapableAp()
+ && accessPoint.isVhtMax8SpatialStreamsSupported()));
drawable.setTint(tint);
return Utils.createIconWithDrawable(drawable);
}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java
index 8a4be10..3a13525 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java
@@ -39,11 +39,18 @@
private String[] mBandEntries;
private String[] mBandSummaries;
private int mBandIndex;
+ private int mSecurityType;
+ private boolean isVendorDualApSupported;
public WifiTetherApBandPreferenceController(Context context,
OnTetherConfigUpdateListener listener) {
super(context, listener);
- updatePreferenceEntries();
+ final SoftApConfiguration config = mWifiManager.getSoftApConfiguration();
+
+ isVendorDualApSupported = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_wifi_dual_sap_mode_enabled);
+
+ updatePreferenceEntries(config);
}
@Override
@@ -53,7 +60,7 @@
mBandIndex = SoftApConfiguration.BAND_2GHZ;
Log.d(TAG, "Updating band index to BAND_2GHZ because no config");
} else if (is5GhzBandSupported()) {
- mBandIndex = validateSelection(config.getBand());
+ mBandIndex = validateSelection(config);
Log.d(TAG, "Updating band index to " + mBandIndex);
} else {
mWifiManager.setSoftApConfiguration(
@@ -71,6 +78,7 @@
preference.setEnabled(false);
preference.setSummary(R.string.wifi_ap_choose_2G);
} else {
+ preference.setEnabled(true);
preference.setValue(Integer.toString(config.getBand()));
preference.setSummary(getConfigSummary());
}
@@ -82,6 +90,8 @@
return mBandSummaries[0];
case SoftApConfiguration.BAND_5GHZ:
return mBandSummaries[1];
+ case SoftApConfiguration.BAND_DUAL:
+ return mBandSummaries[2];
default:
return mContext.getString(R.string.wifi_ap_prefer_5G);
}
@@ -102,6 +112,18 @@
return true;
}
+ private int validateSelection(SoftApConfiguration config) {
+ if (config.getBand() == SoftApConfiguration.BAND_DUAL
+ && config.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_OWE) {
+ config = new SoftApConfiguration.Builder(config).setBand(
+ SoftApConfiguration.BAND_2GHZ).build();
+ mWifiManager.setSoftApConfiguration(config);
+ Log.d(TAG, "Dual band not supported for OWE security, updating band index to " + mBandIndex);
+ }
+
+ return validateSelection(config.getBand());
+ }
+
private int validateSelection(int band) {
// unsupported states:
// 1: BAND_5GHZ only - include 2GHZ since some of countries doesn't support 5G hotspot
@@ -116,11 +138,25 @@
return band;
}
+ public void updatePreferenceEntries(SoftApConfiguration config) {
+ mSecurityType = (config == null ? SoftApConfiguration.SECURITY_TYPE_OPEN : config.getSecurityType());
+ Log.d(TAG, "updating band preferences.");
+ updatePreferenceEntries();
+ }
+
@VisibleForTesting
void updatePreferenceEntries() {
Resources res = mContext.getResources();
int entriesRes = R.array.wifi_ap_band;
int summariesRes = R.array.wifi_ap_band_summary;
+ if (isVendorDualApSupported && mSecurityType != SoftApConfiguration.SECURITY_TYPE_OWE) {
+ // change the list option if AP+AP is supproted and selected security type is not OWE
+ entriesRes = R.array.wifi_ap_band_vendor_config_full;
+ summariesRes = R.array.wifi_ap_band_vendor_summary_full;
+ } else if (mSecurityType == SoftApConfiguration.SECURITY_TYPE_OWE) {
+ entriesRes = R.array.wifi_ap_band_vendor_config_no_dual;
+ summariesRes = R.array.wifi_ap_band_vendor_summary_no_dual;
+ }
mBandEntries = res.getStringArray(entriesRes);
mBandSummaries = res.getStringArray(summariesRes);
}
@@ -136,4 +172,20 @@
public int getBandIndex() {
return mBandIndex;
}
+
+ public boolean isVendorDualApSupported() {
+ return isVendorDualApSupported;
+ }
+
+ public boolean isBandEntriesHasDualband() {
+ if (mBandEntries == null)
+ return false;
+
+ for (int i = 0 ; i < mBandEntries.length; i++) {
+ if (Integer.parseInt(mBandEntries[i]) == SoftApConfiguration.BAND_DUAL)
+ return true;
+ }
+
+ return false;
+ }
}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherPasswordPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherPasswordPreferenceController.java
index a4a51dc..c40a90a 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherPasswordPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherPasswordPreferenceController.java
@@ -69,7 +69,8 @@
public void updateDisplay() {
final SoftApConfiguration config = mWifiManager.getSoftApConfiguration();
if (config == null
- || (config.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
+ || ((config.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
+ || config.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION)
&& TextUtils.isEmpty(config.getPassphrase()))) {
mPassword = generateRandomPassword();
} else {
@@ -103,7 +104,8 @@
*/
public String getPasswordValidated(int securityType) {
// don't actually overwrite unless we get a new config in case it was accidentally toggled.
- if (securityType == SoftApConfiguration.SECURITY_TYPE_OPEN) {
+ if (securityType == SoftApConfiguration.SECURITY_TYPE_OPEN
+ || securityType == SoftApConfiguration.SECURITY_TYPE_OWE) {
return "";
} else if (!isTextValid(mPassword)) {
mPassword = generateRandomPassword();
@@ -113,7 +115,8 @@
}
public void updateVisibility(int securityType) {
- mPreference.setVisible(securityType != SoftApConfiguration.SECURITY_TYPE_OPEN);
+ mPreference.setVisible(securityType != SoftApConfiguration.SECURITY_TYPE_OPEN
+ && securityType != SoftApConfiguration.SECURITY_TYPE_OWE);
}
@Override
diff --git a/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java
index 5049002..106522a 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java
@@ -131,8 +131,15 @@
public void onConnectedClientsChanged(List<WifiClient> clients) {
if (mPreference != null
&& mSoftApState == WifiManager.WIFI_AP_STATE_ENABLED) {
+ String extendWifiSummary;
+ if (mWifiManager.isExtendingWifi()) {
+ extendWifiSummary = "Extending Wifi-Coverage: ";
+ } else {
+ extendWifiSummary = "";
+ }
+
// Only show the number of clients when state is on
- mPreference.setSummary(mContext.getResources().getQuantityString(
+ mPreference.setSummary(extendWifiSummary + mContext.getResources().getQuantityString(
R.plurals.wifi_tether_connected_summary, clients.size(),
clients.size()));
}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java
index 56b5031..f376fbd 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java
@@ -3,26 +3,90 @@
import static com.android.settings.AllInOneTetherSettings.DEDUP_POSTFIX;
import android.content.Context;
+import android.net.wifi.SoftApCapability;
import android.net.wifi.SoftApConfiguration;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.os.HandlerExecutor;
import android.util.FeatureFlagUtils;
+import android.util.Log;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.core.FeatureFlags;
+import java.util.ArrayList;
public class WifiTetherSecurityPreferenceController extends WifiTetherBasePreferenceController {
private static final String PREF_KEY = "wifi_tether_security";
+ private static final String TAG = "WifiTetherSecurityPreferenceController";
- private final String[] mSecurityEntries;
+ private String[] mSecurityEntries;
+ private String[] mSecurityValues;
private int mSecurityValue;
+ private boolean mSecurityCapaFetched;
+ private boolean mDualSoftApSupported;
+ private boolean mSaeSapSupprted;
+ private boolean mOweSapSupprted;
+ final Context mContext;
+
+ private WifiManager.SoftApCallback mSoftApCallback = new WifiManager.SoftApCallback() {
+ @Override
+ public void onCapabilityChanged(SoftApCapability capability) {
+ if (mSecurityCapaFetched)
+ return;
+
+ ArrayList<String> securityEntries = new ArrayList<String>();
+ ArrayList<String> securityValues = new ArrayList<String>();
+
+ mSecurityCapaFetched = true;
+
+ if (capability.areFeaturesSupported(SoftApCapability.SOFTAP_FEATURE_WPA3_SAE))
+ mSaeSapSupprted = true;
+
+ if (capability.areFeaturesSupported(SoftApCapability.SOFTAP_FEATURE_WPA3_OWE))
+ mOweSapSupprted = true;
+
+
+ if (mSaeSapSupprted) {
+ // Add SAE security type
+ securityValues.add(String.valueOf(SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION));
+ securityEntries.add(mContext.getString(R.string.wifi_security_sae));
+ }
+ if (mOweSapSupprted && mDualSoftApSupported) {
+ // Add OWE security type
+ securityValues.add(String.valueOf(SoftApConfiguration.SECURITY_TYPE_OWE));
+ securityEntries.add(mContext.getString(R.string.wifi_security_owe));
+ }
+ // Add WPA2-PSK security type
+ securityValues.add(String.valueOf(SoftApConfiguration.SECURITY_TYPE_WPA2_PSK));
+ securityEntries.add(mContext.getString(R.string.wifi_security_wpa2));
+ // Add open security type
+ securityValues.add(String.valueOf(SoftApConfiguration.SECURITY_TYPE_OPEN));
+ securityEntries.add(mContext.getString(R.string.wifi_security_none));
+
+ mSecurityEntries = securityEntries.toArray(new String[securityEntries.size()]);
+ mSecurityValues = securityValues.toArray(new String[securityValues.size()]);
+
+ updateDisplay();
+ Log.i(TAG, "Updated supported SoftAp AKMs");
+ }
+
+ };
public WifiTetherSecurityPreferenceController(Context context,
OnTetherConfigUpdateListener listener) {
super(context, listener);
- mSecurityEntries = mContext.getResources().getStringArray(R.array.wifi_tether_security);
+ mContext = context;
+ WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+
+ mDualSoftApSupported = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_wifi_dual_sap_mode_enabled);
+
+ Log.i(TAG, "Register SoftAp callback");
+ wifiManager.registerSoftApCallback(new HandlerExecutor(new Handler()), mSoftApCallback);
}
@Override
@@ -34,13 +98,23 @@
@Override
public void updateDisplay() {
final SoftApConfiguration config = mWifiManager.getSoftApConfiguration();
- if (config != null && config.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_OPEN) {
+ if (config == null) {
+ mSecurityValue = SoftApConfiguration.SECURITY_TYPE_WPA2_PSK;
+ } else if (config.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_OPEN) {
mSecurityValue = SoftApConfiguration.SECURITY_TYPE_OPEN;
+ } else if (mOweSapSupprted && mDualSoftApSupported
+ && config.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_OWE) {
+ mSecurityValue = SoftApConfiguration.SECURITY_TYPE_OWE;
+ } else if (mSaeSapSupprted
+ && config.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION) {
+ mSecurityValue = SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION;
} else {
mSecurityValue = SoftApConfiguration.SECURITY_TYPE_WPA2_PSK;
}
final ListPreference preference = (ListPreference) mPreference;
+ preference.setEntries(mSecurityEntries);
+ preference.setEntryValues(mSecurityValues);
preference.setSummary(getSummaryForSecurityType(mSecurityValue));
preference.setValue(String.valueOf(mSecurityValue));
}
@@ -58,10 +132,13 @@
}
private String getSummaryForSecurityType(int securityType) {
- if (securityType == SoftApConfiguration.SECURITY_TYPE_OPEN) {
- return mSecurityEntries[1];
- }
- // WPA2 PSK
- return mSecurityEntries[0];
+ final ListPreference preference = (ListPreference) mPreference;
+ int securityEntryIndex = preference.findIndexOfValue(String.valueOf(securityType));
+
+ return securityEntryIndex < 0 ? "" : mSecurityEntries[securityEntryIndex];
+ }
+
+ public boolean isOweSapSupported() {
+ return mOweSapSupprted;
}
}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index 9e68202..eca5639 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
@@ -18,6 +18,7 @@
import static android.net.ConnectivityManager.ACTION_TETHER_STATE_CHANGED;
import static android.net.wifi.WifiManager.WIFI_AP_STATE_CHANGED_ACTION;
+import static android.net.wifi.WifiManager.WIFI_COUNTRY_CODE_CHANGED_ACTION;
import android.app.settings.SettingsEnums;
import android.content.BroadcastReceiver;
@@ -30,6 +31,7 @@
import android.os.UserManager;
import android.util.FeatureFlagUtils;
import android.util.Log;
+import android.widget.Toast;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceGroup;
@@ -82,6 +84,7 @@
static {
TETHER_STATE_CHANGE_FILTER = new IntentFilter(ACTION_TETHER_STATE_CHANGED);
TETHER_STATE_CHANGE_FILTER.addAction(WIFI_AP_STATE_CHANGED_ACTION);
+ TETHER_STATE_CHANGE_FILTER.addAction(WIFI_COUNTRY_CODE_CHANGED_ACTION);
}
public WifiTetherSettings() {
@@ -189,8 +192,19 @@
@Override
public void onTetherConfigUpdated(AbstractPreferenceController context) {
final SoftApConfiguration config = buildNewConfig();
+ boolean bandEntriesChanged = false;
+
mPasswordPreferenceController.updateVisibility(config.getSecurityType());
+ if (mApBandPreferenceController.isVendorDualApSupported()
+ && mSecurityPreferenceController.isOweSapSupported()) {
+ if ((config.getSecurityType() == SoftApConfiguration.SECURITY_TYPE_OWE)
+ == (mApBandPreferenceController.isBandEntriesHasDualband())) {
+ mApBandPreferenceController.updatePreferenceEntries(config);
+ bandEntriesChanged = true;
+ }
+ }
+
/**
* if soft AP is stopped, bring up
* else restart with new config
@@ -204,6 +218,8 @@
}
mWifiManager.setSoftApConfiguration(config);
+ if (bandEntriesChanged)
+ mApBandPreferenceController.updateDisplay();
if (context instanceof WifiTetherSecurityPreferenceController) {
reConfigInitialExpandedChildCount();
}
@@ -212,13 +228,16 @@
private SoftApConfiguration buildNewConfig() {
final SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder();
final int securityType = mSecurityPreferenceController.getSecurityType();
+ final int band = mApBandPreferenceController.getBandIndex();
configBuilder.setSsid(mSSIDPreferenceController.getSSID());
- if (securityType == SoftApConfiguration.SECURITY_TYPE_WPA2_PSK) {
- configBuilder.setPassphrase(
- mPasswordPreferenceController.getPasswordValidated(securityType),
- SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
+ configBuilder.setPassphrase(mPasswordPreferenceController.getPasswordValidated(securityType),
+ securityType);
+ if (securityType == SoftApConfiguration.SECURITY_TYPE_OWE
+ && band == SoftApConfiguration.BAND_DUAL) {
+ configBuilder.setBand(SoftApConfiguration.BAND_2GHZ);
+ } else {
+ configBuilder.setBand(band);
}
- configBuilder.setBand(mApBandPreferenceController.getBandIndex());
return configBuilder.build();
}
@@ -286,6 +305,13 @@
if (state == WifiManager.WIFI_AP_STATE_DISABLED
&& mRestartWifiApAfterConfigChange) {
startTether();
+ } else if (state == WifiManager.WIFI_AP_STATE_FAILED) {
+ int failureCode = intent.getIntExtra(WifiManager.EXTRA_WIFI_AP_FAILURE_REASON, 0);
+ String failureDesc = intent.getStringExtra(WifiManager.EXTRA_WIFI_AP_FAILURE_DESCRIPTION);
+ if (failureCode == WifiManager.SAP_START_FAILURE_NO_CHANNEL
+ && failureDesc != null && failureDesc.equals(WifiManager.WIFI_AP_FAILURE_DESC_NO_5GHZ_SUPPORT)) {
+ Toast.makeText(content, "5Ghz band not supported. band selection disabled", Toast.LENGTH_LONG).show();
+ }
}
}
}