Merge "Screen Add FDN: Disable Save button if fields Name or Number are empty"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 69620cd..4baec2d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -79,6 +79,10 @@
<protected-broadcast android:name= "com.android.phone.vvm.ACTION_VISUAL_VOICEMAIL_SERVICE_EVENT" />
<protected-broadcast android:name= "com.android.internal.telephony.CARRIER_VVM_PACKAGE_INSTALLED" />
<protected-broadcast android:name= "com.android.cellbroadcastreceiver.GET_LATEST_CB_AREA_INFO" />
+ <protected-broadcast android:name= "android.intent.action.CURRENT_CARRIER_IDENTITY_CHANGED" />
+ <protected-broadcast android:name= "android.telephony.action.SIM_CARD_STATE_CHANGED" />
+ <protected-broadcast android:name= "android.telephony.action.SIM_APPLICATION_STATE_CHANGED" />
+ <protected-broadcast android:name= "android.telephony.action.SIM_SLOT_STATUS_CHANGED" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.CALL_PHONE" />
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 7ddd38d..e5c422c 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Die nuwe PIN bevat ongeldige karakters."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Kan nie PIN verander nie"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Ongesteunde tipe boodskap, bel <xliff:g id="NUMBER">%s</xliff:g> om te luister."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobiele netwerkinstellings"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobiele netwerk"</string>
<string name="label_available" msgid="1181658289009300430">"Beskikbare netwerke"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Soek tans…"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 384e1e4..9020be2 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"አዲሱ ፒን ልክ ያልሆኑ ቁምፊዎችን ይዟል።"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"ፒን መቀየር አልተቻለም።"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"የማይደገፍ የመልዕክት አይነት፤ ለማዳመጥ ወደ <xliff:g id="NUMBER">%s</xliff:g> ይደውሉ።"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"የተንቀሳቃሽ ስልክ አውታረ መረብ ቅንብሮች"</string>
<string name="network_settings_title" msgid="514120489499925574">"የተንቀሳቃሽ ስልክ አውታረ መረብ"</string>
<string name="label_available" msgid="1181658289009300430">"የሚገኙ አውታረመረቦች"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"በመፈለግ ላይ…"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 3191ecf..f850115 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"رقم التعريف الشخصي الجديد يحتوي على أحرف غير صالحة."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"غير قادر على تغيير رقم التعريف الشخصي"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"نوع الرسالة غير معتمد، اتصل على <xliff:g id="NUMBER">%s</xliff:g> لسماعها."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"إعدادات شبكة الجوال"</string>
<string name="network_settings_title" msgid="514120489499925574">"شبكة الجوّال"</string>
<string name="label_available" msgid="1181658289009300430">"الشبكات المتاحة"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"جارِ البحث…"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 14b0b8a..5984aea 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Yeni PIN kod yanlış simvollardan ibarətdir."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN kodu dəyişmək mümkün olmadı"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Dəstəklənməyən mesaj növü, qulaq asmaq üçün <xliff:g id="NUMBER">%s</xliff:g> nömrəsinə zəng edin."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobil şəbəkə parametrləri"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobil şəbəkə"</string>
<string name="label_available" msgid="1181658289009300430">"Əlçatımlı şəbəkələr"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Axtarılır..."</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 9c3c37a..c2a4088 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Novi PIN sadrži nevažeće znakove."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Promena PIN-a nije uspela"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nepodržani tip poruke. Pozovite <xliff:g id="NUMBER">%s</xliff:g> da biste je preslušali."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Podešavanja za mob. mrežu"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobilna mreža"</string>
<string name="label_available" msgid="1181658289009300430">"Dostupne mreže"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Pretražuje se…"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 3f8bf23..b1fddb2 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Новы PIN-код змяшчае несапраўдныя сімвалы."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Немагчыма змяніць PIN-код"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Гэты тып паведамлення не падтрымліваецца; каб праслухаць, патэлефануйце на <xliff:g id="NUMBER">%s</xliff:g>."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Налады мабільнай сеткі"</string>
<string name="network_settings_title" msgid="514120489499925574">"Мабільная сетка"</string>
<string name="label_available" msgid="1181658289009300430">"Даступныя сеткі"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Пошук..."</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index d60b205..9ec3901 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Новият ПИН съдържа невалидни знаци."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Промяната на ПИН не е възможна"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Типът на съобщението не се поддържа. Обадете се на <xliff:g id="NUMBER">%s</xliff:g>, за да го чуете."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Настройки на мобилн. мрежа"</string>
<string name="network_settings_title" msgid="514120489499925574">"Мобилна мрежа"</string>
<string name="label_available" msgid="1181658289009300430">"Налични мрежи"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Търси се…"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 67b89c5..2823559 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"নতুন পিনে অবৈধ অক্ষর রয়েছে৷"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"পিন পরিবর্তন করা গেল না"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"এই ধরণের বার্তা সমর্থিত নয় , শুোনার জন্য <xliff:g id="NUMBER">%s</xliff:g> এ কল করুন৷"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"মোবাইল নেটওয়ার্ক সেটিংস"</string>
<string name="network_settings_title" msgid="514120489499925574">"মোবাইল নেটওয়ার্ক"</string>
<string name="label_available" msgid="1181658289009300430">"উপলব্ধ নেটওয়ার্কগুলি"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"অনুসন্ধান করছে..."</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 1245575..000469d 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Novi PIN sadrži nevažeće znakove."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Nije moguće promijeniti PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nepodržana vrsta poruke. Pozovite <xliff:g id="NUMBER">%s</xliff:g> da je preslušate."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Postavke mobilne mreže"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobilna mreža"</string>
<string name="label_available" msgid="1181658289009300430">"Dostupne mreže"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Pretraživanje…"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 3e7c48c..fa56382 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"El PIN nou conté caràcters que no són vàlids."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"No es pot canviar el PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Aquest tipus de missatge no s\'admet. Truca al <xliff:g id="NUMBER">%s</xliff:g> per escoltar-lo."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Configuració de la xarxa mòbil"</string>
<string name="network_settings_title" msgid="514120489499925574">"Xarxa mòbil"</string>
<string name="label_available" msgid="1181658289009300430">"Xarxes disponibles"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"S\'està cercant…"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 79f1364..8ce0361 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Nový kód PIN obsahuje neplatné znaky."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Kód PIN se nepodařilo změnit"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nepodporovaný typ zprávy, pokud si ji chcete poslechnout zavolejte na číslo <xliff:g id="NUMBER">%s</xliff:g>."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Nastavení mobilní sítě"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobilní síť"</string>
<string name="label_available" msgid="1181658289009300430">"Dostupné sítě"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Vyhledávání..."</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 8d737bb..cff52ec 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Den nye pinkode har ugyldige tegn."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Pinkoden kan ikke ændres"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Ikke-understøttet beskedtype. Ring til <xliff:g id="NUMBER">%s</xliff:g> for at aflytte."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Indstillinger for mobilnetværk"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobilnetværk"</string>
<string name="label_available" msgid="1181658289009300430">"Tilgængelige netværk"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Søger..."</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 02bbfca..fc0d730 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Die neue PIN enthält ungültige Zeichen."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN kann nicht geändert werden"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nicht unterstützter Nachrichtentyp, zum Abhören <xliff:g id="NUMBER">%s</xliff:g> anrufen."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Einstellungen für Mobilfunknetze"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobilfunknetz"</string>
<string name="label_available" msgid="1181658289009300430">"Verfügbare Netzwerke"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Suche läuft..."</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 1a3476b..6a819dc 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Το νέο PIN περιέχει μη έγκυρους χαρακτήρες."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Δεν είναι δυνατή η αλλαγή του PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Μη υποστηριζόμενος τύπος μηνύματος: καλέστε στο <xliff:g id="NUMBER">%s</xliff:g> για να το ακούσετε."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Ρυθμίσεις δικτύου κινητής τηλεφωνίας"</string>
<string name="network_settings_title" msgid="514120489499925574">"Δίκτυο κινητής τηλεφωνίας"</string>
<string name="label_available" msgid="1181658289009300430">"Διαθέσιμα δίκτυα"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Αναζήτηση..."</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 388a6a1..fb47ff8 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"The new PIN contains invalid characters."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Unable to change PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Unsupported message type. Call <xliff:g id="NUMBER">%s</xliff:g> to listen."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobile network settings"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobile network"</string>
<string name="label_available" msgid="1181658289009300430">"Available networks"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Searching…"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 388a6a1..fb47ff8 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"The new PIN contains invalid characters."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Unable to change PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Unsupported message type. Call <xliff:g id="NUMBER">%s</xliff:g> to listen."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobile network settings"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobile network"</string>
<string name="label_available" msgid="1181658289009300430">"Available networks"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Searching…"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 388a6a1..fb47ff8 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"The new PIN contains invalid characters."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Unable to change PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Unsupported message type. Call <xliff:g id="NUMBER">%s</xliff:g> to listen."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobile network settings"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobile network"</string>
<string name="label_available" msgid="1181658289009300430">"Available networks"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Searching…"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index bf2608b..d493bce 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"El nuevo PIN contiene caracteres no válidos."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"No se puede cambiar el PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tipo de mensaje no compatible. Llama al <xliff:g id="NUMBER">%s</xliff:g> para escucharlo."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Configuración de red móvil"</string>
<string name="network_settings_title" msgid="514120489499925574">"Red móvil"</string>
<string name="label_available" msgid="1181658289009300430">"Redes disponibles"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Buscando..."</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 95d345b..6f8359c 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"El PIN nuevo contiene caracteres no válidos."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"No se puede cambiar el PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Este tipo de mensaje no se admite. Llama al <xliff:g id="NUMBER">%s</xliff:g> para escucharlo."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Ajustes de la red móvil"</string>
<string name="network_settings_title" msgid="514120489499925574">"Red móvil"</string>
<string name="label_available" msgid="1181658289009300430">"Redes disponibles"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Buscando..."</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 13a3c26..73e1fa5 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Uus PIN-kood sisaldab sobimatuid tähemärke."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN-koodi ei õnnestu muuta"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Toetamata sõnumi tüüp, kuulamiseks helistage numbrile <xliff:g id="NUMBER">%s</xliff:g>."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobiilsidevõrgu seaded"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobiilsidevõrk"</string>
<string name="label_available" msgid="1181658289009300430">"Saadaolevad võrgud"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Otsimine ..."</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index e01d16b..9dce3d4 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Balio ez duten karaktereak ditu PIN kode berriak."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Ezin da aldatu PIN kodea"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Ez dira onartzen mota honetako mezuak. Entzuteko, deitu <xliff:g id="NUMBER">%s</xliff:g> zenbakira."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Sare mugikorren ezarpenak"</string>
<string name="network_settings_title" msgid="514120489499925574">"Sare mugikorra"</string>
<string name="label_available" msgid="1181658289009300430">"Sare erabilgarriak"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Bilatzen…"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 27ad27f..45502d2 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"پین جدید نویسههای نامعتبری دارد."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"پین تغییر نکرد"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"نوع پیام پشتیبانی نمیشود، برای گوش کردن با <xliff:g id="NUMBER">%s</xliff:g> تماس بگیرید."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"تنظیمات شبکهٔ تلفن همراه"</string>
<string name="network_settings_title" msgid="514120489499925574">"شبکه تلفن همراه"</string>
<string name="label_available" msgid="1181658289009300430">"شبکههای موجود"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"در حال جستجو…"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 6909576..012e352 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Uusi PIN-koodi sisältää virheellisiä merkkejä."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN-koodin vaihtaminen epäonnistui."</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Viestin tyyppiä ei tueta. Kuuntele soittamalla numeroon <xliff:g id="NUMBER">%s</xliff:g>."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobiiliverkkoasetukset"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobiiliverkko"</string>
<string name="label_available" msgid="1181658289009300430">"Käytettävissä olevat verkot"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Haetaan…"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 0e3c052..ba372d6 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Le nouveau NIP contient des caractères incorrects."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Impossible de modifier le NIP"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Type de message non pris en charge. Composez le <xliff:g id="NUMBER">%s</xliff:g> pour l\'écouter."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Paramètres du réseau mobile"</string>
<string name="network_settings_title" msgid="514120489499925574">"Réseau cellulaire"</string>
<string name="label_available" msgid="1181658289009300430">"Réseaux disponibles"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Recherche en cours…"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index a1b7f52..a95a939 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Le nouveau code contient des caractères incorrects."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Impossible de modifier le code"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Type de message incompatible, composez le <xliff:g id="NUMBER">%s</xliff:g> pour l\'écouter."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Paramètres du réseau mobile"</string>
<string name="network_settings_title" msgid="514120489499925574">"Réseau mobile"</string>
<string name="label_available" msgid="1181658289009300430">"Réseaux disponibles"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Recherche..."</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 04be743..1e91d59 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"O novo PIN contén caracteres non válidos."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Non se puido cambiar o PIN."</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tipo de mensaxe non compatible. Chama ao <xliff:g id="NUMBER">%s</xliff:g> para escoitala."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Configuración de rede móbil"</string>
<string name="network_settings_title" msgid="514120489499925574">"Rede de telefonía móbil"</string>
<string name="label_available" msgid="1181658289009300430">"Redes dispoñibles"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Buscando..."</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 1f06345..945d93b 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"નવો PIN અમાન્ય અક્ષરો ધરાવે છે."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN બદલવામાં અસમર્થ"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"અસમર્થિત સંદેશ પ્રકાર, સાંભળવા માટે <xliff:g id="NUMBER">%s</xliff:g> પર કૉલ કરો."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"મોબાઇલ નેટવર્ક સેટિંગ્સ"</string>
<string name="network_settings_title" msgid="514120489499925574">"મોબાઇલ નેટવર્ક"</string>
<string name="label_available" msgid="1181658289009300430">"ઉપલબ્ધ નેટવર્ક્સ"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"શોધી રહ્યું છે..."</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 2d7dd04..291616a 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"नए पिन में अमान्य वर्ण शामिल हैं."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"पिन बदलने में असमर्थ"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"असमर्थित संदेश प्रकार, सुनने के लिए <xliff:g id="NUMBER">%s</xliff:g> पर कॉल करें."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"मोबाइल नेटवर्क सेटिंग"</string>
<string name="network_settings_title" msgid="514120489499925574">"मोबाइल नेटवर्क"</string>
<string name="label_available" msgid="1181658289009300430">"उपलब्ध नेटवर्क"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"खोज रहा है..."</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 495a8f7..2849d4a 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Novi PIN sadrži nevažeće znakove."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN se ne može promijeniti"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Vrsta poruke nije podržana, nazovite <xliff:g id="NUMBER">%s</xliff:g> da biste je poslušali."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Postavke mobilne mreže"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobilna mreža"</string>
<string name="label_available" msgid="1181658289009300430">"Dostupne mreže"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Pretraživanje…"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index ceeb84e..ab240de 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Az új PIN-kód érvénytelen karaktereket tartalmaz."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Nem sikerült módosítani a PIN-kódot"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nem támogatott üzenettípus. Hívja a következő telefonszámot az üzenet meghallgatásához: <xliff:g id="NUMBER">%s</xliff:g>."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobilhálózati beállítások"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobilhálózat"</string>
<string name="label_available" msgid="1181658289009300430">"Elérhető hálózatok"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Keresés…"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 40de4e0..62b04d0 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Նոր PIN-ը պարունակում է անվավեր գրանշաններ:"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Չհաջողվեց փոխել PIN-ը"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Հաղորդագրության չաջակցվող տեսակ, զանգեք <xliff:g id="NUMBER">%s</xliff:g> համարին՝ լսելու համար:"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Բջջ. ցանցի կարգավորումներ"</string>
<string name="network_settings_title" msgid="514120489499925574">"Բջջային ցանց"</string>
<string name="label_available" msgid="1181658289009300430">"Հասանելի ցանցեր"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Որոնում..."</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 1684ece..cdd93b7 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"PIN baru berisi karakter yang tidak valid."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Tidak dapat mengubah PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tipe pesan tidak didukung, telepon <xliff:g id="NUMBER">%s</xliff:g> untuk mendengarkan."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Setelan jaringan seluler"</string>
<string name="network_settings_title" msgid="514120489499925574">"Jaringan seluler"</string>
<string name="label_available" msgid="1181658289009300430">"Jaringan yang tersedia"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Menelusuri…"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index fdbded9..1f87beb 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Nýja PIN-númerið inniheldur ógilda stafi."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Ekki var hægt að breyta PIN-númerinu"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Óstudd skilaboðagerð, hringdu í <xliff:g id="NUMBER">%s</xliff:g> til að hlusta."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Stillingar farsímakerfis"</string>
<string name="network_settings_title" msgid="514120489499925574">"Farsímakerfi"</string>
<string name="label_available" msgid="1181658289009300430">"Símkerfi í boði"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Leitar…"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 751850d..b96864a 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Il nuovo PIN contiene caratteri non validi."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Impossibile cambiare il PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tipo di messaggio non supportato, chiama <xliff:g id="NUMBER">%s</xliff:g> per ascoltare."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Impostazioni reti mobili"</string>
<string name="network_settings_title" msgid="514120489499925574">"Rete mobile"</string>
<string name="label_available" msgid="1181658289009300430">"Reti disponibili"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Ricerca..."</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index e5770e9..9e22e08 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"קוד הגישה החדש מכיל תווים לא חוקיים."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"לא ניתן לשנות את קוד הגישה"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"סוג ההודעה לא נתמך. התקשר למספר <xliff:g id="NUMBER">%s</xliff:g> כדי להאזין לה."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"הגדרות רשת סלולרית"</string>
<string name="network_settings_title" msgid="514120489499925574">"רשת סלולרית"</string>
<string name="label_available" msgid="1181658289009300430">"רשתות זמינות"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"מחפש..."</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index b70057e..1aeb37d 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"新しい PIN に無効な文字が含まれています。"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN を変更できませんでした"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"サポートされていないメッセージ タイプです。<xliff:g id="NUMBER">%s</xliff:g> 宛に電話をかけてメッセージをお聞きください。"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"モバイルネットワーク設定"</string>
<string name="network_settings_title" msgid="514120489499925574">"モバイル ネットワーク"</string>
<string name="label_available" msgid="1181658289009300430">"利用可能なネットワーク"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"検索中..."</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index cb23c48..0798e33 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"ახალი PIN-კოდი არასწორ სიმბოლოებს შეიცავს."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN-კოდის შეცვლა შეუძლებელია"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"შეტყობინების ტიპი მხარდაუჭერელია. მოსასმენად დარეკეთ <xliff:g id="NUMBER">%s</xliff:g>-ზე."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"მობილური ქსელის პარამეტრები"</string>
<string name="network_settings_title" msgid="514120489499925574">"მობილური ქსელი"</string>
<string name="label_available" msgid="1181658289009300430">"ხელმისაწვდომი ქსელები"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"ძიება..."</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 4da2f38..8944ebb 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Жаңа PIN кодта жарамсыз таңбалар бар."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN кодты өзгерту мүмкін емес"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Қолдау көрсетілмейтін хабар түрі, тыңдау үшін <xliff:g id="NUMBER">%s</xliff:g> нөміріне қоңырау шалыңыз."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Ұялы желі параметрлері"</string>
<string name="network_settings_title" msgid="514120489499925574">"Мобильдік желі"</string>
<string name="label_available" msgid="1181658289009300430">"Қол жетімді желілер"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Іздеуде…"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index aecf3b0..c61d7e9 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"លេខកូដ PIN ថ្មីមានតួអក្សរមិនត្រឹមត្រូវ។"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"មិនអាចប្ដូរលេខកូដ PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"មិនស្គាល់ប្រភេទសារ សូមហៅទូរស័ព្ទទៅ <xliff:g id="NUMBER">%s</xliff:g> ដើម្បីស្ដាប់។"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"ការកំណត់បណ្ដាញឧបករណ៍ចល័ត"</string>
<string name="network_settings_title" msgid="514120489499925574">"បណ្ដាញទូរសព្ទចល័ត"</string>
<string name="label_available" msgid="1181658289009300430">"បណ្ដាញដែលមាន"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"កំពុងស្វែងរក..."</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 1212fc2..a829e8c 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"ಹೊಸ ಪಿನ್ ಅಮಾನ್ಯವಾದ ಅಕ್ಷರಗಳನ್ನು ಒಳಗೊಂಡಿದೆ."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"ಪಿನ್ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"ಬೆಂಬಲಿತವಲ್ಲದ ಸಂದೇಶ ಮಾದರಿ, ಆಲಿಸಲು <xliff:g id="NUMBER">%s</xliff:g> ಗೆ ಕರೆ ಮಾಡಿ."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="network_settings_title" msgid="514120489499925574">"ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್"</string>
<string name="label_available" msgid="1181658289009300430">"ಲಭ್ಯವಿರುವ ನೆಟ್ವರ್ಕ್ಗಳು"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 6de4c77..60577d7 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"새 PIN에 잘못된 문자가 있습니다."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN을 변경할 수 없습니다."</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"지원되지 않는 메시지 유형입니다. 들으려면 <xliff:g id="NUMBER">%s</xliff:g>번으로 전화하세요."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"모바일 네트워크 설정"</string>
<string name="network_settings_title" msgid="514120489499925574">"모바일 네트워크"</string>
<string name="label_available" msgid="1181658289009300430">"사용 가능한 네트워크"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"검색 중..."</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 78a1300..db6c96c 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -159,7 +159,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Жаңы PIN коддо жараксыз белгилер бар."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN код өзгөртүлгөн жок"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Колдоого алынбаган билдирүү, угуу үчүн <xliff:g id="NUMBER">%s</xliff:g> чалыңыз."</string>
- <!-- no translation found for mobile_networks (5540397602919106177) -->
<skip />
<string name="network_settings_title" msgid="514120489499925574">"Мобилдик тармак"</string>
<string name="label_available" msgid="1181658289009300430">"Жеткиликтүү тармактар"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index fdce05f..1824c4c 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"ລະຫັດ PIN ໃໝ່ມີຕົວອັກສອນທີ່ບໍ່ຖືກຕ້ອງ."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"ບໍ່ສາມາດປ່ຽນລະຫັດ PIN ໄດ້"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"ປະເພດຂໍ້ຄວາມທີ່ບໍ່ຮອງຮັບ, ໂທ <xliff:g id="NUMBER">%s</xliff:g> ເພື່ອຟັງ."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"ການຕັ້ງຄ່າເຄືອຂ່າຍມືຖື"</string>
<string name="network_settings_title" msgid="514120489499925574">"ເຄືອຂ່າຍມືຖື"</string>
<string name="label_available" msgid="1181658289009300430">"ເຄືອຂ່າຍທີ່ມີ"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"ກຳລັງຊອກຫາ..."</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 948e0d5..633d54a 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Naujame PIN kode yra netinkamų simbolių."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Nepavyko pakeisti PIN kodo"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nepalaikomas pranešimo tipas, paskambinkite numeriu <xliff:g id="NUMBER">%s</xliff:g> ir išklausykite."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobiliojo ryšio tinklo tipas"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobiliojo ryšio tinklas"</string>
<string name="label_available" msgid="1181658289009300430">"Galimi tinklai"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Ieškoma…"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index f9cd07f..4c700af 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Jaunajā PIN ir ietvertas nederīgas rakstzīmes."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Neizdevās mainīt PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Neatbalstīts ziņojuma veids. Lai noklausītos, zvaniet uz numuru <xliff:g id="NUMBER">%s</xliff:g>."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobilā tīkla iestatījumi"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobilais tīkls"</string>
<string name="label_available" msgid="1181658289009300430">"Pieejamie tīkli"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Notiek meklēšana…"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 388db23..d6d4cad 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Новиот PIN содржи погрешни знаци."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN-кодот не може да се промени"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Неподдржан тип порака. Повикајте <xliff:g id="NUMBER">%s</xliff:g> за да слушате."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Поставки на мобилна мрежа"</string>
<string name="network_settings_title" msgid="514120489499925574">"Мобилна мрежа"</string>
<string name="label_available" msgid="1181658289009300430">"Достапни мрежи"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Се пребарува..."</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index ce4daa6..75f0b50 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"പുതിയ പിന്നിൽ അസാധുവായ പ്രതീകങ്ങൾ അടങ്ങിയിരിക്കുന്നു."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"പിൻ മാറ്റാനായില്ല"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"സന്ദേശ തരം പിന്തുണയ്ക്കുന്നില്ല, കേൾക്കാൻ <xliff:g id="NUMBER">%s</xliff:g> നമ്പറിൽ വിളിക്കുക."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"മൊബൈൽ നെറ്റ്വർക്ക് ക്രമീകരണങ്ങൾ"</string>
<string name="network_settings_title" msgid="514120489499925574">"മൊബൈൽ നെറ്റ്വർക്ക്"</string>
<string name="label_available" msgid="1181658289009300430">"ലഭ്യമായ നെറ്റ്വർക്കുകൾ"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"തിരയുന്നു…"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index c0b723e..92cb9dc 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Шинэ PIN-д буруу тэмдэгт агуулагдаж байна."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN-г өөрчлөх боломжгүй"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Дэмжигдээгүй зурвасын төрөл, сонсохын тулд <xliff:g id="NUMBER">%s</xliff:g> руу залгана уу."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Мобайль сүлжээний тохиргоо"</string>
<string name="network_settings_title" msgid="514120489499925574">"Мобайл сүлжээ"</string>
<string name="label_available" msgid="1181658289009300430">"Боломжтой сүлжээнүүд"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Хайж байна..."</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index cf29a1e..4d84040 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"नवीन पिन मध्ये अवैध वर्ण आहेत."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"पिन बदलण्यात अक्षम"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"असमर्थित संदेश प्रकार, ऐकण्यासाठी <xliff:g id="NUMBER">%s</xliff:g> वर कॉल करा."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"मोबाईल नेटवर्क सेटिंग्ज"</string>
<string name="network_settings_title" msgid="514120489499925574">"मोबाइल नेटवर्क"</string>
<string name="label_available" msgid="1181658289009300430">"उपलब्ध नेटवर्क"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"शोधत आहे..."</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 0ba68c1..76352fe 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"PIN baharu mengandungi aksara yang tidak sah."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Tidak dapat menukar PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Jenis mesej tidak disokong, hubungi <xliff:g id="NUMBER">%s</xliff:g> untuk mendengar."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Tetapan rangkaian mudah alih"</string>
<string name="network_settings_title" msgid="514120489499925574">"Rangkaian mudah alih"</string>
<string name="label_available" msgid="1181658289009300430">"Rangkaian sedia ada"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Mencari..."</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index e436235..fa0b96f 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"ပင်နံပါတ်အသစ်တွင် အသုံးပြု၍မရသောစာလုံးများ ပါဝင်နေပါသည်။"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"ပင်နံပါတ်ကို ပြောင်း၍မရပါ"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"ပံ့ပိုးမထားသော မက်ဆေ့ဂျ်အမျိုးအစားဖြစ်၍ နားထောင်ရန် <xliff:g id="NUMBER">%s</xliff:g> ကို ခေါ်ဆိုပါ။"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"မိုဘိုင်းကွန်ယက် ဆက်တင်များ"</string>
<string name="network_settings_title" msgid="514120489499925574">"မိုဘိုင်းကွန်ရက်"</string>
<string name="label_available" msgid="1181658289009300430">"ရရှိနိုင်သော ကွန်ယက်များ"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"ရှာဖွေနေသည်…"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 8f5c42b..c090e7e 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Den nye PIN-koden inneholder ugyldige tegn."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Kan ikke bytte PIN-kode"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Meldingstypen støttes ikke. Ring <xliff:g id="NUMBER">%s</xliff:g> for å høre."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Innstillinger for mobilnettverk"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobilnettverk"</string>
<string name="label_available" msgid="1181658289009300430">"Tilgjengelige nettverk"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Søker …"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index d614be2..d033349 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"नयाँ PIN मा अमान्य वर्णहरू छन्।"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN परिवर्तन गर्न सकिएन"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"सन्देशको असमर्थित प्रकार, सुन्नका लागि <xliff:g id="NUMBER">%s</xliff:g> मा कल गर्नुहोस्।"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"मोबाइल नेटवर्क सेटिहरू"</string>
<string name="network_settings_title" msgid="514120489499925574">"मोबाइल नेटवर्क"</string>
<string name="label_available" msgid="1181658289009300430">"उपलब्ध नेटवर्कहरू"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"खोजी गर्दै..."</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index d4b9c98..6115388 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"De nieuwe pincode bevat ongeldige tekens."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Kan pincode niet wijzigen"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Niet-ondersteund berichttype, bel <xliff:g id="NUMBER">%s</xliff:g> om te luisteren."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Instellingen mobiel netwerk"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobiel netwerk"</string>
<string name="label_available" msgid="1181658289009300430">"Beschikbare netwerken"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Zoeken..."</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 85dcd96..bd4c305 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"ਨਵੇਂ PIN ਵਿੱਚ ਅਵੈਧ ਅੱਖਰ-ਚਿੰਨ੍ਹ ਹਨ।"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN ਨੂੰ ਬਦਲਣ ਵਿੱਚ ਅਸਮਰੱਥ"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"ਅਸਮਰਥਿਤ ਸੁਨੇਹਾ ਕਿਸਮ, ਸੁਣਨ ਲਈ <xliff:g id="NUMBER">%s</xliff:g> \'ਤੇ ਕਾਲ ਕਰੋ।"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"ਮੋਬਾਈਲ ਨੈਟਵਰਕ ਸੈਟਿੰਗਾਂ"</string>
<string name="network_settings_title" msgid="514120489499925574">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ"</string>
<string name="label_available" msgid="1181658289009300430">"ਉਪਲਬਧ ਨੈਟਵਰਕ"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"ਖੋਜ ਰਿਹਾ ਹੈ..."</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 3a2a1c0..301943f 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Nowy PIN zawiera nieprawidłowe znaki."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Nie udało się zmienić kodu PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nieobsługiwany typ wiadomości – aby ją odsłuchać, zadzwoń pod numer <xliff:g id="NUMBER">%s</xliff:g>."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Ustawienia sieci komórkowej"</string>
<string name="network_settings_title" msgid="514120489499925574">"Sieć komórkowa"</string>
<string name="label_available" msgid="1181658289009300430">"Dostępne sieci"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Wyszukiwanie..."</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 43575a0..fd52131 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"O novo PIN contém carateres inválidos."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Não é possível alterar o PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tipo de mensagem não suportada, ligue para o número <xliff:g id="NUMBER">%s</xliff:g> para ouvir."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Definições da rede móvel"</string>
<string name="network_settings_title" msgid="514120489499925574">"Rede móvel"</string>
<string name="label_available" msgid="1181658289009300430">"Redes disponíveis"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"A pesquisar..."</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 9d9dd4d..1793d2e 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"O novo PIN contém caracteres inválidos."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Não foi possível alterar o PIN."</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tipo de mensagem incompatível, para ouvi-la, ligue para <xliff:g id="NUMBER">%s</xliff:g>."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Configurações de rede móvel"</string>
<string name="network_settings_title" msgid="514120489499925574">"Rede móvel"</string>
<string name="label_available" msgid="1181658289009300430">"Redes disponíveis"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Pesquisando..."</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 368565c..cc91c8c 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Codul PIN nou conține caractere nevalide."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Nu se poate schimba codul PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Tip de mesaj neacceptat. Apelează numărul <xliff:g id="NUMBER">%s</xliff:g> pentru a-l asculta."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Setări pentru rețeaua mobilă"</string>
<string name="network_settings_title" msgid="514120489499925574">"Rețea mobilă"</string>
<string name="label_available" msgid="1181658289009300430">"Rețele disponibile"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Se caută…"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 966fe2d..66838cf 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Новый PIN-код содержит недопустимые символы"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Не удалось сменить PIN-код"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Неподдерживаемый тип сообщения. Чтобы его прослушать, позвоните по телефону <xliff:g id="NUMBER">%s</xliff:g>."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Настройки мобильной сети"</string>
<string name="network_settings_title" msgid="514120489499925574">"Мобильная сеть"</string>
<string name="label_available" msgid="1181658289009300430">"Доступные сети"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Поиск…"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index e49e5bc..dc5f92e 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"නව PIN අංකයෙහි අවලංගු අනුලකුණු අන්තර්ගත වේ."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN අංකය මාරු කිරීමට නොහැකිය"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"සහාය නොදක්වන පණිවිඩය වර්ගය, සවන් දීමට <xliff:g id="NUMBER">%s</xliff:g> අමතන්න."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"ජංගම ජාල සැකසුම්"</string>
<string name="network_settings_title" msgid="514120489499925574">"ජංගම ජාලය"</string>
<string name="label_available" msgid="1181658289009300430">"තිබෙන ජාල"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"සොයමින්..."</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 53deb51..0e93513 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Nový PIN obsahuje neplatné znaky."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN nie je možné zmeniť"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nepodporovaný typ správy, zavolajte na číslo <xliff:g id="NUMBER">%s</xliff:g> a vypočujte si správu."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Nastavenia mobilnej siete"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobilná sieť"</string>
<string name="label_available" msgid="1181658289009300430">"Dostupné siete"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Hľadá sa…"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 0444f05..40573df 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Nova koda PIN vsebuje neveljavne znake."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Ni mogoče spremeniti kode PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Nepodprta vrsta sporočila, za poslušanje pokličite <xliff:g id="NUMBER">%s</xliff:g>."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Nastavitve mobi. omrežja"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobilno omrežje"</string>
<string name="label_available" msgid="1181658289009300430">"Razpoložljiva omrežja"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Iskanje ..."</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index f871c17..de7e6f3 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Kodi PIN i ri përmban karaktere të pavlefshme."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Kodi PIN nuk u ndryshua."</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Lloj mesazhi i pambështetur, telefono <xliff:g id="NUMBER">%s</xliff:g> për ta dëgjuar."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Cilësimet e rrjetit celular"</string>
<string name="network_settings_title" msgid="514120489499925574">"Rrjeti celular"</string>
<string name="label_available" msgid="1181658289009300430">"Rrjete të arritshme"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Po kërkon..."</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 7928eac..28cea4f 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Нови PIN садржи неважеће знакове."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Промена PIN-а није успела"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Неподржани тип поруке. Позовите <xliff:g id="NUMBER">%s</xliff:g> да бисте је преслушали."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Подешавања за моб. мрежу"</string>
<string name="network_settings_title" msgid="514120489499925574">"Мобилна мрежа"</string>
<string name="label_available" msgid="1181658289009300430">"Доступне мреже"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Претражује се…"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index d1b111a..e535456 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Den nya pinkoden innehåller ogiltiga tecken."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Det gick inte att ändra pinkoden"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Meddelandetypen stöds inte, ring <xliff:g id="NUMBER">%s</xliff:g> om du vill lyssna."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobila nätverksinställningar"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobilnätverk"</string>
<string name="label_available" msgid="1181658289009300430">"Tillgängliga nätverk"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Söker…"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 884a68a..0a16e94 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"PIN mpya ina herufi zisizostahiki."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Imeshindwa kubadilisha PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Huwezi kuona ujumbe wa aina hii; piga <xliff:g id="NUMBER">%s</xliff:g> ili uusikilize."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mipangilio ya mtandao wa simu"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mtandao wa simu"</string>
<string name="label_available" msgid="1181658289009300430">"Mitandao inayopatikana"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Inatafuta…"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 368ac71..6aceb73 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"புதிய பின்னில் தவறான எழுத்துக்குறிகள் உள்ளன."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"பின்னை மாற்ற முடியவில்லை"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"ஆதரிக்கப்படாத செய்தி வகை, தகவலைக் கேட்க <xliff:g id="NUMBER">%s</xliff:g> என்ற எண்ணிற்கு அழைக்கவும்."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"மொபைல் நெட்வொர்க் அமைப்பு"</string>
<string name="network_settings_title" msgid="514120489499925574">"மொபைல் நெட்வொர்க்"</string>
<string name="label_available" msgid="1181658289009300430">"கிடைக்கின்ற நெட்வொர்க்குகள்"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"தேடுகிறது..."</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 21afe34..4eecc2e 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"కొత్త PIN చెల్లని అక్షరాలను కలిగి ఉంది."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PINని మార్చడం సాధ్యపడలేదు"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"మద్దతులేని సందేశ రకం, వినడానికి <xliff:g id="NUMBER">%s</xliff:g>కి కాల్ చేయండి."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"మొబైల్ నెట్వర్క్ సెట్టింగ్లు"</string>
<string name="network_settings_title" msgid="514120489499925574">"మొబైల్ నెట్వర్క్"</string>
<string name="label_available" msgid="1181658289009300430">"అందుబాటులో ఉన్న నెట్వర్క్లు"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"శోధిస్తోంది..."</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 7daa9f0..7f3a3d3 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"PIN ใหม่มีอักขระที่ไม่ถูกต้อง"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"ไม่สามารถเปลี่ยน PIN ได้"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"ไม่รองรับข้อความประเภทนี้ โปรดโทร <xliff:g id="NUMBER">%s</xliff:g> เพื่อฟังข้อความเสียง"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"การตั้งค่าเครือข่ายมือถือ"</string>
<string name="network_settings_title" msgid="514120489499925574">"เครือข่ายมือถือ"</string>
<string name="label_available" msgid="1181658289009300430">"เครือข่ายที่ใช้งานได้"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"กำลังค้นหา…"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 232281e..66b0956 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Ang bagong PIN ay naglalaman ng mga di-wastong character."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Hindi nabago ang PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Hindi sinusuportahang uri ng mensahe, tawagan ang <xliff:g id="NUMBER">%s</xliff:g> upang pakinggan."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mga setting ng mobile network"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobile network"</string>
<string name="label_available" msgid="1181658289009300430">"Mga available na network"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Naghahanap…"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 3f36d3f..4097ad7 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Yeni PIN, geçersiz karakterler içeriyor."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN değiştirilemedi"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Desteklenmeyen mesaj türü. Dinlemek için <xliff:g id="NUMBER">%s</xliff:g> numaralı telefonu arayın."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobil ağ ayarları"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobil ağ"</string>
<string name="label_available" msgid="1181658289009300430">"Kullanılabilir ağlar"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Aranıyor..."</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index ef8260d..a430ee6 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Новий PIN-код містить недійсні символи"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Не вдалося змінити PIN-код"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Повідомлення непідтримуваного типу. Зателефонуйте на номер <xliff:g id="NUMBER">%s</xliff:g>, щоб прослухати."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Налаштування мобільної мережі"</string>
<string name="network_settings_title" msgid="514120489499925574">"Мобільна мережа"</string>
<string name="label_available" msgid="1181658289009300430">"Доступні мережі"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Пошук…"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 8acb520..2088b6b 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"نئے PIN میں غلط کریکٹرز شامل ہیں۔"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN تبدیل کرنے سے قاصر"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"پیغام کی غیر تعاون یافتہ قسم، سننے کیلئے <xliff:g id="NUMBER">%s</xliff:g> پر کال کریں۔"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"موبائل نیٹ ورک کی ترتیبات"</string>
<string name="network_settings_title" msgid="514120489499925574">"موبائل نیٹ ورک"</string>
<string name="label_available" msgid="1181658289009300430">"دستیاب نیٹ ورکس"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"تلاش کر رہا ہے…"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 8050f11..d824f5f 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Yangi PIN kodda yaroqsiz belgilar mavjud."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"PIN kodni o‘zgartirib bo‘lmadi"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Bu xabar turi qo‘llab-quvvatlanmaydi. Uni eshitish uchun <xliff:g id="NUMBER">%s</xliff:g> raqamiga qo‘ng‘iroq qiling."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Uyali tarmoq sozlamalari"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mobil tarmoq"</string>
<string name="label_available" msgid="1181658289009300430">"Mavjud tarmoqlar"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Qidirilmoqda…"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 7d70605..b4a16e7 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"Mã PIN mới chứa các ký tự không hợp lệ."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Không thể thay đổi mã PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Loại tin nhắn không được hỗ trợ, hãy gọi số <xliff:g id="NUMBER">%s</xliff:g> để nghe."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Cài đặt mạng di động"</string>
<string name="network_settings_title" msgid="514120489499925574">"Mạng di động"</string>
<string name="label_available" msgid="1181658289009300430">"Mạng khả dụng"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Đang tìm kiếm…"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 3c5c843..f980a77 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"新的 PIN 码包含无效字符。"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"无法更改 PIN 码"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"不受支持的语音邮件类型,请拨打 <xliff:g id="NUMBER">%s</xliff:g> 收听。"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"移动网络设置"</string>
<string name="network_settings_title" msgid="514120489499925574">"移动网络"</string>
<string name="label_available" msgid="1181658289009300430">"可用网络"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"正在搜索..."</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 65457b5..77accb0 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"新的 PIN 包含無效字元。"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"無法變更 PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"不支援的訊息類型,撥打 <xliff:g id="NUMBER">%s</xliff:g> 即可聆聽。"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"流動網絡設定"</string>
<string name="network_settings_title" msgid="514120489499925574">"流動網絡"</string>
<string name="label_available" msgid="1181658289009300430">"可用的網絡"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"正在搜尋..."</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 66d341e..0d0f929 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"新的 PIN 碼包含無效的字元。"</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"無法變更 PIN 碼"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"不支援的訊息類型,請撥打 <xliff:g id="NUMBER">%s</xliff:g> 聽取留言。"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"行動網路設定"</string>
<string name="network_settings_title" msgid="514120489499925574">"行動網路"</string>
<string name="label_available" msgid="1181658289009300430">"可用的網路"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"搜尋中…"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 586e3eb..b44a903 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -158,7 +158,6 @@
<string name="vm_change_pin_error_invalid" msgid="3972205462701668653">"I-PIN entsha iqukethe izinhlamvu ezingavumelekile."</string>
<string name="vm_change_pin_error_system_error" msgid="6610603326230000207">"Ayikwazi ukushintsha i-PIN"</string>
<string name="vvm_unsupported_message_format" msgid="11795090778411977">"Uhlobo lomlayezo ongasekelwa, shayela ku-<xliff:g id="NUMBER">%s</xliff:g> ukuze ulalele."</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Izilungiselelo zenethiwekhi yeselula."</string>
<string name="network_settings_title" msgid="514120489499925574">"Inethiwekhi yeselula"</string>
<string name="label_available" msgid="1181658289009300430">"Amanethiwekhi atholakalayo"</string>
<string name="load_networks_progress" msgid="5230707536168902952">"Iyasesha..."</string>
diff --git a/res/values/config.xml b/res/values/config.xml
index 615d43f..1b612c9 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -232,9 +232,12 @@
disconnecting the ongoing Telephony call when the call goes active. -->
<bool name="config_support_handover_from">false</bool>
+ <!-- Flag indicating whether the device supports RTT (real-time text) -->
+ <bool name="config_support_rtt">false</bool>
+
<!-- Flag indicating whether a system app can use video calling fallback if carrier video
calling is not available. -->
- <bool name="config_support_video_calling_fallback">false</bool>
+ <bool name="config_support_video_calling_fallback">true</bool>
<!-- Whether the cellular radio is allowed to be power down when the Bluetooth can provide the data/call capabilities -->
<bool name="config_allowRadioPowerDownOnBluetooth">false</bool>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 67c5747..c79bacc 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -360,8 +360,6 @@
<string name="vvm_unsupported_message_format">Unsupported message type, call <xliff:g id="number" example="*86">%s</xliff:g> to listen.</string>
<!-- networks setting strings --><skip/>
- <!-- Mobile network settings screen title -->
- <string name="mobile_networks">Mobile network settings</string>
<!-- Mobile network settings screen title/heading -->
<string name="network_settings_title">Mobile network</string>
<!-- Available networks screen title/heading -->
@@ -1491,4 +1489,114 @@
<string name="mobile_data_activate_button">ADD DATA</string>
<!-- activate data plan dialogue button for cancel further actions-->
<string name="mobile_data_activate_cancel_button">CANCEL</string>
+
+ <!-- Call failed messages -->
+ <!-- In-call screen: status label displayed briefly after a call ends -->
+ <string name="clh_card_title_call_ended_txt">Call ended</string>
+ <!-- In-call screen: call failure reason (radio is off) -->
+ <string name="clh_callFailed_powerOff_txt">Radio off</string>
+ <!-- In-call screen: call failure reason (SIM error) -->
+ <string name="clh_callFailed_simError_txt">No SIM card or SIM card error</string>
+ <!-- In-call screen: call failure message displayed in an error dialog -->
+ <string name="clh_incall_error_out_of_service_txt">Mobile network not available</string>
+
+ <!-- See CallFailCause for details on what causes each message -->
+ <!-- In-call screen: call failure reason (Cause Number 1) -->
+ <string name="clh_callFailed_unassigned_number_txt">Unassigned (unallocated) number</string>
+ <!-- In-call screen: call failure reason (Cause Number 3) -->
+ <string name="clh_callFailed_no_route_to_destination_txt">No route to destination</string>
+ <!-- In-call screen: call failure reason (Cause Number 6) -->
+ <string name="clh_callFailed_channel_unacceptable_txt">Channel unacceptable</string>
+ <!-- In-call screen: call failure reason (Cause Number 8) -->
+ <string name="clh_callFailed_operator_determined_barring_txt">Operator determined barring</string>
+ <!-- In-call screen: call failure reason (Cause Number 16) -->
+ <string name="clh_callFailed_normal_call_clearing_txt">Normal call clearing</string>
+ <!-- In-call screen: call failure reason (Cause Number 17) -->
+ <string name="clh_callFailed_user_busy_txt">User busy</string>
+ <!-- In-call screen: call failure reason (Cause Number 18) -->
+ <string name="clh_callFailed_no_user_responding_txt">No user responding</string>
+ <!-- In-call screen: call failure reason (Cause Number 19) -->
+ <string name="clh_callFailed_user_alerting_txt">User alerting, no answer</string>
+ <!-- In-call screen: call failure reason (Cause Number 21) -->
+ <string name="clh_callFailed_call_rejected_txt">Call rejected</string>
+ <!-- In-call screen: call failure reason (Cause Number 22) -->
+ <string name="clh_callFailed_number_changed_txt">Number changed</string>
+ <!-- In-call screen: call failure reason (Cause Number 25) -->
+ <string name="clh_callFailed_pre_emption_txt">Pre-emption</string>
+ <!-- In-call screen: call failure reason (Cause Number 26) -->
+ <string name="clh_callFailed_non_selected_user_clearing_txt">Non selected user clearing</string>
+ <!-- In-call screen: call failure reason (Cause Number 27) -->
+ <string name="clh_callFailed_destination_out_of_order_txt">Destination out of order</string>
+ <!-- In-call screen: call failure reason (Cause Number 28) -->
+ <string name="clh_callFailed_invalid_number_format_txt">Invalid number format (incomplete number)</string>
+ <!-- In-call screen: call failure reason (Cause Number 29) -->
+ <string name="clh_callFailed_facility_rejected_txt">Facility rejected</string>
+ <!-- In-call screen: call failure reason (Cause Number 30) -->
+ <string name="clh_callFailed_response_to_STATUS_ENQUIRY_txt">Response to STATUS ENQUIRY</string>
+ <!-- In-call screen: call failure reason (Cause Number 31) -->
+ <string name="clh_callFailed_normal_unspecified_txt">Normal, unspecified</string>
+ <!-- In-call screen: call failure reason (Cause Number 34) -->
+ <string name="clh_callFailed_no_circuit_available_txt">No circuit/channel available</string>
+ <!-- In-call screen: call failure reason (Cause Number 38) -->
+ <string name="clh_callFailed_network_out_of_order_txt">Network out of order</string>
+ <!-- In-call screen: call failure reason (Cause Number 41) -->
+ <string name="clh_callFailed_temporary_failure_txt">Temporary failure</string>
+ <!-- In-call screen: call failure reason (Cause Number 42) -->
+ <string name="clh_callFailed_switching_equipment_congestion_txt">Switching equipment congestion</string>
+ <!-- In-call screen: call failure reason (Cause Number 43) -->
+ <string name="clh_callFailed_access_information_discarded_txt">Access information discarded</string>
+ <!-- In-call screen: call failure reason (Cause Number 44) -->
+ <string name="clh_callFailed_requested_circuit_txt">Requested circuit/channel not available</string>
+ <!-- In-call screen: call failure reason (Cause Number 47) -->
+ <string name="clh_callFailed_resources_unavailable_unspecified_txt">Resources unavailable, unspecified</string>
+ <!-- In-call screen: call failure reason (Cause Number 49) -->
+ <string name="clh_callFailed_quality_of_service_unavailable_txt">Quality of service unavailable</string>
+ <!-- In-call screen: call failure reason (Cause Number 50) -->
+ <string name="clh_callFailed_requested_facility_not_subscribed_txt">Requested facility not subscribed</string>
+ <!-- In-call screen: call failure reason (Cause Number 55) -->
+ <string name="clh_callFailed_incoming_calls_barred_within_the_CUG_txt">Incoming calls barred within the CUG</string>
+ <!-- In-call screen: call failure reason (Cause Number 57) -->
+ <string name="clh_callFailed_bearer_capability_not_authorized_txt">Bearer capability not authorized</string>
+ <!-- In-call screen: call failure reason (Cause Number 58) -->
+ <string name="clh_callFailed_bearer_capability_not_presently_available_txt">Bearer capability not presently available</string>
+ <!-- In-call screen: call failure reason (Cause Number 63) -->
+ <string name="clh_callFailed_service_or_option_not_available_unspecified_txt">Service or option not available, unspecified</string>
+ <!-- In-call screen: call failure reason (Cause Number 65) -->
+ <string name="clh_callFailed_bearer_service_not_implemented_txt">Bearer service not implemented</string>
+ <!-- In-call screen: call failure reason (Cause Number 68) -->
+ <string name="clh_callFailed_ACM_equal_to_or_greater_than_ACMmax_txt">ACM equal to or greater than ACMmax</string>
+ <!-- In-call screen: call failure reason (Cause Number 69) -->
+ <string name="clh_callFailed_requested_facility_not_implemented_txt">Requested facility not implemented</string>
+ <!-- In-call screen: call failure reason (Cause Number 70) -->
+ <string name="clh_callFailed_only_restricted_digital_information_bearer_capability_is_available_txt">Only restricted digital information bearer capability is available</string>
+ <!-- In-call screen: call failure reason (Cause Number 79) -->
+ <string name="clh_callFailed_service_or_option_not_implemented_unspecified_txt">Service or option not implemented, unspecified</string>
+ <!-- In-call screen: call failure reason (Cause Number 81) -->
+ <string name="clh_callFailed_invalid_transaction_identifier_value_txt">Invalid transaction identifier value</string>
+ <!-- In-call screen: call failure reason (Cause Number 87) -->
+ <string name="clh_callFailed_user_not_member_of_CUG_txt">User not member of CUG</string>
+ <!-- In-call screen: call failure reason (Cause Number 88) -->
+ <string name="clh_callFailed_incompatible_destination_txt">Incompatible destination</string>
+ <!-- In-call screen: call failure reason (Cause Number 91) -->
+ <string name="clh_callFailed_invalid_transit_network_selection_txt">Invalid transit network selection</string>
+ <!-- In-call screen: call failure reason (Cause Number 95) -->
+ <string name="clh_callFailed_semantically_incorrect_message_txt">Semantically incorrect message</string>
+ <!-- In-call screen: call failure reason (Cause Number 96) -->
+ <string name="clh_callFailed_invalid_mandatory_information_txt">Invalid mandatory information</string>
+ <!-- In-call screen: call failure reason (Cause Number 97) -->
+ <string name="clh_callFailed_message_type_non_existent_or_not_implemented_txt">Message type non-existent or not implemented</string>
+ <!-- In-call screen: call failure reason (Cause Number 98) -->
+ <string name="clh_callFailed_message_type_not_compatible_with_protocol_state_txt">Message type not compatible with protocol state</string>
+ <!-- In-call screen: call failure reason (Cause Number 99) -->
+ <string name="clh_callFailed_information_element_non_existent_or_not_implemented_txt">Information element non-existent or not implemented</string>
+ <!-- In-call screen: call failure reason (Cause Number 100) -->
+ <string name="clh_callFailed_conditional_IE_error_txt">Conditional IE error</string>
+ <!-- In-call screen: call failure reason (Cause Number 101) -->
+ <string name="clh_callFailed_message_not_compatible_with_protocol_state_txt">Message not compatible with protocol state</string>
+ <!-- In-call screen: call failure reason (Cause Number 102) -->
+ <string name="clh_callFailed_recovery_on_timer_expiry_txt">Recovery on timer expiry</string>
+ <!-- In-call screen: call failure reason (Cause Number 111) -->
+ <string name="clh_callFailed_protocol_Error_unspecified_txt">Protocol error, unspecified</string>
+ <!-- In-call screen: call failure reason (Cause Number 127) -->
+ <string name="clh_callFailed_interworking_unspecified_txt">Interworking, unspecified</string>
</resources>
diff --git a/res/xml/network_setting_fragment.xml b/res/xml/network_setting_fragment.xml
index a4c115d..d334861 100644
--- a/res/xml/network_setting_fragment.xml
+++ b/res/xml/network_setting_fragment.xml
@@ -13,8 +13,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="@string/mobile_networks">
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen
android:key="cdma_lte_data_service_key"
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index e5527bc..a3b0892 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -16,24 +16,18 @@
package com.android.phone;
-import android.app.ActionBar;
import android.app.Activity;
-import android.app.ActivityOptions;
import android.app.AlertDialog;
import android.app.Dialog;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.PersistableBundle;
-import android.os.UserHandle;
import android.os.UserManager;
-import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
@@ -42,10 +36,9 @@
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
-import android.telephony.ims.feature.ImsFeature;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
-import android.text.TextUtils;
+import android.telephony.ims.feature.ImsFeature;
import android.util.Log;
import android.view.MenuItem;
import android.widget.Toast;
@@ -53,18 +46,12 @@
import com.android.ims.ImsConfig;
import com.android.ims.ImsException;
import com.android.ims.ImsManager;
-import com.android.internal.telephony.CallForwardInfo;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneConstants;
-import com.android.phone.common.util.SettingsUtil;
-import com.android.phone.settings.AccountSelectionPreference;
import com.android.phone.settings.PhoneAccountSettingsFragment;
import com.android.phone.settings.VoicemailSettingsActivity;
import com.android.phone.settings.fdn.FdnSetting;
-import com.android.services.telephony.sip.SipUtil;
-import java.lang.String;
-import java.util.ArrayList;
import java.util.List;
/**
@@ -144,7 +131,7 @@
if (DBG) log("onPreferenceChange: \"" + preference + "\" changed to \"" + objValue + "\"");
if (preference == mEnableVideoCalling) {
- if (ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())) {
+ if (mImsMgr.isEnhanced4gLteModeSettingEnabledByUser()) {
PhoneGlobals.getInstance().phoneMgr.enableVideoCalling((boolean) objValue);
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
@@ -296,13 +283,12 @@
}
}
- if (ImsManager.isVtEnabledByPlatform(mPhone.getContext()) &&
- ImsManager.isVtProvisionedOnDevice(mPhone.getContext()) &&
- (carrierConfig.getBoolean(
+ if (mImsMgr.isVtEnabledByPlatform() && mImsMgr.isVtProvisionedOnDevice()
+ && (carrierConfig.getBoolean(
CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS)
- || mPhone.mDcTracker.isDataEnabled())) {
+ || mPhone.mDcTracker.isDataEnabled())) {
boolean currentValue =
- ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())
+ mImsMgr.isEnhanced4gLteModeSettingEnabledByUser()
? PhoneGlobals.getInstance().phoneMgr.isVideoCallingEnabled(
getOpPackageName()) : false;
mEnableVideoCalling.setChecked(currentValue);
@@ -311,8 +297,8 @@
prefSet.removePreference(mEnableVideoCalling);
}
- if (ImsManager.isVolteEnabledByPlatform(this) &&
- !carrierConfig.getBoolean(
+ if (mImsMgr.isVolteEnabledByPlatform()
+ && !carrierConfig.getBoolean(
CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL)) {
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
/* tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); */
@@ -338,14 +324,13 @@
} else {
prefSet.removePreference(wifiCallingSettings);
}
- } else if (!ImsManager.isWfcEnabledByPlatform(mPhone.getContext()) ||
- !ImsManager.isWfcProvisionedOnDevice(mPhone.getContext())) {
+ } else if (!mImsMgr.isWfcEnabledByPlatform() || !mImsMgr.isWfcProvisionedOnDevice()) {
prefSet.removePreference(wifiCallingSettings);
} else {
int resId = com.android.internal.R.string.wifi_calling_off_summary;
- if (ImsManager.isWfcEnabledByUser(mPhone.getContext())) {
+ if (mImsMgr.isWfcEnabledByUser()) {
boolean isRoaming = telephonyManager.isNetworkRoaming();
- int wfcMode = ImsManager.getWfcMode(mPhone.getContext(), isRoaming);
+ int wfcMode = mImsMgr.getWfcMode(isRoaming);
switch (wfcMode) {
case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY:
resId = com.android.internal.R.string.wfc_mode_wifi_only_summary;
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index a26e3d8..1b1327f 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -516,6 +516,7 @@
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT |
Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
SubscriptionManager.putPhoneIdAndSubIdExtra(intent, phoneId);
+ intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, phoneId);
ActivityManager.broadcastStickyIntent(intent, UserHandle.USER_ALL);
mHasSentConfigChange[phoneId] = true;
}
@@ -776,11 +777,15 @@
PersistableBundle retConfig = CarrierConfigManager.getDefaultConfig();
if (SubscriptionManager.isValidPhoneId(phoneId)) {
PersistableBundle config = mConfigFromDefaultApp[phoneId];
- if (config != null)
+ if (config != null) {
retConfig.putAll(config);
+ retConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, true);
+ }
config = mConfigFromCarrierApp[phoneId];
- if (config != null)
+ if (config != null) {
retConfig.putAll(config);
+ retConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, true);
+ }
}
return retConfig;
}
diff --git a/src/com/android/phone/CdmaOptions.java b/src/com/android/phone/CdmaOptions.java
index 8749565..7c09265 100644
--- a/src/com/android/phone/CdmaOptions.java
+++ b/src/com/android/phone/CdmaOptions.java
@@ -26,6 +26,8 @@
import android.telephony.CarrierConfigManager;
import android.text.TextUtils;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.telephony.Phone;
/**
@@ -95,6 +97,8 @@
new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
+ MetricsLogger.action(mButtonAPNExpand.getContext(),
+ MetricsEvent.ACTION_MOBILE_NETWORK_APN_SETTINGS);
// We need to build the Intent by hand as the Preference Framework
// does not allow to add an Intent with some extras into a Preference
// XML file
diff --git a/src/com/android/phone/GsmUmtsOptions.java b/src/com/android/phone/GsmUmtsOptions.java
index a68b1cb..5cf19ad 100644
--- a/src/com/android/phone/GsmUmtsOptions.java
+++ b/src/com/android/phone/GsmUmtsOptions.java
@@ -21,10 +21,11 @@
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
-import android.preference.TwoStatePreference;
import android.provider.Settings;
import android.telephony.CarrierConfigManager;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneFactory;
@@ -116,6 +117,8 @@
new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
+ MetricsLogger.action(mButtonAPNExpand.getContext(),
+ MetricsEvent.ACTION_MOBILE_NETWORK_APN_SETTINGS);
// We need to build the Intent by hand as the Preference Framework
// does not allow to add an Intent with some extras into a Preference
// XML file
diff --git a/src/com/android/phone/INetworkQueryService.aidl b/src/com/android/phone/INetworkQueryService.aidl
index b0fe992..f65c971 100644
--- a/src/com/android/phone/INetworkQueryService.aidl
+++ b/src/com/android/phone/INetworkQueryService.aidl
@@ -31,8 +31,14 @@
* object on query completion. If there is an existing request,
* then just add the callback to the list of notifications
* that will be sent upon query completion.
+ *
+ * It will send the network query with the use of
+ * <code>TelephonyManager.requestNetworkScan()</code> if the
+ * isIncrementalResult is true. And if the isIncrementalResult
+ * is set as false, it will try to send network query through
+ * <code>Phone.getAvailableNetworks()</code>.
*/
- void startNetworkQuery(in INetworkQueryServiceCallback cb, in int phoneId);
+ void startNetworkQuery(in INetworkQueryServiceCallback cb, in int phoneId, boolean isIncrementalResult);
/**
* Tells the service that the requested query is to be ignored.
@@ -40,7 +46,7 @@
* underlying RIL, but it ensures that the callback is removed
* from the list of notifications.
*/
- void stopNetworkQuery(in INetworkQueryServiceCallback cb);
+ void stopNetworkQuery();
/**
* Tells the service to unregister the network query callback.
diff --git a/src/com/android/phone/INetworkQueryServiceCallback.aidl b/src/com/android/phone/INetworkQueryServiceCallback.aidl
index 4c32883..2299f5e 100644
--- a/src/com/android/phone/INetworkQueryServiceCallback.aidl
+++ b/src/com/android/phone/INetworkQueryServiceCallback.aidl
@@ -16,6 +16,7 @@
package com.android.phone;
+import android.telephony.CellInfo;
import com.android.internal.telephony.OperatorInfo;
/**
@@ -26,14 +27,25 @@
oneway interface INetworkQueryServiceCallback {
/**
- * Called upon query completion, handing a status value and an
- * array of OperatorInfo objects.
- *
- * @param networkInfoArray is the list of OperatorInfo. Can be
- * null, indicating no results were found, or an error.
- * @param status the status indicating if there were any
- * problems with the request.
+ * Returns the scan results to the user, this callback will be
+ * called at least one time.
*/
- void onQueryComplete(in List<OperatorInfo> networkInfoArray, int status);
+ void onResults(in List<CellInfo> results);
+
+ /**
+ * Informs the user that the scan has stopped.
+ *
+ * This callback will be called when the scan is finished or cancelled by the user.
+ * The related NetworkScanRequest will be deleted after this callback.
+ */
+ void onComplete();
+
+ /**
+ * Informs the user that there is some error about the scan.
+ *
+ * This callback will be called whenever there is any error about the scan,
+ * and the scan will be terminated. onComplete() will NOT be called.
+ */
+ void onError(int error);
}
diff --git a/src/com/android/phone/ImsUtil.java b/src/com/android/phone/ImsUtil.java
index b6c88ae..4d8ff80 100644
--- a/src/com/android/phone/ImsUtil.java
+++ b/src/com/android/phone/ImsUtil.java
@@ -20,6 +20,7 @@
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
import android.util.Log;
import com.android.ims.ImsConfig;
@@ -52,8 +53,9 @@
* @return {@code true} if WFC is supported by the platform and has been enabled by the user.
*/
public static boolean isWfcEnabled(Context context) {
- boolean isEnabledByPlatform = ImsManager.isWfcEnabledByPlatform(context);
- boolean isEnabledByUser = ImsManager.isWfcEnabledByUser(context);
+ ImsManager imsManager = getDefaultImsManagerInstance(context);
+ boolean isEnabledByPlatform = imsManager.isWfcEnabledByPlatform();
+ boolean isEnabledByUser = imsManager.isWfcEnabledByUser();
if (DBG) Log.d(LOG_TAG, "isWfcEnabled :: isEnabledByPlatform=" + isEnabledByPlatform);
if (DBG) Log.d(LOG_TAG, "isWfcEnabled :: isEnabledByUser=" + isEnabledByUser);
return isEnabledByPlatform && isEnabledByUser;
@@ -64,8 +66,8 @@
* enabled, this will return {@code false}.
*/
public static boolean isWfcModeWifiOnly(Context context) {
- boolean isWifiOnlyMode =
- ImsManager.getWfcMode(context) == ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY;
+ boolean isWifiOnlyMode = getDefaultImsManagerInstance(context).getWfcMode()
+ == ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY;
if (DBG) Log.d(LOG_TAG, "isWfcModeWifiOnly :: isWifiOnlyMode" + isWifiOnlyMode);
return isWfcEnabled(context) && isWifiOnlyMode;
}
@@ -86,7 +88,7 @@
return false;
}
- if (!ImsManager.isWfcProvisionedOnDevice(context)) {
+ if (!getDefaultImsManagerInstance(context).isWfcProvisionedOnDevice()) {
return false;
}
@@ -100,4 +102,8 @@
}
return false;
}
+
+ private static ImsManager getDefaultImsManagerInstance(Context context) {
+ return ImsManager.getInstance(context, SubscriptionManager.getDefaultVoicePhoneId());
+ }
}
diff --git a/src/com/android/phone/MobileDataPreference.java b/src/com/android/phone/MobileDataPreference.java
index fe70028..38d700e 100644
--- a/src/com/android/phone/MobileDataPreference.java
+++ b/src/com/android/phone/MobileDataPreference.java
@@ -36,6 +36,9 @@
import android.view.View;
import android.widget.Checkable;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+
import java.util.List;
/**
@@ -156,6 +159,10 @@
private void setMobileDataEnabled(boolean enabled) {
if (DBG) Log.d(TAG, "setMobileDataEnabled(" + enabled + "," + mSubId + ")");
+
+ MetricsLogger.action(getContext(), MetricsEvent.ACTION_MOBILE_NETWORK_MOBILE_DATA_TOGGLE,
+ enabled);
+
mTelephonyManager.setDataEnabled(mSubId, enabled);
setChecked(enabled);
}
diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java
index 0cd3c05..c061fbc 100644
--- a/src/com/android/phone/MobileNetworkSettings.java
+++ b/src/com/android/phone/MobileNetworkSettings.java
@@ -49,13 +49,13 @@
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
-import android.telephony.ims.feature.ImsFeature;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.euicc.EuiccManager;
+import android.telephony.ims.feature.ImsFeature;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
@@ -76,7 +76,6 @@
import com.android.phone.settings.PhoneAccountSettingsFragment;
import com.android.settingslib.RestrictedLockUtils;
-
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -146,18 +145,31 @@
}
/**
- * Whether to show the Enhanced 4G LTE settings.
+ * Whether to show the Enhanced 4G LTE settings in search result.
*
* <p>We show this settings if the VoLTE can be enabled by this device and the carrier app
- * doesn't set {@link CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL} to false.
+ * doesn't set {@link CarrierConfigManager#KEY_HIDE_ENHANCED_4G_LTE_BOOL} to false.
*/
- public static boolean hideEnhanced4gLteSettings(Context context,
- PersistableBundle carrierConfig) {
- return !(ImsManager.isVolteEnabledByPlatform(context)
- && ImsManager.isVolteProvisionedOnDevice(context))
- || carrierConfig.getBoolean(
- CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL);
+ public static boolean hideEnhanced4gLteSettings(Context context) {
+ List<SubscriptionInfo> sil =
+ SubscriptionManager.from(context).getActiveSubscriptionInfoList();
+ // Check all active subscriptions. We only hide the button if it's disabled for all
+ // active subscriptions.
+ if (sil != null) {
+ for (SubscriptionInfo subInfo : sil) {
+ ImsManager imsManager = ImsManager.getInstance(context, subInfo.getSimSlotIndex());
+ PersistableBundle carrierConfig = PhoneGlobals.getInstance()
+ .getCarrierConfigForSubId(subInfo.getSubscriptionId());
+ if ((imsManager.isVolteEnabledByPlatform()
+ && imsManager.isVolteProvisionedOnDevice())
+ || carrierConfig.getBoolean(
+ CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL)) {
+ return false;
+ }
+ }
+ }
+ return true;
}
public static class MobileNetworkFragment extends PreferenceFragment implements
@@ -186,6 +198,7 @@
private static final String BUTTON_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings";
private static final String BUTTON_CARRIER_SETTINGS_KEY = "carrier_settings_key";
private static final String BUTTON_CDMA_SYSTEM_SELECT_KEY = "cdma_system_select_key";
+ private static final String BUTTON_CDMA_SUBSCRIPTION_KEY = "cdma_subscription_key";
private static final String BUTTON_CARRIER_SETTINGS_EUICC_KEY =
"carrier_settings_euicc_key";
private static final String BUTTON_WIFI_CALLING_KEY = "wifi_calling_key";
@@ -196,6 +209,8 @@
private static final String CATEGORY_CALLING_KEY = "calling";
private static final String CATEGORY_GSM_APN_EXPAND_KEY = "category_gsm_apn_key";
private static final String CATEGORY_CDMA_APN_EXPAND_KEY = "category_cdma_apn_key";
+ private static final String BUTTON_GSM_APN_EXPAND_KEY = "button_gsm_apn_key";
+ private static final String BUTTON_CDMA_APN_EXPAND_KEY = "button_cdma_apn_key";
private final BroadcastReceiver mPhoneChangeReceiver = new PhoneChangeReceiver();
@@ -260,17 +275,11 @@
public void onCallStateChanged(int state, String incomingNumber) {
if (DBG) log("PhoneStateListener.onCallStateChanged: state=" + state);
- Activity activity = getActivity();
- if (activity == null) {
- return;
- }
-
int subId = mPhone != null
? mPhone.getSubId() : SubscriptionManager.INVALID_SUBSCRIPTION_ID;
PersistableBundle carrierConfig =
PhoneGlobals.getInstance().getCarrierConfigForSubId(subId);
- boolean enabled = is4gLtePrefEnabled(activity.getApplicationContext(),
- carrierConfig);
+ boolean enabled = is4gLtePrefEnabled(carrierConfig);
Preference pref = getPreferenceScreen().findPreference(BUTTON_4G_LTE_KEY);
if (pref != null) pref.setEnabled(enabled && hasActiveSubscriptions());
@@ -328,6 +337,9 @@
public void onPositiveButtonClick(DialogFragment dialog) {
mPhone.setDataRoamingEnabled(true);
mButtonDataRoam.setChecked(true);
+ MetricsLogger.action(getContext(),
+ getMetricsEventCategory(getPreferenceScreen(), mButtonDataRoam),
+ true);
}
@Override
@@ -561,8 +573,11 @@
final SubscriptionInfo sir = mSubscriptionManager
.getActiveSubscriptionInfoForSimSlotIndex(slotId);
if (sir != null) {
- mPhone = PhoneFactory.getPhone(
- SubscriptionManager.getPhoneId(sir.getSubscriptionId()));
+ int phoneId = SubscriptionManager.getPhoneId(sir.getSubscriptionId());
+ if (SubscriptionManager.isValidPhoneId(phoneId)) {
+ mPhone = PhoneFactory.getPhone(phoneId);
+ mImsMgr = ImsManager.getInstance(getContext(), phoneId);
+ }
}
if (mPhone == null) {
// Do the best we can
@@ -622,12 +637,6 @@
bindNetworkQueryService();
- if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
- mUnavailable = true;
- activity.setContentView(R.layout.telephony_disallowed_preference_screen);
- return;
- }
-
addPreferencesFromResource(R.xml.network_setting_fragment);
mButton4glte = (SwitchPreference)findPreference(BUTTON_4G_LTE_KEY);
@@ -688,7 +697,13 @@
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- initializeSubscriptions();
+ if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)
+ || !mUm.isSystemUser()) {
+ mUnavailable = true;
+ getActivity().setContentView(R.layout.telephony_disallowed_preference_screen);
+ } else {
+ initializeSubscriptions();
+ }
}
private class PhoneChangeReceiver extends BroadcastReceiver {
@@ -719,11 +734,6 @@
return;
}
- final Activity activity = getActivity();
- if (activity == null || activity.isDestroyed()) {
- Log.e(LOG_TAG, "onResume:- with no valid activity.");
- return;
- }
// upon resumption from the sub-activity, make sure we re-enable the
// preferences.
getPreferenceScreen().setEnabled(true);
@@ -738,15 +748,10 @@
updatePreferredNetworkUIFromDb();
}
- if (ImsManager.isVolteEnabledByPlatform(activity)
- && ImsManager.isVolteProvisionedOnDevice(activity)) {
- mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
- }
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
// NOTE: Buttons will be enabled/disabled in mPhoneStateListener
- boolean enh4glteMode = ImsManager.isEnhanced4gLteModeSettingEnabledByUser(activity)
- && ImsManager.isNonTtyOrTtyOnVolteEnabled(activity);
- mButton4glte.setChecked(enh4glteMode);
+ updateEnhanced4gLteState();
// Video calling and WiFi calling state might have changed.
updateCallingCategory();
@@ -993,21 +998,7 @@
android.util.Log.d(LOG_TAG, "keep ltePref");
}
- Preference pref = prefSet.findPreference(BUTTON_4G_LTE_KEY);
- try {
- if ((mImsMgr.getImsServiceStatus() != ImsFeature.STATE_READY)
- || hideEnhanced4gLteSettings(getActivity(), carrierConfig)) {
- if (pref != null) {
- prefSet.removePreference(pref);
- }
- }
- } catch (ImsException ex) {
- log("Exception when trying to get ImsServiceStatus: " + ex);
- if (pref != null) {
- prefSet.removePreference(pref);
- }
- }
-
+ updateEnhanced4gLteState();
updateCallingCategory();
// Enable link to CMAS app settings depending on the value in config.xml.
@@ -1022,6 +1013,19 @@
}
}
+ /**
+ * Listen to extra preference changes that need as Metrics events logging.
+ */
+ if (prefSet.findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY) != null) {
+ prefSet.findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY)
+ .setOnPreferenceChangeListener(this);
+ }
+
+ if (prefSet.findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY) != null) {
+ prefSet.findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY)
+ .setOnPreferenceChangeListener(this);
+ }
+
// Get the networkMode from Settings.System and displays it
mButtonEnabledNetworks.setValue(Integer.toString(settingsNetworkMode));
mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
@@ -1040,8 +1044,7 @@
* but you do need to remember that this all needs to work when subscriptions
* change dynamically such as when hot swapping sims.
*/
- boolean canChange4glte = is4gLtePrefEnabled(activity.getApplicationContext(),
- carrierConfig);
+ boolean canChange4glte = is4gLtePrefEnabled(carrierConfig);
boolean useVariant4glteTitle = carrierConfig.getBoolean(
CarrierConfigManager.KEY_ENHANCED_4G_LTE_TITLE_VARIANT_BOOL);
int enhanced4glteModeTitleId = useVariant4glteTitle ?
@@ -1054,7 +1057,6 @@
mButton4glte.setEnabled(hasActiveSubscriptions && canChange4glte);
mLteDataServicePref.setEnabled(hasActiveSubscriptions);
Preference ps;
- PreferenceScreen root = getPreferenceScreen();
ps = findPreference(BUTTON_CELL_BROADCAST_SETTINGS);
if (ps != null) {
ps.setEnabled(hasActiveSubscriptions);
@@ -1106,6 +1108,8 @@
* display value.
*/
public boolean onPreferenceChange(Preference preference, Object objValue) {
+ sendMetricsEventPreferenceChanged(getPreferenceScreen(), preference, objValue);
+
final int phoneSubId = mPhone.getSubId();
if (preference == mButtonPreferredNetworkMode) {
//NOTE onPreferenceChange seems to be called even if there is no change
@@ -1209,11 +1213,9 @@
.obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
}
} else if (preference == mButton4glte) {
- SwitchPreference enhanced4gModePref = (SwitchPreference) preference;
- boolean enhanced4gMode = !enhanced4gModePref.isChecked();
- enhanced4gModePref.setChecked(enhanced4gMode);
- ImsManager.setEnhanced4gLteModeSetting(getActivity(),
- enhanced4gModePref.isChecked());
+ boolean enhanced4gMode = !mButton4glte.isChecked();
+ mButton4glte.setChecked(enhanced4gMode);
+ mImsMgr.setEnhanced4gLteModeSetting(mButton4glte.isChecked());
} else if (preference == mButtonDataRoam) {
if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam.");
@@ -1225,6 +1227,9 @@
CarrierConfigManager.KEY_DISABLE_CHARGE_INDICATION_BOOL)) {
mPhone.setDataRoamingEnabled(true);
} else {
+ // MetricsEvent with no value update.
+ MetricsLogger.action(getContext(),
+ getMetricsEventCategory(getPreferenceScreen(), mButtonDataRoam));
// First confirm with a warning dialog about charges
mOkClicked = false;
RoamingDialogFragment fragment = new RoamingDialogFragment();
@@ -1234,19 +1239,27 @@
}
} else {
mPhone.setDataRoamingEnabled(false);
+ MetricsLogger.action(getContext(),
+ getMetricsEventCategory(getPreferenceScreen(), mButtonDataRoam),
+ false);
+ return true;
}
- return true;
} else if (preference == mVideoCallingPref) {
// If mButton4glte is not checked, mVideoCallingPref should be disabled.
// So it only makes sense to call phoneMgr.enableVideoCalling if it's checked.
if (mButton4glte.isChecked()) {
- PhoneGlobals.getInstance().phoneMgr.enableVideoCalling((boolean) objValue);
+ mImsMgr.setVtSetting((boolean) objValue);
return true;
} else {
loge("mVideoCallingPref should be disabled if mButton4glte is not checked.");
mVideoCallingPref.setEnabled(false);
return false;
}
+ } else if (preference == getPreferenceScreen()
+ .findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY)
+ || preference == getPreferenceScreen()
+ .findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY)) {
+ return true;
}
updateBody();
@@ -1254,9 +1267,10 @@
return true;
}
- private boolean is4gLtePrefEnabled(Context context, PersistableBundle carrierConfig) {
+ private boolean is4gLtePrefEnabled(PersistableBundle carrierConfig) {
return (mTelephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE)
- && ImsManager.isNonTtyOrTtyOnVolteEnabled(context)
+ && mImsMgr != null
+ && mImsMgr.isNonTtyOrTtyOnVolteEnabled()
&& carrierConfig.getBoolean(
CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL);
}
@@ -1613,14 +1627,15 @@
} else {
removePref = true;
}
- } else if (!ImsManager.isWfcEnabledByPlatform(mPhone.getContext())
- || !ImsManager.isWfcProvisionedOnDevice(mPhone.getContext())) {
+ } else if (mImsMgr == null
+ || !mImsMgr.isWfcEnabledByPlatform()
+ || !mImsMgr.isWfcProvisionedOnDevice()) {
removePref = true;
} else {
int resId = com.android.internal.R.string.wifi_calling_off_summary;
- if (ImsManager.isWfcEnabledByUser(mPhone.getContext())) {
- boolean isRoaming = mButtonDataRoam.isChecked();
- int wfcMode = ImsManager.getWfcMode(mPhone.getContext(), isRoaming);
+ if (mImsMgr.isWfcEnabledByUser()) {
+ boolean isRoaming = mTelephonyManager.isNetworkRoaming();
+ int wfcMode = mImsMgr.getWfcMode(isRoaming);
switch (wfcMode) {
case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY:
resId = com.android.internal.R.string.wfc_mode_wifi_only_summary;
@@ -1646,6 +1661,34 @@
}
}
+ private void updateEnhanced4gLteState() {
+ if (mButton4glte == null) {
+ return;
+ }
+
+ PersistableBundle carrierConfig = PhoneGlobals.getInstance()
+ .getCarrierConfigForSubId(mPhone.getSubId());
+
+ try {
+ if ((mImsMgr == null
+ || mImsMgr.getImsServiceStatus() != ImsFeature.STATE_READY
+ || !mImsMgr.isVolteEnabledByPlatform()
+ || !mImsMgr.isVolteProvisionedOnDevice()
+ || carrierConfig.getBoolean(
+ CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL))) {
+ getPreferenceScreen().removePreference(mButton4glte);
+ } else {
+ // NOTE: Buttons will be enabled/disabled in mPhoneStateListener
+ boolean enh4glteMode = mImsMgr.isEnhanced4gLteModeSettingEnabledByUser()
+ && mImsMgr.isNonTtyOrTtyOnVolteEnabled();
+ mButton4glte.setChecked(enh4glteMode);
+ }
+ } catch (ImsException ex) {
+ log("Exception when trying to get ImsServiceStatus: " + ex);
+ getPreferenceScreen().removePreference(mButton4glte);
+ }
+ }
+
private void updateVideoCallState() {
if (mVideoCallingPref == null || mCallingCategory == null) {
return;
@@ -1654,30 +1697,23 @@
PersistableBundle carrierConfig = PhoneGlobals.getInstance()
.getCarrierConfigForSubId(mPhone.getSubId());
- boolean removePref = false;
-
- if (ImsManager.isVtEnabledByPlatform(mPhone.getContext())
- && ImsManager.isVtProvisionedOnDevice(mPhone.getContext())
+ if (mImsMgr != null
+ && mImsMgr.isVtEnabledByPlatform()
+ && mImsMgr.isVtProvisionedOnDevice()
&& (carrierConfig.getBoolean(
- CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS)
- || mPhone.mDcTracker.isDataEnabled())) {
- boolean enhanced4gLteEnabled = mButton4glte.isChecked();
- mVideoCallingPref.setEnabled(enhanced4gLteEnabled);
- boolean currentValue = enhanced4gLteEnabled
- ? PhoneGlobals.getInstance().phoneMgr.isVideoCallingEnabled(
- getContext().getOpPackageName()) : false;
- mVideoCallingPref.setChecked(currentValue);
- if (enhanced4gLteEnabled) {
+ CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS)
+ || mPhone.mDcTracker.isDataEnabled())) {
+ mCallingCategory.addPreference(mVideoCallingPref);
+ if (!mButton4glte.isChecked()) {
+ mVideoCallingPref.setEnabled(false);
+ mVideoCallingPref.setChecked(false);
+ } else {
+ mVideoCallingPref.setEnabled(true);
+ mVideoCallingPref.setChecked(mImsMgr.isVtEnabledByUser());
mVideoCallingPref.setOnPreferenceChangeListener(this);
}
} else {
- removePref = true;
- }
-
- if (removePref) {
mCallingCategory.removePreference(mVideoCallingPref);
- } else {
- mCallingCategory.addPreference(mVideoCallingPref);
}
}
@@ -1813,17 +1849,104 @@
return false;
}
+ /**
+ * Metrics events related methods. it takes care of all preferences possible in this
+ * fragment(except a few that log on their own). It doesn't only include preferences in
+ * network_setting_fragment.xml, but also those defined in GsmUmtsOptions and CdmaOptions.
+ */
private void sendMetricsEventPreferenceClicked(
PreferenceScreen preferenceScreen, Preference preference) {
- if (preference == mMobileDataPref) {
- MetricsLogger.action(getContext(),
- MetricsEvent.ACTION_MOBILE_NETWORK_MOBILE_DATA_TOGGLE,
- ((MobileDataPreference) preference).mChecked);
- } else if (preference == mDataUsagePref) {
- MetricsLogger.action(getContext(),
- MetricsEvent.ACTION_MOBILE_NETWORK_DATA_USAGE);
+ final int category = getMetricsEventCategory(preferenceScreen, preference);
+ if (category == MetricsEvent.VIEW_UNKNOWN) {
+ return;
}
- // TODO: add Metrics constants for other preferences and send events here accordingly.
+
+ // Send MetricsEvent on click. It includes preferences other than SwitchPreferences,
+ // which send MetricsEvent in onPreferenceChange.
+ // For ListPreferences, we log it here without a value, only indicating it's clicked to
+ // open the list dialog. When a value is chosen, another MetricsEvent is logged with
+ // new value in onPreferenceChange.
+ if (preference == mLteDataServicePref || preference == mDataUsagePref
+ || preference == mEuiccSettingsPref || preference == mAdvancedOptions
+ || preference == mWiFiCallingPref || preference == mButtonPreferredNetworkMode
+ || preference == mButtonEnabledNetworks
+ || preference == preferenceScreen.findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY)
+ || preference == preferenceScreen.findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY)
+ || preference == preferenceScreen.findPreference(BUTTON_GSM_APN_EXPAND_KEY)
+ || preference == preferenceScreen.findPreference(BUTTON_CDMA_APN_EXPAND_KEY)
+ || preference == preferenceScreen.findPreference(BUTTON_CARRIER_SETTINGS_KEY)) {
+ MetricsLogger.action(getContext(), category);
+ }
+ }
+
+ private void sendMetricsEventPreferenceChanged(
+ PreferenceScreen preferenceScreen, Preference preference, Object newValue) {
+ final int category = getMetricsEventCategory(preferenceScreen, preference);
+ if (category == MetricsEvent.VIEW_UNKNOWN) {
+ return;
+ }
+
+ // MetricsEvent logging with new value, for SwitchPreferences and ListPreferences.
+ if (preference == mButton4glte || preference == mVideoCallingPref) {
+ MetricsLogger.action(getContext(), category, (Boolean) newValue);
+ } else if (preference == mButtonPreferredNetworkMode
+ || preference == mButtonEnabledNetworks
+ || preference == preferenceScreen
+ .findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY)
+ || preference == preferenceScreen
+ .findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY)) {
+ // Network select preference sends metrics event in its own listener.
+ MetricsLogger.action(getContext(), category, Integer.valueOf((String) newValue));
+ }
+ }
+
+ private int getMetricsEventCategory(
+ PreferenceScreen preferenceScreen, Preference preference) {
+
+ if (preference == null) {
+ return MetricsEvent.VIEW_UNKNOWN;
+ } else if (preference == mMobileDataPref) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_MOBILE_DATA_TOGGLE;
+ } else if (preference == mButtonDataRoam) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_DATA_ROAMING_TOGGLE;
+ } else if (preference == mDataUsagePref) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_DATA_USAGE;
+ } else if (preference == mLteDataServicePref) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_SET_UP_DATA_SERVICE;
+ } else if (preference == mAdvancedOptions) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_EXPAND_ADVANCED_FIELDS;
+ } else if (preference == mButton4glte) {
+ return MetricsEvent.ACTION_MOBILE_ENHANCED_4G_LTE_MODE_TOGGLE;
+ } else if (preference == mButtonPreferredNetworkMode) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_SELECT_PREFERRED_NETWORK;
+ } else if (preference == mButtonEnabledNetworks) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_SELECT_ENABLED_NETWORK;
+ } else if (preference == mEuiccSettingsPref) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_EUICC_SETTING;
+ } else if (preference == mWiFiCallingPref) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_WIFI_CALLING;
+ } else if (preference == mVideoCallingPref) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_VIDEO_CALLING_TOGGLE;
+ } else if (preference == preferenceScreen
+ .findPreference(NetworkOperators.BUTTON_AUTO_SELECT_KEY)) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_AUTO_SELECT_NETWORK_TOGGLE;
+ } else if (preference == preferenceScreen
+ .findPreference(NetworkOperators.BUTTON_NETWORK_SELECT_KEY)) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK;
+ } else if (preference == preferenceScreen
+ .findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY)) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_CDMA_SYSTEM_SELECT;
+ } else if (preference == preferenceScreen
+ .findPreference(BUTTON_CDMA_SUBSCRIPTION_KEY)) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_CDMA_SUBSCRIPTION_SELECT;
+ } else if (preference == preferenceScreen.findPreference(BUTTON_GSM_APN_EXPAND_KEY)
+ || preference == preferenceScreen.findPreference(BUTTON_CDMA_APN_EXPAND_KEY)) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_APN_SETTINGS;
+ } else if (preference == preferenceScreen.findPreference(BUTTON_CARRIER_SETTINGS_KEY)) {
+ return MetricsEvent.ACTION_MOBILE_NETWORK_CARRIER_SETTINGS;
+ } else {
+ return MetricsEvent.VIEW_UNKNOWN;
+ }
}
private void updateGsmUmtsOptions(PreferenceFragment prefFragment,
diff --git a/src/com/android/phone/NetworkOperators.java b/src/com/android/phone/NetworkOperators.java
index 4ac5c84..05cfe42 100644
--- a/src/com/android/phone/NetworkOperators.java
+++ b/src/com/android/phone/NetworkOperators.java
@@ -30,6 +30,8 @@
import android.util.AttributeSet;
import android.util.Log;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.telephony.CommandException;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
@@ -112,6 +114,8 @@
if (preference == mAutoSelect) {
boolean autoSelect = (Boolean) newValue;
selectNetworkAutomatic(autoSelect);
+ MetricsLogger.action(getContext(),
+ MetricsEvent.ACTION_MOBILE_NETWORK_AUTO_SELECT_NETWORK_TOGGLE, autoSelect);
return true;
}
return false;
diff --git a/src/com/android/phone/NetworkQueryService.java b/src/com/android/phone/NetworkQueryService.java
index 84fde87..86f4b11 100644
--- a/src/com/android/phone/NetworkQueryService.java
+++ b/src/com/android/phone/NetworkQueryService.java
@@ -19,7 +19,6 @@
import android.app.Service;
import android.content.Context;
import android.content.Intent;
-import com.android.internal.telephony.OperatorInfo;
import android.os.AsyncResult;
import android.os.Binder;
import android.os.Handler;
@@ -27,12 +26,23 @@
import android.os.Message;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
-import android.telephony.SubscriptionManager;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneFactory;
+import android.telephony.AccessNetworkConstants;
+import android.telephony.CellIdentityGsm;
+import android.telephony.CellInfo;
+import android.telephony.CellInfoGsm;
+import android.telephony.NetworkScan;
+import android.telephony.NetworkScanRequest;
+import android.telephony.RadioAccessSpecifier;
+import android.telephony.TelephonyManager;
+import android.telephony.TelephonyScanManager;
import android.util.Log;
+import com.android.internal.telephony.OperatorInfo;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneFactory;
+
import java.util.ArrayList;
+import java.util.List;
/**
* Service code used to assist in querying the network for service
@@ -44,7 +54,10 @@
private static final boolean DBG = true;
// static events
- private static final int EVENT_NETWORK_SCAN_COMPLETED = 100;
+ private static final int EVENT_NETWORK_SCAN_VIA_PHONE_COMPLETED = 100;
+ private static final int EVENT_NETWORK_SCAN_RESULTS = 200;
+ private static final int EVENT_NETWORK_SCAN_ERROR = 300;
+ private static final int EVENT_NETWORK_SCAN_COMPLETED = 400;
// static states indicating the query status of the service
private static final int QUERY_READY = -1;
@@ -55,10 +68,20 @@
public static final int QUERY_EXCEPTION = 1;
static final String ACTION_LOCAL_BINDER = "com.android.phone.intent.action.LOCAL_BINDER";
-
+
/** state of the query service */
private int mState;
-
+
+ private NetworkScan mNetworkScan;
+
+ // NetworkScanRequest parameters
+ private static final int SCAN_TYPE = NetworkScanRequest.SCAN_TYPE_ONE_SHOT;
+ private static final boolean INCREMENTAL_RESULTS = true;
+ // The parameters below are in seconds
+ private static final int SEARCH_PERIODICITY_SEC = 5;
+ private static final int MAX_SEARCH_TIME_SEC = 60;
+ private static final int INCREMENTAL_RESULTS_PERIODICITY_SEC = 3;
+
/**
* Class for clients to access. Because we know this service always
* runs in the same process as its clients, we don't need to deal with
@@ -81,57 +104,150 @@
switch (msg.what) {
// if the scan is complete, broadcast the results.
// to all registerd callbacks.
+ case EVENT_NETWORK_SCAN_VIA_PHONE_COMPLETED:
+ if (DBG) log("scan via Phone completed, broadcasting results");
+ broadcastQueryResults(msg);
+ break;
+
+ case EVENT_NETWORK_SCAN_RESULTS:
+ if (DBG) log("get scan results, broadcasting results");
+ broadcastQueryResults(msg);
+ break;
+
+ case EVENT_NETWORK_SCAN_ERROR:
+ if (DBG) log("get scan error, broadcasting error code");
+ broadcastQueryResults(msg);
+ break;
+
case EVENT_NETWORK_SCAN_COMPLETED:
- if (DBG) log("scan completed, broadcasting results");
- broadcastQueryResults((AsyncResult) msg.obj);
+ if (DBG) log("network scan or stop network query completed");
+ broadcastQueryResults(msg);
break;
}
}
};
-
- /**
+
+ /**
* List of callback objects, also used to synchronize access to
* itself and to changes in state.
*/
final RemoteCallbackList<INetworkQueryServiceCallback> mCallbacks =
- new RemoteCallbackList<INetworkQueryServiceCallback> ();
-
+ new RemoteCallbackList<INetworkQueryServiceCallback>();
+
+ /**
+ * This implementation of NetworkScanCallbackImpl is used to receive callback notifications from
+ * the Telephony Manager.
+ */
+ public class NetworkScanCallbackImpl extends TelephonyScanManager.NetworkScanCallback {
+
+ /** Returns the scan results to the user, this callback will be called at least one time. */
+ public void onResults(List<CellInfo> results) {
+ if (DBG) log("got network scan results: " + results.size());
+ Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_RESULTS, results);
+ msg.sendToTarget();
+ }
+
+ /**
+ * Informs the user that the scan has stopped.
+ *
+ * This callback will be called when the scan is finished or cancelled by the user.
+ * The related NetworkScanRequest will be deleted after this callback.
+ */
+ public void onComplete() {
+ if (DBG) log("network scan completed");
+ Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED);
+ msg.sendToTarget();
+ }
+
+ /**
+ * Informs the user that there is some error about the scan.
+ *
+ * This callback will be called whenever there is any error about the scan, and the scan
+ * will be terminated. onComplete() will NOT be called.
+ */
+ public void onError(int error) {
+ if (DBG) log("network scan got error: " + error);
+ Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_ERROR, error, 0 /* arg2 */);
+ msg.sendToTarget();
+ }
+ }
+
/**
* Implementation of the INetworkQueryService interface.
*/
private final INetworkQueryService.Stub mBinder = new INetworkQueryService.Stub() {
-
+
/**
* Starts a query with a INetworkQueryServiceCallback object if
* one has not been started yet. Ignore the new query request
* if the query has been started already. Either way, place the
- * callback object in the queue to be notified upon request
+ * callback object in the queue to be notified upon request
* completion.
*/
- public void startNetworkQuery(INetworkQueryServiceCallback cb, int phoneId) {
+ public void startNetworkQuery(
+ INetworkQueryServiceCallback cb, int phoneId, boolean isIncrementalResult) {
if (cb != null) {
// register the callback to the list of callbacks.
synchronized (mCallbacks) {
mCallbacks.register(cb);
if (DBG) log("registering callback " + cb.getClass().toString());
-
+
switch (mState) {
case QUERY_READY:
- // TODO: we may want to install a timeout here in case we
- // do not get a timely response from the RIL.
- Phone phone = PhoneFactory.getPhone(phoneId);
- if (phone != null) {
- phone.getAvailableNetworks(
- mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED));
+
+ if (isIncrementalResult) {
+ if (DBG) log("start network scan via TelephonManager");
+ TelephonyManager tm = (TelephonyManager) getSystemService(
+ Context.TELEPHONY_SERVICE);
+ // The Radio Access Specifiers below are meant to scan
+ // all the bands for all the supported technologies.
+ RadioAccessSpecifier gsm = new RadioAccessSpecifier(
+ AccessNetworkConstants.AccessNetworkType.GERAN,
+ null /* bands */,
+ null /* channels */);
+ RadioAccessSpecifier lte = new RadioAccessSpecifier(
+ AccessNetworkConstants.AccessNetworkType.EUTRAN,
+ null /* bands */,
+ null /* channels */);
+ RadioAccessSpecifier wcdma = new RadioAccessSpecifier(
+ AccessNetworkConstants.AccessNetworkType.UTRAN,
+ null /* bands */,
+ null /* channels */);
+ RadioAccessSpecifier[] radioAccessSpecifier = {gsm, lte, wcdma};
+ NetworkScanRequest networkScanRequest = new NetworkScanRequest(
+ SCAN_TYPE,
+ radioAccessSpecifier,
+ SEARCH_PERIODICITY_SEC,
+ MAX_SEARCH_TIME_SEC,
+ INCREMENTAL_RESULTS,
+ INCREMENTAL_RESULTS_PERIODICITY_SEC,
+ null /* List of PLMN ids (MCC-MNC) */);
+
+ // Construct a NetworkScanCallback
+ NetworkQueryService.NetworkScanCallbackImpl
+ networkScanCallback =
+ new NetworkQueryService.NetworkScanCallbackImpl();
+
+ // Request network scan
+ mNetworkScan = tm.requestNetworkScan(networkScanRequest,
+ networkScanCallback);
mState = QUERY_IS_RUNNING;
- if (DBG) log("starting new query");
} else {
- if (DBG) {
- log("phone is null");
+ Phone phone = PhoneFactory.getPhone(phoneId);
+ if (phone != null) {
+ phone.getAvailableNetworks(
+ mHandler.obtainMessage(
+ EVENT_NETWORK_SCAN_VIA_PHONE_COMPLETED));
+ mState = QUERY_IS_RUNNING;
+ if (DBG) log("start network scan via Phone");
+ } else {
+ if (DBG) {
+ log("phone is null");
+ }
}
}
+
break;
-
// do nothing if we're currently busy.
case QUERY_IS_RUNNING:
if (DBG) log("query already in progress");
@@ -141,19 +257,24 @@
}
}
}
-
+
/**
* Stops a query with a INetworkQueryServiceCallback object as
* a token.
*/
- public void stopNetworkQuery(INetworkQueryServiceCallback cb) {
- // currently we just unregister the callback, since there is
- // no way to tell the RIL to terminate the query request.
- // This means that the RIL may still be busy after the stop
- // request was made, but the state tracking logic ensures
- // that the delay will only last for 1 request even with
- // repeated button presses in the NetworkSetting activity.
- unregisterCallback(cb);
+ public void stopNetworkQuery() {
+ if (DBG) log("stop network query");
+ // Tells the RIL to terminate the query request.
+ if (mNetworkScan != null) {
+ try {
+ mNetworkScan.stop();
+ mState = QUERY_READY;
+ } catch (RemoteException e) {
+ if (DBG) log("stop mNetworkScan failed");
+ } catch (IllegalArgumentException e) {
+ // Do nothing, scan has already completed.
+ }
+ }
}
/**
@@ -171,7 +292,7 @@
@Override
public void onCreate() {
- mState = QUERY_READY;
+ mState = QUERY_READY;
}
/**
@@ -180,7 +301,7 @@
@Override
public void onStart(Intent intent, int startId) {
}
-
+
/**
* Handle the bind request.
*/
@@ -198,38 +319,85 @@
* Broadcast the results from the query to all registered callback
* objects.
*/
- private void broadcastQueryResults (AsyncResult ar) {
+ private void broadcastQueryResults(Message msg) {
// reset the state.
synchronized (mCallbacks) {
mState = QUERY_READY;
-
- // see if we need to do any work.
- if (ar == null) {
- if (DBG) log("AsyncResult is null.");
- return;
- }
-
- // TODO: we may need greater accuracy here, but for now, just a
- // simple status integer will suffice.
- int exception = (ar.exception == null) ? QUERY_OK : QUERY_EXCEPTION;
- if (DBG) log("AsyncResult has exception " + exception);
-
+
// Make the calls to all the registered callbacks.
for (int i = (mCallbacks.beginBroadcast() - 1); i >= 0; i--) {
- INetworkQueryServiceCallback cb = mCallbacks.getBroadcastItem(i);
+ INetworkQueryServiceCallback cb = mCallbacks.getBroadcastItem(i);
if (DBG) log("broadcasting results to " + cb.getClass().toString());
try {
- cb.onQueryComplete((ArrayList<OperatorInfo>) ar.result, exception);
+ switch (msg.what) {
+ case EVENT_NETWORK_SCAN_VIA_PHONE_COMPLETED:
+ AsyncResult ar = (AsyncResult) msg.obj;
+ if (ar != null) {
+ cb.onResults(getCellInfoList((List<OperatorInfo>) ar.result));
+ } else {
+ if (DBG) log("AsyncResult is null.");
+ }
+ // Send the onComplete() callback to indicate the one-time network
+ // scan has completed.
+ cb.onComplete();
+ break;
+
+ case EVENT_NETWORK_SCAN_RESULTS:
+ cb.onResults((List<CellInfo>) msg.obj);
+ break;
+
+ case EVENT_NETWORK_SCAN_COMPLETED:
+ cb.onComplete();
+ break;
+
+ case EVENT_NETWORK_SCAN_ERROR:
+ cb.onError(msg.arg1);
+ break;
+ }
} catch (RemoteException e) {
}
}
-
+
// finish up.
mCallbacks.finishBroadcast();
}
}
-
+
+ /**
+ * Wraps up a list of OperatorInfo object to a list of CellInfo object. GsmCellInfo is used here
+ * only because operatorInfo does not contain technology type while CellInfo is an abstract
+ * object that requires to specify technology type. It doesn't matter which CellInfo type to
+ * use here, since we only want to wrap the operator info and PLMN to a CellInfo object.
+ */
+ private List<CellInfo> getCellInfoList(List<OperatorInfo> operatorInfoList) {
+ List<CellInfo> cellInfoList = new ArrayList<>();
+ for (OperatorInfo oi: operatorInfoList) {
+ String operatorNumeric = oi.getOperatorNumeric();
+ String mcc = null;
+ String mnc = null;
+ log("operatorNumeric: " + operatorNumeric);
+ if (operatorNumeric != null && operatorNumeric.matches("^[0-9]{5,6}$")) {
+ mcc = operatorNumeric.substring(0, 3);
+ mnc = operatorNumeric.substring(3);
+ }
+ CellIdentityGsm cig = new CellIdentityGsm(
+ Integer.MAX_VALUE /* lac */,
+ Integer.MAX_VALUE /* cid */,
+ Integer.MAX_VALUE /* arfcn */,
+ Integer.MAX_VALUE /* bsic */,
+ mcc,
+ mnc,
+ oi.getOperatorAlphaLong(),
+ oi.getOperatorAlphaShort());
+
+ CellInfoGsm ci = new CellInfoGsm();
+ ci.setCellIdentity(cig);
+ cellInfoList.add(ci);
+ }
+ return cellInfoList;
+ }
+
private static void log(String msg) {
Log.d(LOG_TAG, msg);
- }
-}
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/phone/NetworkSelectListPreference.java b/src/com/android/phone/NetworkSelectListPreference.java
index 936c2a0..cc54b09 100644
--- a/src/com/android/phone/NetworkSelectListPreference.java
+++ b/src/com/android/phone/NetworkSelectListPreference.java
@@ -19,6 +19,7 @@
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
+import android.metrics.LogMaker;
import android.os.AsyncResult;
import android.os.Handler;
import android.os.Message;
@@ -27,6 +28,16 @@
import android.os.RemoteException;
import android.preference.ListPreference;
import android.preference.Preference;
+import android.telephony.CellInfo;
+import android.telephony.CellInfoCdma;
+import android.telephony.CellInfoGsm;
+import android.telephony.CellInfoLte;
+import android.telephony.CellInfoWcdma;
+import android.telephony.CellSignalStrengthCdma;
+import android.telephony.CellSignalStrengthGsm;
+import android.telephony.CellSignalStrengthLte;
+import android.telephony.CellSignalStrengthWcdma;
+import android.telephony.NetworkScan;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.BidiFormatter;
@@ -35,10 +46,13 @@
import android.util.AttributeSet;
import android.util.Log;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.telephony.OperatorInfo;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
+import java.util.ArrayList;
import java.util.List;
@@ -54,19 +68,22 @@
private static final String LOG_TAG = "networkSelect";
private static final boolean DBG = true;
- private static final int EVENT_NETWORK_SCAN_COMPLETED = 100;
- private static final int EVENT_NETWORK_SELECTION_DONE = 200;
+ private static final int EVENT_NETWORK_SELECTION_DONE = 1;
+ private static final int EVENT_NETWORK_SCAN_RESULTS = 2;
+ private static final int EVENT_NETWORK_SCAN_ERROR = 3;
+ private static final int EVENT_NETWORK_SCAN_COMPLETED = 4;
//dialog ids
private static final int DIALOG_NETWORK_SELECTION = 100;
private static final int DIALOG_NETWORK_LIST_LOAD = 200;
private int mPhoneId = SubscriptionManager.INVALID_PHONE_INDEX;
- private List<OperatorInfo> mOperatorInfoList;
- private OperatorInfo mOperatorInfo;
+ private List<CellInfo> mCellInfoList;
+ private CellInfo mCellInfo;
private int mSubId;
private NetworkOperators mNetworkOperators;
+ private boolean mNeedScanAgain;
private ProgressDialog mProgressDialog;
public NetworkSelectListPreference(Context context, AttributeSet attrs) {
@@ -74,13 +91,15 @@
}
public NetworkSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
+ int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onClick() {
- loadNetworksList();
+ sendMetricsEvent(null);
+ // Scan the network with setting the isIncrementalResult as true via TelephonyManager first.
+ loadNetworksList(true);
}
private final Handler mHandler = new Handler() {
@@ -88,10 +107,6 @@
public void handleMessage(Message msg) {
AsyncResult ar;
switch (msg.what) {
- case EVENT_NETWORK_SCAN_COMPLETED:
- networksListLoaded((List<OperatorInfo>) msg.obj, msg.arg1);
- break;
-
case EVENT_NETWORK_SELECTION_DONE:
if (DBG) logd("hideProgressPanel");
try {
@@ -106,15 +121,98 @@
mNetworkOperators.displayNetworkSelectionFailed(ar.exception);
} else {
if (DBG) {
- logd("manual network selection: succeeded!"
- + getNetworkTitle(mOperatorInfo));
+ logd("manual network selection: succeeded! "
+ + getNetworkTitle(mCellInfo));
}
mNetworkOperators.displayNetworkSelectionSucceeded();
}
mNetworkOperators.getNetworkSelectionMode();
break;
- }
+ case EVENT_NETWORK_SCAN_RESULTS:
+ List<CellInfo> results = (List<CellInfo>) msg.obj;
+ results.removeIf(cellInfo -> cellInfo == null);
+ if (results.size() > 0) {
+ boolean isInvalidCellInfoList = true;
+ // Regard the list as invalid only if all the elements in the list are
+ // invalid.
+ for (CellInfo cellInfo : results) {
+ if (!isInvalidCellInfo(cellInfo)) {
+ isInvalidCellInfoList = false;
+ break;
+ }
+ }
+ if (isInvalidCellInfoList) {
+ mNeedScanAgain = true;
+ if (DBG) {
+ logd("Invalid cell info. Stop current network scan "
+ + "and start a new one via old API");
+ }
+ // Stop current network scan flow. This behavior will result in a
+ // onComplete() callback, after which we will start a new network query
+ // via Phone.getAvailableNetworks(). This behavior might also result in
+ // a onError() callback if the modem did not stop network query
+ // successfully. In this case we will display network query failed
+ // instead of resending a new request.
+ try {
+ if (mNetworkQueryService != null) {
+ mNetworkQueryService.stopNetworkQuery();
+ }
+ } catch (RemoteException e) {
+ loge("exception from stopNetworkQuery " + e);
+ }
+ } else {
+ // TODO(b/70530820): Display the scan results incrementally after
+ // finalizing the UI desing on Mobile Network Setting page. For now,
+ // just update the CellInfo list when received the onResult callback,
+ // and display the scan result when received the onComplete callback
+ // in the end.
+ mCellInfoList = new ArrayList<>(results);
+ if (DBG) logd("CALLBACK_SCAN_RESULTS" + mCellInfoList.toString());
+ }
+ }
+
+ break;
+
+ case EVENT_NETWORK_SCAN_ERROR:
+ int error = msg.arg1;
+ if (DBG) logd("error while querying available networks " + error);
+ if (error == NetworkScan.ERROR_UNSUPPORTED) {
+ if (DBG) {
+ logd("Modem does not support: try to scan network again via Phone");
+ }
+ loadNetworksList(false);
+ } else {
+ try {
+ if (mNetworkQueryService != null) {
+ mNetworkQueryService.unregisterCallback(mCallback);
+ }
+ } catch (RemoteException e) {
+ loge("onError: exception from unregisterCallback " + e);
+ }
+ displayNetworkQueryFailed(error);
+ }
+ break;
+
+ case EVENT_NETWORK_SCAN_COMPLETED:
+ if (mNeedScanAgain) {
+ logd("CellInfo is invalid to display. Start a new scan via Phone. ");
+ loadNetworksList(false);
+ mNeedScanAgain = false;
+ } else {
+ try {
+ if (mNetworkQueryService != null) {
+ mNetworkQueryService.unregisterCallback(mCallback);
+ }
+ } catch (RemoteException e) {
+ loge("onComplete: exception from unregisterCallback " + e);
+ }
+ if (DBG) logd("scan complete, load the cellInfosList");
+ // Modify UI to indicate users that the scan has completed.
+ networksListLoaded();
+ }
+ break;
+ }
return;
}
};
@@ -126,11 +224,34 @@
*/
private final INetworkQueryServiceCallback mCallback = new INetworkQueryServiceCallback.Stub() {
- /** place the message on the looper queue upon query completion. */
- public void onQueryComplete(List<OperatorInfo> networkInfoArray, int status) {
- if (DBG) logd("notifying message loop of query completion.");
- Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED,
- status, 0, networkInfoArray);
+ /** Returns the scan results to the user, this callback will be called at lease one time. */
+ public void onResults(List<CellInfo> results) {
+ if (DBG) logd("get scan results.");
+ Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_RESULTS, results);
+ msg.sendToTarget();
+ }
+
+ /**
+ * Informs the user that the scan has stopped.
+ *
+ * This callback will be called when the scan is finished or cancelled by the user.
+ * The related NetworkScanRequest will be deleted after this callback.
+ */
+ public void onComplete() {
+ if (DBG) logd("network scan completed.");
+ Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED);
+ msg.sendToTarget();
+ }
+
+ /**
+ * Informs the user that there is some error about the scan.
+ *
+ * This callback will be called whenever there is any error about the scan, and the scan
+ * will be terminated. onComplete() will NOT be called.
+ */
+ public void onError(int error) {
+ if (DBG) logd("get onError callback with error code: " + error);
+ Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_ERROR, error, 0 /* arg2 */);
msg.sendToTarget();
}
};
@@ -138,10 +259,12 @@
@Override
//implemented for DialogInterface.OnCancelListener
public void onCancel(DialogInterface dialog) {
+ if (DBG) logd("user manually close the dialog");
// request that the service stop the query with this callback object.
try {
if (mNetworkQueryService != null) {
- mNetworkQueryService.stopNetworkQuery(mCallback);
+ mNetworkQueryService.stopNetworkQuery();
+ mNetworkQueryService.unregisterCallback(mCallback);
}
// If cancelled, we query NetworkSelectMode and update states of AutoSelect button.
mNetworkOperators.getNetworkSelectionMode();
@@ -160,18 +283,6 @@
}
}
- /**
- * Return normalized carrier name given network info.
- *
- * @param ni is network information in OperatorInfo type.
- */
- public String getNormalizedCarrierName(OperatorInfo ni) {
- if (ni != null) {
- return ni.getOperatorAlphaLong() + " (" + ni.getOperatorNumeric() + ")";
- }
- return null;
- }
-
// This method is provided besides initialize() because bind to network query service
// may be binded after initialize(). In that case this method needs to be called explicitly
// to set mNetworkQueryService. Otherwise mNetworkQueryService will remain null.
@@ -181,12 +292,13 @@
// This initialize method needs to be called for this preference to work properly.
protected void initialize(int subId, INetworkQueryService queryService,
- NetworkOperators networkOperators, ProgressDialog progressDialog) {
+ NetworkOperators networkOperators, ProgressDialog progressDialog) {
mSubId = subId;
mNetworkQueryService = queryService;
mNetworkOperators = networkOperators;
// This preference should share the same progressDialog with networkOperators category.
mProgressDialog = progressDialog;
+ mNeedScanAgain = false;
if (SubscriptionManager.isValidSubscriptionId(mSubId)) {
mPhoneId = SubscriptionManager.getPhoneId(mSubId);
@@ -232,7 +344,7 @@
}
private void displayNetworkSelectionInProgress() {
- showProgressBar(DIALOG_NETWORK_SELECTION);
+ showProgressDialog(DIALOG_NETWORK_SELECTION);
}
private void displayNetworkQueryFailed(int error) {
@@ -249,15 +361,17 @@
NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status);
}
- private void loadNetworksList() {
+ private void loadNetworksList(boolean isIncrementalResult) {
if (DBG) logd("load networks list...");
- showProgressBar(DIALOG_NETWORK_LIST_LOAD);
+ if (!mNeedScanAgain) {
+ // Avoid blinking while showing the dialog again.
+ showProgressDialog(DIALOG_NETWORK_LIST_LOAD);
+ }
- // delegate query request to the service.
try {
if (mNetworkQueryService != null) {
- mNetworkQueryService.startNetworkQuery(mCallback, mPhoneId);
+ mNetworkQueryService.startNetworkQuery(mCallback, mPhoneId, isIncrementalResult);
} else {
displayNetworkQueryFailed(NetworkQueryService.QUERY_EXCEPTION);
}
@@ -267,25 +381,9 @@
}
}
- /**
- * networksListLoaded has been rewritten to take an array of
- * OperatorInfo objects and a status field, instead of an
- * AsyncResult. Otherwise, the functionality which takes the
- * OperatorInfo array and creates a list of preferences from it,
- * remains unchanged.
- */
- private void networksListLoaded(List<OperatorInfo> result, int status) {
+ private void networksListLoaded() {
if (DBG) logd("networks list loaded");
- // used to un-register callback
- try {
- if (mNetworkQueryService != null) {
- mNetworkQueryService.unregisterCallback(mCallback);
- }
- } catch (RemoteException e) {
- loge("networksListLoaded: exception from unregisterCallback " + e);
- }
-
// update the state of the preferences.
if (DBG) logd("hideProgressPanel");
@@ -301,49 +399,106 @@
}
setEnabled(true);
- clearList();
- if (status != NetworkQueryService.QUERY_OK) {
- if (DBG) logd("error while querying available networks");
- displayNetworkQueryFailed(status);
- } else {
- if (result != null) {
- // create a preference for each item in the list.
- // just use the operator name instead of the mildly
- // confusing mcc/mnc.
- mOperatorInfoList = result;
- CharSequence[] networkEntries = new CharSequence[result.size()];
- CharSequence[] networkEntryValues = new CharSequence[result.size()];
- for (int i = 0; i < mOperatorInfoList.size(); i++) {
- if (mOperatorInfoList.get(i).getState() == OperatorInfo.State.FORBIDDEN) {
- networkEntries[i] = getNetworkTitle(mOperatorInfoList.get(i))
- + " "
- + getContext().getResources().getString(R.string.forbidden_network);
- } else {
- networkEntries[i] = getNetworkTitle(mOperatorInfoList.get(i));
- }
- networkEntryValues[i] = Integer.toString(i + 2);
+ if (mCellInfoList != null) {
+ // create a preference for each item in the list.
+ // just use the operator name instead of the mildly
+ // confusing mcc/mnc.
+ List<CharSequence> networkEntriesList = new ArrayList<>();
+ List<CharSequence> networkEntryValuesList = new ArrayList<>();
+ for (CellInfo cellInfo: mCellInfoList) {
+ // Display each operator name only once.
+ String networkTitle = getNetworkTitle(cellInfo);
+ if (!networkEntriesList.contains(networkTitle)) {
+ networkEntriesList.add(networkTitle);
+ networkEntryValuesList.add(Integer.toString(networkEntriesList.size() + 1));
}
-
- setEntries(networkEntries);
- setEntryValues(networkEntryValues);
-
- super.onClick();
- } else {
- displayEmptyNetworkList();
}
+ setEntries(networkEntriesList.toArray(new CharSequence[networkEntriesList.size()]));
+ setEntryValues(networkEntryValuesList.toArray(
+ new CharSequence[networkEntryValuesList.size()]));
+
+ super.onClick();
+ } else {
+ displayEmptyNetworkList();
}
}
+ private void dismissProgressBar() {
+ if (mProgressDialog != null && mProgressDialog.isShowing()) {
+ mProgressDialog.dismiss();
+ }
+ }
+
+ private void showProgressDialog(int id) {
+ if (mProgressDialog == null) {
+ mProgressDialog = new ProgressDialog(getContext());
+ } else {
+ // Dismiss progress bar if it's showing now.
+ dismissProgressBar();
+ }
+
+ switch (id) {
+ case DIALOG_NETWORK_SELECTION:
+ final String networkSelectMsg = getContext().getResources()
+ .getString(R.string.register_on_network,
+ getNetworkTitle(mCellInfo));
+ mProgressDialog.setMessage(networkSelectMsg);
+ mProgressDialog.setCanceledOnTouchOutside(false);
+ mProgressDialog.setCancelable(false);
+ mProgressDialog.setIndeterminate(true);
+ break;
+ case DIALOG_NETWORK_LIST_LOAD:
+ mProgressDialog.setMessage(
+ getContext().getResources().getString(R.string.load_networks_progress));
+ mProgressDialog.setCanceledOnTouchOutside(false);
+ mProgressDialog.setCancelable(true);
+ mProgressDialog.setIndeterminate(false);
+ mProgressDialog.setOnCancelListener(this);
+ break;
+ default:
+ }
+ mProgressDialog.show();
+ }
+
+ /**
+ * Implemented to support onPreferenceChangeListener to look for preference
+ * changes specifically on this button.
+ *
+ * @param preference is the preference to be changed, should be network select button.
+ * @param newValue should be the value of the selection as index of operators.
+ */
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ int operatorIndex = findIndexOfValue((String) newValue);
+ mCellInfo = mCellInfoList.get(operatorIndex);
+ if (DBG) logd("selected network: " + mCellInfo.toString());
+
+ sendMetricsEvent(getNetworkTitle(mCellInfo));
+
+ Message msg = mHandler.obtainMessage(EVENT_NETWORK_SELECTION_DONE);
+ Phone phone = PhoneFactory.getPhone(mPhoneId);
+ if (phone != null) {
+ OperatorInfo operatorInfo = getOperatorInfoFromCellInfo(mCellInfo);
+ if (DBG) logd("manually selected network: " + operatorInfo.toString());
+ phone.selectNetworkManually(operatorInfo, true, msg);
+ displayNetworkSelectionInProgress();
+ } else {
+ loge("Error selecting network. phone is null.");
+ }
+ return true;
+ }
+
/**
* Returns the title of the network obtained in the manual search.
*
- * @param ni contains the information of the network.
- *
+ * @param cellInfo contains the information of the network.
* @return Long Name if not null/empty, otherwise Short Name if not null/empty,
* else MCCMNC string.
*/
- private String getNetworkTitle(OperatorInfo ni) {
+ private String getNetworkTitle(CellInfo cellInfo) {
+ OperatorInfo ni = getOperatorInfoFromCellInfo(cellInfo);
+
if (!TextUtils.isEmpty(ni.getOperatorAlphaLong())) {
return ni.getOperatorAlphaLong();
} else if (!TextUtils.isEmpty(ni.getOperatorAlphaShort())) {
@@ -354,74 +509,79 @@
}
}
- private void clearList() {
- if (mOperatorInfoList != null) {
- mOperatorInfoList.clear();
- }
- }
-
- private void dismissProgressBar() {
- if (mProgressDialog != null && mProgressDialog.isShowing()) {
- mProgressDialog.dismiss();
- }
- }
-
- private void showProgressBar(int id) {
- if (mProgressDialog == null) {
- mProgressDialog = new ProgressDialog(getContext());
+ /**
+ * Wrap a cell info into an operator info.
+ */
+ private OperatorInfo getOperatorInfoFromCellInfo(CellInfo cellInfo) {
+ OperatorInfo oi;
+ if (cellInfo instanceof CellInfoLte) {
+ CellInfoLte lte = (CellInfoLte) cellInfo;
+ oi = new OperatorInfo(
+ (String) lte.getCellIdentity().getOperatorAlphaLong(),
+ (String) lte.getCellIdentity().getOperatorAlphaShort(),
+ lte.getCellIdentity().getMobileNetworkOperator());
+ } else if (cellInfo instanceof CellInfoWcdma) {
+ CellInfoWcdma wcdma = (CellInfoWcdma) cellInfo;
+ oi = new OperatorInfo(
+ (String) wcdma.getCellIdentity().getOperatorAlphaLong(),
+ (String) wcdma.getCellIdentity().getOperatorAlphaShort(),
+ wcdma.getCellIdentity().getMobileNetworkOperator());
+ } else if (cellInfo instanceof CellInfoGsm) {
+ CellInfoGsm gsm = (CellInfoGsm) cellInfo;
+ oi = new OperatorInfo(
+ (String) gsm.getCellIdentity().getOperatorAlphaLong(),
+ (String) gsm.getCellIdentity().getOperatorAlphaShort(),
+ gsm.getCellIdentity().getMobileNetworkOperator());
+ } else if (cellInfo instanceof CellInfoCdma) {
+ CellInfoCdma cdma = (CellInfoCdma) cellInfo;
+ oi = new OperatorInfo(
+ (String) cdma.getCellIdentity().getOperatorAlphaLong(),
+ (String) cdma.getCellIdentity().getOperatorAlphaShort(),
+ "" /* operator numeric */);
} else {
- // Dismiss progress bar if it's showing now.
- dismissProgressBar();
+ oi = new OperatorInfo("", "", "");
}
-
- if ((id == DIALOG_NETWORK_SELECTION) || (id == DIALOG_NETWORK_LIST_LOAD)) {
- switch (id) {
- case DIALOG_NETWORK_SELECTION:
- final String networkSelectMsg = getContext().getResources()
- .getString(R.string.register_on_network,
- getNetworkTitle(mOperatorInfo));
- mProgressDialog.setMessage(networkSelectMsg);
- mProgressDialog.setCanceledOnTouchOutside(false);
- mProgressDialog.setCancelable(false);
- mProgressDialog.setIndeterminate(true);
- break;
- case DIALOG_NETWORK_LIST_LOAD:
- mProgressDialog.setMessage(
- getContext().getResources().getString(R.string.load_networks_progress));
- mProgressDialog.setCanceledOnTouchOutside(false);
- mProgressDialog.setCancelable(true);
- mProgressDialog.setIndeterminate(false);
- mProgressDialog.setOnCancelListener(this);
- break;
- default:
- }
- mProgressDialog.show();
- }
+ return oi;
}
+
/**
- * Implemented to support onPreferenceChangeListener to look for preference
- * changes specifically on this button.
- *
- * @param preference is the preference to be changed, should be network select button.
- * @param newValue should be the value of the selection as index of operators.
+ * Check if the CellInfo is valid to display. If a CellInfo has signal strength but does
+ * not have operator info, it is invalid to display.
*/
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- int operatorIndex = findIndexOfValue((String) newValue);
- mOperatorInfo = mOperatorInfoList.get(operatorIndex);
-
- if (DBG) logd("selected network: " + getNetworkTitle(mOperatorInfo));
-
- Message msg = mHandler.obtainMessage(EVENT_NETWORK_SELECTION_DONE);
- Phone phone = PhoneFactory.getPhone(mPhoneId);
- if (phone != null) {
- phone.selectNetworkManually(mOperatorInfo, true, msg);
- displayNetworkSelectionInProgress();
+ private boolean isInvalidCellInfo(CellInfo cellInfo) {
+ if (DBG) logd("Check isInvalidCellInfo: " + cellInfo.toString());
+ CharSequence al = null;
+ CharSequence as = null;
+ boolean hasSignalStrength = false;
+ if (cellInfo instanceof CellInfoLte) {
+ CellInfoLte lte = (CellInfoLte) cellInfo;
+ al = lte.getCellIdentity().getOperatorAlphaLong();
+ as = lte.getCellIdentity().getOperatorAlphaShort();
+ hasSignalStrength = !lte.getCellSignalStrength().equals(new CellSignalStrengthLte());
+ } else if (cellInfo instanceof CellInfoWcdma) {
+ CellInfoWcdma wcdma = (CellInfoWcdma) cellInfo;
+ al = wcdma.getCellIdentity().getOperatorAlphaLong();
+ as = wcdma.getCellIdentity().getOperatorAlphaShort();
+ hasSignalStrength = !wcdma.getCellSignalStrength().equals(
+ new CellSignalStrengthWcdma());
+ } else if (cellInfo instanceof CellInfoGsm) {
+ CellInfoGsm gsm = (CellInfoGsm) cellInfo;
+ al = gsm.getCellIdentity().getOperatorAlphaLong();
+ as = gsm.getCellIdentity().getOperatorAlphaShort();
+ hasSignalStrength = !gsm.getCellSignalStrength().equals(new CellSignalStrengthGsm());
+ } else if (cellInfo instanceof CellInfoCdma) {
+ CellInfoCdma cdma = (CellInfoCdma) cellInfo;
+ al = cdma.getCellIdentity().getOperatorAlphaLong();
+ as = cdma.getCellIdentity().getOperatorAlphaShort();
+ hasSignalStrength = !cdma.getCellSignalStrength().equals(new CellSignalStrengthCdma());
} else {
- loge("Error selecting network. phone is null.");
+ return true;
}
-
- return true;
+ if (TextUtils.isEmpty(al) && TextUtils.isEmpty(as) && hasSignalStrength) {
+ return true;
+ }
+ return false;
}
@Override
@@ -435,7 +595,7 @@
final SavedState myState = new SavedState(superState);
myState.mDialogListEntries = getEntries();
myState.mDialogListEntryValues = getEntryValues();
- myState.mOperatorInfoList = mOperatorInfoList;
+ myState.mCellInfoList = mCellInfoList;
return myState;
}
@@ -455,8 +615,8 @@
if (getEntryValues() == null && myState.mDialogListEntryValues != null) {
setEntryValues(myState.mDialogListEntryValues);
}
- if (mOperatorInfoList == null && myState.mOperatorInfoList != null) {
- mOperatorInfoList = myState.mOperatorInfoList;
+ if (mCellInfoList == null && myState.mCellInfoList != null) {
+ mCellInfoList = myState.mCellInfoList;
}
super.onRestoreInstanceState(myState.getSuperState());
@@ -471,14 +631,14 @@
private static class SavedState extends BaseSavedState {
CharSequence[] mDialogListEntries;
CharSequence[] mDialogListEntryValues;
- List<OperatorInfo> mOperatorInfoList;
+ List<CellInfo> mCellInfoList;
SavedState(Parcel source) {
super(source);
final ClassLoader boot = Object.class.getClassLoader();
mDialogListEntries = source.readCharSequenceArray();
mDialogListEntryValues = source.readCharSequenceArray();
- mOperatorInfoList = source.readParcelableList(mOperatorInfoList, boot);
+ mCellInfoList = source.readParcelableList(mCellInfoList, boot);
}
@Override
@@ -486,7 +646,7 @@
super.writeToParcel(dest, flags);
dest.writeCharSequenceArray(mDialogListEntries);
dest.writeCharSequenceArray(mDialogListEntryValues);
- dest.writeParcelableList(mOperatorInfoList, flags);
+ dest.writeParcelableList(mCellInfoList, flags);
}
SavedState(Parcelable superState) {
@@ -505,6 +665,21 @@
};
}
+ private void sendMetricsEvent(String network) {
+ final LogMaker logMaker =
+ new LogMaker(MetricsEvent.ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK)
+ .setType(MetricsEvent.TYPE_ACTION);
+
+ if (network != null) {
+ // Since operator list is loaded dynamically from modem, we cannot know which network
+ // user chooses if we only record integer index of newValue. So a new tag and a string
+ // value (network) is added in this MetricsEvent.
+ logMaker.addTaggedData(MetricsEvent.FIELD_MOBILE_NETWORK, network);
+ }
+
+ MetricsLogger.action(logMaker);
+ }
+
private void logd(String msg) {
Log.d(LOG_TAG, "[NetworksList] " + msg);
}
@@ -512,4 +687,4 @@
private void loge(String msg) {
Log.e(LOG_TAG, "[NetworksList] " + msg);
}
-}
+}
\ No newline at end of file
diff --git a/src/com/android/phone/NotificationMgr.java b/src/com/android/phone/NotificationMgr.java
index 97daa34..d36c761 100644
--- a/src/com/android/phone/NotificationMgr.java
+++ b/src/com/android/phone/NotificationMgr.java
@@ -45,7 +45,6 @@
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
-import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArrayMap;
@@ -162,7 +161,7 @@
/* package */ void refreshMwi(int subId) {
// In a single-sim device, subId can be -1 which means "no sub id". In this case we will
// reference the single subid stored in the mMwiVisible map.
- if (subId == SubscriptionInfoHelper.NO_SUB_ID) {
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
if (mMwiVisible.keySet().size() == 1) {
Set<Integer> keySet = mMwiVisible.keySet();
Iterator<Integer> keyIt = keySet.iterator();
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index c750d27..8127eae 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -39,7 +39,7 @@
import android.os.Message;
import android.os.Messenger;
import android.os.PersistableBundle;
-import android.os.Process;
+import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ServiceManager;
import android.os.UserHandle;
@@ -67,6 +67,7 @@
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyHistogram;
import android.telephony.TelephonyManager;
+import android.telephony.UiccSlotInfo;
import android.telephony.UssdResponse;
import android.telephony.VisualVoicemailSmsFilterSettings;
import android.text.TextUtils;
@@ -78,6 +79,7 @@
import com.android.ims.ImsManager;
import com.android.ims.internal.IImsMMTelFeature;
import com.android.ims.internal.IImsRcsFeature;
+import com.android.ims.internal.IImsRegistration;
import com.android.ims.internal.IImsServiceFeatureCallback;
import com.android.internal.telephony.CallManager;
import com.android.internal.telephony.CallStateException;
@@ -105,6 +107,7 @@
import com.android.internal.telephony.uicc.UiccCard;
import com.android.internal.telephony.uicc.UiccCardApplication;
import com.android.internal.telephony.uicc.UiccController;
+import com.android.internal.telephony.uicc.UiccSlot;
import com.android.internal.telephony.util.VoicemailNotificationSettingsUtil;
import com.android.internal.util.HexDump;
import com.android.phone.vvm.PhoneAccountHandleConverter;
@@ -177,6 +180,8 @@
private static final int CMD_HANDLE_USSD_REQUEST = 47;
private static final int CMD_GET_FORBIDDEN_PLMNS = 48;
private static final int EVENT_GET_FORBIDDEN_PLMNS_DONE = 49;
+ private static final int CMD_SWITCH_SLOTS = 50;
+ private static final int EVENT_SWITCH_SLOTS_DONE = 51;
/** The singleton instance. */
private static PhoneInterfaceManager sInstance;
@@ -939,6 +944,22 @@
onCompleted);
break;
+ case CMD_SWITCH_SLOTS:
+ request = (MainThreadRequest) msg.obj;
+ int[] physicalSlots = (int[]) request.argument;
+ onCompleted = obtainMessage(EVENT_SWITCH_SLOTS_DONE, request);
+ UiccController.getInstance().switchSlots(physicalSlots, onCompleted);
+ break;
+
+ case EVENT_SWITCH_SLOTS_DONE:
+ ar = (AsyncResult) msg.obj;
+ request = (MainThreadRequest) ar.userObj;
+ request.result = (ar.exception == null);
+ synchronized (request) {
+ request.notifyAll();
+ }
+ break;
+
default:
Log.w(LOG_TAG, "MainThreadHandler: unexpected message code: " + msg.what);
break;
@@ -1540,7 +1561,7 @@
int subId = mSubscriptionController.getDefaultDataSubId();
final Phone phone = getPhone(subId);
if (phone != null) {
- phone.setDataEnabled(true);
+ phone.setUserDataEnabled(true);
return true;
} else {
return false;
@@ -1554,7 +1575,7 @@
int subId = mSubscriptionController.getDefaultDataSubId();
final Phone phone = getPhone(subId);
if (phone != null) {
- phone.setDataEnabled(false);
+ phone.setUserDataEnabled(false);
return true;
} else {
return false;
@@ -1769,6 +1790,18 @@
return phone == null ? null : phone.getDeviceSvn();
}
+ @Override
+ public int getSubscriptionCarrierId(int subId) {
+ final Phone phone = getPhone(subId);
+ return phone == null ? TelephonyManager.UNKNOWN_CARRIER_ID : phone.getCarrierId();
+ }
+
+ @Override
+ public String getSubscriptionCarrierName(int subId) {
+ final Phone phone = getPhone(subId);
+ return phone == null ? null : phone.getCarrierName();
+ }
+
//
// Internal helper methods.
//
@@ -2596,6 +2629,15 @@
return PhoneFactory.getImsResolver().getRcsFeatureAndListen(slotId, callback);
}
+ /**
+ * Returns the {@link IImsRegistration} structure associated with the slotId and feature
+ * specified.
+ */
+ public IImsRegistration getImsRegistration(int slotId, int feature) throws RemoteException {
+ enforceModifyPermission();
+ return PhoneFactory.getImsResolver().getImsRegistration(slotId, feature);
+ }
+
public void setImsRegistrationState(boolean registered) {
enforceModifyPermission();
mPhone.setImsRegistrationState(registered);
@@ -2616,9 +2658,13 @@
* Set the network selection mode to manual with the selected carrier.
*/
@Override
- public boolean setNetworkSelectionModeManual(int subId, OperatorInfo operator,
+ public boolean setNetworkSelectionModeManual(int subId, String operatorNumeric,
boolean persistSelection) {
enforceModifyPermissionOrCarrierPrivilege(subId);
+ OperatorInfo operator = new OperatorInfo(
+ /* operatorAlphaLong */ "",
+ /* operatorAlphaShort */ "",
+ operatorNumeric);
if (DBG) log("setNetworkSelectionModeManual: subId:" + subId + " operator:" + operator);
ManualNetworkSelectionArgument arg = new ManualNetworkSelectionArgument(operator,
persistSelection);
@@ -2745,28 +2791,46 @@
* @param enable {@code true} turn turn data on, else {@code false}
*/
@Override
- public void setDataEnabled(int subId, boolean enable) {
+ public void setUserDataEnabled(int subId, boolean enable) {
enforceModifyPermissionOrCarrierPrivilege(subId);
int phoneId = mSubscriptionController.getPhoneId(subId);
- if (DBG) log("getDataEnabled: subId=" + subId + " phoneId=" + phoneId);
+ if (DBG) log("setUserDataEnabled: subId=" + subId + " phoneId=" + phoneId);
Phone phone = PhoneFactory.getPhone(phoneId);
if (phone != null) {
- if (DBG) log("setDataEnabled: subId=" + subId + " enable=" + enable);
- phone.setDataEnabled(enable);
+ if (DBG) log("setUserDataEnabled: subId=" + subId + " enable=" + enable);
+ phone.setUserDataEnabled(enable);
} else {
- loge("setDataEnabled: no phone for subId=" + subId);
+ loge("setUserDataEnabled: no phone for subId=" + subId);
}
}
/**
- * Get whether mobile data is enabled.
+ * Get the user enabled state of Mobile Data.
+ *
+ * TODO: remove and use isUserDataEnabled.
+ * This can't be removed now because some vendor codes
+ * calls through ITelephony directly while they should
+ * use TelephonyManager.
+ *
+ * @return true on enabled
+ */
+ @Override
+ public boolean getDataEnabled(int subId) {
+ return isUserDataEnabled(subId);
+ }
+
+ /**
+ * Get whether mobile data is enabled per user setting.
+ *
+ * There are other factors deciding whether mobile data is actually enabled, but they are
+ * not considered here. See {@link #isDataEnabled(int)} for more details.
*
* Accepts either ACCESS_NETWORK_STATE, MODIFY_PHONE_STATE or carrier privileges.
*
* @return {@code true} if data is enabled else {@code false}
*/
@Override
- public boolean getDataEnabled(int subId) {
+ public boolean isUserDataEnabled(int subId) {
try {
mApp.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_NETWORK_STATE,
null);
@@ -2774,14 +2838,45 @@
enforceModifyPermissionOrCarrierPrivilege(subId);
}
int phoneId = mSubscriptionController.getPhoneId(subId);
- if (DBG) log("getDataEnabled: subId=" + subId + " phoneId=" + phoneId);
+ if (DBG) log("isUserDataEnabled: subId=" + subId + " phoneId=" + phoneId);
Phone phone = PhoneFactory.getPhone(phoneId);
if (phone != null) {
- boolean retVal = phone.getDataEnabled();
- if (DBG) log("getDataEnabled: subId=" + subId + " retVal=" + retVal);
+ boolean retVal = phone.isUserDataEnabled();
+ if (DBG) log("isUserDataEnabled: subId=" + subId + " retVal=" + retVal);
return retVal;
} else {
- if (DBG) loge("getDataEnabled: no phone subId=" + subId + " retVal=false");
+ if (DBG) loge("isUserDataEnabled: no phone subId=" + subId + " retVal=false");
+ return false;
+ }
+ }
+
+ /**
+ * Get whether mobile data is enabled.
+ *
+ * Comparable to {@link #isUserDataEnabled(int)}, this considers all factors deciding
+ * whether mobile data is actually enabled.
+ *
+ * Accepts either ACCESS_NETWORK_STATE, MODIFY_PHONE_STATE or carrier privileges.
+ *
+ * @return {@code true} if data is enabled else {@code false}
+ */
+ @Override
+ public boolean isDataEnabled(int subId) {
+ try {
+ mApp.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_NETWORK_STATE,
+ null);
+ } catch (Exception e) {
+ enforceModifyPermissionOrCarrierPrivilege(subId);
+ }
+ int phoneId = mSubscriptionController.getPhoneId(subId);
+ if (DBG) log("isDataEnabled: subId=" + subId + " phoneId=" + phoneId);
+ Phone phone = PhoneFactory.getPhone(phoneId);
+ if (phone != null) {
+ boolean retVal = phone.isDataEnabled();
+ if (DBG) log("isDataEnabled: subId=" + subId + " retVal=" + retVal);
+ return retVal;
+ } else {
+ if (DBG) loge("isDataEnabled: no phone subId=" + subId + " retVal=false");
return false;
}
}
@@ -3093,7 +3188,7 @@
@Override
public void enableVideoCalling(boolean enable) {
enforceModifyPermission();
- ImsManager.setVtSetting(mPhone.getContext(), enable);
+ ImsManager.getInstance(mPhone.getContext(), mPhone.getPhoneId()).setVtSetting(enable);
}
@Override
@@ -3106,9 +3201,10 @@
// enabled video calling, if IMS is disabled we aren't able to support video calling.
// In the long run, we may instead need to check if there exists a connection service
// which can support video calling.
- return ImsManager.isVtEnabledByPlatform(mPhone.getContext())
- && ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())
- && ImsManager.isVtEnabledByUser(mPhone.getContext());
+ ImsManager imsManager = ImsManager.getInstance(mPhone.getContext(), mPhone.getPhoneId());
+ return imsManager.isVtEnabledByPlatform()
+ && imsManager.isEnhanced4gLteModeSettingEnabledByUser()
+ && imsManager.isVtEnabledByUser();
}
@Override
@@ -3285,7 +3381,7 @@
if (SubscriptionManager.isUsableSubIdValue(subId) && !mUserManager.hasUserRestriction(
UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
// Enable data
- setDataEnabled(subId, true);
+ setUserDataEnabled(subId, true);
// Set network selection mode to automatic
setNetworkSelectionModeAutomatic(subId);
// Set preferred mobile network type to the best available
@@ -3872,4 +3968,46 @@
return p.getSignalStrength();
}
+
+ @Override
+ public UiccSlotInfo[] getUiccSlotsInfo() {
+ enforceReadPrivilegedPermission();
+
+ UiccSlot[] slots = UiccController.getInstance().getUiccSlots();
+ if (slots == null) return null;
+ UiccSlotInfo[] infos = new UiccSlotInfo[slots.length];
+ for (int i = 0; i < slots.length; i++) {
+ UiccSlot slot = slots[i];
+
+ String cardId = UiccController.getInstance().getUiccCard(i).getCardId();
+
+ int cardState = 0;
+ switch (slot.getCardState()) {
+ case CARDSTATE_ABSENT:
+ cardState = UiccSlotInfo.CARD_STATE_INFO_ABSENT;
+ break;
+ case CARDSTATE_PRESENT:
+ cardState = UiccSlotInfo.CARD_STATE_INFO_PRESENT;
+ break;
+ case CARDSTATE_ERROR:
+ cardState = UiccSlotInfo.CARD_STATE_INFO_ERROR;
+ break;
+ case CARDSTATE_RESTRICTED:
+ cardState = UiccSlotInfo.CARD_STATE_INFO_RESTRICTED;
+ break;
+ default:
+ break;
+
+ }
+
+ infos[i] = new UiccSlotInfo(slot.isActive(), slot.isEuicc(), cardId, cardState);
+ }
+ return infos;
+ }
+
+ @Override
+ public boolean switchSlots(int[] physicalSlots) {
+ enforceModifyPermission();
+ return (Boolean) sendRequest(CMD_SWITCH_SLOTS, physicalSlots);
+ }
}
diff --git a/src/com/android/phone/PhoneSearchIndexablesProvider.java b/src/com/android/phone/PhoneSearchIndexablesProvider.java
index ed3c7df..9c5f354 100644
--- a/src/com/android/phone/PhoneSearchIndexablesProvider.java
+++ b/src/com/android/phone/PhoneSearchIndexablesProvider.java
@@ -36,7 +36,6 @@
import android.provider.SearchIndexablesContract.RawData;
import android.provider.SearchIndexablesProvider;
import android.support.annotation.VisibleForTesting;
-import android.telephony.TelephonyManager;
import android.telephony.euicc.EuiccManager;
public class PhoneSearchIndexablesProvider extends SearchIndexablesProvider {
@@ -103,7 +102,8 @@
final String[] values = new String[]{"preferred_network_mode_key", "button_roaming_key",
"cdma_lte_data_service_key", "enabled_networks_key", "enhanced_4g_lte",
"button_apn_key", "button_network_select_key", "carrier_settings_key",
- "cdma_system_select_key", "esim_list_profile"};
+ "cdma_system_select_key", "esim_list_profile", "mobile_data_enable",
+ "data_usage_summary", "wifi_calling_key", "video_calling_key"};
for (String nik : values) {
cursor.addRow(createNonIndexableRow(nik));
}
@@ -116,6 +116,7 @@
}
}
cursor.addRow(createNonIndexableRow("carrier_settings_euicc_key" /* key */));
+ cursor.addRow(createNonIndexableRow("advanced_options" /* key */));
return cursor;
}
@@ -124,10 +125,7 @@
}
@VisibleForTesting boolean isEnhanced4gLteHidden() {
- TelephonyManager telephonyManager =
- (TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE);
- return MobileNetworkSettings
- .hideEnhanced4gLteSettings(getContext(), telephonyManager.getCarrierConfig());
+ return MobileNetworkSettings.hideEnhanced4gLteSettings(getContext());
}
private Object[] createNonIndexableRow(String key) {
diff --git a/src/com/android/phone/SubscriptionInfoHelper.java b/src/com/android/phone/SubscriptionInfoHelper.java
index 9f0ebd0..7c373e0 100644
--- a/src/com/android/phone/SubscriptionInfoHelper.java
+++ b/src/com/android/phone/SubscriptionInfoHelper.java
@@ -20,12 +20,12 @@
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
+import android.telecom.PhoneAccountHandle;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
-import com.android.phone.PhoneGlobals;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
@@ -37,7 +37,6 @@
* helping extract this info and perform common operations using this info.
*/
public class SubscriptionInfoHelper {
- public static final int NO_SUB_ID = -1;
// Extra on intent containing the id of a subscription.
public static final String SUB_ID_EXTRA =
@@ -46,17 +45,24 @@
private static final String SUB_LABEL_EXTRA =
"com.android.phone.settings.SubscriptionInfoHelper.SubscriptionLabel";
- private static Context mContext;
+ private Context mContext;
- private static int mSubId = NO_SUB_ID;
- private static String mSubLabel;
+ private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+ private String mSubLabel;
/**
* Instantiates the helper, by extracting the subscription id and label from the intent.
*/
public SubscriptionInfoHelper(Context context, Intent intent) {
mContext = context;
- mSubId = intent.getIntExtra(SUB_ID_EXTRA, NO_SUB_ID);
+ PhoneAccountHandle phoneAccountHandle =
+ intent.getParcelableExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE);
+ if (phoneAccountHandle != null) {
+ mSubId = PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccountHandle);
+ }
+ if (mSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ mSubId = intent.getIntExtra(SUB_ID_EXTRA, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ }
mSubLabel = intent.getStringExtra(SUB_LABEL_EXTRA);
}
@@ -118,7 +124,7 @@
}
public boolean hasSubId() {
- return mSubId != NO_SUB_ID;
+ return mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID;
}
public int getSubId() {
diff --git a/src/com/android/services/telephony/DisconnectCauseUtil.java b/src/com/android/services/telephony/DisconnectCauseUtil.java
index 01ccf79..361e5dc 100644
--- a/src/com/android/services/telephony/DisconnectCauseUtil.java
+++ b/src/com/android/services/telephony/DisconnectCauseUtil.java
@@ -20,6 +20,7 @@
import android.media.ToneGenerator;
import android.telecom.DisconnectCause;
+import com.android.internal.telephony.CallFailCause;
import com.android.phone.ImsUtil;
import com.android.phone.PhoneGlobals;
import com.android.phone.common.R;
@@ -34,7 +35,8 @@
* @param telephonyDisconnectCause The code for the reason for the disconnect.
*/
public static DisconnectCause toTelecomDisconnectCause(int telephonyDisconnectCause) {
- return toTelecomDisconnectCause(telephonyDisconnectCause, null /* reason */);
+ return toTelecomDisconnectCause(telephonyDisconnectCause,
+ CallFailCause.NOT_VALID, null /* reason */);
}
/**
@@ -47,10 +49,25 @@
*/
public static DisconnectCause toTelecomDisconnectCause(
int telephonyDisconnectCause, String reason) {
+ return toTelecomDisconnectCause(telephonyDisconnectCause, CallFailCause.NOT_VALID, reason);
+ }
+
+ /**
+ * Converts from a disconnect code in {@link android.telephony.DisconnectCause} into a more
+ * generic {@link android.telecom.DisconnectCause}.object, possibly populated with a localized
+ * message and tone.
+ *
+ * @param telephonyDisconnectCause The code for the reason for the disconnect.
+ * @param telephonyPerciseDisconnectCause The code for the percise reason for the disconnect.
+ * @param reason Description of the reason for the disconnect, not intended for the user to see..
+ */
+ public static DisconnectCause toTelecomDisconnectCause(
+ int telephonyDisconnectCause, int telephonyPerciseDisconnectCause, String reason) {
Context context = PhoneGlobals.getInstance();
return new DisconnectCause(
toTelecomDisconnectCauseCode(telephonyDisconnectCause),
- toTelecomDisconnectCauseLabel(context, telephonyDisconnectCause),
+ toTelecomDisconnectCauseLabel(context, telephonyDisconnectCause,
+ telephonyPerciseDisconnectCause),
toTelecomDisconnectCauseDescription(context, telephonyDisconnectCause),
toTelecomDisconnectReason(context,telephonyDisconnectCause, reason),
toTelecomDisconnectCauseTone(telephonyDisconnectCause));
@@ -168,8 +185,23 @@
* Returns a label for to the disconnect cause to be shown to the user.
*/
private static CharSequence toTelecomDisconnectCauseLabel(
+ Context context, int telephonyDisconnectCause, int telephonyPerciseDisconnectCause) {
+ CharSequence label;
+ if (telephonyPerciseDisconnectCause != CallFailCause.NOT_VALID) {
+ label = getLabelFromPreciseDisconnectCause(context, telephonyPerciseDisconnectCause,
+ telephonyDisconnectCause);
+ } else {
+ label = getLabelFromDisconnectCause(context, telephonyDisconnectCause);
+ }
+ return label;
+ }
+
+ /**
+ * Returns a label for to the generic disconnect cause to be shown to the user.
+ */
+ private static CharSequence getLabelFromDisconnectCause(
Context context, int telephonyDisconnectCause) {
- if (context == null ) {
+ if (context == null) {
return "";
}
@@ -264,6 +296,190 @@
}
/**
+ * Returns a label for to the precise disconnect cause to be shown to the user.
+ */
+ private static CharSequence getLabelFromPreciseDisconnectCause(
+ Context context, int telephonyPreciseDisconnectCause, int telephonyDisconnectCause) {
+ if (context == null) {
+ return "";
+ }
+
+ Integer resourceId = null;
+ switch (telephonyPreciseDisconnectCause) {
+ case CallFailCause.UNOBTAINABLE_NUMBER:
+ resourceId = R.string.clh_callFailed_unassigned_number_txt;
+ break;
+ case CallFailCause.NO_ROUTE_TO_DEST:
+ resourceId = R.string.clh_callFailed_no_route_to_destination_txt;
+ break;
+ case CallFailCause.CHANNEL_UNACCEPTABLE:
+ resourceId = R.string.clh_callFailed_channel_unacceptable_txt;
+ break;
+ case CallFailCause.OPERATOR_DETERMINED_BARRING:
+ resourceId = R.string.clh_callFailed_operator_determined_barring_txt;
+ break;
+ case CallFailCause.NORMAL_CLEARING:
+ resourceId = R.string.clh_callFailed_normal_call_clearing_txt;
+ break;
+ case CallFailCause.USER_BUSY:
+ resourceId = R.string.clh_callFailed_user_busy_txt;
+ break;
+ case CallFailCause.NO_USER_RESPONDING:
+ resourceId = R.string.clh_callFailed_no_user_responding_txt;
+ break;
+ case CallFailCause.USER_ALERTING_NO_ANSWER:
+ resourceId = R.string.clh_callFailed_user_alerting_txt;
+ break;
+ case CallFailCause.CALL_REJECTED:
+ resourceId = R.string.clh_callFailed_call_rejected_txt;
+ break;
+ case CallFailCause.NUMBER_CHANGED:
+ resourceId = R.string.clh_callFailed_number_changed_txt;
+ break;
+ case CallFailCause.PRE_EMPTION:
+ resourceId = R.string.clh_callFailed_pre_emption_txt;
+ break;
+ case CallFailCause.NON_SELECTED_USER_CLEARING:
+ resourceId = R.string.clh_callFailed_non_selected_user_clearing_txt;
+ break;
+ case CallFailCause.DESTINATION_OUT_OF_ORDER:
+ resourceId = R.string.clh_callFailed_destination_out_of_order_txt;
+ break;
+ case CallFailCause.INVALID_NUMBER_FORMAT:
+ resourceId = R.string.clh_callFailed_invalid_number_format_txt;
+ break;
+ case CallFailCause.FACILITY_REJECTED:
+ resourceId = R.string.clh_callFailed_facility_rejected_txt;
+ break;
+ case CallFailCause.STATUS_ENQUIRY:
+ resourceId = R.string.clh_callFailed_response_to_STATUS_ENQUIRY_txt;
+ break;
+ case CallFailCause.NORMAL_UNSPECIFIED:
+ resourceId = R.string.clh_callFailed_normal_unspecified_txt;
+ break;
+ case CallFailCause.NO_CIRCUIT_AVAIL:
+ resourceId = R.string.clh_callFailed_no_circuit_available_txt;
+ break;
+ case CallFailCause.NETWORK_OUT_OF_ORDER:
+ resourceId = R.string.clh_callFailed_network_out_of_order_txt;
+ break;
+ case CallFailCause.TEMPORARY_FAILURE:
+ resourceId = R.string.clh_callFailed_temporary_failure_txt;
+ break;
+ case CallFailCause.SWITCHING_CONGESTION:
+ resourceId = R.string.clh_callFailed_switching_equipment_congestion_txt;
+ break;
+ case CallFailCause.ACCESS_INFORMATION_DISCARDED:
+ resourceId = R.string.clh_callFailed_access_information_discarded_txt;
+ break;
+ case CallFailCause.CHANNEL_NOT_AVAIL:
+ resourceId = R.string.clh_callFailed_requested_circuit_txt;
+ break;
+ case CallFailCause.RESOURCES_UNAVAILABLE_UNSPECIFIED:
+ resourceId = R.string.clh_callFailed_resources_unavailable_unspecified_txt;
+ break;
+ case CallFailCause.QOS_NOT_AVAIL:
+ resourceId = R.string.clh_callFailed_quality_of_service_unavailable_txt;
+ break;
+ case CallFailCause.REQUESTED_FACILITY_NOT_SUBSCRIBED:
+ resourceId = R.string.clh_callFailed_requested_facility_not_subscribed_txt;
+ break;
+ case CallFailCause.INCOMING_CALL_BARRED_WITHIN_CUG:
+ resourceId = R.string.clh_callFailed_incoming_calls_barred_within_the_CUG_txt;
+ break;
+ case CallFailCause.BEARER_CAPABILITY_NOT_AUTHORISED:
+ resourceId = R.string.clh_callFailed_bearer_capability_not_authorized_txt;
+ break;
+ case CallFailCause.BEARER_NOT_AVAIL:
+ resourceId = R.string.clh_callFailed_bearer_capability_not_presently_available_txt;
+ break;
+ case CallFailCause.SERVICE_OR_OPTION_NOT_AVAILABLE:
+ resourceId =
+ R.string.clh_callFailed_service_or_option_not_available_unspecified_txt;
+ break;
+ case CallFailCause.BEARER_SERVICE_NOT_IMPLEMENTED:
+ resourceId = R.string.clh_callFailed_bearer_service_not_implemented_txt;
+ break;
+ case CallFailCause.ACM_LIMIT_EXCEEDED:
+ resourceId = R.string.clh_callFailed_ACM_equal_to_or_greater_than_ACMmax_txt;
+ break;
+ case CallFailCause.REQUESTED_FACILITY_NOT_IMPLEMENTED:
+ resourceId = R.string.clh_callFailed_requested_facility_not_implemented_txt;
+ break;
+ case CallFailCause.ONLY_RESTRICTED_DIGITAL_INFO_BC_AVAILABLE:
+ resourceId = R.string
+ .clh_callFailed_only_restricted_digital_information_bearer_capability_is_available_txt;
+ break;
+ case CallFailCause.SERVICE_OR_OPTION_NOT_IMPLEMENTED:
+ resourceId =
+ R.string.clh_callFailed_service_or_option_not_implemented_unspecified_txt;
+ break;
+ case CallFailCause.INVALID_TRANSACTION_ID_VALUE:
+ resourceId = R.string.clh_callFailed_invalid_transaction_identifier_value_txt;
+ break;
+ case CallFailCause.USER_NOT_MEMBER_OF_CUG:
+ resourceId = R.string.clh_callFailed_user_not_member_of_CUG_txt;
+ break;
+ case CallFailCause.INCOMPATIBLE_DESTINATION:
+ resourceId = R.string.clh_callFailed_incompatible_destination_txt;
+ break;
+ case CallFailCause.INVALID_TRANSIT_NETWORK_SELECTION:
+ resourceId = R.string.clh_callFailed_invalid_transit_network_selection_txt;
+ break;
+ case CallFailCause.SEMANTICALLY_INCORRECT_MESSAGE:
+ resourceId = R.string.clh_callFailed_semantically_incorrect_message_txt;
+ break;
+ case CallFailCause.INVALID_MANDATORY_INFORMATION:
+ resourceId = R.string.clh_callFailed_invalid_mandatory_information_txt;
+ break;
+ case CallFailCause.MESSAGE_TYPE_NON_EXISTENT:
+ resourceId =
+ R.string.clh_callFailed_message_type_non_existent_or_not_implemented_txt;
+ break;
+ case CallFailCause.MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROT_STATE:
+ resourceId = R.string
+ .clh_callFailed_message_type_not_compatible_with_protocol_state_txt;
+ break;
+ case CallFailCause.IE_NON_EXISTENT_OR_NOT_IMPLEMENTED:
+ resourceId = R.string
+ .clh_callFailed_information_element_non_existent_or_not_implemented_txt;
+ break;
+ case CallFailCause.CONDITIONAL_IE_ERROR:
+ resourceId = R.string.clh_callFailed_conditional_IE_error_txt;
+ break;
+ case CallFailCause.MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE:
+ resourceId = R.string.clh_callFailed_message_not_compatible_with_protocol_state_txt;
+ break;
+ case CallFailCause.RECOVERY_ON_TIMER_EXPIRY:
+ resourceId = R.string.clh_callFailed_recovery_on_timer_expiry_txt;
+ break;
+ case CallFailCause.PROTOCOL_ERROR_UNSPECIFIED:
+ resourceId = R.string.clh_callFailed_protocol_Error_unspecified_txt;
+ break;
+ case CallFailCause.INTERWORKING_UNSPECIFIED:
+ resourceId = R.string.clh_callFailed_interworking_unspecified_txt;
+ break;
+ default:
+ switch (telephonyDisconnectCause) {
+ case android.telephony.DisconnectCause.POWER_OFF:
+ resourceId = R.string.clh_callFailed_powerOff_txt;
+ break;
+ case android.telephony.DisconnectCause.ICC_ERROR:
+ resourceId = R.string.clh_callFailed_simError_txt;
+ break;
+ case android.telephony.DisconnectCause.OUT_OF_SERVICE:
+ resourceId = R.string.clh_incall_error_out_of_service_txt;
+ break;
+ default:
+ resourceId = R.string.clh_card_title_call_ended_txt;
+ break;
+ }
+ break;
+ }
+ return context.getResources().getString(resourceId);
+ }
+
+ /**
* Returns a description of the disconnect cause to be shown to the user.
*/
private static CharSequence toTelecomDisconnectCauseDescription(
diff --git a/src/com/android/services/telephony/Log.java b/src/com/android/services/telephony/Log.java
index a56e8b1..9941a59 100644
--- a/src/com/android/services/telephony/Log.java
+++ b/src/com/android/services/telephony/Log.java
@@ -43,7 +43,6 @@
// Register Telephony with the Telecom Logger.
android.telecom.Log.setTag(TAG);
android.telecom.Log.setSessionContext(context);
- android.telecom.Log.initMd5Sum();
}
// Relay log messages to Telecom
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 8963229..3f21d17 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -83,6 +83,7 @@
private boolean mIsVideoConferencingSupported;
private boolean mIsMergeOfWifiCallsAllowedWhenVoWifiOff;
private boolean mIsManageImsConferenceCallSupported;
+ private boolean mIsShowPreciseFailedCause;
AccountEntry(Phone phone, boolean isEmergency, boolean isDummy) {
mPhone = phone;
@@ -184,8 +185,8 @@
}
mIsVideoCapable = mPhone.isVideoEnabled();
- boolean isVideoEnabledByPlatform =
- ImsManager.isVtEnabledByPlatform(mPhone.getContext());
+ boolean isVideoEnabledByPlatform = ImsManager.getInstance(mPhone.getContext(),
+ mPhone.getPhoneId()).isVtEnabledByPlatform();
if (!mIsPrimaryUser) {
Log.i(this, "Disabling video calling for secondary user.");
@@ -226,6 +227,12 @@
isHandoverFromSupported);
}
+ boolean isDeviceRttSupported = mContext.getResources().getBoolean(
+ R.bool.config_support_rtt);
+ if (isDeviceRttSupported && isCarrierRttSupported()) {
+ capabilities |= PhoneAccount.CAPABILITY_RTT;
+ }
+
extras.putBoolean(PhoneAccount.EXTRA_SUPPORTS_VIDEO_CALLING_FALLBACK,
mContext.getResources()
.getBoolean(R.bool.config_support_video_calling_fallback));
@@ -241,6 +248,7 @@
mIsMergeOfWifiCallsAllowedWhenVoWifiOff =
isCarrierMergeOfWifiCallsAllowedWhenVoWifiOff();
mIsManageImsConferenceCallSupported = isCarrierManageImsConferenceCallSupported();
+ mIsShowPreciseFailedCause = isCarrierShowPreciseFailedCause();
if (isEmergency && mContext.getResources().getBoolean(
R.bool.config_emergency_account_emergency_calls_only)) {
@@ -390,6 +398,12 @@
b.getBoolean(CarrierConfigManager.KEY_SUPPORT_VIDEO_CONFERENCE_CALL_BOOL);
}
+ private boolean isCarrierRttSupported() {
+ PersistableBundle b =
+ PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
+ return b != null && b.getBoolean(CarrierConfigManager.KEY_RTT_SUPPORTED_BOOL);
+ }
+
/**
* Determines from carrier config whether merging of wifi calls is allowed when VoWIFI is
* turned off.
@@ -417,6 +431,19 @@
}
/**
+ * Determines from carrier config whether showing percise call diconnect cause to user
+ * is supported.
+ *
+ * @return {@code true} if showing percise call diconnect cause to user is supported,
+ * {@code false} otherwise.
+ */
+ private boolean isCarrierShowPreciseFailedCause() {
+ PersistableBundle b =
+ PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
+ return b.getBoolean(CarrierConfigManager.KEY_SHOW_PRECISE_FAILED_CAUSE_BOOL);
+ }
+
+ /**
* Where a device supports instant lettering and call subjects, retrieves the necessary
* PhoneAccount extras for those features.
* @return The {@link PhoneAccount} extras associated with the current subscription.
@@ -507,6 +534,16 @@
public boolean isManageImsConferenceCallSupported() {
return mIsManageImsConferenceCallSupported;
}
+
+ /**
+ * Indicates whether this account supports showing the precise call disconnect cause
+ * to user (i.e. conferencing).
+ * @return {@code true} if the account supports showing the precise call disconnect cause,
+ * {@code false} otherwise.
+ */
+ public boolean isShowPreciseFailedCause() {
+ return mIsShowPreciseFailedCause;
+ }
}
private OnSubscriptionsChangedListener mOnSubscriptionsChangedListener =
@@ -694,6 +731,23 @@
}
/**
+ * showing precise call disconnect cause to the user.
+ *
+ * @param handle The {@link PhoneAccountHandle}.
+ * @return {@code True} if showing precise call disconnect cause to the user is supported.
+ */
+ boolean isShowPreciseFailedCause(PhoneAccountHandle handle) {
+ synchronized (mAccountsLock) {
+ for (AccountEntry entry : mAccounts) {
+ if (entry.getPhoneAccountHandle().equals(handle)) {
+ return entry.isShowPreciseFailedCause();
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
* @return Reference to the {@code TelecomAccountRegistry}'s subscription manager.
*/
SubscriptionManager getSubscriptionManager() {
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 26aeaba..2358160 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -33,7 +33,6 @@
import android.telecom.TelecomManager;
import android.telecom.VideoProfile;
import android.telephony.CarrierConfigManager;
-import android.telephony.DisconnectCause;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
import android.util.Pair;
@@ -41,6 +40,7 @@
import com.android.ims.ImsCall;
import com.android.ims.ImsCallProfile;
import com.android.internal.telephony.Call;
+import com.android.internal.telephony.CallFailCause;
import com.android.internal.telephony.CallStateException;
import com.android.internal.telephony.Connection.Capability;
import com.android.internal.telephony.Connection.PostDialListener;
@@ -521,6 +521,16 @@
protected final boolean mIsOutgoing;
/**
+ * Indicates whether this call is using assisted dialing.
+ */
+ private boolean mIsUsingAssistedDialing;
+
+ /**
+ * Indicates whether this connection supports showing preciese call failed cause.
+ */
+ private boolean mShowPreciseFailedCause;
+
+ /**
* Listeners to our TelephonyConnection specific callbacks
*/
private final Set<TelephonyConnectionListener> mTelephonyListeners = Collections.newSetFromMap(
@@ -823,6 +833,8 @@
isExternalConnection());
newProperties = changeBitmask(newProperties, PROPERTY_HAS_CDMA_VOICE_PRIVACY,
mIsCdmaVoicePrivacyEnabled);
+ newProperties = changeBitmask(newProperties, PROPERTY_ASSISTED_DIALING_USED,
+ mIsUsingAssistedDialing);
if (getConnectionProperties() != newProperties) {
setConnectionProperties(newProperties);
@@ -1356,8 +1368,14 @@
fireOnOriginalConnectionRetryDial(cause
== android.telephony.DisconnectCause.EMERGENCY_PERM_FAILURE);
} else {
+ int preciseDisconnectCause = CallFailCause.NOT_VALID;
+ if (mShowPreciseFailedCause) {
+ preciseDisconnectCause =
+ mOriginalConnection.getPreciseDisconnectCause();
+ }
setDisconnected(DisconnectCauseUtil.toTelecomDisconnectCause(
mOriginalConnection.getDisconnectCause(),
+ preciseDisconnectCause,
mOriginalConnection.getVendorDisconnectCause()));
close();
}
@@ -1379,6 +1397,7 @@
updateConnectionProperties();
updateAddress();
updateMultiparty();
+ refreshDisableAddCall();
}
/**
@@ -1673,6 +1692,15 @@
}
/**
+ * Sets whether this connection supports showing precise call disconnect cause.
+ * @param showPreciseFailedCause {@code true} if showing precise call
+ * disconnect cause is supported by this connection, {@code false} otherwise.
+ */
+ public void setShowPreciseFailedCause(boolean showPreciseFailedCause) {
+ mShowPreciseFailedCause = showPreciseFailedCause;
+ }
+
+ /**
* Whether the original connection is an IMS connection.
* @return {@code True} if the original connection is an IMS connection, {@code false}
* otherwise.
@@ -1692,6 +1720,15 @@
return mWasImsConnection;
}
+ boolean getIsUsingAssistedDialing() {
+ return mIsUsingAssistedDialing;
+ }
+
+ void setIsUsingAssistedDialing(Boolean isUsingAssistedDialing) {
+ mIsUsingAssistedDialing = isUsingAssistedDialing;
+ updateConnectionProperties();
+ }
+
private static Uri getAddressFromNumber(String number) {
// Address can be null for blocked calls.
if (number == null) {
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index f4ee745..8584d42 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -421,7 +421,11 @@
isEmergencyNumber, handle, phone);
// If there was a failure, the resulting connection will not be a TelephonyConnection,
// so don't place the call!
- if(resultConnection instanceof TelephonyConnection) {
+ if (resultConnection instanceof TelephonyConnection) {
+ if (request.getExtras() != null && request.getExtras().getBoolean(
+ TelecomManager.EXTRA_USE_ASSISTED_DIALING, false)) {
+ ((TelephonyConnection) resultConnection).setIsUsingAssistedDialing(true);
+ }
placeOutgoingConnection((TelephonyConnection) resultConnection, phone, request);
}
return resultConnection;
@@ -1049,6 +1053,9 @@
returnConnection.setManageImsConferenceCallSupported(
TelecomAccountRegistry.getInstance(this).isManageImsConferenceCallSupported(
phoneAccountHandle));
+ returnConnection.setShowPreciseFailedCause(
+ TelecomAccountRegistry.getInstance(this).isShowPreciseFailedCause(
+ phoneAccountHandle));
}
return returnConnection;
}
diff --git a/tests/src/com/android/phone/PhoneSearchIndexablesProviderTest.java b/tests/src/com/android/phone/PhoneSearchIndexablesProviderTest.java
index 730db93..2176d6b 100644
--- a/tests/src/com/android/phone/PhoneSearchIndexablesProviderTest.java
+++ b/tests/src/com/android/phone/PhoneSearchIndexablesProviderTest.java
@@ -119,21 +119,21 @@
SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
assertThat(cursor1.getColumnNames()).isEqualTo(
SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
- assertThat(cursor1.getCount()).isEqualTo(11);
+ assertThat(cursor1.getCount()).isEqualTo(16);
when(mUserManager.isAdminUser()).thenReturn(true);
Cursor cursor2 = mProvider
.queryNonIndexableKeys(SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
- assertThat(cursor2.getCount()).isEqualTo(1);
+ assertThat(cursor2.getCount()).isEqualTo(2);
mProvider.setIsEuiccSettingsHidden(true /* isEuiccSettingsHidden */);
Cursor cursor3 = mProvider
.queryNonIndexableKeys(SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
- assertThat(cursor3.getCount()).isEqualTo(2);
+ assertThat(cursor3.getCount()).isEqualTo(3);
mProvider.setIsEnhanced4gLteHidden(true /* isEnhanced4gLteHidden */);
Cursor cursor4 = mProvider
.queryNonIndexableKeys(SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS);
- assertThat(cursor4.getCount()).isEqualTo(3);
+ assertThat(cursor4.getCount()).isEqualTo(4);
}
}