Merge "Use a special method in SmsManager to have looser permissions."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ef7a812..dd6593b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -449,7 +449,6 @@
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.MAIN" />
<action android:name="android.telecom.action.SHOW_CALL_SETTINGS" />
- <action android:name="com.android.phone.CallFeaturesSetting.ADD_VOICEMAIL" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
@@ -575,6 +574,10 @@
<activity android:name="com.android.phone.settings.VoicemailSettingsActivity"
android:label="@string/voicemail"
android:theme="@style/DialerSettingsLight">
+ <intent-filter >
+ <!-- DO NOT RENAME. There are existing apps which use this string. -->
+ <action android:name="com.android.phone.CallFeaturesSetting.ADD_VOICEMAIL" />
+ </intent-filter>
</activity>
<!-- BroadcastReceiver for receiving Intents from Notification mechanism. -->
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 5111d50..7fede01 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -556,6 +556,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Raak weer om oop te maak"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Kon nie die boodskap dekodeer nie."</string>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index a8d7419..da71fd4 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"የአደጋ ጥሪዎችን ብቻ ለማድረግ"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM ካርድ፣ ማስገቢያ ቀዳዳ፦ <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"ተደራሽነት"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"ገቢ የWi-Fi ጥሪ"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"የWi-Fi ጥሪ"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"ለመክፈት ዳግም ይንኩ"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"መልዕክቱን በማመሳጠር ላይ ስህተት ነበር።"</string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 1ded56e..b0ec167 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -559,10 +559,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"مكالمات الطوارئ فقط"</string>
<string name="sim_description_default" msgid="4778679519938775515">"شريحة SIM، المنفذ: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"إمكانية الوصول"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"مكالمة واردة عبر Wi-Fi"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"مكالمة عبر Wi-Fi"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"المس مرة أخرى للفتح"</string>
<string name="message_decode_error" msgid="3456481534066924855">"حدث خطأ أثناء فك ترميز الرسالة."</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 2bdb198..659c169 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Докоснете отново за отваряне"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"При декодирането на съобщението възникна грешка."</string>
</resources>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index 770b9d1..f521234 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"শুধুমাত্র জরুরী কলিং"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM কার্ড, স্লট: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"অ্যাক্সেসযোগ্যতা"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"আগত Wi-Fi কল"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi কল"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"খোলার জন্য আবার স্পর্শ করুন"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"বার্তাটি ডিকোড করার সময় একটি ত্রুটি ঘটেছে৷"</string>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 77b2d26..474f3a0 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Toca-ho de nou per obrir"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"S\'ha produït un error en descodificar el missatge."</string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index b2791e2..0550ffc 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -558,6 +558,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Otevřete opětovným klepnutím"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Při dekódování zprávy došlo k chybě."</string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 48316d7..4d85f1d 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -558,6 +558,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Tryk igen for at åbne"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Der opstod en fejl under afkodning af beskeden."</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 907ad4a..79e3477 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -556,6 +556,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Zum Öffnen erneut berühren"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Beim Entschlüsseln der Nachricht ist ein Fehler aufgetreten."</string>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 802a0b5..f00043c 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Αγγίξτε ξανά για άνοιγμα"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Παρουσιάστηκε κάποιο σφάλμα κατά την αποκωδικοποίηση του μηνύματος."</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index d73c2f5..38b1937 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Vuelve a tocar para realizar la acción."</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Se produjo un error al decodificar el mensaje."</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 042783b..d5f1189 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -556,6 +556,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Vuelve a tocar para abrir"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Se ha producido un error al decodificar el mensaje."</string>
</resources>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index 56d5736..95a3530 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Avamiseks puudutage uuesti"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Sõnumi dekodeerimisel ilmnes viga."</string>
</resources>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index d8ebd8f..beac948 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -553,11 +553,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"Larrialdi-deiak soilik"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM txartela, <xliff:g id="SLOT_ID">%s</xliff:g> erretena"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Erabilerraztasuna"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Sarrerako Wi-Fi deia"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi deia"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Irekitzeko, ukitu berriro"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Errore bat gertatu mezua deskodetzean."</string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index b072c26..d2ff3a2 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"فقط تماسهای اضطراری"</string>
<string name="sim_description_default" msgid="4778679519938775515">"سیمکارت، شکاف: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"دسترسپذیری"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"تماس Wi-Fi ورودی"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"تماس Wi-Fi"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"لمس دوباره برای باز کردن"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"هنگام رمزگشایی پیام، خطایی روی داد."</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 1cb207e..02733dd 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -556,6 +556,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Avaa koskettamalla uudelleen."</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Virhe purettaessa viestiä."</string>
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 32fae1c..91190a5 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -556,6 +556,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Touchez à nouveau pour ouvrir"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Une erreur s\'est produite lors du décodage du message."</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 77ad660..bc69a29 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Appuyer à nouveau pour ouvrir"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Une erreur s\'est produite lors du décodage du message."</string>
</resources>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index 98f8529..1152a05 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"Só chamadas de emerxencia"</string>
<string name="sim_description_default" msgid="4778679519938775515">"Tarxeta SIM, rañura: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Accesibilidade"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Chamada wifi entrante"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Chamada wifi"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Toca outra vez para abrir"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Produciuse un erro durante a descodificación da mensaxe."</string>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 3e5ebb6..f59ce03 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"केवल आपातकालीन कॉल"</string>
<string name="sim_description_default" msgid="4778679519938775515">"सिम कार्ड, स्लॉट: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"सरल उपयोग"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"इनकमिंग वाई-फ़ाई कॉल"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"वाई-फ़ाई कॉल"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"खोलने के लिए पुन: स्पर्श करें"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"संदेश डीकोड करते समय कोई त्रुटि हुई थी."</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index fa3f9f6..9f0dfb1 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -555,6 +555,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Dodirnite ponovo da biste otvorili"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Došlo je do pogreške prilikom dekodiranja poruke."</string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index a01680b..5744463 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Érintse meg ismét a megnyitáshoz"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Hiba történt az üzenet dekódolása közben."</string>
</resources>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 4ac6d54..0d3143c 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -558,6 +558,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Կրկին հպեք՝ բացելու համար"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Հաղորդագրությունը ապակոդավորելիս սխալ է տեղի է ունեցել:"</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 5dc606e..7cbc6ae 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -547,10 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"Hanya untuk panggilan darurat"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Aksesibilitas"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Panggilan Wi-Fi masuk"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Panggilan Wi-Fi"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Sentuh lagi untuk membuka"</string>
<string name="message_decode_error" msgid="3456481534066924855">"Terjadi kesalahan saat melakukan dekode pesan."</string>
</resources>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index 864e35d..9450c5b 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Snertu aftur til að opna"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Villa kom upp við að afkóða skeytið."</string>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 4b2ca13..5d73a44 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -556,6 +556,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Tocca di nuovo per aprire"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Si è verificato un errore durante la decodifica del messaggio."</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 73e5e91..4ab92c1 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -553,10 +553,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"שיחות חירום בלבד"</string>
<string name="sim_description_default" msgid="4778679519938775515">"כרטיס SIM, חריץ: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"נגישות"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"שיחת Wi-Fi נכנסת"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"שיחת Wi-Fi"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"גע שוב כדי לפתוח"</string>
<string name="message_decode_error" msgid="3456481534066924855">"אירעה שגיאה בעת פענוח ההודעה."</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 8ab9eea..152f44f 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"開くにはもう一度タップしてください"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"メッセージのデコード中にエラーが発生しました。"</string>
</resources>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 32ac74a..e3df07d 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"შეეხეთ ისევ გასახსნელად"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"შეტყობინების გაშიფრვისას წარმოიშვა შეცდომა."</string>
</resources>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index 2eb44fe..0d08c08 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Ашу үшін қайтадан түртіңіз"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Хабарды кодтан шығару кезінде қате пайда болды."</string>
</resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index 4a4a9fd..a58061f 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"សម្រាប់ការហៅពេលអាសន្នប៉ុណ្ណោះ"</string>
<string name="sim_description_default" msgid="4778679519938775515">"ស៊ីមកាត រន្ធ៖ <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"លទ្ធភាពប្រើប្រាស់"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"មានការហៅចូលមកតាម Wi-Fi"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"ហៅតាម Wi-Fi"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"ប៉ះម្ដងទៀតដើម្បីបើក"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"មានកំហុសខណៈពេលឌិកូដសារ។"</string>
</resources>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index 75c690b..8e328b8 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"ತುರ್ತು ಕರೆ ಮಾಡುವಿಕೆ ಮಾತ್ರ"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM ಕಾರ್ಡ್, ಸ್ಲಾಟ್: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"ಪ್ರವೇಶಿಸುವಿಕೆ"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"ಒಳಬರುವ ವೈ-ಫೈ ಕರೆ"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"ವೈ-ಫೈ ಕರೆ"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"ತೆರೆಯಲು ಮತ್ತೊಮ್ಮೆ ಸ್ಪರ್ಶಿಸಿ"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"ಸಂದೇಶವನ್ನು ಡೀಕೋಡ್ ಮಾಡುವಾಗ ದೋಷವುಂಟಾಗಿದೆ."</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 3575201..6e8e516 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"다시 터치하여 열기"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"메시지를 디코딩하는 동안 오류가 발생했습니다."</string>
</resources>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index 444cd0d..c9c1de0 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -833,6 +833,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Ачуу үчүн кайра тийиңиз"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Билдирүү дешифрленип жатканда ката кеткен."</string>
</resources>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index e9c7e6b..fe6a97d 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -547,10 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"ການໂທສຸກເສີນເທົ່ານັ້ນ"</string>
<string name="sim_description_default" msgid="4778679519938775515">"ແຜ່ນ SIM, ຊ່ອງ: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"ການຊ່ວຍເຂົ້າເຖິງ"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"ສາຍໂທເຂົ້າ Wi-Fi"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"ການໂທ Wi-Fi"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"ແຕະອີກເທື່ອນຶ່ງເພື່ອເປີດ"</string>
<string name="message_decode_error" msgid="3456481534066924855">"ມີຂໍ້ຜິດພາດໃນລະຫວ່າງຖອດລະຫັດຂໍ້ຄວາມດັ່ງກ່າວ."</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index ad64d3e..6f5ef1e 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -558,6 +558,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Palieskite dar kartą, kad atidarytumėte"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Iškoduojant pranešimą įvyko klaida."</string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index b2a2863..7db901d 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -557,6 +557,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Lai atvērtu, pieskarieties vēlreiz."</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Atšifrējot ziņojumu, radās kļūda."</string>
</resources>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index 71e56d1..321f680 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -558,6 +558,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Допрете повторно за да отворите"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Настана грешка при дешифрирање на пораката."</string>
</resources>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index b98d197..9fe121c 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"അടിയന്തിര കോൾചെയ്യൽ മാത്രം"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM കാർഡ്, സ്ലോട്ട്: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"പ്രവേശനക്ഷമത"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"ഇൻകമിംഗ് Wi-Fi കോൾ"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi കോൾ"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"തുറക്കുന്നതിന് വീണ്ടും സ്പർശിക്കുക"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"സന്ദേശം ഡീകോഡുചെയ്യുമ്പോൾ ഒരു പിശകുണ്ടായി."</string>
</resources>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index c985bb6..5141624 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"केवळ आणीबाणी कॉल करणे"</string>
<string name="sim_description_default" msgid="4778679519938775515">"सिम कार्ड, स्लॉट: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"प्रवेशयोग्यता"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"येणारा वाय-फाय कॉल"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"वाय-फाय कॉल"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"उघडण्यासाठी पुन्हा स्पर्श करा"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"संदेश डीकोड करताना एक त्रुटी आली."</string>
</resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 99335b7..343d079 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"Panggilan kecemasan sahaja"</string>
<string name="sim_description_default" msgid="4778679519938775515">"Kad SIM, slot: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Kebolehaksesan"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Panggilan Wi-Fi masuk"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Panggilan Wi-Fi"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Sentuh lagi untuk membuka"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Terdapat ralat semasa menyahkodkan mesej."</string>
</resources>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index 5a07782..4de03fc 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -547,10 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"အရေးပေါ် ခေါ်ဆိုမှုသာလျှင်"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM ကဒ်၊ အပေါက်: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"ရယူသုံးနိုင်မှု"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"ဝင်လာသော ဝိုင်ဖိုင်ခေါ်ဆိုမှု"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"ဝိုင်ဖိုင်ခေါ်ဆိုမှု"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"ဖွင့်ရန် ထပ်ပြီး ထိပါ"</string>
<string name="message_decode_error" msgid="3456481534066924855">"စာကို ကုဒ်ဖွင့်နေစဉ် အမှားရှိခဲ့သည်။"</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 74f5179..4d292a9 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -558,6 +558,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Trykk på nytt for å åpne"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Det oppsto en feil under dekoding av meldingen."</string>
</resources>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index 809c99c..ea36209 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"आपातकालीन कल मात्र"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM कार्ड, स्लट: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"पहुँचता"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"आगमन Wi-Fi कल"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi कल"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"खोल्न फेरि छुनुहोस्"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"सन्देश डिकोड गर्दा एउटा समस्या भयो।"</string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 9ef70b9..0486e14 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Tik nogmaals om te openen"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Er is een fout opgetreden tijdens het decoderen van het bericht."</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index a769f7b..1027620 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -558,6 +558,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Kliknij ponownie, by otworzyć"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Podczas dekodowania wiadomości wystąpił błąd."</string>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index b60ecdd..a65d6c1 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Tocar novamente para abrir"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Ocorreu um erro durante a descodificação da mensagem."</string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 1a601d9..f273918 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"Somente chamadas de emergência"</string>
<string name="sim_description_default" msgid="4778679519938775515">"Cartão SIM, slot: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Acessibilidade"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Chamada por Wi-Fi recebida"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Chamada por Wi-Fi"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Toque novamente para abrir"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Ocorreu um erro ao decodificar a mensagem."</string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 8c6874a..70dc5a8 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -555,6 +555,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Atingeți din nou pentru a deschide"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"A apărut o eroare la decodificarea mesajului."</string>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index f999607..e3f24a4 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -560,6 +560,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Нажмите ещё раз, чтобы открыть"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"При расшифровке сообщения произошла ошибка."</string>
</resources>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index 07e74f2..6c8a9a7 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -547,10 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"හදිස්සි ඇමතූම් පමණි"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM කාඩ්පත්, තව්ව: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"ප්රවේශ්යතාව"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"පැමිණෙන Wi-Fi ඇමතුම"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi-ඇමතුම"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"විවෘත කිරීමට නැවත ස්පර්ශ කරන්න"</string>
<string name="message_decode_error" msgid="3456481534066924855">"පණිවිඩය විකේතනය කරන අතරතුර දෝෂයක් සිදු විය."</string>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index ed51079..a4f2291 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -558,6 +558,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Dotaknite se znova, če želite odpreti"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Napaka pri dekodiranju sporočila."</string>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 11cbfd8..a229162 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -555,6 +555,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Додирните поново да бисте отворили"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Дошло је до грешке при декодирању поруке."</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 067be4f..ff56d53 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -558,6 +558,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Tryck igen för att öppna"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Ett fel inträffade när meddelandet avkodades."</string>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 41600fa..abd2fda 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -547,10 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"Simu za dharula pekee"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM kadi, nafasi: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Zana za walio na matatizo ya kuona au kusikia"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Simu ya Wi-Fi inayoingia"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Simu ya Wi-Fi"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Gusa tena ili ufungue"</string>
<string name="message_decode_error" msgid="3456481534066924855">"Hitilafu imetokea wakati wa usimbuaji wa ujumbe."</string>
</resources>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index 8277b73..33465c0 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"அவசர அழைப்பு மட்டுமே"</string>
<string name="sim_description_default" msgid="4778679519938775515">"சிம் கார்டு, ஸ்லாட்: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"அணுகல் தன்மை"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"உள்வரும் வைஃபை அழைப்பு"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"வைஃபை அழைப்பு"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"திறக்க, மீண்டும் தட்டவும்"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"செய்தியைக் குறிவிலக்கும்போது பிழை ஏற்பட்டது."</string>
</resources>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index 0c150e2..590be8e 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"అత్యవసర కాలింగ్ మాత్రమే"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM కార్డ్, స్లాట్: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"ప్రాప్యత సామర్థ్యం"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"ఇన్కమింగ్ Wi-Fi కాల్"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi కాల్"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"తెరవడానికి మళ్లీ తాకండి"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"సందేశాన్ని డీకోడ్ చేస్తున్నప్పుడు లోపం సంభవించింది."</string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index b93f8be..b72fab4 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"แตะอีกครั้งเพื่อเปิด"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"เกิดข้อผิดพลาดขณะถอดรหัสข้อความ"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 6556863..9c7d855 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -547,11 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"Emergency na pagtawag lang"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM card, slot: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Pagiging Naa-access"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Papasok na tawag sa Wi-Fi"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Tawag sa Wi-Fi"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Pinduting muli upang buksan"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Nagkaroon ng error habang dine-decode ang mensahe."</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index aae6127..99f570a 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Açmak için tekrar dokunun"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"İletinin kodu çözülürken bir hata oluştu."</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 8ffdd95..84d9bd5 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -553,11 +553,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"Лише екстрені виклики"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM-карта, роз’єм: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Спеціальні можливості"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Вхід. дзвінок через Wi-Fi"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Дзвінок через Wi-Fi"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Торкніться знову, щоб відкрити"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Під час розшифрування повідомлення сталася помилка."</string>
</resources>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index d8833cf..4e107b7 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"کھولنے کیلئے دوبارہ ٹچ کریں"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"پیغام کو ڈیکوڈ کرتے وقت ایک خرابی پیش آ گئی۔"</string>
</resources>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index ace849c..3e303b4 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -547,10 +547,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"Faqat favqulodda qo‘ng‘iroqlar"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM karta, teshik: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Maxsus imkoniyatlar"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Kiruvchi Wi-Fi qo‘ng‘irog‘i"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi qo‘ng‘irog‘i"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Ochish uchun yana bosing"</string>
<string name="message_decode_error" msgid="3456481534066924855">"Xabarni kodsizlashda xatolik yuz berdi."</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index aedc496..00fddfd 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Chạm lại để mở"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"Đã xảy ra lỗi khi giải mã thư."</string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 9f5c638..3aa8ee9 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -552,6 +552,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"再次触摸即可打开"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"解码邮件时出错。"</string>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 28e94ba..0f34b96 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -553,11 +553,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"只限緊急通話"</string>
<string name="sim_description_default" msgid="4778679519938775515">"SIM 卡,插槽:<xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"無障礙功能"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Wi-Fi 來電"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi 通話"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"再次輕觸以開啟"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"為訊息解碼時發生錯誤。"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 9195035..3a2b84a 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -558,6 +558,5 @@
<!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
<skip />
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"再次輕觸即可開啟"</string>
- <!-- no translation found for message_decode_error (3456481534066924855) -->
- <skip />
+ <string name="message_decode_error" msgid="3456481534066924855">"為郵件解碼時發生錯誤。"</string>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index fa8f982..79bcf32 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -551,10 +551,8 @@
<string name="sim_description_emergency_calls" msgid="7535215397212301562">"Ikholi ephuthumayo kuphela"</string>
<string name="sim_description_default" msgid="4778679519938775515">"Ikhadi le-SIM, isilothi: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
<string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Ukufinyeleleka"</string>
- <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
- <skip />
- <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
- <skip />
+ <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Ikholi ye-Wi-Fi engenayo"</string>
+ <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Ikholi ye-Wi-Fi"</string>
<string name="emergency_action_launch_hint" msgid="5841511849007540970">"Thinta futhi ukuze uvule"</string>
<string name="message_decode_error" msgid="3456481534066924855">"Kube nephutha ngenkathi kukhishwa ikhodi kumlayezo."</string>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ab56faf..e49310d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -171,6 +171,8 @@
<string name="connection_service_default_label">Built-in connection service</string>
<!-- Call settings screen, setting option name -->
<string name="voicemail">Voicemail</string>
+ <!-- Title of the "Voicemail" settings screen, with a text label identifying which SIM the settings are for. -->
+ <string name="voicemail_settings_with_label">Voicemail (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
<!-- Call forwarding dialog box, voicemail number prefix -->
<string name="voicemail_abbreviated">VM:</string>
<!-- Mobile network settings screen, setting option name -->
@@ -182,7 +184,7 @@
<!-- GSM Call settings screen, setting option name -->
<string name="additional_gsm_call_settings">Additional settings</string>
<!-- GSM Call settings screen, setting option name, with label identifying the SIM the settings are for. -->
- <string name="additional_gsm_call_settings_with_label">Additional settings (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
+ <string name="additional_gsm_call_settings_with_label">Additional settings (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
<!-- GSM-only Call settings screen, setting option name-->
<string name="sum_gsm_call_settings">Additional GSM only call settings</string>
<!-- CDMA Call settings screen, setting option name -->
@@ -210,7 +212,7 @@
<!-- Call forwarding settings screen, section heading -->
<string name="call_forwarding_settings">Call forwarding settings</string>
<!-- Call forwarding settings screen, section heading, with a label identifying the SIM the settings are for. -->
- <string name="call_forwarding_settings_with_label">Call forwarding settings (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
+ <string name="call_forwarding_settings_with_label">Call forwarding settings (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
<!-- Call settings screen, setting option name -->
<string name="labelCF">Call forwarding</string>
@@ -266,7 +268,7 @@
<!-- Toast in Call settings when asked to launch settings for a secondary user -->
<string name="call_settings_primary_user_only">Call settings can only be changed by the primary user.</string>
<!-- Title of the "Call settings" settings screen, with a text label identifying which SIM the settings are for. -->
- <string name="call_settings_with_label">Call settings (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
+ <string name="call_settings_with_label">Call settings (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
<!-- Title of the alert dialog displayed if an error occurs while updating Call settings -->
<string name="error_updating_title">Call settings error</string>
<!-- Toast in Call settings dialog while settings are being read -->
@@ -720,13 +722,13 @@
<string name="fdn">Fixed Dialing Numbers</string>
<!-- Title for "Fixed Dialing Number" settings, with a label to identify the SIM the settings
apply to. -->
- <string name="fdn_with_label">Fixed Dialing Numbers (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
+ <string name="fdn_with_label">Fixed Dialing Numbers (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
<!-- Call settings screen, button label that takes you to the Fixed Dialing Number management screen -->
<string name="manage_fdn_list">FDN list</string>
<!-- Title for settings screen to manage Fixed Dialing Number contacts, with a label to identify
the SIM the settings apply to. -->
- <string name="fdn_list_with_label">FDN list (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
+ <string name="fdn_list_with_label">FDN list (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
<!-- Call settings screen, preference item label -->
<string name="fdn_activation">FDN activation</string>
<!-- Call settings setting option name when FDN is enabled -->
diff --git a/res/xml/call_feature_setting.xml b/res/xml/call_feature_setting.xml
index 714f994..f696e2c 100644
--- a/res/xml/call_feature_setting.xml
+++ b/res/xml/call_feature_setting.xml
@@ -29,53 +29,7 @@
<PreferenceScreen
android:key="button_voicemail_category_key"
- android:title="@string/voicemail"
- android:persistent="false">
-
- <com.android.phone.settings.VoicemailProviderListPreference
- android:key="button_voicemail_provider_key"
- android:title="@string/voicemail_provider"
- android:summary="@string/sum_voicemail_choose_provider"
- android:defaultValue=""
- android:persistent="true" />
-
- <PreferenceScreen
- android:key="button_voicemail_setting_key"
- android:title="@string/voicemail_settings"
- android:persistent="false">
-
- <!-- Note for all com.android.phone.EditPhoneNumberPreference objects
-
- The last several attributes are for use with the EditText field
- in the dialog. These attributes are forwarded to that field
- when the edittext is created. The attributes include:
- 1. android:singleLine
- 2. android:autoText
- 3. android:background -->
-
- <com.android.phone.EditPhoneNumberPreference
- android:key="button_voicemail_key"
- android:title="@string/voicemail_settings_number_label"
- android:persistent="false"
- android:dialogTitle="@string/voicemail"
- phone:confirmMode="confirm"
- android:singleLine="true"
- android:autoText="false" />
-
- </PreferenceScreen>
-
- <com.android.phone.settings.VoicemailRingtonePreference
- android:key="@string/voicemail_notification_ringtone_key"
- android:title="@string/voicemail_notification_ringtone_title"
- android:persistent="false"
- android:ringtoneType="notification" />
-
- <CheckBoxPreference
- android:key="@string/voicemail_notification_vibrate_key"
- android:title="@string/voicemail_notification_vibrate_when_title"
- android:persistent="true" />
-
- </PreferenceScreen>
+ android:title="@string/voicemail" />
<PreferenceScreen
android:key="button_fdn_key"
diff --git a/res/xml/voicemail_settings.xml b/res/xml/voicemail_settings.xml
index f4679e5..a7d5fb4 100644
--- a/res/xml/voicemail_settings.xml
+++ b/res/xml/voicemail_settings.xml
@@ -15,9 +15,50 @@
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:phone="http://schemas.android.com/apk/res/com.android.phone"
android:title="@string/voicemail">
- <!-- Temporary placeholder until prefs are migrated from Call Settings. -->
- <Preference android:title="@string/voicemail" />
+ <com.android.phone.settings.VoicemailProviderListPreference
+ android:key="button_voicemail_provider_key"
+ android:title="@string/voicemail_provider"
+ android:summary="@string/sum_voicemail_choose_provider"
+ android:defaultValue=""
+ android:persistent="true" />
+
+ <PreferenceScreen
+ android:key="button_voicemail_setting_key"
+ android:title="@string/voicemail_settings"
+ android:persistent="false">
+
+ <!-- Note for all com.android.phone.EditPhoneNumberPreference objects
+
+ The last several attributes are for use with the EditText field
+ in the dialog. These attributes are forwarded to that field
+ when the edittext is created. The attributes include:
+ 1. android:singleLine
+ 2. android:autoText
+ 3. android:background -->
+
+ <com.android.phone.EditPhoneNumberPreference
+ android:key="button_voicemail_key"
+ android:title="@string/voicemail_settings_number_label"
+ android:persistent="false"
+ android:dialogTitle="@string/voicemail"
+ phone:confirmMode="confirm"
+ android:singleLine="true"
+ android:autoText="false" />
+
+ </PreferenceScreen>
+
+ <com.android.phone.settings.VoicemailRingtonePreference
+ android:key="@string/voicemail_notification_ringtone_key"
+ android:title="@string/voicemail_notification_ringtone_title"
+ android:persistent="false"
+ android:ringtoneType="notification" />
+
+ <CheckBoxPreference
+ android:key="@string/voicemail_notification_vibrate_key"
+ android:title="@string/voicemail_notification_vibrate_when_title"
+ android:persistent="true" />
</PreferenceScreen>
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index a3270e8..81781cb 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -25,18 +25,13 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.database.Cursor;
-import android.os.AsyncResult;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
import android.os.UserHandle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
-import android.provider.ContactsContract.CommonDataKinds;
import android.provider.Settings;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
@@ -44,7 +39,6 @@
import android.text.TextUtils;
import android.util.Log;
import android.view.MenuItem;
-import android.widget.ListAdapter;
import android.widget.Toast;
import com.android.ims.ImsConfig;
@@ -54,26 +48,13 @@
import com.android.internal.telephony.PhoneConstants;
import com.android.phone.common.util.SettingsUtil;
import com.android.phone.settings.AccountSelectionPreference;
-import com.android.phone.settings.CallForwardInfoUtil;
-import com.android.phone.settings.SettingsConstants;
-import com.android.phone.settings.VoicemailDialogUtil;
-import com.android.phone.settings.VoicemailNotificationSettingsUtil;
-import com.android.phone.settings.VoicemailProviderListPreference;
-import com.android.phone.settings.VoicemailProviderListPreference.VoicemailProvider;
-import com.android.phone.settings.VoicemailProviderSettings;
-import com.android.phone.settings.VoicemailProviderSettingsUtil;
-import com.android.phone.settings.VoicemailRingtonePreference;
+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.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
-import java.util.Map;
/**
* Top level "Call settings" UI; see res/xml/call_feature_setting.xml
@@ -90,57 +71,15 @@
* For the "Mobile network settings" screen under the main Settings app,
* See {@link MobileNetworkSettings}.
*
- * TODO: Settings should be split into PreferenceFragments where possible (ie. voicemail).
- *
* @see com.android.phone.MobileNetworkSettings
*/
public class CallFeaturesSetting extends PreferenceActivity
- implements DialogInterface.OnClickListener,
- Preference.OnPreferenceChangeListener,
- EditPhoneNumberPreference.OnDialogClosedListener,
- EditPhoneNumberPreference.GetDefaultNumberListener {
+ implements Preference.OnPreferenceChangeListener {
private static final String LOG_TAG = "CallFeaturesSetting";
private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
// STOPSHIP if true. Flag to override behavior default behavior to hide VT setting.
private static final boolean ENABLE_VT_FLAG = false;
- /**
- * Intent action to bring up Voicemail Provider settings.
- *
- * @see #IGNORE_PROVIDER_EXTRA
- */
- public static final String ACTION_ADD_VOICEMAIL =
- "com.android.phone.CallFeaturesSetting.ADD_VOICEMAIL";
- // intent action sent by this activity to a voice mail provider
- // to trigger its configuration UI
- public static final String ACTION_CONFIGURE_VOICEMAIL =
- "com.android.phone.CallFeaturesSetting.CONFIGURE_VOICEMAIL";
- // Extra put in the return from VM provider config containing voicemail number to set
- public static final String VM_NUMBER_EXTRA = "com.android.phone.VoicemailNumber";
- // Extra put in the return from VM provider config containing call forwarding number to set
- public static final String FWD_NUMBER_EXTRA = "com.android.phone.ForwardingNumber";
- // Extra put in the return from VM provider config containing call forwarding number to set
- public static final String FWD_NUMBER_TIME_EXTRA = "com.android.phone.ForwardingNumberTime";
- // If the VM provider returns non null value in this extra we will force the user to
- // choose another VM provider
- public static final String SIGNOUT_EXTRA = "com.android.phone.Signout";
-
- /**
- * String Extra put into ACTION_ADD_VOICEMAIL call to indicate which provider should be hidden
- * in the list of providers presented to the user. This allows a provider which is being
- * disabled (e.g. GV user logging out) to force the user to pick some other provider.
- */
- public static final String IGNORE_PROVIDER_EXTRA = "com.android.phone.ProviderToIgnore";
-
- /**
- * String Extra put into ACTION_ADD_VOICEMAIL to indicate that the voicemail setup screen should
- * be opened.
- */
- public static final String SETUP_VOICEMAIL_EXTRA = "com.android.phone.SetupVoicemail";
-
- // string constants
- private static final String NUM_PROJECTION[] = {CommonDataKinds.Phone.NUMBER};
-
// String keys for preference lookup
// TODO: Naming these "BUTTON_*" is confusing since they're not actually buttons(!)
// TODO: Consider moving these strings to strings.xml, so that they are not duplicated here and
@@ -148,13 +87,8 @@
// persistent, they are used as the key to store shared preferences and the name should not be
// changed unless the settings are also migrated.
private static final String VOICEMAIL_SETTING_SCREEN_PREF_KEY = "button_voicemail_category_key";
- private static final String BUTTON_VOICEMAIL_KEY = "button_voicemail_key";
- private static final String BUTTON_VOICEMAIL_PROVIDER_KEY = "button_voicemail_provider_key";
- private static final String BUTTON_VOICEMAIL_SETTING_KEY = "button_voicemail_setting_key";
private static final String BUTTON_FDN_KEY = "button_fdn_key";
-
private static final String BUTTON_RETRY_KEY = "button_auto_retry_key";
-
private static final String BUTTON_GSM_UMTS_OPTIONS = "button_gsm_more_expand_key";
private static final String BUTTON_CDMA_OPTIONS = "button_cdma_more_expand_key";
private static final String CALL_FORWARDING_KEY = "call_forwarding_key";
@@ -165,119 +99,13 @@
private static final String ENABLE_VIDEO_CALLING_KEY = "button_enable_video_calling";
- /** Event for Async voicemail change call */
- private static final int EVENT_VOICEMAIL_CHANGED = 500;
- private static final int EVENT_FORWARDING_CHANGED = 501;
- private static final int EVENT_FORWARDING_GET_COMPLETED = 502;
-
- /** Handle to voicemail pref */
- private static final int VOICEMAIL_PREF_ID = 1;
- private static final int VOICEMAIL_PROVIDER_CFG_ID = 2;
-
private Phone mPhone;
-
private SubscriptionInfoHelper mSubscriptionInfoHelper;
- private EditPhoneNumberPreference mSubMenuVoicemailSettings;
-
private CheckBoxPreference mButtonAutoRetry;
- private VoicemailProviderListPreference mVoicemailProviders;
private PreferenceScreen mVoicemailSettingsScreen;
- private PreferenceScreen mVoicemailSettings;
- private VoicemailRingtonePreference mVoicemailNotificationRingtone;
- private CheckBoxPreference mVoicemailNotificationVibrate;
private CheckBoxPreference mEnableVideoCalling;
- /**
- * Results of reading forwarding settings
- */
- private CallForwardInfo[] mForwardingReadResults = null;
-
- /**
- * Result of forwarding number change.
- * Keys are reasons (eg. unconditional forwarding).
- */
- private Map<Integer, AsyncResult> mForwardingChangeResults = null;
-
- /**
- * Expected CF read result types.
- * This set keeps track of the CF types for which we've issued change
- * commands so we can tell when we've received all of the responses.
- */
- private Collection<Integer> mExpectedChangeResultReasons = null;
-
- /**
- * Result of vm number change
- */
- private AsyncResult mVoicemailChangeResult = null;
-
- /**
- * Previous VM provider setting so we can return to it in case of failure.
- */
- private String mPreviousVMProviderKey = null;
-
- /**
- * Id of the dialog being currently shown.
- */
- private int mCurrentDialogId = 0;
-
- /**
- * Flag indicating that we are invoking settings for the voicemail provider programmatically
- * due to vm provider change.
- */
- private boolean mVMProviderSettingsForced = false;
-
- /**
- * Flag indicating that we are making changes to vm or fwd numbers
- * due to vm provider change.
- */
- private boolean mChangingVMorFwdDueToProviderChange = false;
-
- /**
- * True if we are in the process of vm & fwd number change and vm has already been changed.
- * This is used to decide what to do in case of rollback.
- */
- private boolean mVMChangeCompletedSuccessfully = false;
-
- /**
- * True if we had full or partial failure setting forwarding numbers and so need to roll them
- * back.
- */
- private boolean mFwdChangesRequireRollback = false;
-
- /**
- * Id of error msg to display to user once we are done reverting the VM provider to the previous
- * one.
- */
- private int mVMOrFwdSetError = 0;
-
- /** string to hold old voicemail number as it is being updated. */
- private String mOldVmNumber;
-
- // New call forwarding settings and vm number we will be setting
- // Need to save these since before we get to saving we need to asynchronously
- // query the existing forwarding settings.
- private CallForwardInfo[] mNewFwdSettings;
- private String mNewVMNumber;
-
- private boolean mForeground;
-
- @Override
- public void onPause() {
- super.onPause();
- mForeground = false;
- }
-
- /**
- * Used to indicate that the voicemail preference should be shown.
- */
- private boolean mShowVoicemailPreference = false;
-
- /**
- * Used to indicate that the voicemail setup screen should be shown.
- */
- private boolean mSetupVoicemail = false;
-
/*
* Click Listeners, handle click based on objects attached to UI.
*/
@@ -285,44 +113,11 @@
// Click listener for all toggle events
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
- if (preference == mSubMenuVoicemailSettings) {
- return true;
- } else if (preference == mButtonAutoRetry) {
+ if (preference == mButtonAutoRetry) {
android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
android.provider.Settings.Global.CALL_AUTO_RETRY,
mButtonAutoRetry.isChecked() ? 1 : 0);
return true;
- } else if (preference.getKey().equals(mVoicemailSettings.getKey())) {
- // Check key instead of comparing reference because closing the voicemail notification
- // ringtone dialog invokes onResume(), but leaves the old preference screen up,
- // TODO: Revert to checking reference after migrating voicemail to its own activity.
- if (DBG) log("onPreferenceTreeClick: Voicemail Settings Preference is clicked.");
-
- final Dialog dialog = ((PreferenceScreen) preference).getDialog();
- if (dialog != null) {
- dialog.getActionBar().setDisplayHomeAsUpEnabled(false);
- }
-
- if (preference.getIntent() != null) {
- if (DBG) log("Invoking cfg intent " + preference.getIntent().getPackage());
-
- // onActivityResult() will be responsible for resetting some of variables.
- this.startActivityForResult(preference.getIntent(), VOICEMAIL_PROVIDER_CFG_ID);
- return true;
- } else {
- if (DBG) log("onPreferenceTreeClick(). No intent; use default behavior in xml.");
-
- // onActivityResult() will not be called, so reset variables here.
- mPreviousVMProviderKey = VoicemailProviderListPreference.DEFAULT_KEY;
- mVMProviderSettingsForced = false;
- return false;
- }
- } else if (preference == mVoicemailSettingsScreen) {
- final Dialog dialog = mVoicemailSettingsScreen.getDialog();
- if (dialog != null) {
- dialog.getActionBar().setDisplayHomeAsUpEnabled(false);
- }
- return false;
}
return false;
}
@@ -339,40 +134,7 @@
public boolean onPreferenceChange(Preference preference, Object objValue) {
if (DBG) log("onPreferenceChange: \"" + preference + "\" changed to \"" + objValue + "\"");
- if (preference == mVoicemailProviders) {
- final String newProviderKey = (String) objValue;
-
- // If previous provider key and the new one is same, we don't need to handle it.
- if (mPreviousVMProviderKey.equals(newProviderKey)) {
- if (DBG) log("No change is made to the VM provider setting.");
- return true;
- }
- updateVMPreferenceWidgets(newProviderKey);
-
- final VoicemailProviderSettings newProviderSettings =
- VoicemailProviderSettingsUtil.load(this, newProviderKey);
-
- // If the user switches to a voice mail provider and we have numbers stored for it we
- // will automatically change the phone's voice mail and forwarding number to the stored
- // ones. Otherwise we will bring up provider's configuration UI.
- if (newProviderSettings == null) {
- // Force the user into a configuration of the chosen provider
- Log.w(LOG_TAG, "Saved preferences not found - invoking config");
- mVMProviderSettingsForced = true;
- simulatePreferenceClick(mVoicemailSettings);
- } else {
- if (DBG) log("Saved preferences found - switching to them");
- // Set this flag so if we get a failure we revert to previous provider
- mChangingVMorFwdDueToProviderChange = true;
- saveVoiceMailAndForwardingNumber(newProviderKey, newProviderSettings);
- }
- } else if (preference.getKey().equals(mVoicemailNotificationVibrate.getKey())) {
- // Check key instead of comparing reference because closing the voicemail notification
- // ringtone dialog invokes onResume(), but leaves the old preference screen up,
- // TODO: Revert to checking reference after migrating voicemail to its own activity.
- VoicemailNotificationSettingsUtil.setVibrationEnabled(
- mPhone, Boolean.TRUE.equals(objValue));
- } else if (preference == mEnableVideoCalling) {
+ if (preference == mEnableVideoCalling) {
if (ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())) {
PhoneGlobals.getInstance().phoneMgr.enableVideoCalling((boolean) objValue);
} else {
@@ -401,667 +163,6 @@
}
@Override
- public void onDialogClosed(EditPhoneNumberPreference preference, int buttonClicked) {
- if (DBG) log("onDialogClosed: Button clicked is " + buttonClicked);
-
- if (buttonClicked == DialogInterface.BUTTON_NEGATIVE) {
- return;
- }
-
- if (preference == mSubMenuVoicemailSettings) {
- VoicemailProviderSettings newSettings = new VoicemailProviderSettings(
- mSubMenuVoicemailSettings.getPhoneNumber(),
- VoicemailProviderSettings.NO_FORWARDING);
- saveVoiceMailAndForwardingNumber(mVoicemailProviders.getKey(), newSettings);
- }
- }
-
- /**
- * Implemented for EditPhoneNumberPreference.GetDefaultNumberListener.
- * This method set the default values for the various
- * EditPhoneNumberPreference dialogs.
- */
- @Override
- public String onGetDefaultNumber(EditPhoneNumberPreference preference) {
- if (preference == mSubMenuVoicemailSettings) {
- // update the voicemail number field, which takes care of the
- // mSubMenuVoicemailSettings itself, so we should return null.
- if (DBG) log("updating default for voicemail dialog");
- updateVoiceNumberField();
- return null;
- }
-
- String vmDisplay = mPhone.getVoiceMailNumber();
- if (TextUtils.isEmpty(vmDisplay)) {
- // if there is no voicemail number, we just return null to
- // indicate no contribution.
- return null;
- }
-
- // Return the voicemail number prepended with "VM: "
- if (DBG) log("updating default for call forwarding dialogs");
- return getString(R.string.voicemail_abbreviated) + " " + vmDisplay;
- }
-
- private void switchToPreviousVoicemailProvider() {
- if (DBG) log("switchToPreviousVoicemailProvider " + mPreviousVMProviderKey);
-
- if (mPreviousVMProviderKey == null) {
- return;
- }
-
- if (mVMChangeCompletedSuccessfully || mFwdChangesRequireRollback) {
- showDialogIfForeground(VoicemailDialogUtil.VM_REVERTING_DIALOG);
- final VoicemailProviderSettings prevSettings =
- VoicemailProviderSettingsUtil.load(this, mPreviousVMProviderKey);
- if (prevSettings == null) {
- Log.e(LOG_TAG, "VoicemailProviderSettings for the key \""
- + mPreviousVMProviderKey + "\" is null but should be loaded.");
- }
-
- if (mVMChangeCompletedSuccessfully) {
- mNewVMNumber = prevSettings.getVoicemailNumber();
- Log.i(LOG_TAG, "VM change is already completed successfully."
- + "Have to revert VM back to " + mNewVMNumber + " again.");
- mPhone.setVoiceMailNumber(
- mPhone.getVoiceMailAlphaTag().toString(),
- mNewVMNumber,
- Message.obtain(mRevertOptionComplete, EVENT_VOICEMAIL_CHANGED));
- }
-
- if (mFwdChangesRequireRollback) {
- Log.i(LOG_TAG, "Requested to rollback forwarding changes.");
-
- final CallForwardInfo[] prevFwdSettings = prevSettings.getForwardingSettings();
- if (prevFwdSettings != null) {
- Map<Integer, AsyncResult> results = mForwardingChangeResults;
- resetForwardingChangeState();
- for (int i = 0; i < prevFwdSettings.length; i++) {
- CallForwardInfo fi = prevFwdSettings[i];
- if (DBG) log("Reverting fwd #: " + i + ": " + fi.toString());
- // Only revert the settings for which the update succeeded.
- AsyncResult result = results.get(fi.reason);
- if (result != null && result.exception == null) {
- mExpectedChangeResultReasons.add(fi.reason);
- CallForwardInfoUtil.setCallForwardingOption(mPhone, fi,
- mRevertOptionComplete.obtainMessage(
- EVENT_FORWARDING_CHANGED, i, 0));
- }
- }
- }
- }
- } else {
- if (DBG) log("No need to revert");
- onRevertDone();
- }
- }
-
- private void onRevertDone() {
- if (DBG) log("onRevertDone: Changing provider key back to " + mPreviousVMProviderKey);
-
- updateVMPreferenceWidgets(mPreviousVMProviderKey);
- updateVoiceNumberField();
- if (mVMOrFwdSetError != 0) {
- showDialogIfForeground(mVMOrFwdSetError);
- mVMOrFwdSetError = 0;
- }
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (DBG) {
- log("onActivityResult: requestCode: " + requestCode
- + ", resultCode: " + resultCode
- + ", data: " + data);
- }
-
- // there are cases where the contact picker may end up sending us more than one
- // request. We want to ignore the request if we're not in the correct state.
- if (requestCode == VOICEMAIL_PROVIDER_CFG_ID) {
- boolean failure = false;
-
- // No matter how the processing of result goes lets clear the flag
- if (DBG) log("mVMProviderSettingsForced: " + mVMProviderSettingsForced);
- final boolean isVMProviderSettingsForced = mVMProviderSettingsForced;
- mVMProviderSettingsForced = false;
-
- String vmNum = null;
- if (resultCode != RESULT_OK) {
- if (DBG) log("onActivityResult: vm provider cfg result not OK.");
- failure = true;
- } else {
- if (data == null) {
- if (DBG) log("onActivityResult: vm provider cfg result has no data");
- failure = true;
- } else {
- if (data.getBooleanExtra(SIGNOUT_EXTRA, false)) {
- if (DBG) log("Provider requested signout");
- if (isVMProviderSettingsForced) {
- if (DBG) log("Going back to previous provider on signout");
- switchToPreviousVoicemailProvider();
- } else {
- final String victim = mVoicemailProviders.getKey();
- if (DBG) log("Relaunching activity and ignoring " + victim);
- Intent i = new Intent(ACTION_ADD_VOICEMAIL);
- i.putExtra(IGNORE_PROVIDER_EXTRA, victim);
- i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- this.startActivity(i);
- }
- return;
- }
- vmNum = data.getStringExtra(VM_NUMBER_EXTRA);
- if (vmNum == null || vmNum.length() == 0) {
- if (DBG) log("onActivityResult: vm provider cfg result has no vmnum");
- failure = true;
- }
- }
- }
- if (failure) {
- if (DBG) log("Failure in return from voicemail provider.");
- if (isVMProviderSettingsForced) {
- switchToPreviousVoicemailProvider();
- }
-
- return;
- }
- mChangingVMorFwdDueToProviderChange = isVMProviderSettingsForced;
- final String fwdNum = data.getStringExtra(FWD_NUMBER_EXTRA);
-
- // TODO: It would be nice to load the current network setting for this and
- // send it to the provider when it's config is invoked so it can use this as default
- final int fwdNumTime = data.getIntExtra(FWD_NUMBER_TIME_EXTRA, 20);
-
- if (DBG) log("onActivityResult: cfg result has forwarding number " + fwdNum);
- saveVoiceMailAndForwardingNumber(mVoicemailProviders.getKey(),
- new VoicemailProviderSettings(vmNum, fwdNum, fwdNumTime));
- return;
- }
-
- if (requestCode == VOICEMAIL_PREF_ID) {
- if (resultCode != RESULT_OK) {
- if (DBG) log("onActivityResult: contact picker result not OK.");
- return;
- }
-
- Cursor cursor = null;
- try {
- cursor = getContentResolver().query(data.getData(),
- NUM_PROJECTION, null, null, null);
- if ((cursor == null) || (!cursor.moveToFirst())) {
- if (DBG) log("onActivityResult: bad contact data, no results found.");
- return;
- }
- mSubMenuVoicemailSettings.onPickActivityResult(cursor.getString(0));
- return;
- } finally {
- if (cursor != null) {
- cursor.close();
- }
- }
- }
-
- super.onActivityResult(requestCode, resultCode, data);
- }
-
- /**
- * Wrapper around showDialog() that will silently do nothing if we're
- * not in the foreground.
- *
- * This is useful here because most of the dialogs we display from
- * this class are triggered by asynchronous events (like
- * success/failure messages from the telephony layer) and it's
- * possible for those events to come in even after the user has gone
- * to a different screen.
- */
- // TODO: this is too brittle: it's still easy to accidentally add new
- // code here that calls showDialog() directly (which will result in a
- // WindowManager$BadTokenException if called after the activity has
- // been stopped.)
- //
- // It would be cleaner to do the "if (mForeground)" check in one
- // central place, maybe by using a single Handler for all asynchronous
- // events (and have *that* discard events if we're not in the
- // foreground.)
- //
- // Unfortunately it's not that simple, since we sometimes need to do
- // actual work to handle these events whether or not we're in the
- // foreground (see the Handler code in mSetOptionComplete for
- // example.)
- //
- // TODO: It's a bit worrisome that we don't do anything in error cases when we're not in the
- // foreground. Consider displaying a toast instead.
- private void showDialogIfForeground(int id) {
- if (mForeground) {
- showDialog(id);
- }
- }
-
- private void dismissDialogSafely(int id) {
- try {
- dismissDialog(id);
- } catch (IllegalArgumentException e) {
- // This is expected in the case where we were in the background
- // at the time we would normally have shown the dialog, so we didn't
- // show it.
- }
- }
-
- /**
- * TODO: Refactor to make it easier to understand what's done in the different stages.
- */
- private void saveVoiceMailAndForwardingNumber(
- String key, VoicemailProviderSettings newSettings) {
- if (DBG) log("saveVoiceMailAndForwardingNumber: " + newSettings.toString());
- mNewVMNumber = newSettings.getVoicemailNumber();
- mNewVMNumber = (mNewVMNumber == null) ? "" : mNewVMNumber;
- mNewFwdSettings = newSettings.getForwardingSettings();
-
- // Call forwarding is not suppported on CDMA.
- if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
- if (DBG) log("Ignoring forwarding setting since this is CDMA phone");
- mNewFwdSettings = VoicemailProviderSettings.NO_FORWARDING;
- }
-
- // Throw a warning if the voicemail is the same and we did not change forwarding.
- if (mNewVMNumber.equals(mOldVmNumber)
- && mNewFwdSettings == VoicemailProviderSettings.NO_FORWARDING) {
- showDialogIfForeground(VoicemailDialogUtil.VM_NOCHANGE_ERROR_DIALOG);
- return;
- }
-
- VoicemailProviderSettingsUtil.save(this, key, newSettings);
- mVMChangeCompletedSuccessfully = false;
- mFwdChangesRequireRollback = false;
- mVMOrFwdSetError = 0;
-
- if (mNewFwdSettings == VoicemailProviderSettings.NO_FORWARDING
- || key.equals(mPreviousVMProviderKey)) {
- if (DBG) log("Set voicemail number. No changes to forwarding number.");
- setVoicemailNumberWithCarrier();
- } else {
- if (DBG) log("Reading current forwarding settings.");
- int numSettingsReasons = VoicemailProviderSettings.FORWARDING_SETTINGS_REASONS.length;
- mForwardingReadResults = new CallForwardInfo[numSettingsReasons];
- for (int i = 0; i < mForwardingReadResults.length; i++) {
- mPhone.getCallForwardingOption(
- VoicemailProviderSettings.FORWARDING_SETTINGS_REASONS[i],
- mGetOptionComplete.obtainMessage(EVENT_FORWARDING_GET_COMPLETED, i, 0));
- }
- showDialogIfForeground(VoicemailDialogUtil.VM_FWD_READING_DIALOG);
- }
-
- PhoneGlobals.getInstance().refreshMwiIndicator(mSubscriptionInfoHelper.getSubId());
- }
-
- private final Handler mGetOptionComplete = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- AsyncResult result = (AsyncResult) msg.obj;
- switch (msg.what) {
- case EVENT_FORWARDING_GET_COMPLETED:
- handleForwardingSettingsReadResult(result, msg.arg1);
- break;
- }
- }
- };
-
- private void handleForwardingSettingsReadResult(AsyncResult ar, int idx) {
- if (DBG) Log.d(LOG_TAG, "handleForwardingSettingsReadResult: " + idx);
-
- Throwable error = null;
- if (ar.exception != null) {
- error = ar.exception;
- if (DBG) Log.d(LOG_TAG, "FwdRead: ar.exception=" + error.getMessage());
- }
- if (ar.userObj instanceof Throwable) {
- error = (Throwable) ar.userObj;
- if (DBG) Log.d(LOG_TAG, "FwdRead: userObj=" + error.getMessage());
- }
-
- // We may have already gotten an error and decided to ignore the other results.
- if (mForwardingReadResults == null) {
- if (DBG) Log.d(LOG_TAG, "Ignoring fwd reading result: " + idx);
- return;
- }
-
- // In case of error ignore other results, show an error dialog
- if (error != null) {
- if (DBG) Log.d(LOG_TAG, "Error discovered for fwd read : " + idx);
- mForwardingReadResults = null;
- dismissDialogSafely(VoicemailDialogUtil.VM_FWD_READING_DIALOG);
- showDialogIfForeground(VoicemailDialogUtil.FWD_GET_RESPONSE_ERROR_DIALOG);
- return;
- }
-
- // Get the forwarding info.
- mForwardingReadResults[idx] = CallForwardInfoUtil.getCallForwardInfo(
- (CallForwardInfo[]) ar.result,
- VoicemailProviderSettings.FORWARDING_SETTINGS_REASONS[idx]);
-
- // Check if we got all the results already
- boolean done = true;
- for (int i = 0; i < mForwardingReadResults.length; i++) {
- if (mForwardingReadResults[i] == null) {
- done = false;
- break;
- }
- }
-
- if (done) {
- if (DBG) Log.d(LOG_TAG, "Done receiving fwd info");
- dismissDialogSafely(VoicemailDialogUtil.VM_FWD_READING_DIALOG);
-
- if (mPreviousVMProviderKey.equals(VoicemailProviderListPreference.DEFAULT_KEY)) {
- VoicemailProviderSettingsUtil.save(mPhone.getContext(),
- VoicemailProviderListPreference.DEFAULT_KEY,
- new VoicemailProviderSettings(mOldVmNumber, mForwardingReadResults));
- }
- saveVoiceMailAndForwardingNumberStage2();
- }
- }
-
- private void resetForwardingChangeState() {
- mForwardingChangeResults = new HashMap<Integer, AsyncResult>();
- mExpectedChangeResultReasons = new HashSet<Integer>();
- }
-
- // Called after we are done saving the previous forwarding settings if we needed.
- private void saveVoiceMailAndForwardingNumberStage2() {
- mForwardingChangeResults = null;
- mVoicemailChangeResult = null;
-
- resetForwardingChangeState();
- for (int i = 0; i < mNewFwdSettings.length; i++) {
- CallForwardInfo fi = mNewFwdSettings[i];
- CallForwardInfo fiForReason =
- CallForwardInfoUtil.infoForReason(mForwardingReadResults, fi.reason);
- final boolean doUpdate = CallForwardInfoUtil.isUpdateRequired(fiForReason, fi);
-
- if (doUpdate) {
- if (DBG) log("Setting fwd #: " + i + ": " + fi.toString());
- mExpectedChangeResultReasons.add(i);
-
- CallForwardInfoUtil.setCallForwardingOption(mPhone, fi,
- mSetOptionComplete.obtainMessage(
- EVENT_FORWARDING_CHANGED, fi.reason, 0));
- }
- }
- showDialogIfForeground(VoicemailDialogUtil.VM_FWD_SAVING_DIALOG);
- }
-
- private void setVoicemailNumberWithCarrier() {
- if (DBG) log("save voicemail #: " + mNewVMNumber);
-
- mVoicemailChangeResult = null;
- mPhone.setVoiceMailNumber(
- mPhone.getVoiceMailAlphaTag().toString(),
- mNewVMNumber,
- Message.obtain(mSetOptionComplete, EVENT_VOICEMAIL_CHANGED));
- }
-
- /**
- * Callback to handle option update completions
- */
- private final Handler mSetOptionComplete = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- AsyncResult result = (AsyncResult) msg.obj;
- boolean done = false;
- switch (msg.what) {
- case EVENT_VOICEMAIL_CHANGED:
- mVoicemailChangeResult = result;
- mVMChangeCompletedSuccessfully = isVmChangeSuccess();
- done = true;
- break;
- case EVENT_FORWARDING_CHANGED:
- mForwardingChangeResults.put(msg.arg1, result);
- if (result.exception != null) {
- Log.w(LOG_TAG, "Error in setting fwd# " + msg.arg1 + ": " +
- result.exception.getMessage());
- }
- if (isForwardingCompleted()) {
- if (isFwdChangeSuccess()) {
- if (DBG) log("Overall fwd changes completed ok, starting vm change");
- setVoicemailNumberWithCarrier();
- } else {
- Log.w(LOG_TAG, "Overall fwd changes completed in failure. " +
- "Check if we need to try rollback for some settings.");
- mFwdChangesRequireRollback = false;
- Iterator<Map.Entry<Integer,AsyncResult>> it =
- mForwardingChangeResults.entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry<Integer,AsyncResult> entry = it.next();
- if (entry.getValue().exception == null) {
- // If at least one succeeded we have to revert
- Log.i(LOG_TAG, "Rollback will be required");
- mFwdChangesRequireRollback = true;
- break;
- }
- }
- if (!mFwdChangesRequireRollback) {
- Log.i(LOG_TAG, "No rollback needed.");
- }
- done = true;
- }
- }
- break;
- default:
- // TODO: should never reach this, may want to throw exception
- }
-
- if (done) {
- if (DBG) log("All VM provider related changes done");
- if (mForwardingChangeResults != null) {
- dismissDialogSafely(VoicemailDialogUtil.VM_FWD_SAVING_DIALOG);
- }
- handleSetVmOrFwdMessage();
- }
- }
- };
-
- /**
- * Callback to handle option revert completions
- */
- private final Handler mRevertOptionComplete = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- AsyncResult result = (AsyncResult) msg.obj;
- switch (msg.what) {
- case EVENT_VOICEMAIL_CHANGED:
- if (DBG) log("VM revert complete msg");
- mVoicemailChangeResult = result;
- break;
-
- case EVENT_FORWARDING_CHANGED:
- if (DBG) log("FWD revert complete msg ");
- mForwardingChangeResults.put(msg.arg1, result);
- if (result.exception != null) {
- if (DBG) log("Error in reverting fwd# " + msg.arg1 + ": " +
- result.exception.getMessage());
- }
- break;
-
- default:
- // TODO: should never reach this, may want to throw exception
- }
-
- final boolean done = (!mVMChangeCompletedSuccessfully || mVoicemailChangeResult != null)
- && (!mFwdChangesRequireRollback || isForwardingCompleted());
- if (done) {
- if (DBG) log("All VM reverts done");
- dismissDialogSafely(VoicemailDialogUtil.VM_REVERTING_DIALOG);
- onRevertDone();
- }
- }
- };
-
- /**
- * Return true if there is a change result for every reason for which we expect a result.
- */
- private boolean isForwardingCompleted() {
- if (mForwardingChangeResults == null) {
- return true;
- }
-
- for (Integer reason : mExpectedChangeResultReasons) {
- if (mForwardingChangeResults.get(reason) == null) {
- return false;
- }
- }
-
- return true;
- }
-
- private boolean isFwdChangeSuccess() {
- if (mForwardingChangeResults == null) {
- return true;
- }
-
- for (AsyncResult result : mForwardingChangeResults.values()) {
- Throwable exception = result.exception;
- if (exception != null) {
- String msg = exception.getMessage();
- msg = (msg != null) ? msg : "";
- Log.w(LOG_TAG, "Failed to change forwarding setting. Reason: " + msg);
- return false;
- }
- }
- return true;
- }
-
- private boolean isVmChangeSuccess() {
- if (mVoicemailChangeResult.exception != null) {
- String msg = mVoicemailChangeResult.exception.getMessage();
- msg = (msg != null) ? msg : "";
- Log.w(LOG_TAG, "Failed to change voicemail. Reason: " + msg);
- return false;
- }
- return true;
- }
-
- private void handleSetVmOrFwdMessage() {
- if (DBG) log("handleSetVMMessage: set VM request complete");
-
- if (!isFwdChangeSuccess()) {
- handleVmOrFwdSetError(VoicemailDialogUtil.FWD_SET_RESPONSE_ERROR_DIALOG);
- } else if (!isVmChangeSuccess()) {
- handleVmOrFwdSetError(VoicemailDialogUtil.VM_RESPONSE_ERROR_DIALOG);
- } else {
- handleVmAndFwdSetSuccess(VoicemailDialogUtil.VM_CONFIRM_DIALOG);
- }
- }
-
- /**
- * Called when Voicemail Provider or its forwarding settings failed. Rolls back partly made
- * changes to those settings and show "failure" dialog.
- *
- * @param dialogId ID of the dialog to show for the specific error case. Either
- * {@link #FWD_SET_RESPONSE_ERROR_DIALOG} or {@link #VM_RESPONSE_ERROR_DIALOG}
- */
- private void handleVmOrFwdSetError(int dialogId) {
- if (mChangingVMorFwdDueToProviderChange) {
- mVMOrFwdSetError = dialogId;
- mChangingVMorFwdDueToProviderChange = false;
- switchToPreviousVoicemailProvider();
- return;
- }
- mChangingVMorFwdDueToProviderChange = false;
- showDialogIfForeground(dialogId);
- updateVoiceNumberField();
- }
-
- /**
- * Called when Voicemail Provider and its forwarding settings were successfully finished.
- * This updates a bunch of variables and show "success" dialog.
- */
- private void handleVmAndFwdSetSuccess(int dialogId) {
- if (DBG) log("handleVmAndFwdSetSuccess: key is " + mVoicemailProviders.getKey());
-
- mPreviousVMProviderKey = mVoicemailProviders.getKey();
- mChangingVMorFwdDueToProviderChange = false;
- showDialogIfForeground(dialogId);
- updateVoiceNumberField();
- }
-
- /**
- * Update the voicemail number from what we've recorded on the sim.
- */
- private void updateVoiceNumberField() {
- if (DBG) log("updateVoiceNumberField()");
-
- mOldVmNumber = mPhone.getVoiceMailNumber();
- if (TextUtils.isEmpty(mOldVmNumber)) {
- mSubMenuVoicemailSettings.setPhoneNumber("");
- mSubMenuVoicemailSettings.setSummary(getString(R.string.voicemail_number_not_set));
- } else {
- mSubMenuVoicemailSettings.setPhoneNumber(mOldVmNumber);
- mSubMenuVoicemailSettings.setSummary(mOldVmNumber);
- }
- }
-
- /*
- * Helper Methods for Activity class.
- * The initial query commands are split into two pieces now
- * for individual expansion. This combined with the ability
- * to cancel queries allows for a much better user experience,
- * and also ensures that the user only waits to update the
- * data that is relevant.
- */
-
- @Override
- protected void onPrepareDialog(int id, Dialog dialog) {
- super.onPrepareDialog(id, dialog);
- mCurrentDialogId = id;
- }
-
- // dialog creation method, called by showDialog()
- @Override
- protected Dialog onCreateDialog(int dialogId) {
- return VoicemailDialogUtil.getDialog(this, dialogId);
- }
-
- // This is a method implemented for DialogInterface.OnClickListener.
- // Used with the error dialog to close the app, voicemail dialog to just dismiss.
- // Close button is mapped to BUTTON_POSITIVE for the errors that close the activity,
- // while those that are mapped to BUTTON_NEUTRAL only move the preference focus.
- public void onClick(DialogInterface dialog, int which) {
- if (DBG) log("onClick: button clicked is " + which);
-
- dialog.dismiss();
- switch (which){
- case DialogInterface.BUTTON_NEGATIVE:
- if (mCurrentDialogId == VoicemailDialogUtil.FWD_GET_RESPONSE_ERROR_DIALOG) {
- // We failed to get current forwarding settings and the user
- // does not wish to continue.
- switchToPreviousVoicemailProvider();
- }
- break;
- case DialogInterface.BUTTON_POSITIVE:
- if (mCurrentDialogId == VoicemailDialogUtil.FWD_GET_RESPONSE_ERROR_DIALOG) {
- // We failed to get current forwarding settings but the user
- // wishes to continue changing settings to the new vm provider
- setVoicemailNumberWithCarrier();
- } else {
- finish();
- }
- return;
- default:
- // just let the dialog close and go back to the input
- }
-
- // In all dialogs, all buttons except BUTTON_POSITIVE lead to the end of user interaction
- // with settings UI. If we were called to explicitly configure voice mail then
- // we finish the settings activity here to come back to whatever the user was doing.
- if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
- finish();
- }
- }
-
- /*
- * Activity class methods
- */
-
- @Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
if (DBG) log("onCreate: Intent is " + getIntent());
@@ -1074,13 +175,6 @@
return;
}
- // Show the voicemail preference in onResume if the calling intent specifies the
- // ACTION_ADD_VOICEMAIL action.
- mShowVoicemailPreference = (icicle == null) &&
- TextUtils.equals(getIntent().getAction(), ACTION_ADD_VOICEMAIL);
- mSetupVoicemail = mShowVoicemailPreference &&
- getIntent().getBooleanExtra(SETUP_VOICEMAIL_EXTRA, false);
-
mSubscriptionInfoHelper = new SubscriptionInfoHelper(this, getIntent());
mSubscriptionInfoHelper.setActionBarTitle(
getActionBar(), getResources(), R.string.call_settings_with_label);
@@ -1090,7 +184,6 @@
@Override
protected void onResume() {
super.onResume();
- mForeground = true;
PreferenceScreen preferenceScreen = getPreferenceScreen();
if (preferenceScreen != null) {
@@ -1110,32 +203,12 @@
}
PreferenceScreen prefSet = getPreferenceScreen();
- mSubMenuVoicemailSettings = (EditPhoneNumberPreference) findPreference(BUTTON_VOICEMAIL_KEY);
- mSubMenuVoicemailSettings.setParentActivity(this, VOICEMAIL_PREF_ID, this);
- mSubMenuVoicemailSettings.setDialogOnClosedListener(this);
- mSubMenuVoicemailSettings.setDialogTitle(R.string.voicemail_settings_number_label);
-
- mButtonAutoRetry = (CheckBoxPreference) findPreference(BUTTON_RETRY_KEY);
-
- mVoicemailProviders = (VoicemailProviderListPreference) findPreference(
- BUTTON_VOICEMAIL_PROVIDER_KEY);
- mVoicemailProviders.init(mPhone, getIntent());
- mVoicemailProviders.setOnPreferenceChangeListener(this);
- mPreviousVMProviderKey = mVoicemailProviders.getValue();
-
mVoicemailSettingsScreen =
(PreferenceScreen) findPreference(VOICEMAIL_SETTING_SCREEN_PREF_KEY);
- mVoicemailSettings = (PreferenceScreen) findPreference(BUTTON_VOICEMAIL_SETTING_KEY);
+ mVoicemailSettingsScreen.setIntent(mSubscriptionInfoHelper.getIntent(
+ VoicemailSettingsActivity.class));
- mVoicemailNotificationRingtone = (VoicemailRingtonePreference) findPreference(
- getResources().getString(R.string.voicemail_notification_ringtone_key));
- mVoicemailNotificationRingtone.init(mPhone);
-
- mVoicemailNotificationVibrate = (CheckBoxPreference) findPreference(
- getResources().getString(R.string.voicemail_notification_vibrate_key));
- mVoicemailNotificationVibrate.setOnPreferenceChangeListener(this);
-
- updateVMPreferenceWidgets(mVoicemailProviders.getValue());
+ mButtonAutoRetry = (CheckBoxPreference) findPreference(BUTTON_RETRY_KEY);
mEnableVideoCalling = (CheckBoxPreference) findPreference(ENABLE_VIDEO_CALLING_KEY);
@@ -1191,32 +264,6 @@
}
}
- // check the intent that started this activity and pop up the voicemail
- // dialog if we've been asked to.
- // If we have at least one non default VM provider registered then bring up
- // the selection for the VM provider, otherwise bring up a VM number dialog.
- // We only bring up the dialog the first time we are called (not after orientation change)
- if (mShowVoicemailPreference) {
- if (DBG) log("ACTION_ADD_VOICEMAIL Intent is thrown");
- if (mSetupVoicemail) {
- simulatePreferenceClick(mVoicemailSettingsScreen);
- mSetupVoicemail = false;
- } else if (mVoicemailProviders.hasMoreThanOneVoicemailProvider()) {
- if (DBG) log("Voicemail data has more than one provider.");
- simulatePreferenceClick(mVoicemailProviders);
- } else {
- onPreferenceChange(mVoicemailProviders, VoicemailProviderListPreference.DEFAULT_KEY);
- mVoicemailProviders.setValue(VoicemailProviderListPreference.DEFAULT_KEY);
- }
- mShowVoicemailPreference = false;
- }
-
- updateVoiceNumberField();
- mVMProviderSettingsForced = false;
-
- mVoicemailNotificationVibrate.setChecked(
- VoicemailNotificationSettingsUtil.isVibrationEnabled(mPhone));
-
if (ImsManager.isVtEnabledByPlatform(mPhone.getContext()) && ENABLE_VT_FLAG) {
boolean currentValue =
ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())
@@ -1274,58 +321,6 @@
Log.d(LOG_TAG, msg);
}
- /**
- * Updates the look of the VM preference widgets based on current VM provider settings.
- * Note that the provider name is loaded fxrorm the found activity via loadLabel in
- * {@link VoicemailProviderListPreference#initVoiceMailProviders()} in order for it to be
- * localizable.
- */
- private void updateVMPreferenceWidgets(String currentProviderSetting) {
- final String key = currentProviderSetting;
- final VoicemailProvider provider = mVoicemailProviders.getVoicemailProvider(key);
-
- /* This is the case when we are coming up on a freshly wiped phone and there is no
- persisted value for the list preference mVoicemailProviders.
- In this case we want to show the UI asking the user to select a voicemail provider as
- opposed to silently falling back to default one. */
- if (provider == null) {
- if (DBG) log("updateVMPreferenceWidget: key: " + key + " -> null.");
-
- mVoicemailProviders.setSummary(getString(R.string.sum_voicemail_choose_provider));
- mVoicemailSettings.setEnabled(false);
- mVoicemailSettings.setIntent(null);
- mVoicemailNotificationVibrate.setEnabled(false);
- } else {
- if (DBG) log("updateVMPreferenceWidget: key: " + key + " -> " + provider.toString());
-
- final String providerName = provider.name;
- mVoicemailProviders.setSummary(providerName);
- mVoicemailSettings.setEnabled(true);
- mVoicemailSettings.setIntent(provider.intent);
- mVoicemailNotificationVibrate.setEnabled(true);
- }
- }
-
-
- /**
- * Simulates user clicking on a passed preference.
- * Usually needed when the preference is a dialog preference and we want to invoke
- * a dialog for this preference programmatically.
- * TODO: figure out if there is a cleaner way to cause preference dlg to come up
- */
- private void simulatePreferenceClick(Preference preference) {
- // Go through settings until we find our setting
- // and then simulate a click on it to bring up the dialog
- final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
- for (int idx = 0; idx < adapter.getCount(); idx++) {
- if (adapter.getItem(idx) == preference) {
- getPreferenceScreen().onItemClick(this.getListView(),
- null, idx, adapter.getItemId(idx));
- break;
- }
- }
- }
-
@Override
public boolean onOptionsItemSelected(MenuItem item) {
final int itemId = item.getItemId();
diff --git a/src/com/android/phone/EditPhoneNumberPreference.java b/src/com/android/phone/EditPhoneNumberPreference.java
index 86671a8..8a672f1 100644
--- a/src/com/android/phone/EditPhoneNumberPreference.java
+++ b/src/com/android/phone/EditPhoneNumberPreference.java
@@ -94,7 +94,7 @@
* DialogPreference.onDialogClosed(), except we also pass in a buttonClicked
* value indicating which of the three possible buttons were pressed.
*/
- interface OnDialogClosedListener {
+ public interface OnDialogClosedListener {
void onDialogClosed(EditPhoneNumberPreference preference, int buttonClicked);
}
@@ -102,7 +102,7 @@
* Interface for the default number setting listener. Handles requests for
* the default display number for the dialog.
*/
- interface GetDefaultNumberListener {
+ public interface GetDefaultNumberListener {
/**
* Notify that we are looking for a default display value.
* @return null if there is no contribution from this interface,
diff --git a/src/com/android/phone/ErrorDialogActivity.java b/src/com/android/phone/ErrorDialogActivity.java
index 4635f86..bf09376 100644
--- a/src/com/android/phone/ErrorDialogActivity.java
+++ b/src/com/android/phone/ErrorDialogActivity.java
@@ -23,6 +23,8 @@
import android.os.Bundle;
import android.util.Log;
+import com.android.phone.settings.VoicemailSettingsActivity;
+
/**
* Used to display an error dialog from within the Telephony service when an outgoing call fails
*/
@@ -105,8 +107,8 @@
}
// navigate to the Voicemail setting in the Call Settings activity.
- Intent intent = new Intent(CallFeaturesSetting.ACTION_ADD_VOICEMAIL);
- intent.setClass(this, CallFeaturesSetting.class);
+ Intent intent = new Intent(VoicemailSettingsActivity.ACTION_ADD_VOICEMAIL);
+ intent.setClass(this, VoicemailSettingsActivity.class);
startActivity(intent);
finish();
}
diff --git a/src/com/android/phone/NotificationMgr.java b/src/com/android/phone/NotificationMgr.java
index d308a28..1460d63 100644
--- a/src/com/android/phone/NotificationMgr.java
+++ b/src/com/android/phone/NotificationMgr.java
@@ -49,6 +49,7 @@
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneBase;
import com.android.internal.telephony.TelephonyCapabilities;
+import com.android.phone.settings.VoicemailSettingsActivity;
import com.android.phone.settings.VoicemailNotificationSettingsUtil;
import com.android.phone.settings.VoicemailProviderSettingsUtil;
@@ -358,10 +359,9 @@
// to the voicemail settings.
notificationText = mContext.getString(
R.string.notification_voicemail_no_vm_number);
- intent = new Intent(CallFeaturesSetting.ACTION_ADD_VOICEMAIL);
- intent.putExtra(CallFeaturesSetting.SETUP_VOICEMAIL_EXTRA, true);
+ intent = new Intent(VoicemailSettingsActivity.ACTION_ADD_VOICEMAIL);
intent.putExtra(SubscriptionInfoHelper.SUB_ID_EXTRA, subId);
- intent.setClass(mContext, CallFeaturesSetting.class);
+ intent.setClass(mContext, VoicemailSettingsActivity.class);
} else {
if (mTelephonyManager.getPhoneCount() > 1) {
notificationText = subInfo.getDisplayName().toString();
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index d3e8829..6c658d3 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -66,6 +66,7 @@
import com.android.phone.common.CallLogAsync;
import com.android.phone.settings.SettingsConstants;
import com.android.server.sip.SipService;
+import com.android.services.telephony.activation.SimActivationManager;
import java.util.ArrayList;
import java.util.List;
@@ -145,6 +146,7 @@
CallerInfoCache callerInfoCache;
NotificationMgr notificationMgr;
public PhoneInterfaceManager phoneMgr;
+ public SimActivationManager simActivationManager;
private BluetoothManager bluetoothManager;
private CallGatewayManager callGatewayManager;
@@ -441,6 +443,8 @@
cdmaOtaScreenState = new OtaUtils.CdmaOtaScreenState();
cdmaOtaInCallScreenUiState = new OtaUtils.CdmaOtaInCallScreenUiState();
+ simActivationManager = new SimActivationManager();
+
// XXX pre-load the SimProvider so that it's ready
resolver.getType(Uri.parse("content://icc/adn"));
diff --git a/src/com/android/phone/settings/VoicemailDialogUtil.java b/src/com/android/phone/settings/VoicemailDialogUtil.java
index 0a9e4bc..26bc227 100644
--- a/src/com/android/phone/settings/VoicemailDialogUtil.java
+++ b/src/com/android/phone/settings/VoicemailDialogUtil.java
@@ -21,7 +21,6 @@
import android.app.ProgressDialog;
import android.view.WindowManager;
-import com.android.phone.CallFeaturesSetting;
import com.android.phone.R;
public class VoicemailDialogUtil {
@@ -36,7 +35,7 @@
public static final int VM_FWD_READING_DIALOG = 602;
public static final int VM_REVERTING_DIALOG = 603;
- public static Dialog getDialog(CallFeaturesSetting parent, int id) {
+ public static Dialog getDialog(VoicemailSettingsActivity parent, int id) {
if ((id == VM_RESPONSE_ERROR_DIALOG) || (id == VM_NOCHANGE_ERROR_DIALOG) ||
(id == FWD_SET_RESPONSE_ERROR_DIALOG) || (id == FWD_GET_RESPONSE_ERROR_DIALOG) ||
(id == VM_CONFIRM_DIALOG)) {
diff --git a/src/com/android/phone/settings/VoicemailProviderListPreference.java b/src/com/android/phone/settings/VoicemailProviderListPreference.java
index 44a1c7c..d9f1a55 100644
--- a/src/com/android/phone/settings/VoicemailProviderListPreference.java
+++ b/src/com/android/phone/settings/VoicemailProviderListPreference.java
@@ -30,7 +30,6 @@
import android.util.Log;
import com.android.internal.telephony.Phone;
-import com.android.phone.CallFeaturesSetting;
import com.android.phone.PhoneGlobals;
import com.android.phone.R;
@@ -95,12 +94,14 @@
if (DBG) log("initVoicemailProviders()");
String providerToIgnore = null;
- if (activityIntent.getAction().equals(CallFeaturesSetting.ACTION_ADD_VOICEMAIL)
- && activityIntent.hasExtra(CallFeaturesSetting.IGNORE_PROVIDER_EXTRA)) {
+ String action = activityIntent.getAction();
+ if (!TextUtils.isEmpty(action)
+ && action.equals(VoicemailSettingsActivity.ACTION_ADD_VOICEMAIL)
+ && activityIntent.hasExtra(VoicemailSettingsActivity.IGNORE_PROVIDER_EXTRA)) {
// Remove this provider from the list.
if (DBG) log("Found ACTION_ADD_VOICEMAIL.");
providerToIgnore =
- activityIntent.getStringExtra(CallFeaturesSetting.IGNORE_PROVIDER_EXTRA);
+ activityIntent.getStringExtra(VoicemailSettingsActivity.IGNORE_PROVIDER_EXTRA);
VoicemailProviderSettingsUtil.delete(mPhone.getContext(), providerToIgnore);
}
@@ -119,7 +120,7 @@
// Add other voicemail providers.
PackageManager pm = mPhone.getContext().getPackageManager();
- Intent intent = new Intent(CallFeaturesSetting.ACTION_CONFIGURE_VOICEMAIL);
+ Intent intent = new Intent(VoicemailSettingsActivity.ACTION_CONFIGURE_VOICEMAIL);
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
for (int i = 0; i < resolveInfos.size(); i++) {
final ResolveInfo ri= resolveInfos.get(i);
@@ -137,7 +138,7 @@
}
String nameForDisplay = (label != null) ? label.toString() : "";
Intent providerIntent = new Intent();
- providerIntent.setAction(CallFeaturesSetting.ACTION_CONFIGURE_VOICEMAIL);
+ providerIntent.setAction(VoicemailSettingsActivity.ACTION_CONFIGURE_VOICEMAIL);
providerIntent.setClassName(currentActivityInfo.packageName, currentActivityInfo.name);
VoicemailProvider vmProvider = new VoicemailProvider(nameForDisplay, providerIntent);
diff --git a/src/com/android/phone/settings/VoicemailSettingsActivity.java b/src/com/android/phone/settings/VoicemailSettingsActivity.java
index a94c27a..27349fe 100644
--- a/src/com/android/phone/settings/VoicemailSettingsActivity.java
+++ b/src/com/android/phone/settings/VoicemailSettingsActivity.java
@@ -16,21 +16,268 @@
package com.android.phone.settings;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.database.Cursor;
+import android.os.AsyncResult;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.provider.ContactsContract.CommonDataKinds;
+import android.text.TextUtils;
+import android.util.Log;
import android.view.MenuItem;
+import android.widget.ListAdapter;
+import com.android.internal.telephony.CallForwardInfo;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneConstants;
import com.android.phone.R;
+import com.android.phone.EditPhoneNumberPreference;
+import com.android.phone.PhoneGlobals;
+import com.android.phone.SubscriptionInfoHelper;
-public class VoicemailSettingsActivity extends PreferenceActivity {
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+
+public class VoicemailSettingsActivity extends PreferenceActivity
+ implements DialogInterface.OnClickListener,
+ Preference.OnPreferenceChangeListener,
+ EditPhoneNumberPreference.OnDialogClosedListener,
+ EditPhoneNumberPreference.GetDefaultNumberListener {
+ private static final String LOG_TAG = VoicemailSettingsActivity.class.getSimpleName();
+ private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
+
+ /**
+ * Intent action to bring up Voicemail Provider settings
+ * DO NOT RENAME. There are existing apps which use this intent value.
+ */
+ public static final String ACTION_ADD_VOICEMAIL =
+ "com.android.phone.CallFeaturesSetting.ADD_VOICEMAIL";
+
+ /**
+ * Intent action to bring up the {@code VoicemailSettingsActivity}.
+ * DO NOT RENAME. There are existing apps which use this intent value.
+ */
+ public static final String ACTION_CONFIGURE_VOICEMAIL =
+ "com.android.phone.CallFeaturesSetting.CONFIGURE_VOICEMAIL";
+
+ // Extra put in the return from VM provider config containing voicemail number to set
+ public static final String VM_NUMBER_EXTRA = "com.android.phone.VoicemailNumber";
+ // Extra put in the return from VM provider config containing call forwarding number to set
+ public static final String FWD_NUMBER_EXTRA = "com.android.phone.ForwardingNumber";
+ // Extra put in the return from VM provider config containing call forwarding number to set
+ public static final String FWD_NUMBER_TIME_EXTRA = "com.android.phone.ForwardingNumberTime";
+ // If the VM provider returns non null value in this extra we will force the user to
+ // choose another VM provider
+ public static final String SIGNOUT_EXTRA = "com.android.phone.Signout";
+
+ /**
+ * String Extra put into ACTION_ADD_VOICEMAIL call to indicate which provider should be hidden
+ * in the list of providers presented to the user. This allows a provider which is being
+ * disabled (e.g. GV user logging out) to force the user to pick some other provider.
+ */
+ public static final String IGNORE_PROVIDER_EXTRA = "com.android.phone.ProviderToIgnore";
+
+ /**
+ * String Extra put into ACTION_ADD_VOICEMAIL to indicate that the voicemail setup screen should
+ * be opened.
+ */
+ public static final String SETUP_VOICEMAIL_EXTRA = "com.android.phone.SetupVoicemail";
+
+ // TODO: Define these preference keys in XML.
+ private static final String BUTTON_VOICEMAIL_KEY = "button_voicemail_key";
+ private static final String BUTTON_VOICEMAIL_PROVIDER_KEY = "button_voicemail_provider_key";
+ private static final String BUTTON_VOICEMAIL_SETTING_KEY = "button_voicemail_setting_key";
+
+ /** Event for Async voicemail change call */
+ private static final int EVENT_VOICEMAIL_CHANGED = 500;
+ private static final int EVENT_FORWARDING_CHANGED = 501;
+ private static final int EVENT_FORWARDING_GET_COMPLETED = 502;
+
+ /** Handle to voicemail pref */
+ private static final int VOICEMAIL_PREF_ID = 1;
+ private static final int VOICEMAIL_PROVIDER_CFG_ID = 2;
+
+ /**
+ * Results of reading forwarding settings
+ */
+ private CallForwardInfo[] mForwardingReadResults = null;
+
+ /**
+ * Result of forwarding number change.
+ * Keys are reasons (eg. unconditional forwarding).
+ */
+ private Map<Integer, AsyncResult> mForwardingChangeResults = null;
+
+ /**
+ * Expected CF read result types.
+ * This set keeps track of the CF types for which we've issued change
+ * commands so we can tell when we've received all of the responses.
+ */
+ private Collection<Integer> mExpectedChangeResultReasons = null;
+
+ /**
+ * Result of vm number change
+ */
+ private AsyncResult mVoicemailChangeResult = null;
+
+ /**
+ * Previous VM provider setting so we can return to it in case of failure.
+ */
+ private String mPreviousVMProviderKey = null;
+
+ /**
+ * Id of the dialog being currently shown.
+ */
+ private int mCurrentDialogId = 0;
+
+ /**
+ * Flag indicating that we are invoking settings for the voicemail provider programmatically
+ * due to vm provider change.
+ */
+ private boolean mVMProviderSettingsForced = false;
+
+ /**
+ * Flag indicating that we are making changes to vm or fwd numbers
+ * due to vm provider change.
+ */
+ private boolean mChangingVMorFwdDueToProviderChange = false;
+
+ /**
+ * True if we are in the process of vm & fwd number change and vm has already been changed.
+ * This is used to decide what to do in case of rollback.
+ */
+ private boolean mVMChangeCompletedSuccessfully = false;
+
+ /**
+ * True if we had full or partial failure setting forwarding numbers and so need to roll them
+ * back.
+ */
+ private boolean mFwdChangesRequireRollback = false;
+
+ /**
+ * Id of error msg to display to user once we are done reverting the VM provider to the previous
+ * one.
+ */
+ private int mVMOrFwdSetError = 0;
+
+ /** string to hold old voicemail number as it is being updated. */
+ private String mOldVmNumber;
+
+ // New call forwarding settings and vm number we will be setting
+ // Need to save these since before we get to saving we need to asynchronously
+ // query the existing forwarding settings.
+ private CallForwardInfo[] mNewFwdSettings;
+ private String mNewVMNumber;
+
+ /**
+ * Used to indicate that the voicemail preference should be shown.
+ */
+ private boolean mShowVoicemailPreference = false;
+
+ private boolean mForeground;
+ private Phone mPhone;
+ private SubscriptionInfoHelper mSubscriptionInfoHelper;
+
+ private EditPhoneNumberPreference mSubMenuVoicemailSettings;
+ private VoicemailProviderListPreference mVoicemailProviders;
+ private PreferenceScreen mVoicemailSettings;
+ private VoicemailRingtonePreference mVoicemailNotificationRingtone;
+ private CheckBoxPreference mVoicemailNotificationVibrate;
+
+
+ //*********************************************************************************************
+ // Preference Activity Methods
+ //*********************************************************************************************
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
- getActionBar().setTitle(R.string.voicemail);
- getFragmentManager().beginTransaction().replace(
- android.R.id.content, new VoicemailSettingsFragment()).commit();
+ // Show the voicemail preference in onResume if the calling intent specifies the
+ // ACTION_ADD_VOICEMAIL action.
+ mShowVoicemailPreference = (icicle == null) &&
+ TextUtils.equals(getIntent().getAction(), ACTION_ADD_VOICEMAIL);
+
+ mSubscriptionInfoHelper = new SubscriptionInfoHelper(this, getIntent());
+ mSubscriptionInfoHelper.setActionBarTitle(
+ getActionBar(), getResources(), R.string.voicemail_settings_with_label);
+ mPhone = mSubscriptionInfoHelper.getPhone();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mForeground = true;
+
+ PreferenceScreen preferenceScreen = getPreferenceScreen();
+ if (preferenceScreen != null) {
+ preferenceScreen.removeAll();
+ }
+
+ addPreferencesFromResource(R.xml.voicemail_settings);
+
+ PreferenceScreen prefSet = getPreferenceScreen();
+ mSubMenuVoicemailSettings = (EditPhoneNumberPreference) findPreference(BUTTON_VOICEMAIL_KEY);
+ mSubMenuVoicemailSettings.setParentActivity(this, VOICEMAIL_PREF_ID, this);
+ mSubMenuVoicemailSettings.setDialogOnClosedListener(this);
+ mSubMenuVoicemailSettings.setDialogTitle(R.string.voicemail_settings_number_label);
+
+ mVoicemailProviders = (VoicemailProviderListPreference) findPreference(
+ BUTTON_VOICEMAIL_PROVIDER_KEY);
+ mVoicemailProviders.init(mPhone, getIntent());
+ mVoicemailProviders.setOnPreferenceChangeListener(this);
+ mPreviousVMProviderKey = mVoicemailProviders.getValue();
+
+ mVoicemailSettings = (PreferenceScreen) findPreference(BUTTON_VOICEMAIL_SETTING_KEY);
+
+ mVoicemailNotificationRingtone = (VoicemailRingtonePreference) findPreference(
+ getResources().getString(R.string.voicemail_notification_ringtone_key));
+ mVoicemailNotificationRingtone.init(mPhone);
+
+ mVoicemailNotificationVibrate = (CheckBoxPreference) findPreference(
+ getResources().getString(R.string.voicemail_notification_vibrate_key));
+ mVoicemailNotificationVibrate.setOnPreferenceChangeListener(this);
+
+ updateVMPreferenceWidgets(mVoicemailProviders.getValue());
+
+ // check the intent that started this activity and pop up the voicemail
+ // dialog if we've been asked to.
+ // If we have at least one non default VM provider registered then bring up
+ // the selection for the VM provider, otherwise bring up a VM number dialog.
+ // We only bring up the dialog the first time we are called (not after orientation change)
+ if (mShowVoicemailPreference) {
+ if (DBG) log("ACTION_ADD_VOICEMAIL Intent is thrown");
+ if (mVoicemailProviders.hasMoreThanOneVoicemailProvider()) {
+ if (DBG) log("Voicemail data has more than one provider.");
+ simulatePreferenceClick(mVoicemailProviders);
+ } else {
+ onPreferenceChange(mVoicemailProviders, VoicemailProviderListPreference.DEFAULT_KEY);
+ mVoicemailProviders.setValue(VoicemailProviderListPreference.DEFAULT_KEY);
+ }
+ mShowVoicemailPreference = false;
+ }
+
+ updateVoiceNumberField();
+ mVMProviderSettingsForced = false;
+
+ mVoicemailNotificationVibrate.setChecked(
+ VoicemailNotificationSettingsUtil.isVibrationEnabled(mPhone));
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mForeground = false;
}
@Override
@@ -41,4 +288,812 @@
}
return super.onOptionsItemSelected(item);
}
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ if (preference == mSubMenuVoicemailSettings) {
+ return true;
+ } else if (preference.getKey().equals(mVoicemailSettings.getKey())) {
+ // Check key instead of comparing reference because closing the voicemail notification
+ // ringtone dialog invokes onResume(), but leaves the old preference screen up,
+ // TODO: Revert to checking reference after migrating voicemail to its own activity.
+ if (DBG) log("onPreferenceTreeClick: Voicemail Settings Preference is clicked.");
+
+ final Dialog dialog = ((PreferenceScreen) preference).getDialog();
+ if (dialog != null) {
+ dialog.getActionBar().setDisplayHomeAsUpEnabled(false);
+ }
+
+ if (preference.getIntent() != null) {
+ if (DBG) log("Invoking cfg intent " + preference.getIntent().getPackage());
+
+ // onActivityResult() will be responsible for resetting some of variables.
+ this.startActivityForResult(preference.getIntent(), VOICEMAIL_PROVIDER_CFG_ID);
+ return true;
+ } else {
+ if (DBG) log("onPreferenceTreeClick(). No intent; use default behavior in xml.");
+
+ // onActivityResult() will not be called, so reset variables here.
+ mPreviousVMProviderKey = VoicemailProviderListPreference.DEFAULT_KEY;
+ mVMProviderSettingsForced = false;
+ return false;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Implemented to support onPreferenceChangeListener to look for preference changes.
+ *
+ * @param preference is the preference to be changed
+ * @param objValue should be the value of the selection, NOT its localized
+ * display value.
+ */
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object objValue) {
+ if (DBG) log("onPreferenceChange: \"" + preference + "\" changed to \"" + objValue + "\"");
+
+ if (preference == mVoicemailProviders) {
+ final String newProviderKey = (String) objValue;
+
+ // If previous provider key and the new one is same, we don't need to handle it.
+ if (mPreviousVMProviderKey.equals(newProviderKey)) {
+ if (DBG) log("No change is made to the VM provider setting.");
+ return true;
+ }
+ updateVMPreferenceWidgets(newProviderKey);
+
+ final VoicemailProviderSettings newProviderSettings =
+ VoicemailProviderSettingsUtil.load(this, newProviderKey);
+
+ // If the user switches to a voice mail provider and we have numbers stored for it we
+ // will automatically change the phone's voice mail and forwarding number to the stored
+ // ones. Otherwise we will bring up provider's configuration UI.
+ if (newProviderSettings == null) {
+ // Force the user into a configuration of the chosen provider
+ Log.w(LOG_TAG, "Saved preferences not found - invoking config");
+ mVMProviderSettingsForced = true;
+ simulatePreferenceClick(mVoicemailSettings);
+ } else {
+ if (DBG) log("Saved preferences found - switching to them");
+ // Set this flag so if we get a failure we revert to previous provider
+ mChangingVMorFwdDueToProviderChange = true;
+ saveVoiceMailAndForwardingNumber(newProviderKey, newProviderSettings);
+ }
+ } else if (preference.getKey().equals(mVoicemailNotificationVibrate.getKey())) {
+ // Check key instead of comparing reference because closing the voicemail notification
+ // ringtone dialog invokes onResume(), but leaves the old preference screen up,
+ // TODO: Revert to checking reference after migrating voicemail to its own activity.
+ VoicemailNotificationSettingsUtil.setVibrationEnabled(
+ mPhone, Boolean.TRUE.equals(objValue));
+ }
+
+ // Always let the preference setting proceed.
+ return true;
+ }
+
+ /**
+ * Implemented for EditPhoneNumberPreference.GetDefaultNumberListener.
+ * This method set the default values for the various
+ * EditPhoneNumberPreference dialogs.
+ */
+ @Override
+ public String onGetDefaultNumber(EditPhoneNumberPreference preference) {
+ if (preference == mSubMenuVoicemailSettings) {
+ // update the voicemail number field, which takes care of the
+ // mSubMenuVoicemailSettings itself, so we should return null.
+ if (DBG) log("updating default for voicemail dialog");
+ updateVoiceNumberField();
+ return null;
+ }
+
+ String vmDisplay = mPhone.getVoiceMailNumber();
+ if (TextUtils.isEmpty(vmDisplay)) {
+ // if there is no voicemail number, we just return null to
+ // indicate no contribution.
+ return null;
+ }
+
+ // Return the voicemail number prepended with "VM: "
+ if (DBG) log("updating default for call forwarding dialogs");
+ return getString(R.string.voicemail_abbreviated) + " " + vmDisplay;
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (DBG) {
+ log("onActivityResult: requestCode: " + requestCode
+ + ", resultCode: " + resultCode
+ + ", data: " + data);
+ }
+
+ // there are cases where the contact picker may end up sending us more than one
+ // request. We want to ignore the request if we're not in the correct state.
+ if (requestCode == VOICEMAIL_PROVIDER_CFG_ID) {
+ boolean failure = false;
+
+ // No matter how the processing of result goes lets clear the flag
+ if (DBG) log("mVMProviderSettingsForced: " + mVMProviderSettingsForced);
+ final boolean isVMProviderSettingsForced = mVMProviderSettingsForced;
+ mVMProviderSettingsForced = false;
+
+ String vmNum = null;
+ if (resultCode != RESULT_OK) {
+ if (DBG) log("onActivityResult: vm provider cfg result not OK.");
+ failure = true;
+ } else {
+ if (data == null) {
+ if (DBG) log("onActivityResult: vm provider cfg result has no data");
+ failure = true;
+ } else {
+ if (data.getBooleanExtra(SIGNOUT_EXTRA, false)) {
+ if (DBG) log("Provider requested signout");
+ if (isVMProviderSettingsForced) {
+ if (DBG) log("Going back to previous provider on signout");
+ switchToPreviousVoicemailProvider();
+ } else {
+ final String victim = mVoicemailProviders.getKey();
+ if (DBG) log("Relaunching activity and ignoring " + victim);
+ Intent i = new Intent(ACTION_ADD_VOICEMAIL);
+ i.putExtra(IGNORE_PROVIDER_EXTRA, victim);
+ i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ this.startActivity(i);
+ }
+ return;
+ }
+ vmNum = data.getStringExtra(VM_NUMBER_EXTRA);
+ if (vmNum == null || vmNum.length() == 0) {
+ if (DBG) log("onActivityResult: vm provider cfg result has no vmnum");
+ failure = true;
+ }
+ }
+ }
+ if (failure) {
+ if (DBG) log("Failure in return from voicemail provider.");
+ if (isVMProviderSettingsForced) {
+ switchToPreviousVoicemailProvider();
+ }
+
+ return;
+ }
+ mChangingVMorFwdDueToProviderChange = isVMProviderSettingsForced;
+ final String fwdNum = data.getStringExtra(FWD_NUMBER_EXTRA);
+
+ // TODO: It would be nice to load the current network setting for this and
+ // send it to the provider when it's config is invoked so it can use this as default
+ final int fwdNumTime = data.getIntExtra(FWD_NUMBER_TIME_EXTRA, 20);
+
+ if (DBG) log("onActivityResult: cfg result has forwarding number " + fwdNum);
+ saveVoiceMailAndForwardingNumber(mVoicemailProviders.getKey(),
+ new VoicemailProviderSettings(vmNum, fwdNum, fwdNumTime));
+ return;
+ }
+
+ if (requestCode == VOICEMAIL_PREF_ID) {
+ if (resultCode != RESULT_OK) {
+ if (DBG) log("onActivityResult: contact picker result not OK.");
+ return;
+ }
+
+ Cursor cursor = null;
+ try {
+ cursor = getContentResolver().query(data.getData(),
+ new String[] { CommonDataKinds.Phone.NUMBER }, null, null, null);
+ if ((cursor == null) || (!cursor.moveToFirst())) {
+ if (DBG) log("onActivityResult: bad contact data, no results found.");
+ return;
+ }
+ mSubMenuVoicemailSettings.onPickActivityResult(cursor.getString(0));
+ return;
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+ }
+
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+
+ /**
+ * Simulates user clicking on a passed preference.
+ * Usually needed when the preference is a dialog preference and we want to invoke
+ * a dialog for this preference programmatically.
+ * TODO: figure out if there is a cleaner way to cause preference dlg to come up
+ */
+ private void simulatePreferenceClick(Preference preference) {
+ // Go through settings until we find our setting
+ // and then simulate a click on it to bring up the dialog
+ final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
+ for (int idx = 0; idx < adapter.getCount(); idx++) {
+ if (adapter.getItem(idx) == preference) {
+ getPreferenceScreen().onItemClick(this.getListView(),
+ null, idx, adapter.getItemId(idx));
+ break;
+ }
+ }
+ }
+
+
+ //*********************************************************************************************
+ // Activity Dialog Methods
+ //*********************************************************************************************
+
+ @Override
+ protected void onPrepareDialog(int id, Dialog dialog) {
+ super.onPrepareDialog(id, dialog);
+ mCurrentDialogId = id;
+ }
+
+ // dialog creation method, called by showDialog()
+ @Override
+ protected Dialog onCreateDialog(int dialogId) {
+ return VoicemailDialogUtil.getDialog(this, dialogId);
+ }
+
+ @Override
+ public void onDialogClosed(EditPhoneNumberPreference preference, int buttonClicked) {
+ if (DBG) log("onDialogClosed: Button clicked is " + buttonClicked);
+
+ if (buttonClicked == DialogInterface.BUTTON_NEGATIVE) {
+ return;
+ }
+
+ if (preference == mSubMenuVoicemailSettings) {
+ VoicemailProviderSettings newSettings = new VoicemailProviderSettings(
+ mSubMenuVoicemailSettings.getPhoneNumber(),
+ VoicemailProviderSettings.NO_FORWARDING);
+ saveVoiceMailAndForwardingNumber(mVoicemailProviders.getKey(), newSettings);
+ }
+ }
+
+ /**
+ * Wrapper around showDialog() that will silently do nothing if we're
+ * not in the foreground.
+ *
+ * This is useful here because most of the dialogs we display from
+ * this class are triggered by asynchronous events (like
+ * success/failure messages from the telephony layer) and it's
+ * possible for those events to come in even after the user has gone
+ * to a different screen.
+ */
+ // TODO: this is too brittle: it's still easy to accidentally add new
+ // code here that calls showDialog() directly (which will result in a
+ // WindowManager$BadTokenException if called after the activity has
+ // been stopped.)
+ //
+ // It would be cleaner to do the "if (mForeground)" check in one
+ // central place, maybe by using a single Handler for all asynchronous
+ // events (and have *that* discard events if we're not in the
+ // foreground.)
+ //
+ // Unfortunately it's not that simple, since we sometimes need to do
+ // actual work to handle these events whether or not we're in the
+ // foreground (see the Handler code in mSetOptionComplete for
+ // example.)
+ //
+ // TODO: It's a bit worrisome that we don't do anything in error cases when we're not in the
+ // foreground. Consider displaying a toast instead.
+ private void showDialogIfForeground(int id) {
+ if (mForeground) {
+ showDialog(id);
+ }
+ }
+
+ private void dismissDialogSafely(int id) {
+ try {
+ dismissDialog(id);
+ } catch (IllegalArgumentException e) {
+ // This is expected in the case where we were in the background
+ // at the time we would normally have shown the dialog, so we didn't
+ // show it.
+ }
+ }
+
+ // This is a method implemented for DialogInterface.OnClickListener.
+ // Used with the error dialog to close the app, voicemail dialog to just dismiss.
+ // Close button is mapped to BUTTON_POSITIVE for the errors that close the activity,
+ // while those that are mapped to BUTTON_NEUTRAL only move the preference focus.
+ public void onClick(DialogInterface dialog, int which) {
+ if (DBG) log("onClick: button clicked is " + which);
+
+ dialog.dismiss();
+ switch (which){
+ case DialogInterface.BUTTON_NEGATIVE:
+ if (mCurrentDialogId == VoicemailDialogUtil.FWD_GET_RESPONSE_ERROR_DIALOG) {
+ // We failed to get current forwarding settings and the user
+ // does not wish to continue.
+ switchToPreviousVoicemailProvider();
+ }
+ break;
+ case DialogInterface.BUTTON_POSITIVE:
+ if (mCurrentDialogId == VoicemailDialogUtil.FWD_GET_RESPONSE_ERROR_DIALOG) {
+ // We failed to get current forwarding settings but the user
+ // wishes to continue changing settings to the new vm provider
+ setVoicemailNumberWithCarrier();
+ } else {
+ finish();
+ }
+ return;
+ default:
+ // just let the dialog close and go back to the input
+ }
+
+ // In all dialogs, all buttons except BUTTON_POSITIVE lead to the end of user interaction
+ // with settings UI. If we were called to explicitly configure voice mail then
+ // we finish the settings activity here to come back to whatever the user was doing.
+ if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
+ finish();
+ }
+ }
+
+
+ //*********************************************************************************************
+ // Voicemail Methods
+ //*********************************************************************************************
+
+ /**
+ * TODO: Refactor to make it easier to understand what's done in the different stages.
+ */
+ private void saveVoiceMailAndForwardingNumber(
+ String key, VoicemailProviderSettings newSettings) {
+ if (DBG) log("saveVoiceMailAndForwardingNumber: " + newSettings.toString());
+ mNewVMNumber = newSettings.getVoicemailNumber();
+ mNewVMNumber = (mNewVMNumber == null) ? "" : mNewVMNumber;
+ mNewFwdSettings = newSettings.getForwardingSettings();
+
+ // Call forwarding is not suppported on CDMA.
+ if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
+ if (DBG) log("Ignoring forwarding setting since this is CDMA phone");
+ mNewFwdSettings = VoicemailProviderSettings.NO_FORWARDING;
+ }
+
+ // Throw a warning if the voicemail is the same and we did not change forwarding.
+ if (mNewVMNumber.equals(mOldVmNumber)
+ && mNewFwdSettings == VoicemailProviderSettings.NO_FORWARDING) {
+ showDialogIfForeground(VoicemailDialogUtil.VM_NOCHANGE_ERROR_DIALOG);
+ return;
+ }
+
+ VoicemailProviderSettingsUtil.save(this, key, newSettings);
+ mVMChangeCompletedSuccessfully = false;
+ mFwdChangesRequireRollback = false;
+ mVMOrFwdSetError = 0;
+
+ if (mNewFwdSettings == VoicemailProviderSettings.NO_FORWARDING
+ || key.equals(mPreviousVMProviderKey)) {
+ if (DBG) log("Set voicemail number. No changes to forwarding number.");
+ setVoicemailNumberWithCarrier();
+ } else {
+ if (DBG) log("Reading current forwarding settings.");
+ int numSettingsReasons = VoicemailProviderSettings.FORWARDING_SETTINGS_REASONS.length;
+ mForwardingReadResults = new CallForwardInfo[numSettingsReasons];
+ for (int i = 0; i < mForwardingReadResults.length; i++) {
+ mPhone.getCallForwardingOption(
+ VoicemailProviderSettings.FORWARDING_SETTINGS_REASONS[i],
+ mGetOptionComplete.obtainMessage(EVENT_FORWARDING_GET_COMPLETED, i, 0));
+ }
+ showDialogIfForeground(VoicemailDialogUtil.VM_FWD_READING_DIALOG);
+ }
+
+ PhoneGlobals.getInstance().refreshMwiIndicator(mSubscriptionInfoHelper.getSubId());
+ }
+
+ private final Handler mGetOptionComplete = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ AsyncResult result = (AsyncResult) msg.obj;
+ switch (msg.what) {
+ case EVENT_FORWARDING_GET_COMPLETED:
+ handleForwardingSettingsReadResult(result, msg.arg1);
+ break;
+ }
+ }
+ };
+
+ private void handleForwardingSettingsReadResult(AsyncResult ar, int idx) {
+ if (DBG) Log.d(LOG_TAG, "handleForwardingSettingsReadResult: " + idx);
+
+ Throwable error = null;
+ if (ar.exception != null) {
+ error = ar.exception;
+ if (DBG) Log.d(LOG_TAG, "FwdRead: ar.exception=" + error.getMessage());
+ }
+ if (ar.userObj instanceof Throwable) {
+ error = (Throwable) ar.userObj;
+ if (DBG) Log.d(LOG_TAG, "FwdRead: userObj=" + error.getMessage());
+ }
+
+ // We may have already gotten an error and decided to ignore the other results.
+ if (mForwardingReadResults == null) {
+ if (DBG) Log.d(LOG_TAG, "Ignoring fwd reading result: " + idx);
+ return;
+ }
+
+ // In case of error ignore other results, show an error dialog
+ if (error != null) {
+ if (DBG) Log.d(LOG_TAG, "Error discovered for fwd read : " + idx);
+ mForwardingReadResults = null;
+ dismissDialogSafely(VoicemailDialogUtil.VM_FWD_READING_DIALOG);
+ showDialogIfForeground(VoicemailDialogUtil.FWD_GET_RESPONSE_ERROR_DIALOG);
+ return;
+ }
+
+ // Get the forwarding info.
+ mForwardingReadResults[idx] = CallForwardInfoUtil.getCallForwardInfo(
+ (CallForwardInfo[]) ar.result,
+ VoicemailProviderSettings.FORWARDING_SETTINGS_REASONS[idx]);
+
+ // Check if we got all the results already
+ boolean done = true;
+ for (int i = 0; i < mForwardingReadResults.length; i++) {
+ if (mForwardingReadResults[i] == null) {
+ done = false;
+ break;
+ }
+ }
+
+ if (done) {
+ if (DBG) Log.d(LOG_TAG, "Done receiving fwd info");
+ dismissDialogSafely(VoicemailDialogUtil.VM_FWD_READING_DIALOG);
+
+ if (mPreviousVMProviderKey.equals(VoicemailProviderListPreference.DEFAULT_KEY)) {
+ VoicemailProviderSettingsUtil.save(mPhone.getContext(),
+ VoicemailProviderListPreference.DEFAULT_KEY,
+ new VoicemailProviderSettings(mOldVmNumber, mForwardingReadResults));
+ }
+ saveVoiceMailAndForwardingNumberStage2();
+ }
+ }
+
+ private void resetForwardingChangeState() {
+ mForwardingChangeResults = new HashMap<Integer, AsyncResult>();
+ mExpectedChangeResultReasons = new HashSet<Integer>();
+ }
+
+ // Called after we are done saving the previous forwarding settings if we needed.
+ private void saveVoiceMailAndForwardingNumberStage2() {
+ mForwardingChangeResults = null;
+ mVoicemailChangeResult = null;
+
+ resetForwardingChangeState();
+ for (int i = 0; i < mNewFwdSettings.length; i++) {
+ CallForwardInfo fi = mNewFwdSettings[i];
+ CallForwardInfo fiForReason =
+ CallForwardInfoUtil.infoForReason(mForwardingReadResults, fi.reason);
+ final boolean doUpdate = CallForwardInfoUtil.isUpdateRequired(fiForReason, fi);
+
+ if (doUpdate) {
+ if (DBG) log("Setting fwd #: " + i + ": " + fi.toString());
+ mExpectedChangeResultReasons.add(i);
+
+ CallForwardInfoUtil.setCallForwardingOption(mPhone, fi,
+ mSetOptionComplete.obtainMessage(
+ EVENT_FORWARDING_CHANGED, fi.reason, 0));
+ }
+ }
+ showDialogIfForeground(VoicemailDialogUtil.VM_FWD_SAVING_DIALOG);
+ }
+
+
+ /**
+ * Callback to handle option update completions
+ */
+ private final Handler mSetOptionComplete = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ AsyncResult result = (AsyncResult) msg.obj;
+ boolean done = false;
+ switch (msg.what) {
+ case EVENT_VOICEMAIL_CHANGED:
+ mVoicemailChangeResult = result;
+ mVMChangeCompletedSuccessfully = isVmChangeSuccess();
+ done = true;
+ break;
+ case EVENT_FORWARDING_CHANGED:
+ mForwardingChangeResults.put(msg.arg1, result);
+ if (result.exception != null) {
+ Log.w(LOG_TAG, "Error in setting fwd# " + msg.arg1 + ": " +
+ result.exception.getMessage());
+ }
+ if (isForwardingCompleted()) {
+ if (isFwdChangeSuccess()) {
+ if (DBG) log("Overall fwd changes completed ok, starting vm change");
+ setVoicemailNumberWithCarrier();
+ } else {
+ Log.w(LOG_TAG, "Overall fwd changes completed in failure. " +
+ "Check if we need to try rollback for some settings.");
+ mFwdChangesRequireRollback = false;
+ Iterator<Map.Entry<Integer,AsyncResult>> it =
+ mForwardingChangeResults.entrySet().iterator();
+ while (it.hasNext()) {
+ Map.Entry<Integer,AsyncResult> entry = it.next();
+ if (entry.getValue().exception == null) {
+ // If at least one succeeded we have to revert
+ Log.i(LOG_TAG, "Rollback will be required");
+ mFwdChangesRequireRollback = true;
+ break;
+ }
+ }
+ if (!mFwdChangesRequireRollback) {
+ Log.i(LOG_TAG, "No rollback needed.");
+ }
+ done = true;
+ }
+ }
+ break;
+ default:
+ // TODO: should never reach this, may want to throw exception
+ }
+
+ if (done) {
+ if (DBG) log("All VM provider related changes done");
+ if (mForwardingChangeResults != null) {
+ dismissDialogSafely(VoicemailDialogUtil.VM_FWD_SAVING_DIALOG);
+ }
+ handleSetVmOrFwdMessage();
+ }
+ }
+ };
+
+ /**
+ * Callback to handle option revert completions
+ */
+ private final Handler mRevertOptionComplete = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ AsyncResult result = (AsyncResult) msg.obj;
+ switch (msg.what) {
+ case EVENT_VOICEMAIL_CHANGED:
+ if (DBG) log("VM revert complete msg");
+ mVoicemailChangeResult = result;
+ break;
+
+ case EVENT_FORWARDING_CHANGED:
+ if (DBG) log("FWD revert complete msg ");
+ mForwardingChangeResults.put(msg.arg1, result);
+ if (result.exception != null) {
+ if (DBG) log("Error in reverting fwd# " + msg.arg1 + ": " +
+ result.exception.getMessage());
+ }
+ break;
+
+ default:
+ // TODO: should never reach this, may want to throw exception
+ }
+
+ final boolean done = (!mVMChangeCompletedSuccessfully || mVoicemailChangeResult != null)
+ && (!mFwdChangesRequireRollback || isForwardingCompleted());
+ if (done) {
+ if (DBG) log("All VM reverts done");
+ dismissDialogSafely(VoicemailDialogUtil.VM_REVERTING_DIALOG);
+ onRevertDone();
+ }
+ }
+ };
+
+ private void setVoicemailNumberWithCarrier() {
+ if (DBG) log("save voicemail #: " + mNewVMNumber);
+
+ mVoicemailChangeResult = null;
+ mPhone.setVoiceMailNumber(
+ mPhone.getVoiceMailAlphaTag().toString(),
+ mNewVMNumber,
+ Message.obtain(mSetOptionComplete, EVENT_VOICEMAIL_CHANGED));
+ }
+
+ private void switchToPreviousVoicemailProvider() {
+ if (DBG) log("switchToPreviousVoicemailProvider " + mPreviousVMProviderKey);
+
+ if (mPreviousVMProviderKey == null) {
+ return;
+ }
+
+ if (mVMChangeCompletedSuccessfully || mFwdChangesRequireRollback) {
+ showDialogIfForeground(VoicemailDialogUtil.VM_REVERTING_DIALOG);
+ final VoicemailProviderSettings prevSettings =
+ VoicemailProviderSettingsUtil.load(this, mPreviousVMProviderKey);
+ if (prevSettings == null) {
+ Log.e(LOG_TAG, "VoicemailProviderSettings for the key \""
+ + mPreviousVMProviderKey + "\" is null but should be loaded.");
+ }
+
+ if (mVMChangeCompletedSuccessfully) {
+ mNewVMNumber = prevSettings.getVoicemailNumber();
+ Log.i(LOG_TAG, "VM change is already completed successfully."
+ + "Have to revert VM back to " + mNewVMNumber + " again.");
+ mPhone.setVoiceMailNumber(
+ mPhone.getVoiceMailAlphaTag().toString(),
+ mNewVMNumber,
+ Message.obtain(mRevertOptionComplete, EVENT_VOICEMAIL_CHANGED));
+ }
+
+ if (mFwdChangesRequireRollback) {
+ Log.i(LOG_TAG, "Requested to rollback forwarding changes.");
+
+ final CallForwardInfo[] prevFwdSettings = prevSettings.getForwardingSettings();
+ if (prevFwdSettings != null) {
+ Map<Integer, AsyncResult> results = mForwardingChangeResults;
+ resetForwardingChangeState();
+ for (int i = 0; i < prevFwdSettings.length; i++) {
+ CallForwardInfo fi = prevFwdSettings[i];
+ if (DBG) log("Reverting fwd #: " + i + ": " + fi.toString());
+ // Only revert the settings for which the update succeeded.
+ AsyncResult result = results.get(fi.reason);
+ if (result != null && result.exception == null) {
+ mExpectedChangeResultReasons.add(fi.reason);
+ CallForwardInfoUtil.setCallForwardingOption(mPhone, fi,
+ mRevertOptionComplete.obtainMessage(
+ EVENT_FORWARDING_CHANGED, i, 0));
+ }
+ }
+ }
+ }
+ } else {
+ if (DBG) log("No need to revert");
+ onRevertDone();
+ }
+ }
+
+
+ //*********************************************************************************************
+ // Voicemail Handler Helpers
+ //*********************************************************************************************
+
+ /**
+ * Updates the look of the VM preference widgets based on current VM provider settings.
+ * Note that the provider name is loaded fxrorm the found activity via loadLabel in
+ * {@link VoicemailProviderListPreference#initVoiceMailProviders()} in order for it to be
+ * localizable.
+ */
+ private void updateVMPreferenceWidgets(String currentProviderSetting) {
+ final String key = currentProviderSetting;
+ final VoicemailProviderListPreference.VoicemailProvider provider =
+ mVoicemailProviders.getVoicemailProvider(key);
+
+ /* This is the case when we are coming up on a freshly wiped phone and there is no
+ persisted value for the list preference mVoicemailProviders.
+ In this case we want to show the UI asking the user to select a voicemail provider as
+ opposed to silently falling back to default one. */
+ if (provider == null) {
+ if (DBG) log("updateVMPreferenceWidget: key: " + key + " -> null.");
+
+ mVoicemailProviders.setSummary(getString(R.string.sum_voicemail_choose_provider));
+ mVoicemailSettings.setEnabled(false);
+ mVoicemailSettings.setIntent(null);
+ mVoicemailNotificationVibrate.setEnabled(false);
+ } else {
+ if (DBG) log("updateVMPreferenceWidget: key: " + key + " -> " + provider.toString());
+
+ final String providerName = provider.name;
+ mVoicemailProviders.setSummary(providerName);
+ mVoicemailSettings.setEnabled(true);
+ mVoicemailSettings.setIntent(provider.intent);
+ mVoicemailNotificationVibrate.setEnabled(true);
+ }
+ }
+
+ /**
+ * Update the voicemail number from what we've recorded on the sim.
+ */
+ private void updateVoiceNumberField() {
+ if (DBG) log("updateVoiceNumberField()");
+
+ mOldVmNumber = mPhone.getVoiceMailNumber();
+ if (TextUtils.isEmpty(mOldVmNumber)) {
+ mSubMenuVoicemailSettings.setPhoneNumber("");
+ mSubMenuVoicemailSettings.setSummary(getString(R.string.voicemail_number_not_set));
+ } else {
+ mSubMenuVoicemailSettings.setPhoneNumber(mOldVmNumber);
+ mSubMenuVoicemailSettings.setSummary(mOldVmNumber);
+ }
+ }
+
+ private void handleSetVmOrFwdMessage() {
+ if (DBG) log("handleSetVMMessage: set VM request complete");
+
+ if (!isFwdChangeSuccess()) {
+ handleVmOrFwdSetError(VoicemailDialogUtil.FWD_SET_RESPONSE_ERROR_DIALOG);
+ } else if (!isVmChangeSuccess()) {
+ handleVmOrFwdSetError(VoicemailDialogUtil.VM_RESPONSE_ERROR_DIALOG);
+ } else {
+ handleVmAndFwdSetSuccess(VoicemailDialogUtil.VM_CONFIRM_DIALOG);
+ }
+ }
+
+ /**
+ * Called when Voicemail Provider or its forwarding settings failed. Rolls back partly made
+ * changes to those settings and show "failure" dialog.
+ *
+ * @param dialogId ID of the dialog to show for the specific error case. Either
+ * {@link #FWD_SET_RESPONSE_ERROR_DIALOG} or {@link #VM_RESPONSE_ERROR_DIALOG}
+ */
+ private void handleVmOrFwdSetError(int dialogId) {
+ if (mChangingVMorFwdDueToProviderChange) {
+ mVMOrFwdSetError = dialogId;
+ mChangingVMorFwdDueToProviderChange = false;
+ switchToPreviousVoicemailProvider();
+ return;
+ }
+ mChangingVMorFwdDueToProviderChange = false;
+ showDialogIfForeground(dialogId);
+ updateVoiceNumberField();
+ }
+
+ /**
+ * Called when Voicemail Provider and its forwarding settings were successfully finished.
+ * This updates a bunch of variables and show "success" dialog.
+ */
+ private void handleVmAndFwdSetSuccess(int dialogId) {
+ if (DBG) log("handleVmAndFwdSetSuccess: key is " + mVoicemailProviders.getKey());
+
+ mPreviousVMProviderKey = mVoicemailProviders.getKey();
+ mChangingVMorFwdDueToProviderChange = false;
+ showDialogIfForeground(dialogId);
+ updateVoiceNumberField();
+ }
+
+ private void onRevertDone() {
+ if (DBG) log("onRevertDone: Changing provider key back to " + mPreviousVMProviderKey);
+
+ updateVMPreferenceWidgets(mPreviousVMProviderKey);
+ updateVoiceNumberField();
+ if (mVMOrFwdSetError != 0) {
+ showDialogIfForeground(mVMOrFwdSetError);
+ mVMOrFwdSetError = 0;
+ }
+ }
+
+
+ //*********************************************************************************************
+ // Voicemail State Helpers
+ //*********************************************************************************************
+
+ /**
+ * Return true if there is a change result for every reason for which we expect a result.
+ */
+ private boolean isForwardingCompleted() {
+ if (mForwardingChangeResults == null) {
+ return true;
+ }
+
+ for (Integer reason : mExpectedChangeResultReasons) {
+ if (mForwardingChangeResults.get(reason) == null) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private boolean isFwdChangeSuccess() {
+ if (mForwardingChangeResults == null) {
+ return true;
+ }
+
+ for (AsyncResult result : mForwardingChangeResults.values()) {
+ Throwable exception = result.exception;
+ if (exception != null) {
+ String msg = exception.getMessage();
+ msg = (msg != null) ? msg : "";
+ Log.w(LOG_TAG, "Failed to change forwarding setting. Reason: " + msg);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean isVmChangeSuccess() {
+ if (mVoicemailChangeResult.exception != null) {
+ String msg = mVoicemailChangeResult.exception.getMessage();
+ msg = (msg != null) ? msg : "";
+ Log.w(LOG_TAG, "Failed to change voicemail. Reason: " + msg);
+ return false;
+ }
+ return true;
+ }
+
+ private static void log(String msg) {
+ Log.d(LOG_TAG, msg);
+ }
}
diff --git a/src/com/android/phone/settings/VoicemailSettingsFragment.java b/src/com/android/phone/settings/VoicemailSettingsFragment.java
deleted file mode 100644
index fef3e8c..0000000
--- a/src/com/android/phone/settings/VoicemailSettingsFragment.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.phone.settings;
-
-import android.os.Bundle;
-import android.preference.PreferenceFragment;
-
-import com.android.phone.R;
-
-public class VoicemailSettingsFragment extends PreferenceFragment {
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- addPreferencesFromResource(R.xml.voicemail_settings);
- }
-}
diff --git a/src/com/android/phone/vvm/omtp/imap/ImapHelper.java b/src/com/android/phone/vvm/omtp/imap/ImapHelper.java
index 3a260d7..eae6cac 100644
--- a/src/com/android/phone/vvm/omtp/imap/ImapHelper.java
+++ b/src/com/android/phone/vvm/omtp/imap/ImapHelper.java
@@ -71,8 +71,7 @@
accountManager.getUserData(account, OmtpConstants.IMAP_PORT));
// TODO: determine the security protocol (e.g. ssl, tls, none, etc.)
mImapStore = new ImapStore(
- context, username, password, port, serverName,
- ImapStore.FLAG_NONE);
+ context, username, password, port, serverName, ImapStore.FLAG_NONE);
} catch (NumberFormatException e) {
LogUtils.e(TAG, e, "Could not parse port number");
}
diff --git a/src/com/android/phone/vvm/omtp/sms/OmtpMessageReceiver.java b/src/com/android/phone/vvm/omtp/sms/OmtpMessageReceiver.java
index 07cdafa..57979ff 100644
--- a/src/com/android/phone/vvm/omtp/sms/OmtpMessageReceiver.java
+++ b/src/com/android/phone/vvm/omtp/sms/OmtpMessageReceiver.java
@@ -52,12 +52,10 @@
intent.getExtras().getInt(PhoneConstants.PHONE_KEY));
SmsMessage[] messages = Telephony.Sms.Intents.getMessagesFromIntent(intent);
- StringBuilder userData = new StringBuilder();
StringBuilder messageBody = new StringBuilder();
for (int i = 0; i < messages.length; i++) {
messageBody.append(messages[i].getMessageBody());
- userData.append(extractUserData(messages[i]));
}
WrappedMessageData messageData = OmtpSmsParser.parse(messageBody.toString());
@@ -75,16 +73,6 @@
// Let this fall through: this is not a message we're interested in.
}
- private String extractUserData(SmsMessage sms) {
- try {
- // OMTP spec does not tell about the encoding. We assume ASCII.
- // UTF-8 sounds safer as it can handle ascii as well as other charsets.
- return new String(sms.getUserData(), "UTF-8");
- } catch (UnsupportedEncodingException e) {
- throw new IllegalStateException("This should have never happened", e);
- }
- }
-
/**
* A sync message has two purposes: to signal a new voicemail message, and to indicate the
* voicemails on the server have changed remotely (usually through the TUI). Save the new
@@ -107,9 +95,11 @@
break;
case OmtpConstants.MAILBOX_UPDATE:
// Needs a total resync
+ Bundle bundle = new Bundle();
+ bundle.putBoolean(OmtpVvmSyncAdapter.SYNC_EXTRAS_CLEAR_AND_RELOAD, true);
ContentResolver.requestSync(
new Account(mPhoneAccount.getId(), OmtpVvmSyncAccountManager.ACCOUNT_TYPE),
- VoicemailContract.AUTHORITY, new Bundle());
+ VoicemailContract.AUTHORITY, bundle);
break;
case OmtpConstants.GREETINGS_UPDATE:
// Not implemented in V1
diff --git a/src/com/android/services/telephony/activation/Activator.java b/src/com/android/services/telephony/activation/Activator.java
new file mode 100644
index 0000000..7dee5b3
--- /dev/null
+++ b/src/com/android/services/telephony/activation/Activator.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.activation;
+
+/**
+ * SIM Activation implementation generic interface.
+ */
+public interface Activator {
+ void onActivate();
+}
diff --git a/src/com/android/services/telephony/activation/OtaspActivator.java b/src/com/android/services/telephony/activation/OtaspActivator.java
new file mode 100644
index 0000000..11ba726
--- /dev/null
+++ b/src/com/android/services/telephony/activation/OtaspActivator.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.activation;
+
+/**
+ * Over-The-Air SIM Provisioning (OTASP) activation implementation.
+ *
+ * Handles OTASP activation requests and returns status updates as activation progresses.
+ */
+public class OtaspActivator implements Activator {
+ @Override
+ public void onActivate() {
+ // TODO: handle otasp activation
+ }
+}
diff --git a/src/com/android/services/telephony/activation/SimActivationActivity.java b/src/com/android/services/telephony/activation/SimActivationActivity.java
index acc0cdf..ae11a3f 100644
--- a/src/com/android/services/telephony/activation/SimActivationActivity.java
+++ b/src/com/android/services/telephony/activation/SimActivationActivity.java
@@ -17,9 +17,13 @@
package com.android.services.telephony.activation;
import android.app.Activity;
+import android.app.PendingIntent;
+import android.app.PendingIntent.CanceledException;
import android.content.Intent;
import android.os.Bundle;
+import android.telephony.TelephonyManager;
+import com.android.phone.PhoneGlobals;
import com.android.services.telephony.Log;
/**
@@ -30,11 +34,40 @@
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
+ Log.i(this, "onCreate");
Intent intent = getIntent();
if (Intent.ACTION_SIM_ACTIVATION_REQUEST.equals(intent.getAction())) {
Log.i(this, "Activation requested " + intent);
+
+ runActivation(intent);
}
finish();
}
+
+ private void runActivation(Intent intent) {
+ final PendingIntent response =
+ intent.getParcelableExtra(Intent.EXTRA_SIM_ACTIVATION_RESPONSE);
+
+ Log.i(this, "Running activation w/ response " + response);
+
+ PhoneGlobals app = PhoneGlobals.getInstance();
+ app.simActivationManager.runActivation(SimActivationManager.Triggers.EXPLICIT_REQUEST,
+ new SimActivationManager.Response() {
+ @Override
+ public void onResponse(int status) {
+ if (response != null) {
+ try {
+ response.send();
+ } catch (CanceledException e) {
+ Log.w(this, "Could not respond to SIM Activation.");
+ }
+ }
+ }
+ });
+
+ // TODO: Set this status to the return value of runActivation
+ // Return the response as an activity result and the pending intent.
+ setResult(TelephonyManager.SIM_ACTIVATION_RESULT_IN_PROGRESS);
+ }
}
diff --git a/src/com/android/services/telephony/activation/SimActivationManager.java b/src/com/android/services/telephony/activation/SimActivationManager.java
new file mode 100644
index 0000000..ce9e508
--- /dev/null
+++ b/src/com/android/services/telephony/activation/SimActivationManager.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.activation;
+
+import android.app.PendingIntent;
+import android.telephony.TelephonyManager;
+
+/**
+ * Handles SIM activation requests and runs the appropriate activation process until it completes
+ * or fails. When done, sends back a response if needed.
+ */
+public class SimActivationManager {
+ public static final class Triggers {
+ public static final int SYSTEM_START = 1;
+ public static final int EXPLICIT_REQUEST = 2;
+ }
+
+ public interface Response {
+ /**
+ * @param status See {@link android.telephony.TelephonyManager} for SIM_ACTIVATION_RESULT_*
+ * constants.
+ */
+ void onResponse(int status);
+ }
+
+ public void runActivation(int trigger, Response response) {
+ Activator activator = selectActivator(trigger);
+
+ activator.onActivate();
+
+ // TODO: Specify some way to determine if activation is even necessary.
+
+ // TODO: specify some way to return the result.
+
+ if (response != null) {
+ response.onResponse(TelephonyManager.SIM_ACTIVATION_RESULT_COMPLETE);
+ }
+ }
+
+ private Activator selectActivator(int trigger) {
+ // TODO: Select among all activator types
+
+ // For now, pick a do-nothing activator
+ return new Activator() {
+
+ /** ${inheritDoc} */
+ @Override
+ public void onActivate() {
+ // do something
+ }
+ };
+ }
+}
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index af3f7e4..8900568 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -19,6 +19,7 @@
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PERFORM_CDMA_PROVISIONING" />
+ <uses-permission android:name="android.permission.PERFORM_SIM_ACTIVATION" />
<application android:label="@string/app_name">
<uses-library android:name="android.test.runner" />
@@ -56,6 +57,8 @@
<data android:scheme="smsto" />
</intent-filter>
</service>
+
+ <receiver android:name="com.android.services.telephony.activation.ResponseReceiver" />
</application>
<!--
diff --git a/tests/src/com/android/services/telephony/activation/ResponseReceiver.java b/tests/src/com/android/services/telephony/activation/ResponseReceiver.java
new file mode 100644
index 0000000..33e7f00
--- /dev/null
+++ b/tests/src/com/android/services/telephony/activation/ResponseReceiver.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.activation;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import com.android.services.telephony.Log;
+
+public class ResponseReceiver extends BroadcastReceiver {
+ volatile public static boolean responseReceived = false;
+ public static final String ACTION_ACTIVATION_RESPONSE =
+ "com.android.services.telephony.ACTIVATION_RESPONSE";
+
+ private final Object mLock;
+ private Context mContext;
+
+ ResponseReceiver(Object lock) {
+ mLock = lock;
+ }
+
+ /** ${inheritDoc} */
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (!ACTION_ACTIVATION_RESPONSE.equals(intent.getAction())) {
+ Log.e(this, null, "Unexpected intent: " + intent.getAction());
+ return;
+ }
+
+ responseReceived = true;
+ Log.i(this, "received intent");
+
+ if (mLock != null) {
+ synchronized(mLock) {
+ Log.i(this, "notifying");
+ mLock.notify();
+ }
+ }
+ }
+
+ void register(Context context) {
+ context.registerReceiver(this, new IntentFilter(ACTION_ACTIVATION_RESPONSE));
+ mContext = context;
+ }
+
+ void unregister() {
+ mContext.unregisterReceiver(this);
+ }
+}
diff --git a/tests/src/com/android/services/telephony/activation/SimActivationTest.java b/tests/src/com/android/services/telephony/activation/SimActivationTest.java
new file mode 100644
index 0000000..f6060dc
--- /dev/null
+++ b/tests/src/com/android/services/telephony/activation/SimActivationTest.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.activation;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.services.telephony.Log;
+
+public class SimActivationTest extends AndroidTestCase {
+
+ private static Object mActivationLock = new Object();
+ private ResponseReceiver mResponseReceiver;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ mResponseReceiver = new ResponseReceiver(mActivationLock);
+ mResponseReceiver.register(context());
+ }
+
+ /** ${inheritDoc} */
+ @Override
+ protected void tearDown() throws Exception {
+ mResponseReceiver.unregister();
+ super.tearDown();
+ }
+
+ @SmallTest
+ public void testSimActivationResponse() throws Exception {
+ Log.i(this, "Running activation test");
+
+ Intent responseIntent = new Intent(ResponseReceiver.ACTION_ACTIVATION_RESPONSE);
+ responseIntent.setPackage(context().getPackageName());
+ PendingIntent pendingResponse = PendingIntent.getBroadcast(
+ context(), 0, responseIntent, 0);
+
+ Intent intent = new Intent(Intent.ACTION_SIM_ACTIVATION_REQUEST);
+ intent.putExtra(Intent.EXTRA_SIM_ACTIVATION_RESPONSE, pendingResponse);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ Log.i(this, "sent intent");
+ context().startActivity(intent);
+ synchronized (mActivationLock) {
+ Log.i(this, "waiting ");
+ mActivationLock.wait(5000);
+ Log.i(this, "unwaiting");
+ }
+ assertTrue(ResponseReceiver.responseReceived);
+ }
+
+ private Context context() {
+ return getContext();
+ }
+}