Merge "Clean up emergency app overlay intent" into qt-dev
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 8f463c1..f0c3b30 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -392,7 +392,7 @@
<item msgid="6043847456049107742">"১"</item>
</string-array>
<string name="cdma_activate_device" msgid="3793805892364814518">"ডিভাইস সক্রিয় করুন"</string>
- <string name="cdma_lte_data_service" msgid="4255018217292548962">"ডেটা পরিষেবা সেট আপ করুন"</string>
+ <string name="cdma_lte_data_service" msgid="4255018217292548962">"ডেটা পরিষেবা সেট-আপ করুন"</string>
<string name="carrier_settings_title" msgid="9028166176523012300">"ক্যারিয়ার সেটিংস"</string>
<string name="fdn" msgid="7878832555095183202">"স্থায়ী ডায়ালের নম্বরগুলি"</string>
<string name="fdn_with_label" msgid="187084204115493366">"ফিক্সড ডায়ালিং নাম্বার (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 0374ff3..8ebe1ac 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -444,7 +444,7 @@
<string name="simContacts_title" msgid="1861472842524839921">"Kontakte für Import auswählen"</string>
<string name="simContacts_airplaneMode" msgid="5254946758982621072">"Deaktiviere den Flugmodus, um Kontakte von der SIM-Karte zu importieren."</string>
<string name="enable_pin" msgid="5422767284133234860">"PIN-Abfrage für SIM-Karte aktivieren/deaktivieren"</string>
- <string name="change_pin" msgid="9174186126330785343">"SIM-PIN ändern"</string>
+ <string name="change_pin" msgid="9174186126330785343">"PIN für SIM-Karte ändern"</string>
<string name="enter_pin_text" msgid="8532615714751931951">"PIN der SIM-Karte:"</string>
<string name="oldPinLabel" msgid="5287773661246368314">"Alte PIN"</string>
<string name="newPinLabel" msgid="207488227285336897">"Neue PIN"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 03ae83e..f510813 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -34,7 +34,7 @@
<string name="ok" msgid="3811371167865772377">"Ados"</string>
<string name="audio_mode_speaker" msgid="27649582100085266">"Bozgorailua"</string>
<string name="audio_mode_earpiece" msgid="4156527186373869107">"Aurikularrak"</string>
- <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Kabledun entzungailua"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Entzungailu kableduna"</string>
<string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth entzungailua"</string>
<string name="wait_prompt_str" msgid="7601815427707856238">"Ondorengo tonuak bidali?\n"</string>
<string name="pause_prompt_str" msgid="1789964702154314806">"Tonuak bidaltzen\n"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index ada89b6..60058c9 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -65,7 +65,7 @@
<string name="phone_accounts_make_sip_calls_with" msgid="4677789312053828493">"આના વડે SIP કૉલ્સ કરો"</string>
<string name="phone_accounts_ask_every_time" msgid="4346499067149985702">"પહેલાં પૂછો"</string>
<string name="phone_accounts_default_account_label" msgid="4183772241814460014">"કોઇ નેટવર્ક ઉપલબ્ધ નથી"</string>
- <string name="phone_accounts_settings_header" msgid="4141710640883261094">"સેટિંગ્સ"</string>
+ <string name="phone_accounts_settings_header" msgid="4141710640883261094">"સેટિંગ"</string>
<string name="phone_accounts_choose_accounts" msgid="5232948804226424002">"એકાઉન્ટ્સ પસંદ કરો"</string>
<string name="phone_accounts_selection_header" msgid="1365215726106915865">"ફોન એકાઉન્ટ્સ"</string>
<string name="phone_accounts_add_sip_account" msgid="2023821743341923271">"SIP એકાઉન્ટ ઉમેરો"</string>
@@ -80,7 +80,7 @@
<string name="make_and_receive_calls" msgid="1258596928285972166">"કૉલ કરો અને પ્રાપ્ત કરો"</string>
<string name="smart_forwarding_settings_menu" msgid="3874243342391798449">"સ્માર્ટ ફૉરવર્ડિંગ"</string>
<string name="smart_forwarding_settings_menu_summary" msgid="8962247659470565059">"એક નંબર પર પહોંચી શકાય તેમ ન હોય, ત્યારે હંમેશાં તમારા અન્ય નંબર પર કૉલ ફૉરવર્ડ કરો"</string>
- <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"સૂચનાઓ"</string>
+ <string name="voicemail_notifications_preference_title" msgid="4019728578955102213">"નોટિફિકેશન"</string>
<string name="cell_broadcast_settings" msgid="8740238216690502563">"કટોકટીના બ્રોડકાસ્ટ્સ"</string>
<string name="call_settings" msgid="6112441768261754562">"કૉલ સેટિંગ્સ"</string>
<string name="additional_gsm_call_settings" msgid="1391795981938800617">"વધારાની સેટિંગ્સ"</string>
@@ -123,8 +123,8 @@
<string name="disable_cfnrc_forbidden" msgid="5646361343094064333">"જ્યારે તમારો ફોન પહોંચયોગ્ય ન હોય ત્યારે તમારા કેરિઅર કૉલ ફોરવર્ડિંગને અક્ષમ કરવાને સમર્થન આપતા નથી."</string>
<string name="updating_title" msgid="6146755386174019046">"કૉલ સેટિંગ્સ"</string>
<string name="call_settings_admin_user_only" msgid="4526094783818216374">"કૉલ સેટિંગ્સને ફક્ત એડમિન વપરાશકર્તા દ્વારા જ બદલી શકાય છે."</string>
- <string name="call_settings_with_label" msgid="3401177261468593519">"સેટિંગ્સ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"કૉલ સેટિંગ્સની ભૂલ"</string>
+ <string name="call_settings_with_label" msgid="3401177261468593519">"સેટિંગ (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+ <string name="error_updating_title" msgid="7970259216988931777">"કૉલ સેટિંગની ભૂલ"</string>
<string name="reading_settings" msgid="1920291699287055284">"સેટિંગ્સ વાંચી રહ્યાં છે…"</string>
<string name="updating_settings" msgid="8171225533884883252">"સેટિંગ્સ અપડેટ કરી રહ્યાં છે..."</string>
<string name="reverting_settings" msgid="4752151682666912828">"સેટિંગ્સ પાછી ફરાવી રહ્યાં છે…"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 39c6d75..7e48172 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -134,7 +134,7 @@
<string name="stk_cc_ss_to_ussd_error" msgid="6095812685884176176">"SS अनुरोध को USSD अनुरोध में बदला गया"</string>
<string name="stk_cc_ss_to_ss_error" msgid="7920654012697945858">"नए SS अनुरोध में बदला गया"</string>
<string name="stk_cc_ss_to_dial_video_error" msgid="3873905132181743781">"SS अनुरोध को वीडियो कॉल में बदला गया"</string>
- <string name="fdn_check_failure" msgid="18200614306525434">"आपके फ़ोन ऐप्स की फ़िक्स्ड डायलिंग नंबर सेटिंग चालू है. इसके परिणामस्वरूप, कॉल से संबंधित कुछ सुविधाएं कार्य नहीं कर रही हैं."</string>
+ <string name="fdn_check_failure" msgid="18200614306525434">"आपके फ़ोन ऐप्स की फ़िक्स्ड डायलिंग नंबर सेटिंग चालू है. इसके परिणामस्वरूप, कॉल से संबंधित कुछ सुविधाएं काम नहीं कर रही हैं."</string>
<string name="radio_off_error" msgid="2304459933248513376">"इन सेटिंग को देखने के पहले रेडियो चालू करें."</string>
<string name="close_dialog" msgid="2365884406356986917">"ठीक है"</string>
<string name="enable" msgid="7248657275000173526">"चालू करें"</string>
@@ -447,8 +447,8 @@
<string name="oldPinLabel" msgid="5287773661246368314">"पुराना पिन"</string>
<string name="newPinLabel" msgid="207488227285336897">"नया पिन"</string>
<string name="confirmPinLabel" msgid="257597715098070206">"नए पिन की दुबारा पूछें"</string>
- <string name="badPin" msgid="8955102849303984935">"आपके द्वारा लिखा गया पुराना पिन सही नहीं है. फिर से प्रयास करें."</string>
- <string name="mismatchPin" msgid="5923253370683071889">"आपके द्वारा लिखे गए पिन का मिलान नहीं होता. फिर से प्रयास करें."</string>
+ <string name="badPin" msgid="8955102849303984935">" लिखा गया पुराना पिन सही नहीं है. फिर से प्रयास करें."</string>
+ <string name="mismatchPin" msgid="5923253370683071889">" लिखे गए पिन का मिलान नहीं होता. फिर से प्रयास करें."</string>
<string name="invalidPin" msgid="5981171102258684792">"कोई ऐसा पिन लिखें, जिसमें 4 से 8 अंक हों."</string>
<string name="disable_sim_pin" msgid="3419351358300716472">"सिम पिन साफ़ करें"</string>
<string name="enable_sim_pin" msgid="4845145659651484248">"सिम पिन सेट करें"</string>
@@ -475,7 +475,7 @@
<string name="pin2_attempts" msgid="720736232885011507">\n"आपके पास <xliff:g id="NUMBER">%d</xliff:g> प्रयास शेष हैं."</string>
<string name="pin2_unblocked" msgid="7791600368153469078">"PIN2 अब अवरोधित नहीं है"</string>
<string name="pin2_error_exception" msgid="1088689322248996699">"नेटवर्क या SIM कार्ड गड़बड़ी"</string>
- <string name="doneButton" msgid="2859593360997984240">"पूर्ण"</string>
+ <string name="doneButton" msgid="2859593360997984240">"पूरा हो गया"</string>
<string name="voicemail_settings_number_label" msgid="8524164258691887790">"वॉइसमेल नबंर"</string>
<string name="card_title_dialing" msgid="5769417478498348054">"डायल हो रहा है"</string>
<string name="card_title_redialing" msgid="8253487008234167266">"फिर से डायल हो रहा है"</string>
@@ -554,7 +554,7 @@
<string name="rtt_mode_more_information" msgid="6080420780730383030">"आरटीटी उन कॉल करने वालों की मदद करता है, जो सुन नहीं सकते हैं, ऊंचा सुनते हैं, जिन्हें बोलने में दिक्कत है या जिनके लिए सिर्फ़ आवाज़ काफ़ी नहीं होती.<br> <a href=<xliff:g id="URL">http://support.google.com/mobile?p=telephony_rtt</xliff:g>>ज़्यादा जानें</a>\n <br><br> - आरटीटी कॉल, मैसेज लेख के रूप में सेव किए जाते हैं\n <br> - वीडियो कॉल के लिए आरटीटी उपलब्ध नहीं है"</string>
<string-array name="tty_mode_entries">
<item msgid="512950011423868021">"TTY बंद"</item>
- <item msgid="3971695875449640648">"TTY पूर्ण"</item>
+ <item msgid="3971695875449640648">"TTY पूरा हुआ"</item>
<item msgid="1937509904407445684">"TTY HCO"</item>
<item msgid="5644925873488772224">"TTY VCO"</item>
</string-array>
@@ -576,7 +576,7 @@
<string name="ota_activate" msgid="1368528132525626264">"सक्रिय करें"</string>
<string name="ota_title_activate_success" msgid="6570240212263372046">"फ़ोन सक्रिय हो गया."</string>
<string name="ota_title_problem_with_activation" msgid="7095824491970084367">"सक्रियण में समस्या"</string>
- <string name="ota_listen" msgid="162923839877584937">"जब तक आप यह न सुनें कि सक्रियण पूर्ण हो गया है, कहे गए निर्देशों का पालन करें."</string>
+ <string name="ota_listen" msgid="162923839877584937">"जब तक आप यह न सुनें कि चालू करना पूरा हो गया है, कहे गए निर्देशों का पालन करें."</string>
<string name="ota_speaker" msgid="6904589278542719647">"स्पीकर"</string>
<string name="ota_progress" msgid="460876637828044519">"आपका फ़ोन प्रोग्राम किया जा रहा है…"</string>
<string name="ota_failure" msgid="7713756181204620397">"आपके फ़ोन को प्रोग्राम नहीं किया जा सका"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 6acc09a..7b7e6e6 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -763,7 +763,7 @@
<string name="supp_service_clir_suppression_rejected" msgid="1581851661582189045">"חסימת המספר נדחתה."</string>
<string name="supp_service_closed_user_group_call" msgid="5761735840904590950">"שיחה עם קבוצת משתמשים סגורה."</string>
<string name="supp_service_incoming_calls_barred" msgid="3248813207307882723">"אי אפשר לקבל שיחות נכנסות."</string>
- <string name="supp_service_outgoing_calls_barred" msgid="1962644621292054081">"אי אפשר לבצע שיחות יוצאות."</string>
+ <string name="supp_service_outgoing_calls_barred" msgid="1962644621292054081">"אי אפשר להוציא שיחות."</string>
<string name="supp_service_call_forwarding_active" msgid="1253134771682248735">"העברת השיחות פעילה."</string>
<string name="supp_service_additional_call_forwarded" msgid="5228624725214727315">"שיחה נוספת הועברה."</string>
<string name="supp_service_additional_ect_connected" msgid="6396964292513707102">"העברת השיחה שנבחרה הסתיימה."</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 96effbd..6c6de71 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -255,7 +255,7 @@
<string name="roaming_notification_title" msgid="4749053220884743110">"Mobildatatilkoblingen er tapt"</string>
<string name="roaming_warning" msgid="1603164667540144353">"Det kan medføre betydelige kostnader."</string>
<string name="roaming_check_price_warning" msgid="7497570906830902550">"Sjekk med nettverksleverandøren din for priser."</string>
- <string name="roaming_alert_title" msgid="3654815360303826008">"Vil du tillate roaming?"</string>
+ <string name="roaming_alert_title" msgid="3654815360303826008">"Vil du tillate data-roaming?"</string>
<string name="data_usage_title" msgid="4042209259808900283">"Appens databruk"</string>
<string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> mobildata er brukt i perioden <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="advanced_options_title" msgid="8074895510265488035">"Avansert"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index b39b91f..9905a5e 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -619,7 +619,7 @@
<string name="voicemail_visual_voicemail_switch_title" msgid="5012622186976275457">"Visuele voicemail"</string>
<string name="voicemail_set_pin_dialog_title" msgid="2797924461029093837">"Pincode instellen"</string>
<string name="voicemail_change_pin_dialog_title" msgid="6035421908626121564">"Pincode wijzigen"</string>
- <string name="preference_category_ringtone" msgid="5197960752529332721">"Beltoon en trillen"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Ringtone en trillen"</string>
<string name="pstn_connection_service_label" msgid="1743245930577325900">"Ingebouwde simkaarten"</string>
<string name="enable_video_calling_title" msgid="7237253660669000899">"Videogesprekken inschakelen"</string>
<string name="enable_video_calling_dialog_msg" msgid="8948186136957417948">"Als je videogesprekken wilt inschakelen, moet je de geoptimaliseerde 4G LTE-modus inschakelen in de netwerkinstellingen."</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index f3dd169..97c7a84 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="phoneAppLabel" product="tablet" msgid="8576272342240415145">"Mobile Data"</string>
+ <string name="phoneAppLabel" product="tablet" msgid="8576272342240415145">"Dane mobilne"</string>
<string name="phoneAppLabel" product="default" msgid="6790717591729922998">"Telefon – usługi"</string>
<string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Numery alarmowe"</string>
<string name="phoneIconLabel" msgid="2331230813161304895">"Telefon"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 2cafd04..c725d00 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -475,7 +475,7 @@
<string name="puk2_requested" msgid="5831015200030161434">"Неверный пароль. SIM-карта заблокирована. Введите код PUK2."</string>
<string name="puk2_blocked" msgid="3150263853077280049">"Код PUK2 заблокирован навсегда"</string>
<string name="pin2_attempts" msgid="720736232885011507">\n"Осталось попыток: <xliff:g id="NUMBER">%d</xliff:g>."</string>
- <string name="pin2_unblocked" msgid="7791600368153469078">"Код PIN2 разблокирован"</string>
+ <string name="pin2_unblocked" msgid="7791600368153469078">"Код PIN2 разблокирован."</string>
<string name="pin2_error_exception" msgid="1088689322248996699">"Ошибка сети или SIM-карты"</string>
<string name="doneButton" msgid="2859593360997984240">"Готово"</string>
<string name="voicemail_settings_number_label" msgid="8524164258691887790">"Номер голосовой почты"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 05749c0..fe6b7a1 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -256,7 +256,7 @@
<string name="roaming_warning" msgid="1603164667540144353">"Detta kan leda till höga kostnader."</string>
<string name="roaming_check_price_warning" msgid="7497570906830902550">"Kontakta din nätoperatör för priser."</string>
<string name="roaming_alert_title" msgid="3654815360303826008">"Vill du tillåta dataroaming?"</string>
- <string name="data_usage_title" msgid="4042209259808900283">"Appens dataanvändning"</string>
+ <string name="data_usage_title" msgid="4042209259808900283">"Appars dataanvändning"</string>
<string name="data_usage_template" msgid="8526428824844656364">"<xliff:g id="ID_1">%1$s</xliff:g> mobildata använt mellan <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="advanced_options_title" msgid="8074895510265488035">"Avancerat"</string>
<string name="carrier_settings_euicc" msgid="6714062862127226405">"Operatör"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index e1bfbab..a3503be 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -134,7 +134,7 @@
<string name="stk_cc_ss_to_ussd_error" msgid="6095812685884176176">"SS கோரிக்கை, USSD கோரிக்கைக்கு மாற்றப்பட்டது"</string>
<string name="stk_cc_ss_to_ss_error" msgid="7920654012697945858">"புதிய SS கோரிக்கைக்கு மாற்றப்பட்டது"</string>
<string name="stk_cc_ss_to_dial_video_error" msgid="3873905132181743781">"SS கோரிக்கை, வீடியோ அழைப்பிற்கு மாற்றப்பட்டது"</string>
- <string name="fdn_check_failure" msgid="18200614306525434">"மொபைல் பயன்பாட்டின் நிலையான அழைப்பு எண்களுக்கான அமைப்பு இயக்கப்பட்டது. இதன் விளைவாக, அழைப்பு தொடர்பான சில அம்சங்கள் செயல்படவில்லை."</string>
+ <string name="fdn_check_failure" msgid="18200614306525434">"மொபைல் ஆப்ஸின் நிலையான அழைப்பு எண்களுக்கான அமைப்பு இயக்கப்பட்டது. இதன் விளைவாக, அழைப்பு தொடர்பான சில அம்சங்கள் செயல்படவில்லை."</string>
<string name="radio_off_error" msgid="2304459933248513376">"அமைப்புகளைப் பார்ப்பதற்கு முன், ரேடியோவை இயக்கவும்."</string>
<string name="close_dialog" msgid="2365884406356986917">"சரி"</string>
<string name="enable" msgid="7248657275000173526">"இயக்கு"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 20cd1bd..149871e 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -263,7 +263,7 @@
<string name="keywords_carrier_settings_euicc" msgid="6861505396475991277">"ผู้ให้บริการ, eSIM, ซิม, eUICC, เปลี่ยนผู้ให้บริการ, เพิ่มผู้ให้บริการ"</string>
<string name="carrier_settings_euicc_summary" msgid="5115001942761995457">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
<string name="mobile_data_settings_title" msgid="4661165467914727157">"เน็ตมือถือ"</string>
- <string name="mobile_data_settings_summary" msgid="5087255915840576895">"เข้าถึงข้อมูลโดยใช้เครือข่ายมือถือ"</string>
+ <string name="mobile_data_settings_summary" msgid="5087255915840576895">"เข้าถึงอินเทอร์เน็ตโดยใช้เครือข่ายมือถือ"</string>
<string name="data_usage_disable_mobile" msgid="3577275288809667615">"ปิดเน็ตมือถือไหม"</string>
<string name="sim_selection_required_pref" msgid="7049424902961844236">"ต้องเลือก"</string>
<string name="sim_change_data_title" msgid="5332425991853799280">"เปลี่ยนซิมอินเทอร์เน็ตไหม"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 16d2ad2..cacb893 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -105,21 +105,21 @@
<string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Barcha qo‘ng‘iroqlar yo‘naltirilmoqda"</string>
<string name="sum_cfu_enabled" msgid="2450052502198827927">"Barcha qo‘ng‘iroqlar <xliff:g id="PHONENUMBER">{0}</xliff:g>ga yo‘naltirilmoqda"</string>
<string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Raqam mavjud emas"</string>
- <string name="sum_cfu_disabled" msgid="8384177689501334080">"O‘chiq"</string>
+ <string name="sum_cfu_disabled" msgid="8384177689501334080">"Yoqilmagan"</string>
<string name="labelCFB" msgid="6139853033106283172">"Agar raqam band bo‘lsa"</string>
<string name="messageCFB" msgid="3711089705936187129">"Ushbu raqamga yo‘naltirilsin"</string>
<string name="sum_cfb_enabled" msgid="5984198104833116690">"<xliff:g id="PHONENUMBER">{0}</xliff:g> raqamiga yo‘naltiriladi"</string>
- <string name="sum_cfb_disabled" msgid="4913145177320506827">"O‘chiq"</string>
+ <string name="sum_cfb_disabled" msgid="4913145177320506827">"Yoqilmagan"</string>
<string name="disable_cfb_forbidden" msgid="3506984333877998061">"Telefoningiz band bo‘lganda qo‘ng‘iroqlarni boshqa raqamga yo‘naltirishni o‘chirish xususiyati tarmoq operatoringizda yo‘q."</string>
<string name="labelCFNRy" msgid="1736067178393744351">"Agar javob berilmasa"</string>
<string name="messageCFNRy" msgid="672317899884380374">"Ushbu raqamga yo‘naltirilsin"</string>
<string name="sum_cfnry_enabled" msgid="6955775691317662910">"<xliff:g id="PHONENUMBER">{0}</xliff:g> raqamiga yo‘naltiriladi"</string>
- <string name="sum_cfnry_disabled" msgid="3884684060443538097">"O‘chiq"</string>
+ <string name="sum_cfnry_disabled" msgid="3884684060443538097">"Yoqilmagan"</string>
<string name="disable_cfnry_forbidden" msgid="4308233959150658058">"Telefoningiz javob bermayotganda qo‘ng‘iroqlarni boshqa raqamga yo‘naltirishni o‘chirish xususiyati operatoringizda yo‘q."</string>
<string name="labelCFNRc" msgid="2614827454402079766">"Agar raqam tarmoqdan tashqarida bo‘lsa"</string>
<string name="messageCFNRc" msgid="6380695421020295119">"Ushbu raqamga yo‘naltirilsin"</string>
<string name="sum_cfnrc_enabled" msgid="7010898346095497421">"<xliff:g id="PHONENUMBER">{0}</xliff:g> raqamiga yo‘naltiriladi"</string>
- <string name="sum_cfnrc_disabled" msgid="2684474391807469832">"O‘chiq"</string>
+ <string name="sum_cfnrc_disabled" msgid="2684474391807469832">"Yoqilmagan"</string>
<string name="disable_cfnrc_forbidden" msgid="5646361343094064333">"Telefoningiz o‘chiq bo‘lganida qo‘ng‘iroqlarni boshqa raqamga yo‘naltirishni o‘chirish xususiyati tarmoq operatoringizda yo‘q."</string>
<string name="updating_title" msgid="6146755386174019046">"Chaqiruv sozlamalari"</string>
<string name="call_settings_admin_user_only" msgid="4526094783818216374">"Faqat administrator qo‘ng‘iroq sozlamalarini o‘zgartirishi mumkin."</string>
@@ -720,7 +720,7 @@
<string name="clh_callFailed_interworking_unspecified_txt" msgid="6701560054199411045">"Chaqiruv amalga oshmadi. Xatolik kodi: 127."</string>
<string name="labelCallBarring" msgid="3452870940716226978">"Chaqiruvlarni taqiqlash"</string>
<string name="sum_call_barring_enabled" msgid="6804489690436703488">"Yoniq"</string>
- <string name="sum_call_barring_disabled" msgid="5900772179198857783">"O‘chiq"</string>
+ <string name="sum_call_barring_disabled" msgid="5900772179198857783">"Yoqilmagan"</string>
<string name="call_barring_baoc" msgid="1199843944333106035">"Barcha chiquvchi chaqiruvlar"</string>
<string name="call_barring_baoc_enabled" msgid="8112118391869380361">"Barcha chiquvchi chaqiruvlarni bloklash bekor qilinsinmi?"</string>
<string name="call_barring_baoc_disabled" msgid="7806697133004697974">"Barcha chiquvchi chaqiruvlar bloklansinmi?"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index bf9a050..9b4dac5 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -630,7 +630,7 @@
<string name="sim_label_emergency_calls" msgid="4847699229529306397">"緊急電話"</string>
<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>
+ <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"無障礙設定"</string>
<string name="status_hint_label_incoming_wifi_call" msgid="5932176406432044638">"Wi-Fi 通話來電:"</string>
<string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi 通話"</string>
<string name="emergency_action_launch_hint" msgid="4906759256275562674">"再次輕觸即可開啟"</string>
diff --git a/res/values/config.xml b/res/values/config.xml
index 232c57f..63c185b 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -254,4 +254,11 @@
<!-- The country list that shortcut view can be enabled. -->
<string-array name="config_countries_to_enable_shortcut_view" translatable="false">
</string-array>
+
+ <!-- When an emergency call is placed and the carrier supports network initiated SUPL requests
+ for location, this configuration dictates whether or not the modem supports SUPL requests
+ being handled on the logical slot that is not currently configured as the default data
+ slot. If true, telephony will always try to place the emergency call on the subscription
+ associated with default data first, instead of using the default voice configuration.-->
+ <bool name="config_gnss_supl_requires_default_data_for_emergency">false</bool>
</resources>
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 5f50002..ed1de19 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -4450,7 +4450,7 @@
.setMinSdkVersionForFine(Build.VERSION_CODES.Q)
.build());
if (locationResult != LocationAccessPolicy.LocationPermissionResult.ALLOWED) {
- SecurityException e = checkNetworkRequestForSanitizedLocationAccess(request);
+ SecurityException e = checkNetworkRequestForSanitizedLocationAccess(request, subId);
if (e != null) {
if (locationResult == LocationAccessPolicy.LocationPermissionResult.DENIED_HARD) {
throw e;
@@ -4473,11 +4473,16 @@
}
private SecurityException checkNetworkRequestForSanitizedLocationAccess(
- NetworkScanRequest request) {
- if (mApp.checkCallingOrSelfPermission(android.Manifest.permission.NETWORK_SCAN)
- != PERMISSION_GRANTED) {
- return new SecurityException("permission.NETWORK_SCAN is needed for network scans"
- + " without location access.");
+ NetworkScanRequest request, int subId) {
+ boolean hasCarrierPriv = getCarrierPrivilegeStatusForUid(subId, Binder.getCallingUid())
+ == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
+ boolean hasNetworkScanPermission =
+ mApp.checkCallingOrSelfPermission(android.Manifest.permission.NETWORK_SCAN)
+ == PERMISSION_GRANTED;
+
+ if (!hasCarrierPriv && !hasNetworkScanPermission) {
+ return new SecurityException("permission.NETWORK_SCAN or carrier privileges is needed"
+ + " for network scans without location access.");
}
if (request.getSpecifiers() != null && request.getSpecifiers().length > 0) {
@@ -7061,4 +7066,28 @@
PickSmsSubscriptionActivity.SMS_PICK_FOR_MESSAGE);
mApp.startActivity(intent);
}
+
+ @Override
+ public String getMmsUAProfUrl(int subId) {
+ //TODO investigate if this API should require proper permission check in R b/133791609
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return SubscriptionManager.getResourcesForSubId(getDefaultPhone().getContext(), subId)
+ .getString(com.android.internal.R.string.config_mms_user_agent_profile_url);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public String getMmsUserAgent(int subId) {
+ //TODO investigate if this API should require proper permission check in R b/133791609
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return SubscriptionManager.getResourcesForSubId(getDefaultPhone().getContext(), subId)
+ .getString(com.android.internal.R.string.config_mms_user_agent);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
}
diff --git a/src/com/android/services/telephony/ImsConference.java b/src/com/android/services/telephony/ImsConference.java
index 1f157e3..8cd8051 100644
--- a/src/com/android/services/telephony/ImsConference.java
+++ b/src/com/android/services/telephony/ImsConference.java
@@ -259,6 +259,8 @@
private boolean mCouldManageConference;
private FeatureFlagProxy mFeatureFlagProxy;
private boolean mIsEmulatingSinglePartyCall = false;
+ private boolean mIsUsingSimCallManager = false;
+
/**
* Where {@link #mIsEmulatingSinglePartyCall} is {@code true}, contains the
* {@link ConferenceParticipantConnection#getUserEntity()} and
@@ -616,6 +618,7 @@
private void updateManageConference() {
boolean couldManageConference = can(Connection.CAPABILITY_MANAGE_CONFERENCE);
boolean canManageConference = mFeatureFlagProxy.isUsingSinglePartyCallEmulation()
+ && mIsEmulatingSinglePartyCall
? mConferenceParticipantConnections.size() > 1
: mConferenceParticipantConnections.size() != 0;
Log.v(this, "updateManageConference was :%s is:%s", couldManageConference ? "Y" : "N",
@@ -675,6 +678,9 @@
mConferenceHostAddress = new Uri[hostAddresses.size()];
mConferenceHostAddress = hostAddresses.toArray(mConferenceHostAddress);
+
+ mIsUsingSimCallManager = mTelecomAccountRegistry.isUsingSimCallManager(
+ mConferenceHostPhoneAccountHandle);
}
mConferenceHost.addConnectionListener(mConferenceHostListener);
@@ -725,12 +731,16 @@
// Determine if the conference event package represents a single party conference.
// A single party conference is one where there is no other participant other than the
// conference host and one other participant.
+ // Note: We consider 0 to still be a single party conference since some carriers will
+ // send a conference event package with JUST the host in it when the conference is
+ // disconnected. We don't want to change back to conference mode prior to disconnection
+ // or we will not log the call.
boolean isSinglePartyConference = participants.stream()
.filter(p -> {
Pair<Uri, Uri> pIdent = new Pair<>(p.getHandle(), p.getEndpoint());
return !Objects.equals(mHostParticipantIdentity, pIdent);
})
- .count() == 1;
+ .count() <= 1;
// We will only process the CEP data if:
// 1. We're not emulating a single party call.
@@ -829,8 +839,18 @@
* 1. Tell telecom we're a conference again.
* 2. Restore {@link Connection#CAPABILITY_MANAGE_CONFERENCE} capability.
* 3. Null out the name/address.
+ *
+ * Note: Single party call emulation is disabled if the conference is taking place via a
+ * sim call manager. Emulating a single party call requires properties of the conference to be
+ * changed (connect time, address, conference state) which cannot be guaranteed to be relayed
+ * correctly by the sim call manager to Telecom.
*/
private void stopEmulatingSinglePartyCall() {
+ if (mIsUsingSimCallManager) {
+ Log.i(this, "stopEmulatingSinglePartyCall: using sim call manager; skip.");
+ return;
+ }
+
Log.i(this, "stopEmulatingSinglePartyCall: conference now has more than one"
+ " participant; make it look conference-like again.");
mIsEmulatingSinglePartyCall = false;
@@ -867,8 +887,18 @@
* 2. Tell telecom we're not a conference.
* 3. Remove {@link Connection#CAPABILITY_MANAGE_CONFERENCE} capability.
* 4. Set the name/address to that of the single participant.
+ *
+ * Note: Single party call emulation is disabled if the conference is taking place via a
+ * sim call manager. Emulating a single party call requires properties of the conference to be
+ * changed (connect time, address, conference state) which cannot be guaranteed to be relayed
+ * correctly by the sim call manager to Telecom.
*/
private void startEmulatingSinglePartyCall() {
+ if (mIsUsingSimCallManager) {
+ Log.i(this, "startEmulatingSinglePartyCall: using sim call manager; skip.");
+ return;
+ }
+
Log.i(this, "startEmulatingSinglePartyCall: conference has a single "
+ "participant; downgrade to single party call.");
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 21685a3..46f7023 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -56,6 +56,7 @@
import com.android.ims.ImsManager;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.SubscriptionController;
import com.android.phone.PhoneGlobals;
import com.android.phone.PhoneUtils;
import com.android.phone.R;
@@ -84,6 +85,7 @@
private final PstnPhoneCapabilitiesNotifier mPhoneCapabilitiesNotifier;
private boolean mIsEmergency;
private boolean mIsRttCapable;
+ private boolean mIsEmergencyPreferred;
private MmTelFeature.MmTelCapabilities mMmTelCapabilities;
private ImsMmTelManager.CapabilityCallback mMmtelCapabilityCallback;
private ImsMmTelManager mMmTelManager;
@@ -96,6 +98,7 @@
private boolean mIsVideoConferencingSupported;
private boolean mIsMergeOfWifiCallsAllowedWhenVoWifiOff;
private boolean mIsManageImsConferenceCallSupported;
+ private boolean mIsUsingSimCallManager;
private boolean mIsShowPreciseFailedCause;
AccountEntry(Phone phone, boolean isEmergency, boolean isDummy) {
@@ -271,6 +274,11 @@
capabilities |= PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS;
}
+ mIsEmergencyPreferred = isEmergencyPreferredAccount(subId);
+ if (mIsEmergencyPreferred) {
+ capabilities |= PhoneAccount.CAPABILITY_EMERGENCY_PREFERRED;
+ }
+
if (isRttCurrentlySupported()) {
capabilities |= PhoneAccount.CAPABILITY_RTT;
mIsRttCapable = true;
@@ -343,6 +351,7 @@
mIsMergeOfWifiCallsAllowedWhenVoWifiOff =
isCarrierMergeOfWifiCallsAllowedWhenVoWifiOff();
mIsManageImsConferenceCallSupported = isCarrierManageImsConferenceCallSupported();
+ mIsUsingSimCallManager = isCarrierUsingSimCallManager();
mIsShowPreciseFailedCause = isCarrierShowPreciseFailedCause();
if (isEmergency && mContext.getResources().getBoolean(
@@ -410,6 +419,36 @@
}
/**
+ * In some cases, we need to try sending the emergency call over this PhoneAccount due to
+ * restrictions and limitations in MSIM configured devices. This includes the following:
+ * 1) The device does not support GNSS SUPL requests on the non-DDS subscription due to
+ * modem limitations. If the device does not support SUPL on non-DDS, we need to try the
+ * emergency call on the DDS subscription first to allow for SUPL to be completed.
+ *
+ * @return true if Telecom should prefer this PhoneAccount, false if there is no preference
+ * needed.
+ */
+ private boolean isEmergencyPreferredAccount(int subId) {
+ final boolean gnssSuplRequiresDefaultData = mContext.getResources().getBoolean(
+ R.bool.config_gnss_supl_requires_default_data_for_emergency);
+ if (!gnssSuplRequiresDefaultData) {
+ // No preference is necessary.
+ return false;
+ }
+
+ // Only set a preference on MSIM devices
+ if (mTelephonyManager.getPhoneCount() <= 1) {
+ return false;
+ }
+ // Check to see if this PhoneAccount is associated with the default Data subscription.
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ return false;
+ }
+ SubscriptionController controller = SubscriptionController.getInstance();
+ return controller != null && (controller.getDefaultDataSubId() == subId);
+ }
+
+ /**
* Determines from carrier configuration whether pausing of IMS video calls is supported.
*
* @return {@code true} if pausing IMS video calls is supported.
@@ -521,6 +560,19 @@
}
/**
+ * Determines from carrier config whether the carrier uses a sim call manager.
+ *
+ * @return {@code true} if the carrier uses a sim call manager,
+ * {@code false} otherwise.
+ */
+ private boolean isCarrierUsingSimCallManager() {
+ PersistableBundle b =
+ PhoneGlobals.getInstance().getCarrierConfigForSubId(mPhone.getSubId());
+ return !TextUtils.isEmpty(
+ b.getString(CarrierConfigManager.KEY_DEFAULT_SIM_CALL_MANAGER_STRING));
+ }
+
+ /**
* Determines from carrier config whether showing percise call diconnect cause to user
* is supported.
*
@@ -596,6 +648,14 @@
}
}
+ public void updateDefaultDataSubId() {
+ boolean isEmergencyPreferred = isEmergencyPreferredAccount(mPhone.getSubId());
+ if (isEmergencyPreferred != mIsEmergencyPreferred) {
+ Log.i(this, "updateDefaultDataSubId - changed, new value: " + isEmergencyPreferred);
+ mAccount = registerPstnPhoneAccount(mIsEmergency, mIsDummy);
+ }
+ }
+
/**
* Determines whether RTT is supported given the current state of the
* device.
@@ -662,6 +722,15 @@
}
/**
+ * Indicates whether this account uses a sim call manger.
+ * @return {@code true} if the account uses a sim call manager,
+ * {@code false} otherwise.
+ */
+ public boolean isUsingSimCallManager() {
+ return mIsUsingSimCallManager;
+ }
+
+ /**
* Indicates whether this account supports showing the precise call disconnect cause
* to user (i.e. conferencing).
* @return {@code true} if the account supports showing the precise call disconnect cause,
@@ -743,6 +812,15 @@
}
mServiceState = newState;
}
+
+ @Override
+ public void onActiveDataSubscriptionIdChanged(int subId) {
+ synchronized (mAccountsLock) {
+ for (AccountEntry account : mAccounts) {
+ account.updateDefaultDataSubId();
+ }
+ }
+ }
};
private static TelecomAccountRegistry sInstance;
@@ -924,7 +1002,7 @@
* @param handle The phone account handle to find the subscription address for.
* @return The address.
*/
- Uri getAddress(PhoneAccountHandle handle) {
+ public Uri getAddress(PhoneAccountHandle handle) {
synchronized (mAccountsLock) {
for (AccountEntry entry : mAccounts) {
if (entry.getPhoneAccountHandle().equals(handle)) {
@@ -936,6 +1014,24 @@
}
/**
+ * Returns whethere a the subscription associated with a {@link PhoneAccountHandle} is using a
+ * sim call manager.
+ *
+ * @param handle The phone account handle to find the subscription address for.
+ * @return {@code true} if a sim call manager is in use, {@code false} otherwise.
+ */
+ public boolean isUsingSimCallManager(PhoneAccountHandle handle) {
+ synchronized (mAccountsLock) {
+ for (AccountEntry entry : mAccounts) {
+ if (entry.getPhoneAccountHandle().equals(handle)) {
+ return entry.isUsingSimCallManager();
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
* Sets up all the phone accounts for SIMs on first boot.
*/
public void setupOnBoot() {
@@ -951,7 +1047,8 @@
// We also need to listen for changes to the service state (e.g. emergency -> in service)
// because this could signal a removal or addition of a SIM in a single SIM phone.
- mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE);
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE
+ | PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE);
// Listen for user switches. When the user switches, we need to ensure that if the current
// use is not the primary user we disable video calling.
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 632e9ac..7bb6b7d 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -2203,7 +2203,6 @@
boolean isIms = phone.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS;
boolean isVoWifiEnabled = false;
if (isIms) {
- ImsPhone imsPhone = (ImsPhone) phone;
isVoWifiEnabled = ImsUtil.isWfcEnabled(phone.getContext(), phone.getPhoneId());
}
PhoneAccountHandle phoneAccountHandle = isIms ? PhoneUtils
diff --git a/tests/src/com/android/services/telephony/ImsConferenceTest.java b/tests/src/com/android/services/telephony/ImsConferenceTest.java
index 56a6240..8d67973 100644
--- a/tests/src/com/android/services/telephony/ImsConferenceTest.java
+++ b/tests/src/com/android/services/telephony/ImsConferenceTest.java
@@ -16,9 +16,11 @@
package com.android.services.telephony;
+import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.any;
@@ -30,8 +32,10 @@
import android.net.Uri;
import android.os.Looper;
+import android.telecom.Conference;
import android.telecom.ConferenceParticipant;
import android.telecom.Connection;
+import android.telecom.PhoneAccountHandle;
import android.test.suitebuilder.annotation.SmallTest;
import com.android.internal.telephony.PhoneConstants;
@@ -53,9 +57,6 @@
@Mock
private TelecomAccountRegistry mMockTelecomAccountRegistry;
- @Mock
- private com.android.internal.telephony.Connection mOriginalConnection;
-
private TestTelephonyConnection mConferenceHost;
@Before
@@ -66,11 +67,122 @@
}
mConferenceHost = new TestTelephonyConnection();
mConferenceHost.setManageImsConferenceCallSupported(true);
+ when(mMockTelecomAccountRegistry.getAddress(any(PhoneAccountHandle.class)))
+ .thenReturn(null);
}
@Test
@SmallTest
public void testSinglePartyEmulation() {
+ when(mMockTelecomAccountRegistry.isUsingSimCallManager(any(PhoneAccountHandle.class)))
+ .thenReturn(false);
+
+ ImsConference imsConference = new ImsConference(mMockTelecomAccountRegistry,
+ mMockTelephonyConnectionServiceProxy, mConferenceHost,
+ null /* phoneAccountHandle */, () -> true /* featureFlagProxy */);
+
+ ConferenceParticipant participant1 = new ConferenceParticipant(
+ Uri.parse("tel:6505551212"),
+ "A",
+ Uri.parse("sip:6505551212@testims.com"),
+ Connection.STATE_ACTIVE);
+ ConferenceParticipant participant2 = new ConferenceParticipant(
+ Uri.parse("tel:6505551213"),
+ "A",
+ Uri.parse("sip:6505551213@testims.com"),
+ Connection.STATE_ACTIVE);
+ imsConference.handleConferenceParticipantsUpdate(mConferenceHost,
+ Arrays.asList(participant1, participant2));
+ assertEquals(2, imsConference.getNumberOfParticipants());
+ verify(mMockTelephonyConnectionServiceProxy, times(2)).addExistingConnection(
+ any(PhoneAccountHandle.class), any(Connection.class),
+ eq(imsConference));
+
+ // Because we're pretending its a single party, there should be no participants any more.
+ imsConference.handleConferenceParticipantsUpdate(mConferenceHost,
+ Arrays.asList(participant1));
+ assertEquals(0, imsConference.getNumberOfParticipants());
+ verify(mMockTelephonyConnectionServiceProxy, times(2)).removeConnection(
+ any(Connection.class));
+ reset(mMockTelephonyConnectionServiceProxy);
+
+ // Back to 2!
+ imsConference.handleConferenceParticipantsUpdate(mConferenceHost,
+ Arrays.asList(participant1, participant2));
+ assertEquals(2, imsConference.getNumberOfParticipants());
+ verify(mMockTelephonyConnectionServiceProxy, times(2)).addExistingConnection(
+ any(PhoneAccountHandle.class), any(Connection.class),
+ eq(imsConference));
+ }
+
+ /**
+ * We have seen a scenario on a carrier where a conference event package comes in just prior to
+ * the call disconnecting with only the conference host in it. This caused a problem because
+ * it triggered exiting single party conference mode (due to a bug) and caused the call to not
+ * be logged.
+ */
+ @Test
+ @SmallTest
+ public void testSinglePartyEmulationWithPreDisconnectParticipantUpdate() {
+ when(mMockTelecomAccountRegistry.isUsingSimCallManager(any(PhoneAccountHandle.class)))
+ .thenReturn(false);
+
+ ImsConference imsConference = new ImsConference(mMockTelecomAccountRegistry,
+ mMockTelephonyConnectionServiceProxy, mConferenceHost,
+ null /* phoneAccountHandle */, () -> true /* featureFlagProxy */);
+
+ final boolean[] isConferenceState = new boolean[1];
+ Conference.Listener conferenceListener = new Conference.Listener() {
+ @Override
+ public void onConferenceStateChanged(Conference c, boolean isConference) {
+ super.onConferenceStateChanged(c, isConference);
+ isConferenceState[0] = isConference;
+ }
+ };
+ imsConference.addListener(conferenceListener);
+
+ ConferenceParticipant participant1 = new ConferenceParticipant(
+ Uri.parse("tel:6505551212"),
+ "A",
+ Uri.parse("sip:6505551212@testims.com"),
+ Connection.STATE_ACTIVE);
+ ConferenceParticipant participant2 = new ConferenceParticipant(
+ Uri.parse("tel:6505551213"),
+ "A",
+ Uri.parse("sip:6505551213@testims.com"),
+ Connection.STATE_ACTIVE);
+ imsConference.handleConferenceParticipantsUpdate(mConferenceHost,
+ Arrays.asList(participant1, participant2));
+ assertEquals(2, imsConference.getNumberOfParticipants());
+ verify(mMockTelephonyConnectionServiceProxy, times(2)).addExistingConnection(
+ any(PhoneAccountHandle.class), any(Connection.class),
+ eq(imsConference));
+
+ // Because we're pretending its a single party, there should be only a single participant.
+ imsConference.handleConferenceParticipantsUpdate(mConferenceHost,
+ Arrays.asList(participant1));
+ assertEquals(0, imsConference.getNumberOfParticipants());
+ verify(mMockTelephonyConnectionServiceProxy, times(2)).removeConnection(
+ any(Connection.class));
+
+ // Emulate a pre-disconnect conference event package; there will be zero participants.
+ imsConference.handleConferenceParticipantsUpdate(mConferenceHost,
+ Arrays.asList());
+
+ // We should still not be considered a conference (hence we should be logging this call).
+ assertFalse(isConferenceState[0]);
+ }
+
+ /**
+ * Verify that we do not use single party emulation when a sim call manager is in use.
+ */
+ @Test
+ @SmallTest
+ public void testNoSinglePartyEmulationWithSimCallManager() {
+ // Make it look like there is a sim call manager in use.
+ when(mMockTelecomAccountRegistry.isUsingSimCallManager(
+ any(PhoneAccountHandle.class))).thenReturn(true);
+
ImsConference imsConference = new ImsConference(mMockTelecomAccountRegistry,
mMockTelephonyConnectionServiceProxy, mConferenceHost,
null /* phoneAccountHandle */, () -> true /* featureFlagProxy */);
@@ -89,10 +201,10 @@
Arrays.asList(participant1, participant2));
assertEquals(2, imsConference.getNumberOfParticipants());
- // Because we're pretending its a single party, there should be no participants any more.
+ // Because we're not using single party emulation, should still be one participant.
imsConference.handleConferenceParticipantsUpdate(mConferenceHost,
Arrays.asList(participant1));
- assertEquals(0, imsConference.getNumberOfParticipants());
+ assertEquals(1, imsConference.getNumberOfParticipants());
// Back to 2!
imsConference.handleConferenceParticipantsUpdate(mConferenceHost,
@@ -103,6 +215,9 @@
@Test
@SmallTest
public void testNormalConference() {
+ when(mMockTelecomAccountRegistry.isUsingSimCallManager(any(PhoneAccountHandle.class)))
+ .thenReturn(false);
+
ImsConference imsConference = new ImsConference(mMockTelecomAccountRegistry,
mMockTelephonyConnectionServiceProxy, mConferenceHost,
null /* phoneAccountHandle */, () -> false /* featureFlagProxy */);
diff --git a/tests/src/com/android/services/telephony/TestTelephonyConnection.java b/tests/src/com/android/services/telephony/TestTelephonyConnection.java
index c064ef6..b6e4bf3 100644
--- a/tests/src/com/android/services/telephony/TestTelephonyConnection.java
+++ b/tests/src/com/android/services/telephony/TestTelephonyConnection.java
@@ -82,9 +82,11 @@
any(Connection.PostDialListener.class));
when(mMockPhone.getRingingCall()).thenReturn(mMockCall);
when(mMockPhone.getContext()).thenReturn(mMockContext);
+ when(mMockPhone.getCurrentSubscriberUris()).thenReturn(null);
when(mMockContext.getResources()).thenReturn(mMockResources);
when(mMockResources.getBoolean(anyInt())).thenReturn(false);
when(mMockPhone.getDefaultPhone()).thenReturn(mMockPhone);
+ when(mMockPhone.getPhoneType()).thenReturn(PhoneConstants.PHONE_TYPE_IMS);
when(mMockCall.getState()).thenReturn(Call.State.ACTIVE);
when(mMockCall.getPhone()).thenReturn(mMockPhone);
}