Merge spl-2020-08-05
Change-Id: Ia7cf8b053673069985f34df2328bc4d528f9405c
diff --git a/Android.mk b/Android.mk
index 906cfc7..7aa774f 100644
--- a/Android.mk
+++ b/Android.mk
@@ -38,7 +38,8 @@
LOCAL_JAVA_LIBRARIES := \
telephony-common \
- ims-common
+ ims-common \
+ telephony-ext
LOCAL_STATIC_JAVA_LIBRARIES := \
androidx-constraintlayout_constraintlayout-solver \
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 86cb3f2..40563e2 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -185,7 +185,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>
@@ -916,6 +915,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"
@@ -2692,6 +2721,27 @@
android:grantUriPermissions="true"
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=".sim.SimPreferenceDialog"
android:theme="@style/Theme.AlertDialog"
android:excludeFromRecents="true" />
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/wifi_dialog.xml b/res/layout/wifi_dialog.xml
index 50c22a2..cf4d3af 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"
@@ -352,6 +370,13 @@
android:orientation="vertical"
android:visibility="gone">
+ <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 c8b0d47..5722d02 100644
--- a/res/values-af/arrays.xml
+++ b/res/values-af/arrays.xml
@@ -205,6 +205,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-am/arrays.xml b/res/values-am/arrays.xml
index 722b48c..eb63fbd 100644
--- a/res/values-am/arrays.xml
+++ b/res/values-am/arrays.xml
@@ -205,6 +205,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 f99cdfb..ed212e9 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-ar/arrays.xml b/res/values-ar/arrays.xml
index f6e693f..413e993 100644
--- a/res/values-ar/arrays.xml
+++ b/res/values-ar/arrays.xml
@@ -205,6 +205,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 5d80837..be1664e 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -1875,9 +1875,9 @@
<string name="lockpassword_strong_auth_required_work_pattern" msgid="6803652050512161140">"استخدام نقش للملف الشخصي للعمل لزيادة الأمان"</string>
<string name="lockpassword_strong_auth_required_work_pin" msgid="4208510396448713500">"إدخال رقم تعريف شخصي للملف الشخصي للعمل لزيادة الأمان"</string>
<string name="lockpassword_strong_auth_required_work_password" msgid="6119482061429323090">"إدخال كلمة مرور للملف الشخصي للعمل لزيادة الأمان"</string>
- <string name="lockpassword_confirm_your_pattern_details_frp" msgid="6351784282865851482">"تم إعادة ضبط هاتفك على الإعدادات الأصلية. لاستخدام هذا الهاتف، أدخل النقش السابق."</string>
- <string name="lockpassword_confirm_your_pin_details_frp" msgid="2128795640346033349">"تم إعادة ضبط هاتفك على الإعدادات الأصلية. لاستخدام هذا الهاتف، أدخل رقم التعريف الشخصي السابق."</string>
- <string name="lockpassword_confirm_your_password_details_frp" msgid="4031863562975125016">"تم إعادة ضبط هاتفك على الإعدادات الأصلية. لاستخدام هذا الهاتف، أدخل كلمة المرور السابقة."</string>
+ <string name="lockpassword_confirm_your_pattern_details_frp" msgid="6351784282865851482">"تم إعادة تعيين هاتفك على إعدادات المصنع. لاستخدام هذا الهاتف، أدخل النقش السابق."</string>
+ <string name="lockpassword_confirm_your_pin_details_frp" msgid="2128795640346033349">"تم إعادة تعيين هاتفك على إعدادات المصنع. لاستخدام هذا الهاتف، أدخل رقم التعريف الشخصي السابق."</string>
+ <string name="lockpassword_confirm_your_password_details_frp" msgid="4031863562975125016">"تم إعادة تعيين هاتفك على إعدادات المصنع. لاستخدام هذا الهاتف، أدخل كلمة المرور السابقة."</string>
<string name="lockpassword_confirm_your_pattern_header_frp" msgid="5641858015891896427">"التحقق من النقش"</string>
<string name="lockpassword_confirm_your_pin_header_frp" msgid="8285647793164729982">"التحقق من رقم التعريف الشخصي"</string>
<string name="lockpassword_confirm_your_password_header_frp" msgid="7932240547542564033">"التحقق من كلمة المرور"</string>
@@ -5010,4 +5010,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-az/arrays.xml b/res/values-az/arrays.xml
index 1e8758f..e763d12 100644
--- a/res/values-az/arrays.xml
+++ b/res/values-az/arrays.xml
@@ -205,6 +205,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 782dde2..32e9ce3 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-b+sr+Latn/arrays.xml b/res/values-b+sr+Latn/arrays.xml
index b355390..7f2b390 100644
--- a/res/values-b+sr+Latn/arrays.xml
+++ b/res/values-b+sr+Latn/arrays.xml
@@ -205,6 +205,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-be/arrays.xml b/res/values-be/arrays.xml
index e1038b9..69bd042 100644
--- a/res/values-be/arrays.xml
+++ b/res/values-be/arrays.xml
@@ -205,6 +205,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/arrays.xml b/res/values-bg/arrays.xml
index f37ecea..4c7334d 100644
--- a/res/values-bg/arrays.xml
+++ b/res/values-bg/arrays.xml
@@ -205,6 +205,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 252862e..89d530f 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -4204,6 +4204,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 f14398a..434c4de 100644
--- a/res/values-bn/arrays.xml
+++ b/res/values-bn/arrays.xml
@@ -205,6 +205,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 7a04f73..6db0418 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">হার্ডওয়্যার ফিডব্যাক</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc প্রতিবেদন</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-bs/arrays.xml b/res/values-bs/arrays.xml
index 365473e..f6c5b24 100644
--- a/res/values-bs/arrays.xml
+++ b/res/values-bs/arrays.xml
@@ -205,6 +205,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-ca/arrays.xml b/res/values-ca/arrays.xml
index 81e9f83..825c7f3 100644
--- a/res/values-ca/arrays.xml
+++ b/res/values-ca/arrays.xml
@@ -205,6 +205,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 6cfc756..de11b40 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-cs/arrays.xml b/res/values-cs/arrays.xml
index f44b947..a99b9e9 100644
--- a/res/values-cs/arrays.xml
+++ b/res/values-cs/arrays.xml
@@ -205,6 +205,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 a73d51f..7358c85 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -4840,4 +4840,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-da/arrays.xml b/res/values-da/arrays.xml
index fd4e58d..cd4bf2d 100644
--- a/res/values-da/arrays.xml
+++ b/res/values-da/arrays.xml
@@ -205,6 +205,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 9ce3e62..0acf827 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Hardware-feedback</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Rapportering</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-de/arrays.xml b/res/values-de/arrays.xml
index 886c9f6..a06a6cf 100644
--- a/res/values-de/arrays.xml
+++ b/res/values-de/arrays.xml
@@ -205,6 +205,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 0893b5c..fbd837c 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -4671,4 +4671,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-el/arrays.xml b/res/values-el/arrays.xml
index 6b4a697..e1f7f44 100644
--- a/res/values-el/arrays.xml
+++ b/res/values-el/arrays.xml
@@ -205,6 +205,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 b58ddf8..0ddb713 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-en-rAU/arrays.xml b/res/values-en-rAU/arrays.xml
index 62498e8..3e0bc81 100644
--- a/res/values-en-rAU/arrays.xml
+++ b/res/values-en-rAU/arrays.xml
@@ -205,6 +205,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/arrays.xml b/res/values-en-rGB/arrays.xml
index 62498e8..3e0bc81 100644
--- a/res/values-en-rGB/arrays.xml
+++ b/res/values-en-rGB/arrays.xml
@@ -205,6 +205,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/arrays.xml b/res/values-en-rIN/arrays.xml
index 62498e8..3e0bc81 100644
--- a/res/values-en-rIN/arrays.xml
+++ b/res/values-en-rIN/arrays.xml
@@ -205,6 +205,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-es-rUS/arrays.xml b/res/values-es-rUS/arrays.xml
index b5cee26..7916576 100644
--- a/res/values-es-rUS/arrays.xml
+++ b/res/values-es-rUS/arrays.xml
@@ -205,6 +205,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 a3963f6..33f6cb5 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -4668,4 +4668,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-es/arrays.xml b/res/values-es/arrays.xml
index d60f164..5ffecf1 100644
--- a/res/values-es/arrays.xml
+++ b/res/values-es/arrays.xml
@@ -205,6 +205,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 c9ebccc..f9a2bb9 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -4205,6 +4205,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 0836f3a..d2320ab 100644
--- a/res/values-et/arrays.xml
+++ b/res/values-et/arrays.xml
@@ -205,6 +205,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 d7cdf83..f528bed 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-eu/arrays.xml b/res/values-eu/arrays.xml
index 5924a7c..ce251d6 100644
--- a/res/values-eu/arrays.xml
+++ b/res/values-eu/arrays.xml
@@ -205,6 +205,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 d5cd37a..e25278b 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-fa/arrays.xml b/res/values-fa/arrays.xml
index a44cefd..562cc8d 100644
--- a/res/values-fa/arrays.xml
+++ b/res/values-fa/arrays.xml
@@ -205,6 +205,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 a64087e..e1dce44 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-fi/arrays.xml b/res/values-fi/arrays.xml
index 98f0d4d..42db12a 100644
--- a/res/values-fi/arrays.xml
+++ b/res/values-fi/arrays.xml
@@ -205,6 +205,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 c6d57b3..dace689 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Palaute laitteesta</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc -raportointi</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-fr-rCA/arrays.xml b/res/values-fr-rCA/arrays.xml
index ea4cb2d..9c1767a 100644
--- a/res/values-fr-rCA/arrays.xml
+++ b/res/values-fr-rCA/arrays.xml
@@ -205,6 +205,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 a920d22..3ba1529f 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Avis sur le matériel</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Transmission de rapports</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-fr/arrays.xml b/res/values-fr/arrays.xml
index 2673a8f..876a12a 100644
--- a/res/values-fr/arrays.xml
+++ b/res/values-fr/arrays.xml
@@ -205,6 +205,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 a1461ea..f916254 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-gl/arrays.xml b/res/values-gl/arrays.xml
index eab6c49..79bd2ad 100644
--- a/res/values-gl/arrays.xml
+++ b/res/values-gl/arrays.xml
@@ -205,6 +205,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 e02faff..71e0fa2 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Comentarios sobre o hardware</string>
+ <string name="qtifeedback_settings_subtitle">Informe de Qualcomm Technologies, Inc</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-gu/arrays.xml b/res/values-gu/arrays.xml
index ece9976..3e381a3 100644
--- a/res/values-gu/arrays.xml
+++ b/res/values-gu/arrays.xml
@@ -205,6 +205,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/arrays.xml b/res/values-hi/arrays.xml
index b0b1aed..ae04aec 100644
--- a/res/values-hi/arrays.xml
+++ b/res/values-hi/arrays.xml
@@ -205,6 +205,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 a577037..ae19897 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -4670,4 +4670,7 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="no_connected_devices" msgid="6657176404588389594">"कोई डिवाइस नहीं जुड़ा है"</string>
+ <string name="qtifeedback_settings_title"> हार्डवेयर प्रतिसाद</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc रिपोर्टिंग</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-hr/arrays.xml b/res/values-hr/arrays.xml
index 2a865b6..882f09f 100644
--- a/res/values-hr/arrays.xml
+++ b/res/values-hr/arrays.xml
@@ -205,6 +205,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 5ca6766..6abafd9 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -4755,4 +4755,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Povratne informacije o hardveru</string>
+ <string name="qtifeedback_settings_subtitle"> Slanje izvještaja tvrtki Qualcomm Technologies, Inc</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-hu/arrays.xml b/res/values-hu/arrays.xml
index 1cee4db..066d2eb 100644
--- a/res/values-hu/arrays.xml
+++ b/res/values-hu/arrays.xml
@@ -205,6 +205,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 dc496e5..1b75228 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Hardverrel kapcsolatos visszajelzés</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Jelentésküldés</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-hy/arrays.xml b/res/values-hy/arrays.xml
index a31975c..546ca2c 100644
--- a/res/values-hy/arrays.xml
+++ b/res/values-hy/arrays.xml
@@ -205,6 +205,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 ce4c4b0..eece569 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Հետադարձ կապ սարքակազմի մասին</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Զեկուցում</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-in/arrays.xml b/res/values-in/arrays.xml
index 5cad411..1d08c48 100644
--- a/res/values-in/arrays.xml
+++ b/res/values-in/arrays.xml
@@ -205,6 +205,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 55aa81c..16c89b9 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-is/arrays.xml b/res/values-is/arrays.xml
index 135aee5..6892507 100644
--- a/res/values-is/arrays.xml
+++ b/res/values-is/arrays.xml
@@ -205,6 +205,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 434fbb9..a4c54bb 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-it/arrays.xml b/res/values-it/arrays.xml
index fa9f8a5..6e6ece6 100644
--- a/res/values-it/arrays.xml
+++ b/res/values-it/arrays.xml
@@ -205,6 +205,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 c996d1b..0f75ebb 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-iw/arrays.xml b/res/values-iw/arrays.xml
index 6e699a5..15695e7 100644
--- a/res/values-iw/arrays.xml
+++ b/res/values-iw/arrays.xml
@@ -205,6 +205,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/arrays.xml b/res/values-ja/arrays.xml
index ec6032a..a78ef66 100644
--- a/res/values-ja/arrays.xml
+++ b/res/values-ja/arrays.xml
@@ -205,6 +205,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 5ba128b..4648b58 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title"> ハードウェアに関するフィードバック</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Incレポート</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-ka/arrays.xml b/res/values-ka/arrays.xml
index 5a5ddf4..65f364d 100644
--- a/res/values-ka/arrays.xml
+++ b/res/values-ka/arrays.xml
@@ -205,6 +205,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 2e38301..30023dc 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">აპარატურის შესახებ უკუკავშირი</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc რეპორტინგი</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-kk/arrays.xml b/res/values-kk/arrays.xml
index 296f53f..2ed2edf 100644
--- a/res/values-kk/arrays.xml
+++ b/res/values-kk/arrays.xml
@@ -205,6 +205,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 aa3355b..07d1792 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title"> Жабдыққа байланысты пікір</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc хабарламасы</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-km/arrays.xml b/res/values-km/arrays.xml
index c8ccd75..8484dac 100644
--- a/res/values-km/arrays.xml
+++ b/res/values-km/arrays.xml
@@ -205,6 +205,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 b3e8e5f..b32320e 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">មតិតបនៃហាដវែរ</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc ការរាយការណ៍</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-kn/arrays.xml b/res/values-kn/arrays.xml
index 4cf184b..fda9f29 100644
--- a/res/values-kn/arrays.xml
+++ b/res/values-kn/arrays.xml
@@ -205,6 +205,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 6a73034..9e360fe 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">ಹಾರ್ಡ್ವೇರ್ ಪ್ರತಿಕ್ರಿಯೆ</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc ವರದಿ</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-ko/arrays.xml b/res/values-ko/arrays.xml
index ebaf3c0..8e27502 100644
--- a/res/values-ko/arrays.xml
+++ b/res/values-ko/arrays.xml
@@ -205,6 +205,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 a91d41a..9716b6a 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">하드웨어 피드백</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc 보고</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-ky/arrays.xml b/res/values-ky/arrays.xml
index 165f2c6..0934a32 100644
--- a/res/values-ky/arrays.xml
+++ b/res/values-ky/arrays.xml
@@ -205,6 +205,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/arrays.xml b/res/values-lo/arrays.xml
index 48d3bd9..9e8b136 100644
--- a/res/values-lo/arrays.xml
+++ b/res/values-lo/arrays.xml
@@ -205,6 +205,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-lt/arrays.xml b/res/values-lt/arrays.xml
index bf9dbe1..65360db 100644
--- a/res/values-lt/arrays.xml
+++ b/res/values-lt/arrays.xml
@@ -205,6 +205,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 099db56..d17ba42 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -4840,4 +4840,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-lv/arrays.xml b/res/values-lv/arrays.xml
index 0463c08..829b3d5 100644
--- a/res/values-lv/arrays.xml
+++ b/res/values-lv/arrays.xml
@@ -205,6 +205,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 3846a40..58a66ff 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -4755,4 +4755,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-mk/arrays.xml b/res/values-mk/arrays.xml
index f4fb3d3..c683eb1 100644
--- a/res/values-mk/arrays.xml
+++ b/res/values-mk/arrays.xml
@@ -205,6 +205,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 16fc02a..bee9339 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-ml/arrays.xml b/res/values-ml/arrays.xml
index 90f5e2d..f37a1ff 100644
--- a/res/values-ml/arrays.xml
+++ b/res/values-ml/arrays.xml
@@ -205,6 +205,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 e076601..c00684f 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">ഹാർഡ്വെയർ ഫീഡ്ബാക്ക്</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc റിപ്പോർട്ടുചെയ്യൽ</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-mn/arrays.xml b/res/values-mn/arrays.xml
index 0fc94fe..1bcd1a0 100644
--- a/res/values-mn/arrays.xml
+++ b/res/values-mn/arrays.xml
@@ -205,6 +205,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/arrays.xml b/res/values-mr/arrays.xml
index 19eed5b..5f51a3d 100644
--- a/res/values-mr/arrays.xml
+++ b/res/values-mr/arrays.xml
@@ -205,6 +205,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 1561ada..ab7d9a2 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -4671,4 +4671,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">हार्डवेअर फीडबॅक</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc रिपोर्टिंग</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-ms/arrays.xml b/res/values-ms/arrays.xml
index 7a61cb0..e2d8895 100644
--- a/res/values-ms/arrays.xml
+++ b/res/values-ms/arrays.xml
@@ -205,6 +205,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 28a4e95..a8f412c 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Maklum Balas Perkakasan</string>
+ <string name="qtifeedback_settings_subtitle">Pelaporan Qualcomm Technologies, Inc</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-my/arrays.xml b/res/values-my/arrays.xml
index 60eb09d..dbd699a 100644
--- a/res/values-my/arrays.xml
+++ b/res/values-my/arrays.xml
@@ -205,6 +205,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-nb/arrays.xml b/res/values-nb/arrays.xml
index 73f2b60..4cdf126 100644
--- a/res/values-nb/arrays.xml
+++ b/res/values-nb/arrays.xml
@@ -205,6 +205,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-ne/arrays.xml b/res/values-ne/arrays.xml
index 3f48106..36dd33f 100644
--- a/res/values-ne/arrays.xml
+++ b/res/values-ne/arrays.xml
@@ -205,6 +205,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 1f8070d..c8741bd 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">हार्डवेयर प्रतिक्रिया</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc रिपोर्टिंङ </string>
+</resources>
\ No newline at end of file
diff --git a/res/values-nl/arrays.xml b/res/values-nl/arrays.xml
index ae3fbb3..61142f1 100644
--- a/res/values-nl/arrays.xml
+++ b/res/values-nl/arrays.xml
@@ -205,6 +205,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 e6d4e53..e267f3b 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-pa/arrays.xml b/res/values-pa/arrays.xml
index 9ab1d80..2ab46c4 100644
--- a/res/values-pa/arrays.xml
+++ b/res/values-pa/arrays.xml
@@ -205,6 +205,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-pl/arrays.xml b/res/values-pl/arrays.xml
index 1b0f899..fb66897 100644
--- a/res/values-pl/arrays.xml
+++ b/res/values-pl/arrays.xml
@@ -205,6 +205,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 c1804d9..62ee34f 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -4840,4 +4840,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Informacje zwrotne o urządzeniu</string>
+ <string name="qtifeedback_settings_subtitle">Raportowanie Qualcomm Technologies, Inc</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-pt-rBR/arrays.xml b/res/values-pt-rBR/arrays.xml
index 0cb0d0c..e4e6c5e 100644
--- a/res/values-pt-rBR/arrays.xml
+++ b/res/values-pt-rBR/arrays.xml
@@ -205,6 +205,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-rPT/arrays.xml b/res/values-pt-rPT/arrays.xml
index aec6985..22b8eb9 100644
--- a/res/values-pt-rPT/arrays.xml
+++ b/res/values-pt-rPT/arrays.xml
@@ -205,6 +205,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 75a8ec1..d40ce58 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-pt/arrays.xml b/res/values-pt/arrays.xml
index 0cb0d0c..e4e6c5e 100644
--- a/res/values-pt/arrays.xml
+++ b/res/values-pt/arrays.xml
@@ -205,6 +205,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 a9da1d2..352ce2f 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-ro/arrays.xml b/res/values-ro/arrays.xml
index f12e145..f59a721 100644
--- a/res/values-ro/arrays.xml
+++ b/res/values-ro/arrays.xml
@@ -205,6 +205,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 fb349c2..c1a55e8 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -4755,4 +4755,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-ru/arrays.xml b/res/values-ru/arrays.xml
index ac5e085..c8cecdf 100644
--- a/res/values-ru/arrays.xml
+++ b/res/values-ru/arrays.xml
@@ -205,6 +205,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 6bdd49a..a28ebda 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -4840,4 +4840,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Отзывы по оборудованию</string>
+ <string name="qtifeedback_settings_subtitle"> Отчеты Qualcomm Technologies, Inc</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-si/arrays.xml b/res/values-si/arrays.xml
index 67c9a97..19c4fc9 100644
--- a/res/values-si/arrays.xml
+++ b/res/values-si/arrays.xml
@@ -205,6 +205,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 7bf66d8..b421882 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-sk/arrays.xml b/res/values-sk/arrays.xml
index 639e8fa..7d5ab1e 100644
--- a/res/values-sk/arrays.xml
+++ b/res/values-sk/arrays.xml
@@ -205,6 +205,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 1fc91c9..8bbf3cf 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -4840,4 +4840,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Spätná väzba k hardvéru</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Nahlasovanie</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-sl/arrays.xml b/res/values-sl/arrays.xml
index 31ff81f..63dc3fb 100644
--- a/res/values-sl/arrays.xml
+++ b/res/values-sl/arrays.xml
@@ -205,6 +205,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 edaf7db..c995d4c 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -4840,4 +4840,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Povratne informacije o strojni opremi</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Poročilo</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-sq/arrays.xml b/res/values-sq/arrays.xml
index 5a9fde5..0187eb7 100644
--- a/res/values-sq/arrays.xml
+++ b/res/values-sq/arrays.xml
@@ -205,6 +205,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-sr/arrays.xml b/res/values-sr/arrays.xml
index 1c975e0..2ce0712 100644
--- a/res/values-sr/arrays.xml
+++ b/res/values-sr/arrays.xml
@@ -205,6 +205,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 c48f039..338955d 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -4755,4 +4755,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-sv/arrays.xml b/res/values-sv/arrays.xml
index 00c54a0..fe87e7e 100644
--- a/res/values-sv/arrays.xml
+++ b/res/values-sv/arrays.xml
@@ -205,6 +205,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 8176671..24d2ce9 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -4670,4 +4670,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-sw/arrays.xml b/res/values-sw/arrays.xml
index 6eed660..0a8ba78 100644
--- a/res/values-sw/arrays.xml
+++ b/res/values-sw/arrays.xml
@@ -205,6 +205,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 1d99b33..146c99a 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -4671,4 +4671,8 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-ta/arrays.xml b/res/values-ta/arrays.xml
index 9135fff..d960c13 100644
--- a/res/values-ta/arrays.xml
+++ b/res/values-ta/arrays.xml
@@ -205,6 +205,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 f8b86ac..a94202d 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">வன்பொருள் பின்னூட்டம்</string>
+ <string name="qtifeedback_settings_subtitle"> Qualcomm Technologies, Inc அறிக்கையிடுதல்</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-te/arrays.xml b/res/values-te/arrays.xml
index 7c92706..43444cc 100644
--- a/res/values-te/arrays.xml
+++ b/res/values-te/arrays.xml
@@ -205,6 +205,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 70f33c9..d2a4cfe 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -4672,4 +4672,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">హార్డ్వేర్ అభిప్రాయం</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc నివేదించడం</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-th/arrays.xml b/res/values-th/arrays.xml
index 33fbe3b..51c69d8 100644
--- a/res/values-th/arrays.xml
+++ b/res/values-th/arrays.xml
@@ -205,6 +205,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 f90244d..b161daa 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">ความคิดเห็นเกี่ยวกับฮาร์ดแวร์</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc การรายงาน</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-tl/arrays.xml b/res/values-tl/arrays.xml
index 3d439a6..e31482b 100644
--- a/res/values-tl/arrays.xml
+++ b/res/values-tl/arrays.xml
@@ -205,6 +205,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-tr/arrays.xml b/res/values-tr/arrays.xml
index 080847c..a8e05a4 100644
--- a/res/values-tr/arrays.xml
+++ b/res/values-tr/arrays.xml
@@ -205,6 +205,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 fe163eb..74e7ab4 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Donanım Geri Bildirimi</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Raporlama</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-uk/arrays.xml b/res/values-uk/arrays.xml
index 850a400..02f209e 100644
--- a/res/values-uk/arrays.xml
+++ b/res/values-uk/arrays.xml
@@ -205,6 +205,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 d63d9cb..7b67b66 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -4840,4 +4840,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Відгук про обладнання</string>
+ <string name="qtifeedback_settings_subtitle">Надсилання звітів Qualcomm Technologies, Inc</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-ur/arrays.xml b/res/values-ur/arrays.xml
index 8b13cf9..2e24d85 100644
--- a/res/values-ur/arrays.xml
+++ b/res/values-ur/arrays.xml
@@ -205,6 +205,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-uz/arrays.xml b/res/values-uz/arrays.xml
index abe944c..c25bdc2 100644
--- a/res/values-uz/arrays.xml
+++ b/res/values-uz/arrays.xml
@@ -205,6 +205,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 f7638e1..55e462d 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -4684,4 +4684,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">Apparat vositalari javobi</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc Hisobot berish</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-vi/arrays.xml b/res/values-vi/arrays.xml
index e54b3bc..9f78e8a 100644
--- a/res/values-vi/arrays.xml
+++ b/res/values-vi/arrays.xml
@@ -205,6 +205,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 f6b574c..0e04589 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <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>
\ No newline at end of file
diff --git a/res/values-zh-rCN/arrays.xml b/res/values-zh-rCN/arrays.xml
index fffcf47..4fdf8d7 100644
--- a/res/values-zh-rCN/arrays.xml
+++ b/res/values-zh-rCN/arrays.xml
@@ -205,6 +205,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 53a1f7a..fa9d33c 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -3226,6 +3226,7 @@
<string name="vibrate_when_ringing_title" msgid="3436203665622843196">"有来电时振动"</string>
<string name="other_sound_settings" msgid="5468360269346162072">"其他提示音"</string>
<string name="dial_pad_tones_title" msgid="3536945335367914892">"拨号键盘提示音"</string>
+ <string name="call_connected_tones_title" msgid="1999293510400911558">"通话接通提示音"</string>
<string name="screen_locking_sounds_title" msgid="1502654020775767536">"屏幕锁定提示音"</string>
<string name="charging_sounds_title" msgid="5261683808537783668">"充电提示音和振动"</string>
<string name="docking_sounds_title" msgid="5341616179210436159">"基座提示音"</string>
@@ -4417,6 +4418,29 @@
<!-- no translation found for game_driver_app_preference_values:0 (2432393448266016546) -->
<!-- no translation found for game_driver_app_preference_values:1 (398843973192851256) -->
<!-- no translation found for game_driver_app_preference_values:2 (8840726898745627072) -->
+ <string name="gup_dashboard_title" msgid="6365053025908111197">"游戏更新软件包偏好设置"</string>
+ <string name="gup_dashboard_summary" msgid="7454221684538769577">"修改游戏更新软件包的设置"</string>
+ <string name="gup_all_apps_switch_title" msgid="8071650410524064369">"针对所有应用启用"</string>
+ <string name="gup_app_preference_title" msgid="7176388161899486800">"选择图形驱动程序"</string>
+ <string name="gup_app_preference_default" msgid="7995039180348956109">"默认"</string>
+ <string name="gup_app_preference_gup" msgid="5605778469372613985">"游戏更新软件包"</string>
+ <string name="gup_app_preference_system" msgid="5701853677984004799">"系统图形驱动程序"</string>
+ <!-- no translation found for gup_app_preference_values:0 (8465947040872291983) -->
+ <!-- no translation found for gup_app_preference_values:1 (2528348813076808406) -->
+ <!-- no translation found for gup_app_preference_values:2 (1224045073126150618) -->
+ <!-- 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="directory_on_volume" msgid="1246959267814974387">"<xliff:g id="VOLUME">%1$s</xliff:g>(<xliff:g id="DIRECTORY">%2$s</xliff:g>)"</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>
@@ -4670,4 +4694,10 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></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>
</resources>
diff --git a/res/values-zh-rHK/arrays.xml b/res/values-zh-rHK/arrays.xml
index 7055620..44d2fbe 100644
--- a/res/values-zh-rHK/arrays.xml
+++ b/res/values-zh-rHK/arrays.xml
@@ -205,6 +205,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 66748c7..d28d003 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -4671,4 +4671,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">硬件反饋</string>
+ <string name="qtifeedback_settings_subtitle">Qualcomm Technologies, Inc 報告</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-zh-rTW/arrays.xml b/res/values-zh-rTW/arrays.xml
index 2dd50e6..5a253fc 100644
--- a/res/values-zh-rTW/arrays.xml
+++ b/res/values-zh-rTW/arrays.xml
@@ -205,6 +205,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 d8f76de..16623d7 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -4670,4 +4670,6 @@
<string name="rtt_settings_no_visible" msgid="7440356831140948382"></string>
<string name="rtt_settings_visible_during_call" msgid="7866181103286073700"></string>
<string name="rtt_settings_always_visible" msgid="2364173070088756238"></string>
-</resources>
+ <string name="qtifeedback_settings_title">硬體使用情況回報</string>
+ <string name="qtifeedback_settings_subtitle"> Qualcomm Technologies, Inc 報告</string>
+</resources>
\ No newline at end of file
diff --git a/res/values-zu/arrays.xml b/res/values-zu/arrays.xml
index 9a31ab4..2b52120 100644
--- a/res/values-zu/arrays.xml
+++ b/res/values-zu/arrays.xml
@@ -205,6 +205,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/arrays.xml b/res/values/arrays.xml
index 09447b9..e93babb 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -266,6 +266,20 @@
<item>@string/wifi_ap_choose_5G</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>0</item>
+ <item>1</item>
+ <item>2</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_choose_5G</item>
+ <item>@string/wifi_ap_choose_vendor_both</item>
+ </string-array>
+
<string-array translatable="false" name="wifi_ap_band_dual_mode">
<item>0</item>
<item>-1</item>
@@ -505,6 +519,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">
@@ -516,6 +531,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 -->
@@ -1390,12 +1407,29 @@
<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 -->
diff --git a/res/values/config.xml b/res/values/config.xml
index 0f03c23..2ea14a6 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -406,6 +406,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>
@@ -416,7 +422,7 @@
<string-array name="config_suppress_injected_tile_keys" translatable="false"/>
<!-- "Show work policy info" intent action. TODO(b/134391103): Replace with final SystemAPI intent when it's available. -->
- <string name="config_work_policy_info_intent_action" translatable="false"/>
+ <string name="config_work_policy_info_intent_action" translatable="false">com.google.android.settings.privacy.ACTION_SHOW_WORK_POLICY_INFO</string>
<!-- RTT setting intent action -->
<string name="config_rtt_setting_intent_action" translatable="false"></string>
@@ -431,4 +437,8 @@
<item>com.android.systemui</item>
<item>com.android.vending</item>
</string-array>
+
+ <!-- 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 deea388..4857a85 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -418,6 +418,8 @@
<string name="connected_device_connected_title">Currently connected</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]-->
@@ -1884,6 +1886,8 @@
<!-- Wifi Display settings. The title of the screen. [CHAR LIMIT=40] -->
<string name="wifi_display_settings_title">Cast</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]-->
@@ -1930,6 +1934,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>
<!-- Wifi Sign in CTA for wifi settings when captive portal auth is required [CHAR LIMIT = 50] -->
@@ -2178,6 +2184,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_both">Both</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 -->
@@ -2607,28 +2615,62 @@
<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>
@@ -2636,6 +2678,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>
@@ -7567,6 +7611,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 sounds</string>
@@ -10707,6 +10754,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] -->
@@ -11223,6 +11283,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>
+
<!-- Used for EmergencyInfoSlice slice helper class [CHAR LIMIT=NONE]-->
<string name="emergency_info_contextual_card_summary">Medical info, emergency contacts</string>
@@ -11300,6 +11367,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] -->
@@ -11368,6 +11437,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>
diff --git a/res/xml/connected_devices.xml b/res/xml/connected_devices.xml
index 7acdc79..da55fe3 100644
--- a/res/xml/connected_devices.xml
+++ b/res/xml/connected_devices.xml
@@ -36,6 +36,11 @@
android:title="@string/connected_device_connected_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 7cf52fa..2a6433a 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -243,6 +243,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" />
@@ -253,6 +258,16 @@
android:summary="@string/wifi_scan_throttling_summary" />
<SwitchPreference
+ android:key="wifi_whitelist_roaming"
+ android:title="@string/wifi_whitelist_roaming"
+ android:summary="@string/wifi_whitelist_roaming_summary" />
+
+ <SwitchPreference
+ android:key="wifi_unsaved_network_linking"
+ android:title="@string/wifi_unsaved_network_linking"
+ android:summary="@string/wifi_unsaved_network_linking_summary" />
+
+ <SwitchPreference
android:key="mobile_data_always_on"
android:title="@string/mobile_data_always_on"
android:summary="@string/mobile_data_always_on_summary" />
diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml
index 136e6ab..0f31cb8 100644
--- a/res/xml/location_settings.xml
+++ b/res/xml/location_settings.xml
@@ -31,6 +31,11 @@
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"/>
<PreferenceCategory
android:key="location_advanced_settings"
android:layout="@layout/preference_category_no_label"
diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml
index 9a6047c..ce7dacb 100644
--- a/res/xml/my_device_info.xml
+++ b/res/xml/my_device_info.xml
@@ -192,4 +192,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/network_and_internet.xml b/res/xml/network_and_internet.xml
index 32b51d4..2ea279b 100644
--- a/res/xml/network_and_internet.xml
+++ b/res/xml/network_and_internet.xml
@@ -44,6 +44,13 @@
settings:useAdminDisabledSummary="true">
</com.android.settingslib.RestrictedPreference>
+ <com.android.settings.datausage.DataSaverPreference
+ android:key="restrict_background_parent_entry"
+ android:title="@string/data_saver_title"
+ android:icon="@drawable/ic_settings_data_usage"
+ android:order="-10"
+ android:fragment="com.android.settings.datausage.DataSaverSummary"/>
+
<com.android.settingslib.RestrictedPreference
android:fragment="com.android.settings.TetherSettings"
android:key="tether_settings"
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 d99cc00..8a58706 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -152,6 +152,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/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 605f483..da32c44 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -52,6 +52,7 @@
import androidx.preference.SwitchPreference;
import com.android.internal.telephony.CommandException;
+import com.android.internal.telephony.IccCardConstants.State;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.TelephonyIntents;
@@ -265,12 +266,24 @@
}
private void updatePreferences() {
+ boolean pinToggleState = false;
+ boolean pinDialogState = false;
+
+ if (mPhone != null) {
+ State cardState = mPhone.getIccCard().getState();
+ if (cardState == State.READY || cardState == State.LOADED) {
+ // if SIM State is NOT READY, it is not possible to interact with UICC app
+ // for enabling/disabling PIN so greyout PIN options.
+ pinToggleState = true;
+ pinDialogState = true;
+ }
+ }
+
if (mPinDialog != null) {
- mPinDialog.setEnabled(mPhone != null);
+ mPinDialog.setEnabled(pinDialogState);
}
if (mPinToggle != null) {
- mPinToggle.setEnabled(mPhone != null);
-
+ mPinToggle.setEnabled(pinToggleState);
if (mPhone != null) {
mPinToggle.setChecked(mPhone.getIccCard().getIccLockEnabled());
}
diff --git a/src/com/android/settings/ResetNetworkConfirm.java b/src/com/android/settings/ResetNetworkConfirm.java
index beb0528..9b5f972 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,7 +46,6 @@
import android.widget.Toast;
import androidx.annotation.VisibleForTesting;
-import androidx.appcompat.app.AlertDialog;
import com.android.ims.ImsManager;
import com.android.internal.telephony.PhoneConstants;
@@ -53,6 +53,8 @@
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"
@@ -122,6 +124,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 e63edd7..f31783f 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -177,5 +177,7 @@
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 */ }
}
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 3b01b32..11214ab 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -30,6 +30,8 @@
import android.content.res.Resources.Theme;
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;
@@ -58,6 +60,7 @@
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.homepage.TopLevelSettings;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.sim.SimSettings;
import com.android.settings.wfd.WifiDisplaySettings;
import com.android.settings.widget.SwitchBar;
import com.android.settingslib.core.instrumentation.Instrumentable;
@@ -70,6 +73,8 @@
import java.util.ArrayList;
import java.util.List;
+import org.codeaurora.internal.IExtTelephony;
+
public class SettingsActivity extends SettingsBaseActivity
implements PreferenceManager.OnPreferenceTreeClickListener,
@@ -143,6 +148,7 @@
private CharSequence mInitialTitle;
private int mInitialTitleResId;
+ private SmqSettings mSMQ;
private BroadcastReceiver mDevelopmentSettingsListener;
@@ -231,6 +237,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);
@@ -550,7 +558,35 @@
*/
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);
+ IExtTelephony extTelephony =
+ IExtTelephony.Stub.asInterface(ServiceManager.getService("extphone"));
+ try {
+ if (fragmentName.equals(SimSettings.class.getName()) && extTelephony != null &&
+ extTelephony.isVendorApkAvailable("com.qualcomm.qti.simsettings")) {
+ 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;
+ }
+ } catch (RemoteException e) {
+ // could not connect to extphone service, launch the default activity
+ Log.i(LOG_TAG,
+ "couldn't connect to extphone service, launch the default sim cards activity");
+ }
+
if (validate && !isValidFragment(fragmentName)) {
throw new IllegalArgumentException("Invalid fragment for this activity: "
+ fragmentName);
@@ -597,6 +633,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,
@@ -611,6 +651,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 20b6e2f..c3a18d8
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -136,7 +136,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);
}
@@ -228,12 +228,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:
@@ -244,7 +252,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
old mode 100644
new mode 100755
index c4b1400..947a74a
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -44,6 +44,7 @@
import android.content.pm.UserInfo;
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;
@@ -74,6 +75,8 @@
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;
@@ -111,6 +114,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";
@@ -124,6 +129,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.
*/
@@ -131,6 +144,11 @@
"device_identifier_access_restrictions_disabled";
/**
+ * An int extra specifying a slot ID.
+ */
+ public static final String EXTRA_SLOT_ID = "slot_id";
+
+ /**
* Finds a matching activity for a preference's intent. If a matching
* activity is not found, it will remove the preference.
*
@@ -1018,6 +1036,74 @@
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;
+ }
+
+ /**
+ * 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("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 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/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index 971c6f5..2f6296e 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -508,7 +508,9 @@
outState.putBoolean(EXTRA_SHOW_SYSTEM, mShowSystem);
outState.putBoolean(EXTRA_HAS_ENTRIES, mApplications.mHasReceivedLoadEntries);
outState.putBoolean(EXTRA_HAS_BRIDGE, mApplications.mHasReceivedBridgeCallback);
- outState.putBoolean(EXTRA_EXPAND_SEARCH_VIEW, !mSearchView.isIconified());
+ if (null != mSearchView) {
+ outState.putBoolean(EXTRA_EXPAND_SEARCH_VIEW, !mSearchView.isIconified());
+ }
outState.putInt(EXTRA_FILTER_TYPE, mFilter.getFilterType());
if (mApplications != null) {
mApplications.onSaveInstanceState(outState);
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 94bdfe8..95d59fc 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 6381b84..827155c 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");
@@ -44,9 +77,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..d1773a9
--- /dev/null
+++ b/src/com/android/settings/bluetooth/SavedBluetoothTwsDeviceUpdater.java
@@ -0,0 +1,83 @@
+/*
+ *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 {
+
+ public SavedBluetoothTwsDeviceUpdater(Context context, DashboardFragment fragment,
+ DevicePreferenceCallback devicePreferenceCallback) {
+ super(context, fragment, devicePreferenceCallback);
+ }
+
+ SavedBluetoothTwsDeviceUpdater(DashboardFragment fragment,
+ DevicePreferenceCallback devicePreferenceCallback,
+ LocalBluetoothManager localBluetoothManager) {
+ super(fragment, devicePreferenceCallback, localBluetoothManager);
+ }
+
+ @Override
+ public boolean isFilterMatched(CachedBluetoothDevice cachedDevice) {
+ final BluetoothDevice device = cachedDevice.getDevice();
+ return device.getBondState() == BluetoothDevice.BOND_BONDED &&
+ !device.isConnected() && device.isTwsPlusDevice();
+ }
+}
diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
index cbabb06..db9eb02 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");
@@ -92,6 +125,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(DiscoverableFooterPreferenceController.class).init(this);
use(SlicePreferenceController.class).setSliceUri(nearbyEnabled
diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
index 5b23d69..b74c79d 100644
--- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
@@ -22,7 +22,13 @@
import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;
+import android.bluetooth.BluetoothAdapter;
+import com.android.settingslib.bluetooth.BluetoothCallback;
+import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settings.bluetooth.Utils;
import com.android.settings.bluetooth.BluetoothDeviceUpdater;
import com.android.settings.bluetooth.SavedBluetoothDeviceUpdater;
import com.android.settings.connecteddevice.dock.DockUpdater;
@@ -34,11 +40,13 @@
import com.android.settingslib.core.lifecycle.events.OnStop;
public class PreviouslyConnectedDevicePreferenceController extends BasePreferenceController
- implements LifecycleObserver, OnStart, OnStop, DevicePreferenceCallback {
+ implements LifecycleObserver, OnStart, OnStop, DevicePreferenceCallback, BluetoothCallback {
private static final int MAX_DEVICE_NUM = 3;
private PreferenceGroup mPreferenceGroup;
+ private LocalBluetoothAdapter mLocalAdapter;
+ private LocalBluetoothManager manager;
private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
private DockUpdater mSavedDockUpdater;
private int mPreferenceSize;
@@ -48,6 +56,10 @@
mSavedDockUpdater = FeatureFactory.getFactory(
context).getDockUpdaterFeatureProvider().getSavedDockUpdater(context, this);
+ manager = Utils.getLocalBtManager(context);
+ if ( manager != null) {
+ mLocalAdapter = manager.getBluetoothAdapter();
+ }
}
@Override
@@ -75,12 +87,15 @@
public void onStart() {
mBluetoothDeviceUpdater.registerCallback();
mSavedDockUpdater.registerCallback();
+ manager.getEventManager().registerCallback(this);
}
@Override
public void onStop() {
mBluetoothDeviceUpdater.unregisterCallback();
mSavedDockUpdater.unregisterCallback();
+ manager.getEventManager().unregisterCallback(this);
+
}
public void init(DashboardFragment fragment) {
@@ -104,6 +119,46 @@
updatePreferenceVisiblity();
}
+ @Override
+ public void onBluetoothStateChanged(int bluetoothState) {
+ updatePreferenceVisiblity();
+ }
+
+ @Override
+ public void onScanningStateChanged(boolean started) {
+ // do nothing
+ }
+
+ @Override
+ public void onDeviceAdded(CachedBluetoothDevice cachedDevice) {
+ // do nothing
+ }
+
+ @Override
+ public void onDeviceDeleted(CachedBluetoothDevice cachedDevice) {
+ // do nothing
+ }
+
+ @Override
+ public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
+ // do nothing
+ }
+
+ @Override
+ public void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) {
+ // do nothing
+ }
+
+ @Override
+ public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) {
+ // do nothing
+ }
+
+ @Override
+ public void onAudioModeChanged() {
+ // do nothing
+ }
+
@VisibleForTesting
void setBluetoothDeviceUpdater(BluetoothDeviceUpdater bluetoothDeviceUpdater) {
mBluetoothDeviceUpdater = bluetoothDeviceUpdater;
@@ -121,6 +176,12 @@
@VisibleForTesting
void updatePreferenceVisiblity() {
- mPreferenceGroup.setVisible(mPreferenceSize > 0);
+ if ((mLocalAdapter != null) &&
+ (mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON)) {
+ mPreferenceGroup.setVisible(mPreferenceSize > 0);
+ } else {
+ mPreferenceGroup.setVisible(false);
+ }
}
+
}
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 fd03697..16bca66 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -304,6 +304,7 @@
// Home page > Network & Internet
Settings.WifiSettingsActivity.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/CellDataPreference.java b/src/com/android/settings/datausage/CellDataPreference.java
index af7e16e..b0cd87e 100644
--- a/src/com/android/settings/datausage/CellDataPreference.java
+++ b/src/com/android/settings/datausage/CellDataPreference.java
@@ -51,7 +51,6 @@
public int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
public boolean mChecked;
- public boolean mMultiSimDialog;
private TelephonyManager mTelephonyManager;
@VisibleForTesting
SubscriptionManager mSubscriptionManager;
@@ -68,7 +67,6 @@
super.onRestoreInstanceState(state.getSuperState());
mTelephonyManager = TelephonyManager.from(getContext());
mChecked = state.mChecked;
- mMultiSimDialog = state.mMultiSimDialog;
if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
mSubId = state.mSubId;
setKey(getKey() + mSubId);
@@ -80,7 +78,6 @@
protected Parcelable onSaveInstanceState() {
CellDataState state = new CellDataState(super.onSaveInstanceState());
state.mChecked = mChecked;
- state.mMultiSimDialog = mMultiSimDialog;
state.mSubId = mSubId;
return state;
}
@@ -135,42 +132,16 @@
@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 = mSubscriptionManager.getActiveSubscriptionInfo(
mSubId);
final SubscriptionInfo nextSir = mSubscriptionManager.getDefaultDataSubscriptionInfo();
if (mChecked) {
- // If the device is single SIM or is enabling data on the active data SIM then forgo
- // the pop-up.
- if (!Utils.showSimCardTile(getContext()) ||
- (nextSir != null && currentSir != null &&
- currentSir.getSubscriptionId() == nextSir.getSubscriptionId())) {
- setMobileDataEnabled(false);
- if (nextSir != null && currentSir != null &&
- currentSir.getSubscriptionId() == nextSir.getSubscriptionId()) {
- disableDataForOtherSubscriptions(mSubId);
- }
- return;
- }
- // disabling data; show confirmation dialog which eventually
- // calls setMobileDataEnabled() once user confirms.
- mMultiSimDialog = false;
super.performClick(view);
} else {
- // If we are showing the Sim Card tile then we are a Multi-Sim device.
- if (Utils.showSimCardTile(getContext())) {
- mMultiSimDialog = true;
- if (nextSir != null && currentSir != null &&
- currentSir.getSubscriptionId() == nextSir.getSubscriptionId()) {
- setMobileDataEnabled(true);
- disableDataForOtherSubscriptions(mSubId);
- return;
- }
- super.performClick(view);
- } else {
- setMobileDataEnabled(true);
- }
+ setMobileDataEnabled(true);
}
}
@@ -198,11 +169,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,
@@ -213,6 +180,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 = mSubscriptionManager.getActiveSubscriptionInfo(mSubId);
@@ -248,14 +216,8 @@
if (which != DialogInterface.BUTTON_POSITIVE) {
return;
}
- if (mMultiSimDialog) {
- mSubscriptionManager.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
@@ -298,7 +260,6 @@
public static class CellDataState extends BaseSavedState {
public int mSubId;
public boolean mChecked;
- public boolean mMultiSimDialog;
public CellDataState(Parcelable base) {
super(base);
@@ -307,7 +268,6 @@
public CellDataState(Parcel source) {
super(source);
mChecked = source.readByte() != 0;
- mMultiSimDialog = source.readByte() != 0;
mSubId = source.readInt();
}
@@ -315,7 +275,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 6597ecb..911ed55 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -28,6 +28,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;
@@ -94,7 +95,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 (DataUsageUtils.hasSim(context) && hasWifiRadio) {
// If the device has a SIM installed, 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/BluetoothAudioCodecPreferenceController.java b/src/com/android/settings/development/BluetoothAudioCodecPreferenceController.java
index b5c40a3..a7fb255 100644
--- a/src/com/android/settings/development/BluetoothAudioCodecPreferenceController.java
+++ b/src/com/android/settings/development/BluetoothAudioCodecPreferenceController.java
@@ -82,6 +82,12 @@
case 5:
codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC;
break;
+ case 6:
+ codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_ADAPTIVE;
+ break;
+ case 7:
+ codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_TWSP;
+ break;
default:
break;
}
@@ -107,13 +113,21 @@
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;
+ case 8:
synchronized (mBluetoothA2dpConfigStore) {
if (mBluetoothA2dp != null) {
mBluetoothA2dp.enableOptionalCodecs(null); // Use current active device
}
}
return;
- case 7:
+ case 9:
synchronized (mBluetoothA2dpConfigStore) {
if (mBluetoothA2dp != null) {
mBluetoothA2dp.disableOptionalCodecs(null); // Use current active device
@@ -147,6 +161,12 @@
case BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC:
index = 5;
break;
+ case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_ADAPTIVE:
+ index = 6;
+ break;
+ case BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_TWSP:
+ index = 7;
+ break;
case BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID:
default:
break;
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 f384d85..8e1c37a 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -431,8 +431,11 @@
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 WifiWhitelistRoamingPreferenceController(context));
+ controllers.add(new WifiUnsavedNetworkLinkingPreferenceController(context));
controllers.add(new MobileDataAlwaysOnPreferenceController(context));
controllers.add(new TetheringHardwareAccelPreferenceController(context));
controllers.add(new BluetoothDeviceNoNamePreferenceController(context));
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/WifiUnsavedNetworkLinkingPreferenceController.java b/src/com/android/settings/development/WifiUnsavedNetworkLinkingPreferenceController.java
new file mode 100644
index 0000000..2e33e2b
--- /dev/null
+++ b/src/com/android/settings/development/WifiUnsavedNetworkLinkingPreferenceController.java
@@ -0,0 +1,79 @@
+/*
+ * 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.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 WifiUnsavedNetworkLinkingPreferenceController extends DeveloperOptionsPreferenceController
+ implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
+
+ private static final String WIFI_UNSAVED_NETWORK_LINKING_KEY = "wifi_unsaved_network_linking";
+
+ private final WifiManager mWifiManager;
+
+ public WifiUnsavedNetworkLinkingPreferenceController(Context context) {
+ super(context);
+
+ mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return WIFI_UNSAVED_NETWORK_LINKING_KEY;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ final boolean isEnabled = (Boolean) newValue;
+ mWifiManager.enableUnsavedNetworkLinkingFeature(isEnabled);
+ return true;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ final boolean enabled = mWifiManager.isUnsavedNetworkLinkingFeatureEnabled();
+ ((SwitchPreference) mPreference).setChecked(enabled);
+
+ }
+
+ @Override
+ protected void onDeveloperOptionsSwitchDisabled() {
+ super.onDeveloperOptionsSwitchDisabled();
+ mWifiManager.enableUnsavedNetworkLinkingFeature(false);
+ ((SwitchPreference) mPreference).setChecked(false);
+ }
+}
diff --git a/src/com/android/settings/development/WifiWhitelistRoamingPreferenceController.java b/src/com/android/settings/development/WifiWhitelistRoamingPreferenceController.java
new file mode 100644
index 0000000..6867ec1
--- /dev/null
+++ b/src/com/android/settings/development/WifiWhitelistRoamingPreferenceController.java
@@ -0,0 +1,79 @@
+/*
+ * 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.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 WifiWhitelistRoamingPreferenceController extends DeveloperOptionsPreferenceController
+ implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
+
+ private static final String WIFI_WHITELIST_ROAMING_KEY = "wifi_whitelist_roaming";
+
+ private final WifiManager mWifiManager;
+
+ public WifiWhitelistRoamingPreferenceController(Context context) {
+ super(context);
+
+ mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return WIFI_WHITELIST_ROAMING_KEY;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ final boolean isEnabled = (Boolean) newValue;
+ mWifiManager.enableWhitelistNetworkRoamingFeature(isEnabled);
+ return true;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ final boolean enabled = mWifiManager.isWhitelistNetworkRoamingFeatureEnabled();
+ ((SwitchPreference) mPreference).setChecked(enabled);
+
+ }
+
+ @Override
+ protected void onDeveloperOptionsSwitchDisabled() {
+ super.onDeveloperOptionsSwitchDisabled();
+ mWifiManager.enableWhitelistNetworkRoamingFeature(false);
+ ((SwitchPreference) mPreference).setChecked(false);
+ }
+}
diff --git a/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java b/src/com/android/settings/deviceinfo/DeviceNamePreferenceController.java
index fb20a2e..96682cb 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 29f1391..a01669b 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 e6afb7b..10cc300 100644
--- a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
+++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
@@ -38,6 +38,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;
@@ -115,6 +117,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 e7f6423..8560951 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;
@@ -58,6 +59,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/ImeiInfoDialogController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java
index 9ab21de..80b2a05 100644
--- a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java
+++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java
@@ -106,7 +106,8 @@
private void updateDialogForCdmaPhone() {
final Resources res = mDialog.getContext().getResources();
- mDialog.setText(ID_MEID_NUMBER_VALUE, getMeid());
+ mDialog.setText(ID_MEID_NUMBER_VALUE,
+ mSubscriptionInfo != null ? getMeid() : "");
// MIN needs to read from SIM. So if no SIM, we should not show MIN on UI
mDialog.setText(ID_MIN_NUMBER_VALUE, mSubscriptionInfo != null
? mTelephonyManager.getCdmaMin(mSubscriptionInfo.getSubscriptionId())
@@ -133,9 +134,13 @@
}
private void updateDialogForGsmPhone() {
- mDialog.setText(ID_IMEI_VALUE, getTextAsDigits(mTelephonyManager.getImei(mSlotId)));
+ mDialog.setText(ID_IMEI_VALUE,
+ mSubscriptionInfo != null ?
+ getTextAsDigits(mTelephonyManager.getImei(mSlotId)) : "");
mDialog.setText(ID_IMEI_SV_VALUE,
- getTextAsDigits(mTelephonyManager.getDeviceSoftwareVersion(mSlotId)));
+ mSubscriptionInfo != null ?
+ getTextAsDigits(mTelephonyManager.
+ getDeviceSoftwareVersion(mSlotId)) : "");
// device is not CDMA, do not display CDMA features
mDialog.removeViewFromScreen(ID_CDMA_SETTINGS);
}
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 3459b5c..292c27f
--- 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;
}
@@ -160,6 +217,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/location/AgpsPreferenceController.java b/src/com/android/settings/location/AgpsPreferenceController.java
new file mode 100755
index 0000000..0ef073f
--- /dev/null
+++ b/src/com/android/settings/location/AgpsPreferenceController.java
@@ -0,0 +1,77 @@
+/*
+ * 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 BasePreferenceController {
+ private static final String KEY_ASSISTED_GPS = "assisted_gps";
+
+ private CheckBoxPreference mAgpsPreference;
+
+ public AgpsPreferenceController(Context context) {
+ super(context, KEY_ASSISTED_GPS);
+ }
+
+ @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;
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/location/AppSettingsInjector.java b/src/com/android/settings/location/AppSettingsInjector.java
index 8120821..2265e7f 100644
--- a/src/com/android/settings/location/AppSettingsInjector.java
+++ b/src/com/android/settings/location/AppSettingsInjector.java
@@ -18,9 +18,19 @@
import android.content.Context;
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.widget.RestrictedAppPreference;
import com.android.settingslib.location.InjectedSetting;
import com.android.settingslib.location.SettingsInjector;
@@ -35,10 +45,29 @@
super(context);
}
+ /**
+ * 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);
}
}
diff --git a/src/com/android/settings/location/DimmableIZatIconPreference.java b/src/com/android/settings/location/DimmableIZatIconPreference.java
new file mode 100644
index 0000000..8166ec0
--- /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/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 7142486..ba05cb4 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -122,6 +122,7 @@
controllers.add(new LocationScanningPreferenceController(context));
controllers.add(new LocationServicePreferenceController(context, fragment, lifecycle));
controllers.add(new LocationFooterPreferenceController(context, lifecycle));
+ controllers.add(new AgpsPreferenceController(context));
return controllers;
}
diff --git a/src/com/android/settings/network/ApnEditor.java b/src/com/android/settings/network/ApnEditor.java
index 1451a40..fae43c0 100644
--- a/src/com/android/settings/network/ApnEditor.java
+++ b/src/com/android/settings/network/ApnEditor.java
@@ -56,6 +56,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;
@@ -143,6 +144,8 @@
private boolean mReadOnlyApn;
private Uri mCarrierUri;
+ private static final String APN_DEFALUT_VALUES_STRING_ARRAY = "apn_default_values_strings_array";
+
/**
* Standard projection for the interesting columns of a normal note.
*/
@@ -174,6 +177,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;
@@ -298,6 +321,9 @@
mApnData = getApnDataFromUri(uri);
} else {
mApnData = new ApnData(sProjection.length);
+ if (action.equals(Intent.ACTION_INSERT)) {
+ setDefaultData();
+ }
}
mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
@@ -569,6 +595,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()));
@@ -677,6 +707,11 @@
mMvnoMatchData.setText(numeric + "x");
} else if (values[mvnoIndex].equals("GID")) {
mMvnoMatchData.setText(mTelephonyManager.getGroupIdLevel1());
+ } else if (values[mvnoIndex].equals("ICCID")) {
+ if (mMvnoMatchDataStr != null) {
+ Log.d(TAG, "mMvnoMatchDataStr: " + mMvnoMatchDataStr);
+ mMvnoMatchData.setText(mMvnoMatchDataStr);
+ }
}
}
@@ -1159,6 +1194,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"
@@ -1303,5 +1383,9 @@
String getString(int index) {
return (String) mData[index];
}
+
+ void setObject(int index, Object value) {
+ mData[index] = value;
+ }
}
}
diff --git a/src/com/android/settings/network/ApnPreference.java b/src/com/android/settings/network/ApnPreference.java
index f039539..1d45efa 100755
--- a/src/com/android/settings/network/ApnPreference.java
+++ b/src/com/android/settings/network/ApnPreference.java
@@ -91,6 +91,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 f0603bb..b8261a1 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;
@@ -38,6 +39,7 @@
import android.os.UserManager;
import android.provider.Telephony;
import android.telephony.CarrierConfigManager;
+import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -51,15 +53,20 @@
import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
-
+import com.android.ims.ImsManager;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.uicc.UiccController;
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 {
@@ -84,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;
@@ -93,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 +138,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);
}
@@ -158,6 +179,12 @@
}
fillList();
}
+ } else if (intent.getAction().equals(ACTION_VOLTE_ENABLED_STATE_CHANGED)) {
+ if (!mRestoreDefaultApnMode) {
+ fillList();
+ } else {
+ showDialog(DIALOG_RESTORE_DEFAULTAPN);
+ }
}
}
};
@@ -186,6 +213,9 @@
mIntentFilter = new IntentFilter(
TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
mIntentFilter.addAction(TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED);
+ if (Utils.isSupportCTPA(getActivity().getApplicationContext())) {
+ mIntentFilter.addAction(ACTION_VOLTE_ENABLED_STATE_CHANGED);
+ }
setIfOnlyAvailableForAdmins(true);
@@ -197,6 +227,14 @@
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) {
String[] readOnlyApnTypes = b.getStringArray(
CarrierConfigManager.KEY_READ_ONLY_APN_TYPES_STRING_ARRAY);
@@ -283,10 +321,18 @@
StringBuilder where = 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());
+
Cursor cursor = getContentResolver().query(simApnUri,
CARRIERS_PROJECTION, where.toString(), null,
Telephony.Carriers.DEFAULT_SORT_ORDER);
@@ -299,6 +345,10 @@
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()) {
String name = cursor.getString(NAME_INDEX);
@@ -309,6 +359,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;
+ }
+ }
ApnPreference pref = new ApnPreference(getPrefContext());
pref.setKey(key);
@@ -323,6 +393,9 @@
}
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)) {
@@ -345,6 +418,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/MobileNetworkListController.java b/src/com/android/settings/network/MobileNetworkListController.java
index ab41fad..67dec82 100644
--- a/src/com/android/settings/network/MobileNetworkListController.java
+++ b/src/com/android/settings/network/MobileNetworkListController.java
@@ -19,15 +19,18 @@
import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.provider.Settings;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.util.ArrayMap;
+import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
+import com.android.settings.Utils;
import com.android.settings.network.telephony.MobileNetworkActivity;
import com.android.settings.network.telephony.MobileNetworkUtils;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -127,8 +130,19 @@
if (!info.isEmbedded() && !mSubscriptionManager.isActiveSubscriptionId(subId)) {
mSubscriptionManager.setSubscriptionEnabled(subId, true);
} else {
- final Intent intent = new Intent(mContext, MobileNetworkActivity.class);
- intent.putExtra(Settings.EXTRA_SUB_ID, info.getSubscriptionId());
+ Intent intent;
+ if (Utils.isNetworkSettingsApkAvailable()) {
+ intent = new Intent(Intent.ACTION_MAIN);
+ intent.setComponent(
+ new ComponentName("com.qualcomm.qti.networksetting",
+ "com.qualcomm.qti.networksetting.MobileNetworkSettings"));
+ intent.putExtra(Utils.EXTRA_SLOT_ID, info.getSimSlotIndex());
+ Log.d(TAG, "slot extra: " + info.getSimSlotIndex()
+ + "name: " + info.getDisplayName());
+ } else {
+ intent = new Intent(mContext, MobileNetworkActivity.class);
+ intent.putExtra(Settings.EXTRA_SUB_ID, info.getSubscriptionId());
+ }
mContext.startActivity(intent);
}
return true;
diff --git a/src/com/android/settings/network/MobileNetworkPreferenceController.java b/src/com/android/settings/network/MobileNetworkPreferenceController.java
index 646f10c..74a5247 100644
--- a/src/com/android/settings/network/MobileNetworkPreferenceController.java
+++ b/src/com/android/settings/network/MobileNetworkPreferenceController.java
@@ -27,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 android.util.FeatureFlagUtils;
@@ -40,12 +42,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 {
@@ -62,9 +66,12 @@
private Preference mPreference;
@VisibleForTesting
PhoneStateListener mPhoneStateListener;
+ private SubscriptionManager mSubscriptionManager;
private BroadcastReceiver mAirplanModeChangedReceiver;
+ private CharSequence mSummary;
+
public MobileNetworkPreferenceController(Context context) {
super(context);
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
@@ -74,9 +81,11 @@
mAirplanModeChangedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
+ updateDisplayName();
updateState(mPreference);
}
};
+ mSubscriptionManager = SubscriptionManager.from(context);
}
@Override
@@ -105,11 +114,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);
}
};
@@ -122,11 +134,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 = MobileNetworkUtils.getCurrentCarrierNameForDisplay(mContext);
+ }
+ }
+ }
+
+ 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);
}
@@ -147,7 +201,13 @@
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (KEY_MOBILE_NETWORK_SETTINGS.equals(preference.getKey())) {
- if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.MOBILE_NETWORK_V2)) {
+ if (Utils.isNetworkSettingsApkAvailable()) {
+ final Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setComponent(
+ new ComponentName("com.qualcomm.qti.networksetting",
+ "com.qualcomm.qti.networksetting.MobileNetworkSettings"));
+ mContext.startActivity(intent);
+ } else if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.MOBILE_NETWORK_V2)) {
final Intent intent = new Intent(mContext, MobileNetworkActivity.class);
mContext.startActivity(intent);
} else {
@@ -163,6 +223,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 0d4a6a6..64d1dc3 100644
--- a/src/com/android/settings/network/TetherPreferenceController.java
+++ b/src/com/android/settings/network/TetherPreferenceController.java
@@ -70,7 +70,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);
+ }
}
};
@@ -129,15 +133,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();
}
@@ -152,6 +161,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);
}
@@ -162,10 +175,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/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
index 8d83ef2..9b5a89f 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -34,6 +34,7 @@
import com.android.internal.telephony.TelephonyIntents;
import com.android.settings.R;
+import com.android.settings.Utils;
import com.android.settings.core.FeatureFlags;
import com.android.settings.dashboard.RestrictedDashboardFragment;
import com.android.settings.datausage.BillingCyclePreferenceController;
@@ -272,6 +273,11 @@
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
boolean enabled) {
+ if (Utils.isNetworkSettingsApkAvailable()) {
+ Log.i(LOG_TAG, "Vendor network setting app is available, not indexing"
+ + " MobileNetworkSettings from Settings app.");
+ return null;
+ }
final ArrayList<SearchIndexableResource> result = new ArrayList<>();
final SearchIndexableResource sir = new SearchIndexableResource(context);
diff --git a/src/com/android/settings/notification/CallConnectedTonePreferenceController.java b/src/com/android/settings/notification/CallConnectedTonePreferenceController.java
new file mode 100644
index 0000000..8070d6c
--- /dev/null
+++ b/src/com/android/settings/notification/CallConnectedTonePreferenceController.java
@@ -0,0 +1,49 @@
+/*
+ * 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.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 eec0fb8..c65c75d 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -242,6 +242,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 =
@@ -260,6 +262,7 @@
new EmergencyTonePreferenceController(context, fragment, lifecycle);
controllers.add(dialPadTonePreferenceController);
+ controllers.add(callConnectedTonePreferenceController);
controllers.add(screenLockSoundPreferenceController);
controllers.add(chargingSoundPreferenceController);
controllers.add(dockingSoundPreferenceController);
@@ -271,6 +274,7 @@
controllers.add(new PreferenceCategoryController(context,
"other_sounds_and_vibrations_category").setChildren(
Arrays.asList(dialPadTonePreferenceController,
+ callConnectedTonePreferenceController,
screenLockSoundPreferenceController,
chargingSoundPreferenceController,
dockingSoundPreferenceController,
@@ -318,4 +322,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 2a7de05..7c67fed 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -202,6 +202,7 @@
mLockPatternUtils = new LockPatternUtils(getActivity());
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 = getActivity().getIntent()
@@ -933,6 +934,7 @@
@Override
public void onDestroy() {
super.onDestroy();
+ mLockPatternUtils.sanitizePassword();
}
@Override
diff --git a/src/com/android/settings/sim/SimSelectNotification.java b/src/com/android/settings/sim/SimSelectNotification.java
index fbf766c..82aae65 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 ceda8a7..d557b78 100644
--- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
+++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
@@ -396,9 +396,12 @@
final PreferenceImageView imageView = view.findViewById(android.R.id.icon);
final int level = accessPoint.getLevel();
+ final int generation = accessPoint.getWifiGeneration();
+ final boolean isReady = accessPoint.isHe8ssCapableAp()
+ && accessPoint.isVhtMax8SpatialStreamsSupported();
if (imageView != null) {
final Drawable drawable = getContext().getDrawable(
- Utils.getWifiIconResource(level));
+ Utils.getWifiIconResource(level, generation, 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 8521a75..eead184 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -36,8 +36,10 @@
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
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.TextUtils;
@@ -59,6 +61,9 @@
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;
@@ -69,6 +74,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;
@@ -164,6 +172,9 @@
private TextView mEapIdentityView;
private TextView mEapAnonymousView;
+ private Spinner mSimCardSpinner;
+ private ArrayList<String> mSimDisplayNames;
+
private Spinner mIpSettingsSpinner;
private TextView mIpAddressView;
private TextView mGatewayView;
@@ -181,6 +192,7 @@
private TextView mProxyExclusionListView;
private TextView mProxyPacView;
private CheckBox mSharedCheckBox;
+ private CheckBox mShareThisWifiCheckBox;
private IpAssignment mIpAssignment = IpAssignment.UNASSIGNED;
private ProxySettings mProxySettings = ProxySettings.UNASSIGNED;
@@ -197,6 +209,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) {
@@ -231,6 +246,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)) {
@@ -279,6 +296,7 @@
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
@@ -286,6 +304,14 @@
mConfigUi.setSubmitButton(res.getString(R.string.wifi_save));
mPasswordScanButton.setVisibility(View.GONE);
} 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);
@@ -315,7 +341,7 @@
} else {
mIpSettingsSpinner.setSelection(DHCP);
}
-
+ mShareThisWifiCheckBox.setChecked(config.shareThisAp);
mSharedCheckBox.setEnabled(config.shared);
if (!config.shared) {
showAdvancedFields = true;
@@ -413,6 +439,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);
}
@@ -617,6 +646,7 @@
}
config.shared = mSharedCheckBox.isChecked();
+ config.shareThisAp = mShareThisWifiCheckBox.isChecked();
switch (mAccessPointSecurity) {
case AccessPoint.SECURITY_NONE:
@@ -656,6 +686,12 @@
case AccessPoint.SECURITY_EAP_SUITE_B:
config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
+ if (mAccessPoint != null && mAccessPoint.isFils256Supported()) {
+ config.allowedKeyManagement.set(KeyMgmt.FILS_SHA256);
+ }
+ if (mAccessPoint != null && mAccessPoint.isFils384Supported()) {
+ config.allowedKeyManagement.set(KeyMgmt.FILS_SHA384);
+ }
if (mAccessPointSecurity == AccessPoint.SECURITY_EAP_SUITE_B) {
config.allowedKeyManagement.set(KeyMgmt.SUITE_B_192);
config.requirePMF = true;
@@ -695,6 +731,12 @@
break;
}
break;
+ case Eap.SIM:
+ case Eap.AKA:
+ case Eap.AKA_PRIME:
+ selectedSimCardNumber = mSimCardSpinner.getSelectedItemPosition() + 1;
+ config.enterpriseConfig.setSimNum(selectedSimCardNumber);
+ break;
case Eap.TTLS:
// The default index from mPhase2TtlsAdapter maps to the API
switch(phase2Method) {
@@ -787,6 +829,15 @@
// clear password
config.enterpriseConfig.setPassword(mPasswordView.getText().toString());
}
+ if (mAccessPoint != null && (mAccessPoint.isFils256Supported()
+ || mAccessPoint.isFils384Supported())) {
+ config.enterpriseConfig.setFieldValue(WifiEnterpriseConfig.EAP_ERP, "1");
+ }
+ break;
+
+ case AccessPoint.SECURITY_DPP:
+ config.allowedKeyManagement.set(KeyMgmt.DPP);
+ config.requirePMF = true;
break;
case AccessPoint.SECURITY_SAE:
config.allowedKeyManagement.set(KeyMgmt.SAE);
@@ -957,7 +1008,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;
}
@@ -973,12 +1025,19 @@
if (mAccessPoint != null && mAccessPoint.isSaved()) {
mPasswordView.setHint(R.string.wifi_unchanged);
+ // Disable Password Scanner for "Modify Network"
+ mPasswordScanButton.setVisibility(View.GONE);
}
}
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);
@@ -986,8 +1045,15 @@
boolean initiateEnterpriseNetworkUi = false;
if (mEapMethodSpinner == null) {
initiateEnterpriseNetworkUi = true;
+ getSIMInfo();
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);
@@ -996,6 +1062,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);
}
@@ -1091,6 +1158,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;
}
@@ -1123,6 +1201,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());
}
}
@@ -1169,12 +1253,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
@@ -1186,6 +1272,7 @@
mView.findViewById(R.id.l_anonymous).setVisibility(View.VISIBLE);
showPeapFields();
setUserCertInvisible();
+ setSimCardInvisible();
break;
case WIFI_EAP_METHOD_TTLS:
// Reset adapter if needed
@@ -1196,10 +1283,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();
@@ -1239,6 +1348,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);
}
@@ -1535,6 +1648,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(true /* refreshEapMethods */, true /* refreshCertificates */);
if (WifiDppUtils.isSupportEnrolleeQrCodeScanner(mContext, mAccessPointSecurity)) {
@@ -1588,6 +1711,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/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
index 252193d..20ad94d 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
@@ -113,8 +113,9 @@
boolean isNonTtyOrTtyOnVolteEnabled = mImsManager.isNonTtyOrTtyOnVolteEnabled();
boolean isWfcEnabled = mSwitchBar.isChecked()
&& isNonTtyOrTtyOnVolteEnabled;
-
- mSwitchBar.setEnabled((state == TelephonyManager.CALL_STATE_IDLE)
+ boolean isCallStateIdle =
+ mTelephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE;
+ mSwitchBar.setEnabled(isCallStateIdle
&& isNonTtyOrTtyOnVolteEnabled);
boolean isWfcModeEditable = true;
@@ -135,13 +136,13 @@
Preference pref = getPreferenceScreen().findPreference(BUTTON_WFC_MODE);
if (pref != null) {
pref.setEnabled(isWfcEnabled && isWfcModeEditable
- && (state == TelephonyManager.CALL_STATE_IDLE));
+ && isCallStateIdle);
}
Preference pref_roam =
getPreferenceScreen().findPreference(BUTTON_WFC_ROAMING_MODE);
if (pref_roam != null) {
pref_roam.setEnabled(isWfcEnabled && isWfcRoamingModeEditable
- && (state == TelephonyManager.CALL_STATE_IDLE));
+ && isCallStateIdle);
}
}
};
@@ -262,8 +263,7 @@
mImsManager = getImsManager();
- mTelephonyManager = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE))
- .createForSubscriptionId(mSubId);
+ mTelephonyManager = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE));
mButtonWfcMode = findPreference(BUTTON_WFC_MODE);
mButtonWfcMode.setOnPreferenceChangeListener(this);
@@ -310,6 +310,7 @@
CarrierConfigManager configManager = (CarrierConfigManager)
getSystemService(Context.CARRIER_CONFIG_SERVICE);
boolean isWifiOnlySupported = true;
+ boolean isImsPreferredSupported = false;
if (configManager != null) {
PersistableBundle b = configManager.getConfigForSubId(mSubId);
@@ -323,23 +324,67 @@
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);
}
}
- if (!isWifiOnlySupported) {
- mButtonWfcMode.setEntries(R.array.wifi_calling_mode_choices_without_wifi_only);
- mButtonWfcMode.setEntryValues(R.array.wifi_calling_mode_values_without_wifi_only);
- mButtonWfcMode.setEntrySummaries(R.array.wifi_calling_mode_summaries_without_wifi_only);
+ Log.d(TAG, "isWifiOnlySupported = " + isWifiOnlySupported + " isImsPreferredSupported = "
+ + isImsPreferredSupported);
+ if (isWifiOnlySupported) {
+ if (isImsPreferredSupported) {
+ mButtonWfcMode.setEntries(
+ R.array.wifi_calling_mode_choices_with_ims_preferred);
+ mButtonWfcMode.setEntryValues(
+ R.array.wifi_calling_mode_values_with_ims_preferred);
+ mButtonWfcMode.setEntrySummaries(
+ R.array.wifi_calling_mode_summaries_with_ims_preferred);
- mButtonWfcRoamingMode.setEntries(
- R.array.wifi_calling_mode_choices_v2_without_wifi_only);
- mButtonWfcRoamingMode.setEntryValues(
- R.array.wifi_calling_mode_values_without_wifi_only);
- mButtonWfcRoamingMode.setEntrySummaries(
- R.array.wifi_calling_mode_summaries_without_wifi_only);
+ mButtonWfcRoamingMode.setEntries(
+ R.array.wifi_calling_mode_choices_v2_with_ims_preferred);
+ mButtonWfcRoamingMode.setEntryValues(
+ R.array.wifi_calling_mode_values_with_ims_preferred);
+ mButtonWfcRoamingMode.setEntrySummaries(
+ R.array.wifi_calling_mode_summaries_with_ims_preferred);
+ } else {
+ mButtonWfcMode.setEntries(R.array.wifi_calling_mode_choices);
+ mButtonWfcMode.setEntryValues(R.array.wifi_calling_mode_values);
+ mButtonWfcMode.setEntrySummaries(R.array.wifi_calling_mode_summaries);
+
+ mButtonWfcRoamingMode.setEntries(R.array.wifi_calling_mode_choices_v2);
+ mButtonWfcRoamingMode.setEntryValues(R.array.wifi_calling_mode_values);
+ mButtonWfcRoamingMode.setEntrySummaries(R.array.wifi_calling_mode_summaries);
+ }
+ } else {
+ if (isImsPreferredSupported) {
+ mButtonWfcMode.setEntries(
+ R.array.wifi_calling_mode_choices_without_wifi_only_with_ims_preferred);
+ mButtonWfcMode.setEntryValues(
+ R.array.wifi_calling_mode_values_without_wifi_only_with_ims_preferred);
+ mButtonWfcMode.setEntrySummaries(
+ R.array.wifi_calling_mode_summaries_without_wifi_only_with_ims_preferred);
+
+ mButtonWfcRoamingMode.setEntries(
+ R.array.wifi_calling_mode_choices_v2_without_wifi_only_with_ims_preferred);
+ mButtonWfcRoamingMode.setEntryValues(
+ R.array.wifi_calling_mode_values_without_wifi_only_with_ims_preferred);
+ mButtonWfcRoamingMode.setEntrySummaries(
+ R.array.wifi_calling_mode_summaries_without_wifi_only_with_ims_preferred);
+ } else {
+ mButtonWfcMode.setEntries(R.array.wifi_calling_mode_choices_without_wifi_only);
+ mButtonWfcMode.setEntryValues(R.array.wifi_calling_mode_values_without_wifi_only);
+ mButtonWfcMode.setEntrySummaries(
+ R.array.wifi_calling_mode_summaries_without_wifi_only);
+
+ mButtonWfcRoamingMode.setEntries(
+ R.array.wifi_calling_mode_choices_v2_without_wifi_only);
+ mButtonWfcRoamingMode.setEntryValues(
+ R.array.wifi_calling_mode_values_without_wifi_only);
+ mButtonWfcRoamingMode.setEntrySummaries(
+ R.array.wifi_calling_mode_summaries_without_wifi_only);
+ }
}
-
// NOTE: Buttons will be enabled/disabled in mPhoneStateListener
boolean wfcEnabled = mImsManager.isWfcEnabledByUser()
&& mImsManager.isNonTtyOrTtyOnVolteEnabled();
@@ -392,8 +437,7 @@
if (mValidListener) {
mValidListener = false;
- TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
- tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
mSwitchBar.removeOnSwitchChangeListener(this);
}
@@ -589,6 +633,9 @@
case ImsConfig.WfcModeFeatureValueConstants.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 a915766..ed8c429 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -42,6 +42,7 @@
import android.net.NetworkUtils;
import android.net.RouteInfo;
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;
@@ -157,6 +158,8 @@
private NetworkInfo mNetworkInfo;
private NetworkCapabilities mNetworkCapabilities;
private int mRssiSignalLevel = -1;
+ private int mWifiGeneration;
+ private boolean mIsReady;
private String[] mSignalStr;
private WifiConfiguration mWifiConfig;
private WifiInfo mWifiInfo;
@@ -408,6 +411,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));
}
@@ -561,6 +571,9 @@
private void refreshRssiViews() {
int signalLevel = mAccessPoint.getLevel();
+ int wifiGeneration = mAccessPoint.getWifiGeneration();
+ boolean isReady = (mAccessPoint.isVhtMax8SpatialStreamsSupported()
+ && mAccessPoint.isHe8ssCapableAp());
// Disappears signal view if not in range. e.g. for saved networks.
if (mIsOutOfRange) {
@@ -569,11 +582,15 @@
return;
}
- if (mRssiSignalLevel == signalLevel) {
+ if (mRssiSignalLevel == signalLevel
+ && mWifiGeneration == wifiGeneration
+ && mIsReady == isReady) {
return;
}
mRssiSignalLevel = signalLevel;
- Drawable wifiIcon = mIconInjector.getIcon(mRssiSignalLevel);
+ mWifiGeneration = wifiGeneration;
+ mIsReady = isReady;
+ Drawable wifiIcon = mIconInjector.getIcon(mRssiSignalLevel, mWifiGeneration, mIsReady);
if (mEntityHeaderController != null) {
mEntityHeaderController
@@ -629,6 +646,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
@@ -956,8 +976,8 @@
mContext = context;
}
- public Drawable getIcon(int level) {
- return mContext.getDrawable(Utils.getWifiIconResource(level)).mutate();
+ public Drawable getIcon(int level, int generation, boolean isReady) {
+ return mContext.getDrawable(Utils.getWifiIconResource(level, generation, isReady)).mutate();
}
}
diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
index c37bdc0a..681c1ac 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
@@ -227,6 +227,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/dpp/WifiDppUtils.java b/src/com/android/settings/wifi/dpp/WifiDppUtils.java
index fc1bc25..3af7b23 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppUtils.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppUtils.java
@@ -389,6 +389,8 @@
// it supports PSK and WEP and non security
// KeyMgmt.NONE is for WEP or non security
return wifiConfiguration.allowedKeyManagement.get(KeyMgmt.WPA2_PSK) ||
+ wifiConfiguration.allowedKeyManagement.get(KeyMgmt.SAE) ||
+ wifiConfiguration.allowedKeyManagement.get(KeyMgmt.OWE) ||
wifiConfiguration.allowedKeyManagement.get(KeyMgmt.NONE);
}
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
index f1ac6cd..e5f624d 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
@@ -66,7 +66,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);
private static final int MENU_ID_SEARCH = Menu.FIRST;
private 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 e5c8de5..f80a35d 100644
--- a/src/com/android/settings/wifi/slice/WifiSlice.java
+++ b/src/com/android/settings/wifi/slice/WifiSlice.java
@@ -199,7 +199,11 @@
private IconCompat getAccessPointLevelIcon(AccessPoint accessPoint) {
final Drawable d = mContext.getDrawable(
- com.android.settingslib.Utils.getWifiIconResource(accessPoint.getLevel()));
+ com.android.settingslib.Utils.getWifiIconResource(
+ accessPoint.getLevel(),
+ accessPoint.getWifiGeneration(),
+ accessPoint.isHe8ssCapableAp()
+ && accessPoint.isVhtMax8SpatialStreamsSupported()));
final @ColorInt int color;
if (accessPoint.isActive()) {
diff --git a/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java
index 3a85f7b..6eba796 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherApBandPreferenceController.java
@@ -35,23 +35,31 @@
private String[] mBandEntries;
private String[] mBandSummaries;
private int mBandIndex;
+ private int mSecurityType;
private boolean isDualMode;
+ private boolean isVendorDualApSupported;
public WifiTetherApBandPreferenceController(Context context,
OnTetherConfigUpdateListener listener) {
super(context, listener);
+ final WifiConfiguration config = mWifiManager.getWifiApConfiguration();
isDualMode = mWifiManager.isDualModeSupported();
- updatePreferenceEntries();
+
+ isVendorDualApSupported = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_wifi_dual_sap_mode_enabled);
+
+ updatePreferenceEntries(config);
}
@Override
public void updateDisplay() {
final WifiConfiguration config = mWifiManager.getWifiApConfiguration();
+ int tempBandIndex = mBandIndex;
if (config == null) {
mBandIndex = 0;
Log.d(TAG, "Updating band index to 0 because no config");
} else if (is5GhzBandSupported()) {
- mBandIndex = validateSelection(config.apBand);
+ mBandIndex = validateSelection(config);
Log.d(TAG, "Updating band index to " + mBandIndex);
} else {
config.apBand = 0;
@@ -64,10 +72,15 @@
preference.setEntries(mBandSummaries);
preference.setEntryValues(mBandEntries);
+ if (mBandIndex >= mBandEntries.length) {
+ mBandIndex = tempBandIndex < mBandEntries.length ? tempBandIndex : 0;
+ }
+
if (!is5GhzBandSupported()) {
preference.setEnabled(false);
preference.setSummary(R.string.wifi_ap_choose_2G);
} else {
+ preference.setEnabled(true);
preference.setValue(Integer.toString(config.apBand));
preference.setSummary(getConfigSummary());
}
@@ -94,6 +107,17 @@
return true;
}
+ private int validateSelection(WifiConfiguration config) {
+ if (config.apBand == WifiConfiguration.AP_BAND_DUAL
+ && config.getAuthType() == WifiConfiguration.KeyMgmt.OWE) {
+ config.apBand = 0;
+ mWifiManager.setWifiApConfiguration(config);
+ Log.d(TAG, "Dual band not supported for OWE security, updating band index to " + mBandIndex);
+ }
+
+ return validateSelection(config.apBand);
+ }
+
private int validateSelection(int band) {
// Reset the band to 2.4 GHz if we get a weird config back to avoid a crash.
final boolean isDualMode = mWifiManager.isDualModeSupported();
@@ -113,6 +137,12 @@
return band;
}
+ public void updatePreferenceEntries(WifiConfiguration config) {
+ mSecurityType = (config == null ? WifiConfiguration.KeyMgmt.NONE : config.getAuthType());
+ Log.d(TAG, "updating band preferences.");
+ updatePreferenceEntries();
+ }
+
@VisibleForTesting
void updatePreferenceEntries() {
Resources res = mContext.getResources();
@@ -122,6 +152,10 @@
if (isDualMode) {
entriesRes = R.array.wifi_ap_band_dual_mode;
summariesRes = R.array.wifi_ap_band_dual_mode_summary;
+ } else if (isVendorDualApSupported && mSecurityType != WifiConfiguration.KeyMgmt.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;
}
mBandEntries = res.getStringArray(entriesRes);
mBandSummaries = res.getStringArray(summariesRes);
@@ -138,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]) == WifiConfiguration.AP_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 8d9e858..6655e6a 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherPasswordPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherPasswordPreferenceController.java
@@ -49,8 +49,9 @@
@Override
public void updateDisplay() {
final WifiConfiguration config = mWifiManager.getWifiApConfiguration();
- if (config == null || (config.getAuthType() == WifiConfiguration.KeyMgmt.WPA2_PSK
- && TextUtils.isEmpty(config.preSharedKey))) {
+ if (config == null || (TextUtils.isEmpty(config.preSharedKey) &&
+ (config.getAuthType() == WifiConfiguration.KeyMgmt.WPA2_PSK
+ || config.getAuthType() == WifiConfiguration.KeyMgmt.SAE))) {
mPassword = generateRandomPassword();
} else {
mPassword = config.preSharedKey;
@@ -79,7 +80,8 @@
*/
public String getPasswordValidated(int securityType) {
// don't actually overwrite unless we get a new config in case it was accidentally toggled.
- if (securityType == WifiConfiguration.KeyMgmt.NONE) {
+ if (securityType == WifiConfiguration.KeyMgmt.NONE
+ || securityType == WifiConfiguration.KeyMgmt.OWE) {
return "";
} else if (!isTextValid(mPassword)) {
mPassword = generateRandomPassword();
@@ -89,7 +91,8 @@
}
public void updateVisibility(int securityType) {
- mPreference.setVisible(securityType != WifiConfiguration.KeyMgmt.NONE);
+ mPreference.setVisible(securityType != WifiConfiguration.KeyMgmt.NONE
+ && securityType != WifiConfiguration.KeyMgmt.OWE);
}
@Override
diff --git a/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java
index 8f6d489..10322db 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 onNumClientsChanged(int numClients) {
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, numClients,
numClients));
}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java
index f97a209..c21554c 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSecurityPreferenceController.java
@@ -7,18 +7,51 @@
import androidx.preference.Preference;
import com.android.settings.R;
+import java.util.ArrayList;
public class WifiTetherSecurityPreferenceController extends WifiTetherBasePreferenceController {
private static final String PREF_KEY = "wifi_tether_security";
private final String[] mSecurityEntries;
+ private final String[] mSecurityValues;
private int mSecurityValue;
+ private boolean mWpa3SoftApSupported;
+ private boolean mDualSoftApSupported;
+ private boolean mWpa3SoftApOweAkmSupported;
public WifiTetherSecurityPreferenceController(Context context,
OnTetherConfigUpdateListener listener) {
super(context, listener);
- mSecurityEntries = mContext.getResources().getStringArray(R.array.wifi_tether_security);
+ ArrayList<String> securityEntries = new ArrayList<String>();
+ ArrayList<String> securityValues = new ArrayList<String>();
+
+ mDualSoftApSupported = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_wifi_dual_sap_mode_enabled);
+ mWpa3SoftApSupported = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_wifi_wap3_sap_mode_enabled);
+ mWpa3SoftApOweAkmSupported = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_wifi_wap3_sap_owe_akm_enabled);
+
+ // Add SAE security type
+ if (mWpa3SoftApSupported) {
+ securityValues.add(String.valueOf(WifiConfiguration.KeyMgmt.SAE));
+ securityEntries.add(context.getString(R.string.wifi_security_sae));
+ }
+ // Add WPA2-PSK security type
+ securityValues.add(String.valueOf(WifiConfiguration.KeyMgmt.WPA2_PSK));
+ securityEntries.add(context.getString(R.string.wifi_security_wpa2));
+ // Add OWE security type
+ if (mWpa3SoftApOweAkmSupported && mDualSoftApSupported) {
+ securityValues.add(String.valueOf(WifiConfiguration.KeyMgmt.OWE));
+ securityEntries.add(context.getString(R.string.wifi_security_owe));
+ }
+ // Add open security type
+ securityValues.add(String.valueOf(WifiConfiguration.KeyMgmt.NONE));
+ securityEntries.add(context.getString(R.string.wifi_security_none));
+
+ mSecurityEntries = securityEntries.toArray(new String[securityEntries.size()]);
+ mSecurityValues = securityValues.toArray(new String[securityValues.size()]);
}
@Override
@@ -29,14 +62,22 @@
@Override
public void updateDisplay() {
final WifiConfiguration config = mWifiManager.getWifiApConfiguration();
- if (config != null && config.getAuthType() == WifiConfiguration.KeyMgmt.NONE) {
+ if (config == null) {
+ mSecurityValue = WifiConfiguration.KeyMgmt.WPA2_PSK;
+ } else if (config.getAuthType() == WifiConfiguration.KeyMgmt.NONE) {
mSecurityValue = WifiConfiguration.KeyMgmt.NONE;
-
+ } else if (mWpa3SoftApOweAkmSupported && mDualSoftApSupported
+ && config.getAuthType() == WifiConfiguration.KeyMgmt.OWE) {
+ mSecurityValue = WifiConfiguration.KeyMgmt.OWE;
+ } else if (mWpa3SoftApSupported && config.getAuthType() == WifiConfiguration.KeyMgmt.SAE) {
+ mSecurityValue = WifiConfiguration.KeyMgmt.SAE;
} else {
mSecurityValue = WifiConfiguration.KeyMgmt.WPA2_PSK;
}
final ListPreference preference = (ListPreference) mPreference;
+ preference.setEntries(mSecurityEntries);
+ preference.setEntryValues(mSecurityValues);
preference.setSummary(getSummaryForSecurityType(mSecurityValue));
preference.setValue(String.valueOf(mSecurityValue));
}
@@ -54,10 +95,13 @@
}
private String getSummaryForSecurityType(int securityType) {
- if (securityType == WifiConfiguration.KeyMgmt.NONE) {
- return mSecurityEntries[1];
- }
- // WPA2 PSK
- return mSecurityEntries[0];
+ final ListPreference preference = (ListPreference) mPreference;
+ int securityEntryIndex = preference.findIndexOfValue(String.valueOf(securityType));
+
+ return mSecurityEntries[securityEntryIndex];
+ }
+
+ public boolean isWpa3OweSupported() {
+ return mWpa3SoftApOweAkmSupported;
}
}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index aecc053..760bf46 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.provider.SearchIndexableResource;
import android.util.Log;
+import android.widget.Toast;
import androidx.annotation.VisibleForTesting;
@@ -79,6 +81,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() {
@@ -187,8 +190,19 @@
@Override
public void onTetherConfigUpdated() {
final WifiConfiguration config = buildNewConfig();
+ boolean bandEntriesChanged = false;
+
mPasswordPreferenceController.updateVisibility(config.getAuthType());
+ if (mApBandPreferenceController.isVendorDualApSupported()
+ && mSecurityPreferenceController.isWpa3OweSupported()) {
+ if ((config.getAuthType() == WifiConfiguration.KeyMgmt.OWE)
+ == (mApBandPreferenceController.isBandEntriesHasDualband())) {
+ mApBandPreferenceController.updatePreferenceEntries(config);
+ bandEntriesChanged = true;
+ }
+ }
+
/**
* if soft AP is stopped, bring up
* else restart with new config
@@ -201,6 +215,9 @@
mSwitchBarController.stopTether();
}
mWifiManager.setWifiApConfiguration(config);
+
+ if (bandEntriesChanged)
+ mApBandPreferenceController.updateDisplay();
}
private WifiConfiguration buildNewConfig() {
@@ -212,6 +229,12 @@
config.preSharedKey = mPasswordPreferenceController.getPasswordValidated(securityType);
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.apBand = mApBandPreferenceController.getBandIndex();
+
+ if (config.getAuthType() == WifiConfiguration.KeyMgmt.OWE
+ && config.apBand == WifiConfiguration.AP_BAND_DUAL) {
+ config.apBand = WifiConfiguration.AP_BAND_2GHZ;
+ }
+
return config;
}
@@ -281,6 +304,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();
+ }
}
}
}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSoftApManager.java b/src/com/android/settings/wifi/tether/WifiTetherSoftApManager.java
index 77a44b0..b7d7168 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSoftApManager.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSoftApManager.java
@@ -19,6 +19,16 @@
@Override
public void onNumClientsChanged(int numClients) {
+ // Do nothing - we don't care about changing anything here.
+ }
+
+ @Override
+ public void onStaConnected(String Macaddr, int numClients) {
+ mWifiTetherSoftApCallback.onNumClientsChanged(numClients);
+ }
+
+ @Override
+ public void onStaDisconnected(String Macaddr, int numClients) {
mWifiTetherSoftApCallback.onNumClientsChanged(numClients);
}
};