[automerger skipped] [automerged blank] Import translations. DO NOT MERGE ANYWHERE 2p: 2e6e6a9193 am: f3f7440d11 -s ours
am skip reason: subject contains skip directive
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/services/Telephony/+/16478304
Change-Id: I228158dc9ecfd97f37800ef36e54c33743c4e400
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index fbc1a74..261506d 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -196,7 +196,7 @@
<string name="network_connecting" msgid="160901383582774987">"Povezivanje…"</string>
<string name="network_could_not_connect" msgid="6547460848093727998">"Povezivanje nije uspjelo"</string>
<string-array name="preferred_network_mode_choices">
- <item msgid="4531933377509551889">"Preferiraj GSM/WCDMA"</item>
+ <item msgid="4531933377509551889">"Preferira se GSM/WCDMA"</item>
<item msgid="5120532750027435355">"Samo GSM"</item>
<item msgid="8973311380798000102">"Samo WCDMA"</item>
<item msgid="4139961027147085705">"Automatski GSM/WCDMA"</item>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 424b36a..98e780b 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -113,17 +113,17 @@
<string name="messageCFB" msgid="1958017270393563388">"Nummer indien in gesprek"</string>
<string name="sum_cfb_enabled" msgid="332037613072049492">"Doorschakelen naar <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfb_disabled" msgid="3589913334164866035">"Uit"</string>
- <string name="disable_cfb_forbidden" msgid="4831494744351633961">"Je provider biedt geen ondersteuning voor het uitschakelen van oproepdoorschakelingen wanneer je telefoon bezet is."</string>
+ <string name="disable_cfb_forbidden" msgid="4831494744351633961">"Je provider biedt geen ondersteuning voor het uitzetten van oproepdoorschakelingen wanneer je telefoon bezet is."</string>
<string name="labelCFNRy" msgid="3403533792248457946">"Indien niet opgenomen"</string>
<string name="messageCFNRy" msgid="7644434155765359009">"Nummer indien onbeantwoord"</string>
<string name="sum_cfnry_enabled" msgid="3000500837493854799">"Doorschakelen naar <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfnry_disabled" msgid="1990563512406017880">"Uit"</string>
- <string name="disable_cfnry_forbidden" msgid="3174731413216550689">"Je provider biedt geen ondersteuning voor het uitschakelen van oproepdoorschakelingen wanneer je telefoon niet wordt opgenomen."</string>
+ <string name="disable_cfnry_forbidden" msgid="3174731413216550689">"Je provider biedt geen ondersteuning voor het uitzetten van oproepdoorschakelingen wanneer je telefoon niet wordt opgenomen."</string>
<string name="labelCFNRc" msgid="4163399350778066013">"Indien geen bereik"</string>
<string name="messageCFNRc" msgid="6980340731313007250">"Nummer indien onbereikbaar"</string>
<string name="sum_cfnrc_enabled" msgid="1799069234006073477">"Doorschakelen naar <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfnrc_disabled" msgid="739289696796917683">"Uit"</string>
- <string name="disable_cfnrc_forbidden" msgid="775348748084726890">"Je provider biedt geen ondersteuning voor het uitschakelen van oproepdoorschakelingen wanneer je telefoon niet bereikbaar is."</string>
+ <string name="disable_cfnrc_forbidden" msgid="775348748084726890">"Je provider biedt geen ondersteuning voor het uitzetten van oproepdoorschakelingen wanneer je telefoon niet bereikbaar is."</string>
<string name="registration_cf_forbidden" msgid="4386482610771190420">"Je provider ondersteunt het doorschakelen van gesprekken niet."</string>
<string name="cdma_call_waiting" msgid="4565070960879673216">"Wisselgesprek aanzetten?"</string>
<string name="enable_cdma_call_waiting_setting" msgid="5906811747921744307">"Tijdens een gesprek krijg je een melding over inkomende gesprekken"</string>
@@ -144,7 +144,7 @@
<string name="stk_cc_ss_to_ussd_error" msgid="8330749347425752192">"SS-verzoek gewijzigd in USSD-verzoek"</string>
<string name="stk_cc_ss_to_ss_error" msgid="8297155544652134278">"Gewijzigd in nieuw SS-verzoek"</string>
<string name="stk_cc_ss_to_dial_video_error" msgid="4255261231466032505">"SS-verzoek gewijzigd in videogesprek"</string>
- <string name="fdn_check_failure" msgid="1833769746374185247">"De instelling \'Vaste nummers\' in je app Telefoon is ingeschakeld. Hierdoor werken sommige oproepgerelateerde functies niet."</string>
+ <string name="fdn_check_failure" msgid="1833769746374185247">"De instelling \'Vaste nummers\' in je app Telefoon staat aan. Hierdoor werken sommige oproepgerelateerde functies niet."</string>
<string name="radio_off_error" msgid="8321564164914232181">"Schakel de radio in voordat je deze instellingen bekijkt."</string>
<string name="close_dialog" msgid="1074977476136119408">"OK"</string>
<string name="enable" msgid="2636552299455477603">"Aanzetten"</string>
@@ -153,7 +153,7 @@
<string-array name="clir_display_values">
<item msgid="8477364191403806960">"Netwerkstandaard"</item>
<item msgid="6813323051965618926">"Nummer verbergen"</item>
- <item msgid="9150034130629852635">"Nummer weergeven"</item>
+ <item msgid="9150034130629852635">"Nummer tonen"</item>
</string-array>
<string name="vm_changed" msgid="4739599044379692505">"Voicemailnummer gewijzigd."</string>
<string name="vm_change_failed" msgid="7877733929455763566">"Kan het voicemailnummer niet wijzigen.\nNeem contact op met je provider als dit probleem zich blijft voordoen."</string>
@@ -284,10 +284,10 @@
<string name="roaming" msgid="1576180772877858949">"Roaming"</string>
<string name="roaming_enable" msgid="6853685214521494819">"Verbinding maken met dataservices tijdens roaming"</string>
<string name="roaming_disable" msgid="8856224638624592681">"Verbinding maken met dataservices tijdens roaming"</string>
- <string name="roaming_reenable_message" msgid="1951802463885727915">"Dataroaming is uitgeschakeld. Tik om in te schakelen."</string>
+ <string name="roaming_reenable_message" msgid="1951802463885727915">"Dataroaming staat uit. Tik om in te schakelen."</string>
<string name="roaming_enabled_message" msgid="9022249120750897">"Er kunnen kosten voor roaming in rekening worden gebracht. Tik om te wijzigen."</string>
<string name="roaming_notification_title" msgid="3590348480688047320">"Mobiele internetverbinding is verbroken"</string>
- <string name="roaming_on_notification_title" msgid="7451473196411559173">"Dataroaming is ingeschakeld"</string>
+ <string name="roaming_on_notification_title" msgid="7451473196411559173">"Dataroaming staat aan"</string>
<string name="roaming_warning" msgid="7855681468067171971">"Er kunnen hoge roamingkosten in rekening worden gebracht."</string>
<string name="roaming_check_price_warning" msgid="8212484083990570215">"Neem contact op met je netwerkprovider over de prijzen."</string>
<string name="roaming_alert_title" msgid="5689615818220960940">"Dataroaming toestaan?"</string>
@@ -305,7 +305,7 @@
<string name="carrier_settings_euicc_summary" msgid="2027941166597330117">"<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="7228249980933944101">"Mobiele data"</string>
<string name="mobile_data_settings_summary" msgid="5012570152029118471">"Datatoegang via mobiel netwerk"</string>
- <string name="data_usage_disable_mobile" msgid="5669109209055988308">"Mobiele data uitschakelen?"</string>
+ <string name="data_usage_disable_mobile" msgid="5669109209055988308">"Mobiele data uitzetten?"</string>
<string name="sim_selection_required_pref" msgid="6985901872978341314">"Selectie vereist"</string>
<string name="sim_change_data_title" msgid="9142726786345906606">"Sim voor gegevens wijzigen?"</string>
<string name="sim_change_data_message" msgid="3567358694255933280">"<xliff:g id="NEW_SIM">%1$s</xliff:g> in plaats van <xliff:g id="OLD_SIM">%2$s</xliff:g> gebruiken voor mobiele data?"</string>
@@ -441,12 +441,12 @@
<string name="manage_fdn_list" msgid="3341716430375195441">"FDN-lijst"</string>
<string name="fdn_list_with_label" msgid="1409655283510382556">"FDN-lijst (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
<string name="fdn_activation" msgid="2178637004710435895">"FDN-activering"</string>
- <string name="fdn_enabled" msgid="7017355494808056447">"Vaste nummers zijn ingeschakeld"</string>
+ <string name="fdn_enabled" msgid="7017355494808056447">"Vaste nummers staan aan"</string>
<string name="fdn_disabled" msgid="6696468878037736600">"Vaste nummers zijn uitgeschakeld"</string>
<string name="enable_fdn" msgid="4830555730418033723">"FDN aanzetten"</string>
- <string name="disable_fdn" msgid="3918794950264647541">"FDN uitschakelen"</string>
+ <string name="disable_fdn" msgid="3918794950264647541">"FDN uitzetten"</string>
<string name="change_pin2" msgid="3110844547237754871">"PIN2-code wijzigen"</string>
- <string name="enable_fdn_ok" msgid="5080925177369329827">"FDN uitschakelen"</string>
+ <string name="enable_fdn_ok" msgid="5080925177369329827">"FDN uitzetten"</string>
<string name="disable_fdn_ok" msgid="3745475926874838676">"FDN aanzetten"</string>
<string name="sum_fdn" msgid="6152246141642323582">"Vaste nummers beheren"</string>
<string name="sum_fdn_change_pin" msgid="3510994280557335727">"Pincode voor FDN-toegang wijzigen"</string>
@@ -483,7 +483,7 @@
<string name="simContacts_empty" msgid="1135632055473689521">"Geen contacten op je simkaart."</string>
<string name="simContacts_title" msgid="2714029230160136647">"Contacten selecteren om te importeren"</string>
<string name="simContacts_airplaneMode" msgid="4654884030631503808">"Schakel de vliegtuigmodus uit om contacten van de simkaart te importeren."</string>
- <string name="enable_pin" msgid="967674051730845376">"SIM pincode in-/uitschakelen"</string>
+ <string name="enable_pin" msgid="967674051730845376">"SIM pincode aan-/uitzetten"</string>
<string name="change_pin" msgid="3657869530942905790">"Pincode simkaart wijzigen"</string>
<string name="enter_pin_text" msgid="3182311451978663356">"Pincode simkaart:"</string>
<string name="oldPinLabel" msgid="8618515202411987721">"Oude pincode"</string>
@@ -666,7 +666,7 @@
<string name="selectContact" msgid="1527612842599767382">"contact selecteren"</string>
<string name="not_voice_capable" msgid="2819996734252084253">"Audiogesprekken worden niet ondersteund"</string>
<string name="description_dial_button" msgid="8614631902795087259">"bellen"</string>
- <string name="description_dialpad_button" msgid="7395114120463883623">"toetsenblok weergeven"</string>
+ <string name="description_dialpad_button" msgid="7395114120463883623">"toetsenblok tonen"</string>
<string name="pane_title_emergency_dialpad" msgid="3627372514638694401">"Noodtoetsenblok"</string>
<string name="voicemail_visual_voicemail_switch_title" msgid="6610414098912832120">"Visuele voicemail"</string>
<string name="voicemail_set_pin_dialog_title" msgid="7005128605986960003">"Pincode instellen"</string>
@@ -705,8 +705,8 @@
<string name="change_pin_confirm_pins_dont_match" msgid="305164501222587215">"Pincodes komen niet overeen"</string>
<string name="change_pin_succeeded" msgid="2504705600693014403">"Voicemailpincode geüpdatet"</string>
<string name="change_pin_system_error" msgid="7772788809875146873">"Kan pincode niet instellen"</string>
- <string name="mobile_data_status_roaming_turned_off_subtext" msgid="6840673347416227054">"Dataroaming is uitgeschakeld"</string>
- <string name="mobile_data_status_roaming_turned_on_subtext" msgid="5615757897768777865">"Dataroaming is ingeschakeld"</string>
+ <string name="mobile_data_status_roaming_turned_off_subtext" msgid="6840673347416227054">"Dataroaming staat uit"</string>
+ <string name="mobile_data_status_roaming_turned_on_subtext" msgid="5615757897768777865">"Dataroaming staat aan"</string>
<string name="mobile_data_status_roaming_without_plan_subtext" msgid="6536671968072284677">"Momenteel aan het roamen, data-abonnement nodig"</string>
<string name="mobile_data_status_roaming_with_plan_subtext" msgid="2576177169108123095">"Momenteel aan het roamen, data-abonnement is actief"</string>
<string name="mobile_data_status_no_plan_subtext" msgid="170331026419263657">"Geen mobiele data meer"</string>
@@ -826,7 +826,7 @@
<string name="callFailed_otasp_provisioning_in_process" msgid="3345666183602879326">"Kan geen gesprek plaatsen omdat het apparaat momenteel wordt geregistreerd."</string>
<string name="callFailed_already_dialing" msgid="7250591188960691086">"Kan gesprek niet plaatsen omdat er al een uitgaand gesprek is gestart."</string>
<string name="callFailed_already_ringing" msgid="2376603543544289303">"Kan gesprek niet plaatsen omdat er een niet-beantwoord inkomend gesprek is. Beantwoord of weiger het inkomende gesprek voordat je een nieuw gesprek plaatst."</string>
- <string name="callFailed_calling_disabled" msgid="5010992739401206283">"Kan gesprek niet plaatsen omdat bellen is uitgeschakeld via de systeemeigenschap ro.telephony.disable-call."</string>
+ <string name="callFailed_calling_disabled" msgid="5010992739401206283">"Kan gesprek niet plaatsen omdat bellen is uitgezet via de systeemeigenschap ro.telephony.disable-call."</string>
<string name="callFailed_too_many_calls" msgid="5379426826618582180">"Kan gesprek niet plaatsen omdat er al twee actieve gesprekken zijn. Verbreek de verbinding in een van de gesprekken of voeg ze samen tot een conferencecall voordat je een nieuw gesprek plaatst."</string>
<string name="supp_service_over_ut_precautions" msgid="2145018231396701311">"Als je <xliff:g id="SUPP_SERVICE">%s</xliff:g> wilt gebruiken, zorg je dat je mobiele data hebt ingeschakeld. Je kunt dit wijzigen via de mobiele netwerkinstellingen."</string>
<string name="supp_service_over_ut_precautions_roaming" msgid="670342104569972327">"Als je <xliff:g id="SUPP_SERVICE">%s</xliff:g> wilt gebruiken, zorg je dat je mobiele data en dataroaming hebt ingeschakeld. Je kunt dit wijzigen via de mobiele netwerkinstellingen."</string>
@@ -834,7 +834,7 @@
<string name="supp_service_over_ut_precautions_roaming_dual_sim" msgid="6627654855191817965">"Als je <xliff:g id="SUPP_SERVICE">%1$s</xliff:g> wilt gebruiken, zorg je dat je mobiele data en dataroaming hebt ingeschakeld voor sim <xliff:g id="SIM_NUMBER">%2$d</xliff:g>. Je kunt dit wijzigen via de mobiele netwerkinstellingen."</string>
<string name="supp_service_over_ut_precautions_dialog_dismiss" msgid="5934541487903081652">"Sluiten"</string>
<string name="radio_info_data_connection_enable" msgid="6183729739783252840">"Dataverbinding aanzetten"</string>
- <string name="radio_info_data_connection_disable" msgid="6404751291511368706">"Dataverbinding uitschakelen"</string>
+ <string name="radio_info_data_connection_disable" msgid="6404751291511368706">"Dataverbinding uitzetten"</string>
<string name="volte_provisioned_switch_string" msgid="4812874990480336178">"VoLTE-registratie"</string>
<string name="vt_provisioned_switch_string" msgid="8295542122512195979">"Videogesprekken geregistreerd"</string>
<string name="wfc_provisioned_switch_string" msgid="3835004640321078988">"Wifi-gesprekken geregistreerd"</string>
@@ -908,7 +908,7 @@
<string name="radio_info_smsc_label" msgid="3749927072726033763">"SMSC:"</string>
<string name="radio_info_smsc_update_label" msgid="5141996256097115753">"Updaten"</string>
<string name="radio_info_smsc_refresh_label" msgid="8409923721451604560">"Vernieuwen"</string>
- <string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS-controle in-/uitschakelen"</string>
+ <string name="radio_info_toggle_dns_check_label" msgid="1394078554927787350">"DNS-controle aan-/uitzetten"</string>
<string name="oem_radio_info_label" msgid="2914167475119997456">"OEM-specifieke gegevens/instellingen"</string>
<string name="radio_info_endc_available" msgid="4410653375290113436">"EN-DC beschikbaar:"</string>
<string name="radio_info_dcnr_restricted" msgid="2469125498066960807">"DCNR beperkt:"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 5c79ff8..e4883ef 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -273,7 +273,7 @@
<string name="network_operator_category" msgid="4992217193732304680">"ਨੈੱਟਵਰਕ"</string>
<string name="enhanced_4g_lte_mode_title" msgid="4213420368777080540">"ਵਿਸਤ੍ਰਿਤ 4G LTE ਮੋਡ"</string>
<!-- no translation found for enhanced_4g_lte_mode_title_variant:0 (7240155150166394308) -->
- <string name="enhanced_4g_lte_mode_summary" msgid="7725708511804143638">"ਵੌਇਸ ਅਤੇ ਹੋਰ ਸੰਚਾਰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ LTE ਸੇਵਾਵਾਂ ਵਰਤੋ ( ਸਿਫ਼ਾਰਸ਼ ਕੀਤਾ)"</string>
+ <string name="enhanced_4g_lte_mode_summary" msgid="7725708511804143638">"ਅਵਾਜ਼ੀ ਕਾਲਾਂ ਅਤੇ ਹੋਰ ਸੰਚਾਰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ LTE ਸੇਵਾਵਾਂ ਵਰਤੋ (ਸਿਫ਼ਾਰਸ਼ੀ)"</string>
<string name="enhanced_4g_lte_mode_summary_o2" msgid="2521108446409016542">"ਅਵਾਜ਼ ਅਤੇ ਹੋਰ ਸੰਚਾਰਾਂ (ਸਿਫ਼ਾਰਸ਼ ਕੀਤੇ) ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ 4G ਸੇਵਾਵਾਂ ਵਰਤੋ"</string>
<!-- no translation found for enhanced_4g_lte_mode_sumary_variant:0 (2943982616649705147) -->
<!-- no translation found for enhanced_4g_lte_mode_sumary_variant:1 (5262249464504131443) -->
@@ -595,7 +595,7 @@
<string name="hac_mode_title" msgid="4127986689621125468">"ਸੁਣਨ ਲਈ ਸਹਾਇਕ ਸਾਧਨ"</string>
<string name="hac_mode_summary" msgid="7774989500136009881">"ਸੁਣਨ ਲਈ ਸਹਾਇਕ ਸਾਧਨ ਅਨੁਕੂਲਤਾ ਚਾਲੂ ਕਰੋ"</string>
<string name="rtt_mode_title" msgid="3075948111362818043">"ਨਾਲ-ਦੀ-ਨਾਲ ਦਿਸਦੀ ਲਿਖਤ (RTT) ਵਾਲੀ ਕਾਲ"</string>
- <string name="rtt_mode_summary" msgid="8631541375609989562">"ਕਿਸੇ ਵੌਇਸ ਕਾਲ ਦੌਰਾਨ ਸੁਨੇਹਾ ਭੇਜਣ ਦਿਓ"</string>
+ <string name="rtt_mode_summary" msgid="8631541375609989562">"ਕਿਸੇ ਅਵਾਜ਼ੀ ਕਾਲ ਦੌਰਾਨ ਸੁਨੇਹਾ ਭੇਜਣ ਦਿਓ"</string>
<string name="rtt_mode_more_information" msgid="587500128658756318">"RTT ਅਜਿਹੇ ਕਾਲ ਕਰਨ ਵਾਲੇ ਲੋਕਾਂ ਦੀ ਸਹਾਇਤਾ ਕਰਦਾ ਹੈ ਜੋ ਬੋਲੇ, ਘੱਟ ਸੁਣਨ ਵਾਲੇ, ਬੋਲਣ ਵਿੱਚ ਅਸਮਰਥ ਜਾਂ ਜਿਨ੍ਹਾਂ ਲਈ ਸਿਰਫ਼ ਅਵਾਜ਼ ਕਾਫ਼ੀ ਨਹੀਂ ਹੁੰਦੀ।<br> <a href=<xliff:g id="URL">http://support.google.com/mobile?p=telephony_rtt</xliff:g>>ਹੋਰ ਜਾਣੋ</a>\n <br><br> - RTT ਕਾਲਾਂ ਨੂੰ ਇੱਕ ਪ੍ਰਤਿਲਿਪੀ ਸੁਨੇਹੇ ਵਜੋਂ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ\n <br> - RTT ਵੀਡੀਓ ਕਾਲਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
<string name="no_rtt_when_roaming" msgid="5268008247378355389">"ਨੋਟ ਕਥਨ:ਵੇਲੇ RTT ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
<string-array name="tty_mode_entries">
@@ -664,7 +664,7 @@
<string name="contactPhoto" msgid="7885089213135154834">"ਸੰਪਰਕ ਫ਼ੋਟੋ"</string>
<string name="goPrivate" msgid="4645108311382209551">"ਨਿੱਜੀ ਜਾਓ"</string>
<string name="selectContact" msgid="1527612842599767382">"ਸੰਪਰਕ ਚੁਣੋ"</string>
- <string name="not_voice_capable" msgid="2819996734252084253">"ਵੌਇਸ ਕਾਲਿੰਗ ਸਮਰਥਿਤ ਨਹੀਂ"</string>
+ <string name="not_voice_capable" msgid="2819996734252084253">"ਅਵਾਜ਼ੀ ਕਾਲਿੰਗ ਸਮਰਥਿਤ ਨਹੀਂ"</string>
<string name="description_dial_button" msgid="8614631902795087259">"ਡਾਇਲ ਕਰੋ"</string>
<string name="description_dialpad_button" msgid="7395114120463883623">"ਡਾਇਲਪੈਡ ਦਿਖਾਓ"</string>
<string name="pane_title_emergency_dialpad" msgid="3627372514638694401">"ਸੰਕਟਕਾਲੀਨ ਡਾਇਲਪੈਡ"</string>
@@ -855,7 +855,7 @@
<string name="radio_info_ims_reg_status_not_registered" msgid="8045821447288876085">"ਰਜਿਸਟਰ ਨਹੀਂ ਕੀਤੀ ਗਈ"</string>
<string name="radio_info_ims_feature_status_available" msgid="6493200914756969292">"ਉਪਲਬਧ"</string>
<string name="radio_info_ims_feature_status_unavailable" msgid="8930391136839759778">"ਅਣਉਪਲਬਧ"</string>
- <string name="radio_info_ims_reg_status" msgid="25582845222446390">"IMS ਰਜਿਸਟਰੇਸ਼ਨ: <xliff:g id="STATUS">%1$s</xliff:g>\nLTE \'ਤੇ ਵੌਇਸ: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nਵਾਈ-ਫਾਈ \'ਤੇ ਵੌਇਸ: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nਵੀਡੀਓ ਕਾਲਿੰਗ: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nUT ਇੰਟਰਫੇਸ: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
+ <string name="radio_info_ims_reg_status" msgid="25582845222446390">"IMS ਰਜਿਸਟਰੇਸ਼ਨ: <xliff:g id="STATUS">%1$s</xliff:g>\nLTE \'ਤੇ ਅਵਾਜ਼: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nਵਾਈ-ਫਾਈ \'ਤੇ ਅਵਾਜ਼ੀ ਕਾਲ: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\nਵੀਡੀਓ ਕਾਲਿੰਗ: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nUT ਇੰਟਰਫੇਸ: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
<string name="radioInfo_service_in" msgid="45753418231446400">"ਸੇਵਾ ਵਿੱਚ"</string>
<string name="radioInfo_service_out" msgid="287972405416142312">"ਸੇਵਾ ਵਿੱਚ ਨਹੀਂ"</string>
<string name="radioInfo_service_emergency" msgid="4763879891415016848">"ਸਿਰਫ਼ ਸੰਕਟਕਾਲੀਨ ਕਾਲਾਂ"</string>
@@ -892,12 +892,12 @@
<string name="radio_info_ppp_received_label" msgid="5753592451640644889">"ਡਾਟਾ ਪ੍ਰਾਪਤ ਹੋਇਆ:"</string>
<string name="radio_info_gsm_service_label" msgid="6443348321714241328">"ਵੌਇਸ ਸੇਵਾ:"</string>
<string name="radio_info_signal_strength_label" msgid="5545444702102543260">"ਸਿਗਨਲ ਦੀ ਤੀਬਰਤਾ:"</string>
- <string name="radio_info_call_status_label" msgid="7693575431923095487">"ਵੌਇਸ ਕਾਲ ਸਥਿਤੀ:"</string>
+ <string name="radio_info_call_status_label" msgid="7693575431923095487">"ਅਵਾਜ਼ੀ ਕਾਲ ਸਥਿਤੀ:"</string>
<string name="radio_info_ppp_sent_label" msgid="6542208429356199695">"ਡਾਟਾ ਭੇਜਿਆ ਗਿਆ:"</string>
<string name="radio_info_message_waiting_label" msgid="1886549432566952078">"ਸੁਨੇਹੇ ਦੀ ਉਡੀਕ:"</string>
<string name="radio_info_phone_number_label" msgid="2533852539562512203">"ਫ਼ੋਨ ਨੰਬਰ:"</string>
<string name="radio_info_band_mode_label" msgid="23480556225515290">"ਰੇਡੀਓ ਬੈਂਡ ਚੁਣੋ"</string>
- <string name="radio_info_voice_network_type_label" msgid="2395347336419593265">"ਵੌਇਸ ਨੈੱਟਵਰਕ ਕਿਸਮ:"</string>
+ <string name="radio_info_voice_network_type_label" msgid="2395347336419593265">"ਅਵਾਜ਼ੀ ਨੈੱਟਵਰਕ ਦੀ ਕਿਸਮ:"</string>
<string name="radio_info_data_network_type_label" msgid="8886597029237501929">"ਡਾਟਾ ਨੈੱਟਵਰਕ ਕਿਸਮ:"</string>
<string name="phone_index_label" msgid="6222406512768964268">"ਫ਼ੋਨ ਕ੍ਰਮ-ਸੂਚੀ ਚੁਣੋ"</string>
<string name="radio_info_set_perferred_label" msgid="7408131389363136210">"ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਕਿਸਮ ਸੈੱਟ ਕਰੋ:"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index ceb9082..006693b 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -278,7 +278,7 @@
<!-- no translation found for enhanced_4g_lte_mode_sumary_variant:0 (2943982616649705147) -->
<!-- no translation found for enhanced_4g_lte_mode_sumary_variant:1 (5262249464504131443) -->
<!-- no translation found for enhanced_4g_lte_mode_sumary_variant:2 (6356974241850241718) -->
- <string name="data_enabled" msgid="22525832097434368">"Włączone przesyłanie danych"</string>
+ <string name="data_enabled" msgid="22525832097434368">"Przesyłanie danych włączone"</string>
<string name="data_enable_summary" msgid="696860063456536557">"Zezwalaj na użycie danych"</string>
<string name="dialog_alert_title" msgid="5260471806940268478">"Uwaga"</string>
<string name="roaming" msgid="1576180772877858949">"Roaming"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 3665df7..e2b0566 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -393,9 +393,9 @@
<string name="enable_disable_retail_directory" msgid="9095153426757081972">"రీటైల్ డైరెక్టరీ"</string>
<string name="retail_directory_enable" msgid="2532176568755452171">"రీటైల్ డైరెక్టరీ ప్రారంభించబడింది"</string>
<string name="retail_directory_disable" msgid="7242451210736299193">"రీటైల్ డైరెక్టరీ నిలిపివేయబడింది"</string>
- <string name="enable_disable_advertisements" msgid="8704125663718797151">"బిజినెస్ ప్రకటనలు"</string>
- <string name="advertisements_enable" msgid="8651409664217899145">"బిజినెస్ ప్రకటనలు ప్రారంభించబడ్డాయి"</string>
- <string name="advertisements_disable" msgid="2999957360508271492">"బిజినెస్ ప్రకటనలు నిలిపివేయబడ్డాయి"</string>
+ <string name="enable_disable_advertisements" msgid="8704125663718797151">"అడ్వర్టయిజ్మెంట్లు"</string>
+ <string name="advertisements_enable" msgid="8651409664217899145">"అడ్వర్టయిజ్మెంట్లు ఎనేబుల్ చేయబడ్డాయి"</string>
+ <string name="advertisements_disable" msgid="2999957360508271492">"అడ్వర్టయిజ్మెంట్లు డిజేబుల్ చేయబడ్డాయి"</string>
<string name="enable_disable_stock_quotes" msgid="631498357725951825">"స్టాక్ కోట్లు"</string>
<string name="stock_quotes_enable" msgid="5104318195579771947">"స్టాక్ కోట్లు ప్రారంభించబడ్డాయి"</string>
<string name="stock_quotes_disable" msgid="3126423481704498278">"స్టాక్ కోట్లు నిలిపివేయబడ్డాయి"</string>
diff --git a/src/com/android/phone/CallForwardEditPreference.java b/src/com/android/phone/CallForwardEditPreference.java
index bf296f9..45121f7 100644
--- a/src/com/android/phone/CallForwardEditPreference.java
+++ b/src/com/android/phone/CallForwardEditPreference.java
@@ -58,6 +58,7 @@
CarrierXmlParser.SsEntry.SSAction.UNKNOWN;
private int mAction;
private HashMap<String, String> mCfInfo;
+ private long mDelayMillisAfterUssdSet = 1000;
public CallForwardEditPreference(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -488,8 +489,9 @@
mPhone.getCallForwardingOption(reason, mServiceClass,
obtainMessage(MESSAGE_GET_CF, msg.arg1, MESSAGE_SET_CF, ar.exception));
} else {
- mHandler.sendMessage(mHandler.obtainMessage(mHandler.MESSAGE_GET_CF_USSD,
- msg.arg1, MyHandler.MESSAGE_SET_CF, ar.exception));
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(mHandler.MESSAGE_GET_CF_USSD,
+ msg.arg1, MyHandler.MESSAGE_SET_CF, ar.exception),
+ mDelayMillisAfterUssdSet);
}
}
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index a463243..45ca974 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -65,6 +65,7 @@
import com.android.internal.telephony.TelephonyPermissions;
import com.android.internal.telephony.util.ArrayUtils;
import com.android.internal.util.IndentingPrintWriter;
+import com.android.telephony.Rlog;
import java.io.File;
import java.io.FileDescriptor;
@@ -1064,6 +1065,7 @@
}
String fileName;
+ String iccid = null;
if (isNoSimConfig) {
fileName = getFilenameForNoSimConfig(packageName);
} else {
@@ -1073,7 +1075,7 @@
return null;
}
- final String iccid = getIccIdForPhoneId(phoneId);
+ iccid = getIccIdForPhoneId(phoneId);
final int cid = getSpecificCarrierIdForPhoneId(phoneId);
if (iccid == null) {
loge("Cannot restore config with null iccid.");
@@ -1102,7 +1104,15 @@
} catch (FileNotFoundException e) {
// Missing file is normal occurrence that might occur with a new sim or when restoring
// an override file during boot and should not be treated as an error.
- if (file != null) logd("File not found: " + file.getPath());
+ if (file != null) {
+ if (isNoSimConfig) {
+ logd("File not found: " + file.getPath());
+ } else {
+ String filePath = file.getPath();
+ filePath = getFilePathForLogging(filePath, iccid);
+ logd("File not found : " + filePath);
+ }
+ }
} catch (IOException e) {
loge(e.toString());
}
@@ -1110,6 +1120,22 @@
return restoredBundle;
}
+ /**
+ * This method will mask most part of iccid in the filepath for logging on userbuild
+ */
+ private String getFilePathForLogging(String filePath, String iccid) {
+ // If loggable then return with actual file path
+ if (Rlog.isLoggable(LOG_TAG, Log.VERBOSE)) {
+ return filePath;
+ }
+ String path = filePath;
+ int length = (iccid != null) ? iccid.length() : 0;
+ if (length > 5 && filePath != null) {
+ path = filePath.replace(iccid.substring(5), "***************");
+ }
+ return path;
+ }
+
private PersistableBundle restoreConfigFromXml(String packageName, @NonNull String extraString,
int phoneId) {
return restoreConfigFromXml(packageName, extraString, phoneId, false);
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 03b0be9..d96c0c5 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -22,6 +22,7 @@
import static com.android.internal.telephony.PhoneConstants.PHONE_TYPE_GSM;
import static com.android.internal.telephony.PhoneConstants.PHONE_TYPE_IMS;
import static com.android.internal.telephony.PhoneConstants.SUBSCRIPTION_KEY;
+import static com.android.internal.telephony.TelephonyStatsLog.RCS_CLIENT_PROVISIONING_STATS__EVENT__CLIENT_PARAMS_SENT;
import android.Manifest;
import android.Manifest.permission;
@@ -180,6 +181,7 @@
import com.android.internal.telephony.ims.ImsResolver;
import com.android.internal.telephony.imsphone.ImsPhone;
import com.android.internal.telephony.imsphone.ImsPhoneCallTracker;
+import com.android.internal.telephony.metrics.RcsStats;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType;
import com.android.internal.telephony.uicc.IccIoResult;
@@ -2055,7 +2057,8 @@
case CMD_PREPARE_UNATTENDED_REBOOT:
request = (MainThreadRequest) msg.obj;
request.result =
- UiccController.getInstance().getPinStorage().prepareUnattendedReboot();
+ UiccController.getInstance().getPinStorage()
+ .prepareUnattendedReboot(request.workSource);
notifyRequester(request);
break;
@@ -5511,11 +5514,9 @@
*/
public int setForbiddenPlmns(int subId, int appType, List<String> fplmns, String callingPackage,
String callingFeatureId) {
- if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(mApp, subId, callingPackage,
- callingFeatureId, "setForbiddenPlmns")) {
- if (DBG) logv("no permissions for setForbiddenplmns");
- throw new IllegalStateException("No Permissions for setForbiddenPlmns");
- }
+ TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+ mApp, subId, "setForbiddenPlmns");
+
if (appType != TelephonyManager.APPTYPE_USIM && appType != TelephonyManager.APPTYPE_SIM) {
loge("setForbiddenPlmnList(): App Type must be USIM or SIM");
throw new IllegalArgumentException("Invalid appType: App Type must be USIM or SIM");
@@ -6921,7 +6922,9 @@
for (int p = packages.size() - 1; p >= 0; p--) {
PackageInfo pkgInfo = packages.get(p);
if (pkgInfo != null && pkgInfo.packageName != null
- && card.getCarrierPrivilegeStatus(pkgInfo)
+ && getCarrierPrivilegeStatusFromCarrierConfigRules(
+ card.getCarrierPrivilegeStatus(pkgInfo),
+ getPhone(phoneId), pkgInfo.packageName)
== TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
privilegedPackages.add(pkgInfo.packageName);
}
@@ -8321,6 +8324,16 @@
int result = (int) sendRequest(CMD_ENABLE_VONR, enabled, subId,
workSource);
if (DBG) log("setVoNrEnabled result: " + result);
+
+ if (result == TelephonyManager.ENABLE_VONR_SUCCESS) {
+ if (DBG) {
+ log("Set VoNR settings in siminfo db; subId=" + subId + ", value:" + enabled);
+ }
+ SubscriptionManager.setSubscriptionProperty(
+ subId, SubscriptionManager.NR_ADVANCED_CALLING_ENABLED,
+ (enabled ? "1" : "0"));
+ }
+
return result;
} finally {
Binder.restoreCallingIdentity(identity);
@@ -10389,6 +10402,9 @@
} else {
configBinder.setRcsClientConfiguration(rcc);
}
+
+ RcsStats.getInstance().onRcsClientProvisioningStats(subId,
+ RCS_CLIENT_PROVISIONING_STATS__EVENT__CLIENT_PARAMS_SENT);
} catch (RemoteException e) {
Rlog.e(LOG_TAG, "fail to setRcsClientConfiguration " + e.getMessage());
throw new ServiceSpecificException(ImsException.CODE_ERROR_SERVICE_UNAVAILABLE,
@@ -10894,11 +10910,12 @@
@Override
@TelephonyManager.PrepareUnattendedRebootResult
public int prepareForUnattendedReboot() {
+ WorkSource workSource = getWorkSource(Binder.getCallingUid());
enforceRebootPermission();
final long identity = Binder.clearCallingIdentity();
try {
- return (int) sendRequest(CMD_PREPARE_UNATTENDED_REBOOT, null);
+ return (int) sendRequest(CMD_PREPARE_UNATTENDED_REBOOT, null, workSource);
} finally {
Binder.restoreCallingIdentity(identity);
}
diff --git a/src/com/android/phone/RcsProvisioningMonitor.java b/src/com/android/phone/RcsProvisioningMonitor.java
index 6d2bd6f..e819afc 100644
--- a/src/com/android/phone/RcsProvisioningMonitor.java
+++ b/src/com/android/phone/RcsProvisioningMonitor.java
@@ -16,6 +16,10 @@
package com.android.phone;
+import static com.android.internal.telephony.TelephonyStatsLog.RCS_ACS_PROVISIONING_STATS__RESPONSE_TYPE__PROVISIONING_XML;
+import static com.android.internal.telephony.TelephonyStatsLog.RCS_CLIENT_PROVISIONING_STATS__EVENT__DMA_CHANGED;
+import static com.android.internal.telephony.TelephonyStatsLog.RCS_CLIENT_PROVISIONING_STATS__EVENT__TRIGGER_RCS_RECONFIGURATION;
+
import android.Manifest;
import android.app.role.OnRoleHoldersChangedListener;
import android.app.role.RoleManager;
@@ -47,6 +51,8 @@
import com.android.ims.FeatureUpdates;
import com.android.ims.RcsFeatureManager;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.metrics.RcsStats;
+import com.android.internal.telephony.metrics.RcsStats.RcsProvisioningCallback;
import com.android.internal.telephony.util.HandlerExecutor;
import com.android.internal.util.CollectionUtils;
import com.android.telephony.Rlog;
@@ -100,6 +106,8 @@
private final RoleManagerAdapter mRoleManager;
private FeatureConnectorFactory<RcsFeatureManager> mFeatureFactory;
+ private RcsStats mRcsStats;
+
private static RcsProvisioningMonitor sInstance;
private final SubscriptionManager.OnSubscriptionsChangedListener mSubChangedListener =
@@ -227,6 +235,10 @@
if (mSingleRegistrationCapability != singleRegistrationCapability) {
mSingleRegistrationCapability = singleRegistrationCapability;
notifyDma();
+
+ // update whether single registration supported.
+ mRcsStats.setEnableSingleRegistration(mSubId,
+ mSingleRegistrationCapability == ProvisioningManager.STATUS_CAPABLE);
}
}
@@ -338,6 +350,9 @@
} else {
notifyRcsAutoConfigurationReceived();
}
+
+ // check callback for metrics if not registered, register callback
+ registerMetricsCallback();
} else {
// clear callbacks if rcs disconnected
clearCallbacks();
@@ -397,6 +412,18 @@
}
}
}
+
+ private void registerMetricsCallback() {
+ RcsProvisioningCallback rcsProvisioningCallback = mRcsStats.getRcsProvisioningCallback(
+ mSubId, mSingleRegistrationCapability == ProvisioningManager.STATUS_CAPABLE);
+
+ // if not yet registered, register callback and set registered value
+ if (rcsProvisioningCallback != null && !rcsProvisioningCallback.getRegistered()) {
+ if (addRcsConfigCallback(rcsProvisioningCallback)) {
+ rcsProvisioningCallback.setRegistered(true);
+ }
+ }
+ }
}
@VisibleForTesting
@@ -454,7 +481,7 @@
@VisibleForTesting
public RcsProvisioningMonitor(PhoneGlobals app, Looper looper, RoleManagerAdapter roleManager,
- FeatureConnectorFactory<RcsFeatureManager> factory) {
+ FeatureConnectorFactory<RcsFeatureManager> factory, RcsStats rcsStats) {
mPhone = app;
mHandler = new MyHandler(looper);
mCarrierConfigManager = mPhone.getSystemService(CarrierConfigManager.class);
@@ -465,6 +492,7 @@
logv("DMA is " + mDmaPackageName);
mDmaChangedListener = new DmaChangedListener();
mFeatureFactory = factory;
+ mRcsStats = rcsStats;
init();
}
@@ -477,7 +505,8 @@
HandlerThread handlerThread = new HandlerThread(TAG);
handlerThread.start();
sInstance = new RcsProvisioningMonitor(app, handlerThread.getLooper(),
- new RoleManagerAdapterImpl(app), RcsFeatureManager::getConnector);
+ new RoleManagerAdapterImpl(app), RcsFeatureManager::getConnector,
+ RcsStats.getInstance());
}
return sInstance;
}
@@ -704,6 +733,10 @@
logv("acs not used, set cached config and notify.");
v.setConfig(cachedConfig);
}
+
+ // store RCS metrics - DMA changed event
+ mRcsStats.onRcsClientProvisioningStats(k,
+ RCS_CLIENT_PROVISIONING_STATS__EVENT__DMA_CHANGED);
});
}
}
@@ -803,6 +836,14 @@
}
info.setConfig(isCompressed ? RcsConfig.decompressGzip(config) : config);
updateConfigForSub(subId, config, isCompressed);
+
+ // Supporting ACS means config data comes from ACS
+ // store RCS metrics - received provisioning event
+ if (isAcsUsed(subId)) {
+ mRcsStats.onRcsAcsProvisioningStats(subId, 200,
+ RCS_ACS_PROVISIONING_STATS__RESPONSE_TYPE__PROVISIONING_XML,
+ isRcsVolteSingleRegistrationEnabled(subId));
+ }
}
private void onReconfigRequest(int subId) {
@@ -814,6 +855,10 @@
updateConfigForSub(subId, null, true);
info.triggerRcsReconfiguration();
}
+
+ // store RCS metrics - reconfig event
+ mRcsStats.onRcsClientProvisioningStats(subId,
+ RCS_CLIENT_PROVISIONING_STATS__EVENT__TRIGGER_RCS_RECONFIGURATION);
}
private void notifyDmaForSub(int subId, int capability) {
diff --git a/src/com/android/services/telephony/ImsConference.java b/src/com/android/services/telephony/ImsConference.java
index 7f088f7..c62b4fa 100644
--- a/src/com/android/services/telephony/ImsConference.java
+++ b/src/com/android/services/telephony/ImsConference.java
@@ -534,6 +534,10 @@
(properties & Connection.PROPERTY_IS_ADHOC_CONFERENCE) != 0);
Log.i(this, "applyHostProperties: confProp=%s", conferenceProperties);
+ conferenceProperties = changeBitmask(conferenceProperties,
+ Connection.PROPERTY_CROSS_SIM,
+ (properties & Connection.PROPERTY_CROSS_SIM) != 0);
+
return conferenceProperties;
}
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 766a75e..8c5fb66 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -498,7 +498,8 @@
IntentFilter intentFilter = new IntentFilter(
TelecomManager.ACTION_TTY_PREFERRED_MODE_CHANGED);
- registerReceiver(mTtyBroadcastReceiver, intentFilter);
+ registerReceiver(mTtyBroadcastReceiver, intentFilter,
+ android.Manifest.permission.MODIFY_PHONE_STATE, null);
}
@Override
@@ -2084,8 +2085,7 @@
if (phone.getEmergencyNumberTracker() != null) {
if (phone.getEmergencyNumberTracker().isEmergencyNumber(
emergencyNumberAddress, true)) {
- if (phone.getHalVersion().greaterOrEqual(RIL.RADIO_HAL_VERSION_1_4)
- || isAvailableForEmergencyCalls(phone)) {
+ if (isAvailableForEmergencyCalls(phone)) {
// a)
if (phone.getPhoneId() == defaultVoicePhoneId) {
Log.i(this, "getPhoneForEmergencyCall, Phone Id that supports"
@@ -2208,12 +2208,6 @@
// Only sort if there are enough elements to do so.
if (phoneSlotStatus.size() > 1) {
Collections.sort(phoneSlotStatus, (o1, o2) -> {
- if (!o1.hasDialedEmergencyNumber && o2.hasDialedEmergencyNumber) {
- return -1;
- }
- if (o1.hasDialedEmergencyNumber && !o2.hasDialedEmergencyNumber) {
- return 1;
- }
// Sort by non-absent SIM.
if (o1.simState == TelephonyManager.SIM_STATE_ABSENT
&& o2.simState != TelephonyManager.SIM_STATE_ABSENT) {
@@ -2232,6 +2226,13 @@
if (o2.isLocked && !o1.isLocked) {
return 1;
}
+ // Prefer slots where the number is considered emergency.
+ if (!o1.hasDialedEmergencyNumber && o2.hasDialedEmergencyNumber) {
+ return -1;
+ }
+ if (o1.hasDialedEmergencyNumber && !o2.hasDialedEmergencyNumber) {
+ return 1;
+ }
// sort by number of RadioAccessFamily Capabilities.
int compare = RadioAccessFamily.compare(o1.capabilities, o2.capabilities);
if (compare == 0) {
diff --git a/src/com/android/services/telephony/rcs/DelegateStateTracker.java b/src/com/android/services/telephony/rcs/DelegateStateTracker.java
index 321c7ba..18aab88 100644
--- a/src/com/android/services/telephony/rcs/DelegateStateTracker.java
+++ b/src/com/android/services/telephony/rcs/DelegateStateTracker.java
@@ -24,9 +24,12 @@
import android.telephony.ims.aidl.ISipDelegate;
import android.telephony.ims.aidl.ISipDelegateConnectionStateCallback;
import android.telephony.ims.stub.DelegateConnectionStateCallback;
+import android.util.ArraySet;
import android.util.LocalLog;
import android.util.Log;
+import com.android.internal.telephony.metrics.RcsStats;
+
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
@@ -50,11 +53,15 @@
private boolean mCreatedCalled = false;
private int mRegistrationStateOverride = -1;
+ private Set<String> mDelegateSupportedTags;
+ private final RcsStats mRcsStats;
+
public DelegateStateTracker(int subId, ISipDelegateConnectionStateCallback appStateCallback,
- ISipDelegate localDelegateImpl) {
+ ISipDelegate localDelegateImpl, RcsStats rcsStats) {
mSubId = subId;
mAppStateCallback = appStateCallback;
mLocalDelegateImpl = localDelegateImpl;
+ mRcsStats = rcsStats;
}
/**
@@ -63,10 +70,13 @@
* Registration and state updates will be send via the
* {@link SipDelegateBinderConnection.StateCallback} callback implemented by this class as they
* arrive.
+ * @param supportedTags the tags supported by the SipTransportController and ImsService creating
+ * the SipDelegate. These tags will be used as a key for SipDelegate
+ * metrics.
* @param deniedTags The tags denied by the SipTransportController and ImsService creating the
* SipDelegate. These tags will need to be notified back to the IMS application.
*/
- public void sipDelegateConnected(Set<FeatureTagState> deniedTags) {
+ public void sipDelegateConnected(Set<String> supportedTags, Set<FeatureTagState> deniedTags) {
logi("SipDelegate connected with denied tags:" + deniedTags);
// From the IMS application perspective, we only call onCreated/onDestroyed once and
// provide the local implementation of ISipDelegate, which doesn't change, even though
@@ -74,6 +84,8 @@
if (!mCreatedCalled) {
mCreatedCalled = true;
notifySipDelegateCreated();
+ mDelegateSupportedTags = supportedTags;
+ mRcsStats.createSipDelegateStats(mSubId, mDelegateSupportedTags);
}
mRegistrationStateOverride = -1;
mDelegateDeniedTags = new ArrayList<>(deniedTags);
@@ -84,8 +96,8 @@
*
* This will trigger an override of the IMS application's registration state. All feature tags
* in the REGISTERED state will be overridden to move to the deregistering state specified until
- * a new SipDelegate was successfully created and {@link #sipDelegateConnected(Set)} was called
- * or it was destroyed and {@link #sipDelegateDestroyed(int)} was called.
+ * a new SipDelegate was successfully created and {@link #sipDelegateConnected(Set, Set)} was
+ * called or it was destroyed and {@link #sipDelegateDestroyed(int)} was called.
* @param deregisteringReason The new deregistering reason that all feature tags in the
* registered state should now report.
*/
@@ -115,6 +127,7 @@
mRegistrationStateOverride = -1;
try {
mAppStateCallback.onDestroyed(reason);
+ mRcsStats.onSipDelegateStats(mSubId, mDelegateSupportedTags, reason);
} catch (RemoteException e) {
logw("sipDelegateDestroyed: IMS application is dead: " + e);
}
@@ -141,6 +154,11 @@
logi("onRegistrationStateChanged: sending reg state " + registrationState);
try {
mAppStateCallback.onFeatureTagStatusChanged(registrationState, mDelegateDeniedTags);
+ Set<String> registeredFeatureTags = registrationState.getRegisteredFeatureTags();
+ mRcsStats.onSipTransportFeatureTagStats(mSubId,
+ new ArraySet<FeatureTagState>(mDelegateDeniedTags),
+ registrationState.getDeregisteredFeatureTags(),
+ registeredFeatureTags);
} catch (RemoteException e) {
logw("onRegistrationStateChanged: IMS application is dead: " + e);
}
diff --git a/src/com/android/services/telephony/rcs/SipDelegateController.java b/src/com/android/services/telephony/rcs/SipDelegateController.java
index 8cc70a4..c728141 100644
--- a/src/com/android/services/telephony/rcs/SipDelegateController.java
+++ b/src/com/android/services/telephony/rcs/SipDelegateController.java
@@ -34,6 +34,7 @@
import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.metrics.RcsStats;
import com.android.internal.util.IndentingPrintWriter;
import java.io.PrintWriter;
@@ -102,7 +103,7 @@
mMessageTransportWrapper = new MessageTransportWrapper(mSubId, executorService,
messageCallback);
mDelegateStateTracker = new DelegateStateTracker(mSubId, stateCallback,
- mMessageTransportWrapper.getDelegateConnection());
+ mMessageTransportWrapper.getDelegateConnection(), RcsStats.getInstance());
}
/**
@@ -191,7 +192,7 @@
.collect(Collectors.toSet()));
mMessageTransportWrapper.openTransport(resultPair.first, allowedTags,
resultPair.second);
- mDelegateStateTracker.sipDelegateConnected(resultPair.second);
+ mDelegateStateTracker.sipDelegateConnected(allowedTags, resultPair.second);
return true;
});
}
diff --git a/src/com/android/services/telephony/rcs/SipSessionTracker.java b/src/com/android/services/telephony/rcs/SipSessionTracker.java
index 5ab482f..68e3065 100644
--- a/src/com/android/services/telephony/rcs/SipSessionTracker.java
+++ b/src/com/android/services/telephony/rcs/SipSessionTracker.java
@@ -24,6 +24,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.SipMessageParsingUtils;
+import com.android.internal.telephony.metrics.RcsStats;
import com.android.internal.util.IndentingPrintWriter;
import java.io.PrintWriter;
@@ -66,6 +67,14 @@
// associated pending operation.
private final ArrayMap<String, Runnable> mPendingAck = new ArrayMap<>();
+ private final RcsStats mRcsStats;
+ int mSubId;
+
+ public SipSessionTracker(int subId, RcsStats rcsStats) {
+ mSubId = subId;
+ mRcsStats = rcsStats;
+ }
+
/**
* Filter a SIP message to determine if it will result in a new SIP dialog. This will need to be
* successfully acknowledged by the remote IMS stack using
@@ -73,10 +82,10 @@
*
* @param message The Incoming SIP message.
*/
- public void filterSipMessage(SipMessage message) {
+ public void filterSipMessage(int direction, SipMessage message) {
final Runnable r;
if (startsEarlyDialog(message)) {
- r = getCreateDialogRunnable(message);
+ r = getCreateDialogRunnable(direction, message);
} else if (closesDialog(message)) {
r = getCloseDialogRunnable(message);
} else if (SipMessageParsingUtils.isSipResponse(message.getStartLine())) {
@@ -137,6 +146,8 @@
if (dialogsToCleanup.isEmpty()) return;
logi("Cleanup dialogs associated with call id: " + callId);
for (SipDialog d : dialogsToCleanup) {
+ mRcsStats.onSipTransportSessionClosed(mSubId, callId, 0,
+ d.getState() == d.STATE_CLOSED);
d.close();
logi("Dialog closed: " + d);
}
@@ -197,6 +208,9 @@
* Clears all tracked sessions.
*/
public void clearAllSessions() {
+ for (SipDialog d : mTrackedDialogs) {
+ mRcsStats.onSipTransportSessionClosed(mSubId, d.getCallId(), 0, false);
+ }
mTrackedDialogs.clear();
mPendingAck.clear();
}
@@ -262,7 +276,7 @@
return SIP_CLOSE_DIALOG_REQUEST_METHOD.equalsIgnoreCase(startLineSegments[0]);
}
- private Runnable getCreateDialogRunnable(SipMessage m) {
+ private Runnable getCreateDialogRunnable(int direction, SipMessage m) {
return () -> {
List<SipDialog> duplicateDialogs = mTrackedDialogs.stream()
.filter(d -> d.getCallId().equals(m.getCallIdParameter()))
@@ -273,6 +287,10 @@
return;
}
SipDialog dialog = SipDialog.fromSipMessage(m);
+ String[] startLineSegments =
+ SipMessageParsingUtils.splitStartLineAndVerify(m.getStartLine());
+ mRcsStats.earlySipTransportSession(startLineSegments[0], dialog.getCallId(),
+ direction);
logi("Starting new SipDialog: " + dialog);
mTrackedDialogs.add(dialog);
};
@@ -285,6 +303,7 @@
.collect(Collectors.toList());
if (dialogsToClose.isEmpty()) return;
logi("Closing dialogs associated with: " + m);
+ mRcsStats.onSipTransportSessionClosed(mSubId, m.getCallIdParameter(), 0, true);
for (SipDialog d : dialogsToClose) {
d.close();
logi("Dialog closed: " + d);
@@ -344,11 +363,13 @@
if (statusCode <= 100) return;
// If 300+, then this dialog has received an error response and should move to closed state.
if (statusCode >= 300) {
+ mRcsStats.onSipTransportSessionClosed(mSubId, m.getCallIdParameter(), statusCode, true);
d.close();
return;
}
if (toTag == null) logw("updateSipDialogState: No to tag for message: " + m);
if (statusCode >= 200) {
+ mRcsStats.confirmedSipTransportSession(m.getCallIdParameter(), statusCode);
d.confirm(toTag);
return;
}
diff --git a/src/com/android/services/telephony/rcs/TelephonyRcsService.java b/src/com/android/services/telephony/rcs/TelephonyRcsService.java
index 034382c..046910c 100644
--- a/src/com/android/services/telephony/rcs/TelephonyRcsService.java
+++ b/src/com/android/services/telephony/rcs/TelephonyRcsService.java
@@ -32,6 +32,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.PhoneConfigurationManager;
+import com.android.internal.telephony.metrics.RcsStats;
import com.android.internal.util.IndentingPrintWriter;
import com.android.phone.R;
@@ -163,6 +164,7 @@
mFeatureControllers = new SparseArray<>(numSlots);
mSlotToAssociatedSubIds = new SparseArray<>(numSlots);
mRcsUceEnabled = sResourceProxy.getDeviceUceEnabled(mContext);
+ RcsStats.getInstance().registerUceCallback();
}
@VisibleForTesting
@@ -173,6 +175,7 @@
mSlotToAssociatedSubIds = new SparseArray<>(numSlots);
sResourceProxy = resourceProxy;
mRcsUceEnabled = sResourceProxy.getDeviceUceEnabled(mContext);
+ RcsStats.getInstance().registerUceCallback();
}
/**
diff --git a/src/com/android/services/telephony/rcs/TransportSipMessageValidator.java b/src/com/android/services/telephony/rcs/TransportSipMessageValidator.java
index 777026c..3b1b26d 100644
--- a/src/com/android/services/telephony/rcs/TransportSipMessageValidator.java
+++ b/src/com/android/services/telephony/rcs/TransportSipMessageValidator.java
@@ -16,6 +16,9 @@
package com.android.services.telephony.rcs;
+import static com.android.internal.telephony.TelephonyStatsLog.SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__INCOMING;
+import static com.android.internal.telephony.TelephonyStatsLog.SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING;
+
import android.telephony.ims.DelegateRegistrationState;
import android.telephony.ims.FeatureTagState;
import android.telephony.ims.SipDelegateConfiguration;
@@ -26,6 +29,8 @@
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.SipMessageParsingUtils;
+import com.android.internal.telephony.metrics.RcsStats;
import com.android.internal.util.IndentingPrintWriter;
import com.android.services.telephony.rcs.validator.IncomingTransportStateValidator;
import com.android.services.telephony.rcs.validator.MalformedSipMessageValidator;
@@ -145,11 +150,13 @@
private PendingTask mPendingClose;
private PendingRegCleanupTask mPendingRegCleanup;
private Consumer<Set<String>> mRegistrationAppliedConsumer;
+ private final RcsStats mRcsStats;
public TransportSipMessageValidator(int subId, ScheduledExecutorService executor) {
mSubId = subId;
mExecutor = executor;
- mSipSessionTracker = new SipSessionTracker();
+ mRcsStats = RcsStats.getInstance();
+ mSipSessionTracker = new SipSessionTracker(subId, mRcsStats);
mOutgoingTransportStateValidator = new OutgoingTransportStateValidator(mSipSessionTracker);
mIncomingTransportStateValidator = new IncomingTransportStateValidator();
mOutgoingMessageValidator = new MalformedSipMessageValidator().andThen(
@@ -163,7 +170,7 @@
public TransportSipMessageValidator(int subId, ScheduledExecutorService executor,
SipSessionTracker sipSessionTracker,
OutgoingTransportStateValidator outgoingStateValidator,
- IncomingTransportStateValidator incomingStateValidator) {
+ IncomingTransportStateValidator incomingStateValidator, RcsStats rcsStats) {
mSubId = subId;
mExecutor = executor;
mSipSessionTracker = sipSessionTracker;
@@ -171,6 +178,7 @@
mIncomingTransportStateValidator = incomingStateValidator;
mOutgoingMessageValidator = mOutgoingTransportStateValidator;
mIncomingMessageValidator = mIncomingTransportStateValidator;
+ mRcsStats = rcsStats;
}
/**
@@ -365,7 +373,11 @@
}
ValidationResult result = mOutgoingMessageValidator.validate(message);
logi("verifyOutgoingMessage: " + result + ", message=" + message);
- if (result.isValidated) mSipSessionTracker.filterSipMessage(message);
+ if (result.isValidated) {
+ mSipSessionTracker.filterSipMessage(
+ SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING, message);
+ }
+ updateForMetrics(SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING, message, result);
return result;
}
@@ -378,7 +390,11 @@
public ValidationResult verifyIncomingMessage(SipMessage message) {
ValidationResult result = mIncomingMessageValidator.validate(message);
logi("verifyIncomingMessage: " + result + ", message=" + message);
- if (result.isValidated) mSipSessionTracker.filterSipMessage(message);
+ if (result.isValidated) {
+ mSipSessionTracker.filterSipMessage(
+ SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__INCOMING, message);
+ }
+ updateForMetrics(SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__INCOMING, message, result);
return result;
}
@@ -539,6 +555,28 @@
.collect(Collectors.toSet());
}
+ private void updateForMetrics(int direction, SipMessage m, ValidationResult result) {
+ String[] startLineSegments = SipMessageParsingUtils
+ .splitStartLineAndVerify(m.getStartLine());
+ if (SipMessageParsingUtils.isSipRequest(m.getStartLine())) {
+ if (result.isValidated) {
+ // SipMessage add to list for Metrics stats
+ mRcsStats.onSipMessageRequest(m.getCallIdParameter(), startLineSegments[0],
+ direction);
+ } else {
+ //Message sending fail and there is no response.
+ mRcsStats.invalidatedMessageResult(mSubId, startLineSegments[0], direction,
+ result.restrictedReason);
+ }
+ } else if (SipMessageParsingUtils.isSipResponse(m.getStartLine())) {
+ int statusCode = Integer.parseInt(startLineSegments[1]);
+ mRcsStats.onSipMessageResponse(mSubId, m.getCallIdParameter(), statusCode,
+ result.restrictedReason);
+ } else {
+ logw("Message is Restricted");
+ }
+ }
+
private void logi(String log) {
Log.i(SipTransportController.LOG_TAG, LOG_TAG + "[" + mSubId + "] " + log);
mLocalLog.log("[I] " + log);
diff --git a/testapps/GbaTestApp/res/values-it/strings.xml b/testapps/GbaTestApp/res/values-it/strings.xml
index 00409d3..f290a5b 100644
--- a/testapps/GbaTestApp/res/values-it/strings.xml
+++ b/testapps/GbaTestApp/res/values-it/strings.xml
@@ -21,7 +21,7 @@
<string name="request_force_bootstrapping" msgid="206043602616214325">"Forzare il bootstrapping?"</string>
<string name="request_org" msgid="8416693445448308975">"Codice organizzazione"</string>
<string name="request_security_protocol" msgid="1444164827561010482">"ID protocollo sicurezza UA"</string>
- <string name="request_tls_cipher_suite" msgid="6659854717595308404">"ID pacchetto crittografia TLS"</string>
+ <string name="request_tls_cipher_suite" msgid="6659854717595308404">"ID suite di crittografia TLS"</string>
<string name="response_success" msgid="2469204471244527663">"Autenticazione GBA riuscita?"</string>
<string name="response_fail_reason" msgid="3401426967253202496">"ID motivo errore"</string>
<string name="response_key" msgid="8839847772051686309">"Chiave GBA (CK + IK)"</string>
diff --git a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
index 8e5e073..8873402 100644
--- a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
+++ b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
@@ -16,6 +16,10 @@
package com.android.phone;
+import static com.android.internal.telephony.TelephonyStatsLog.RCS_ACS_PROVISIONING_STATS__RESPONSE_TYPE__PROVISIONING_XML;
+import static com.android.internal.telephony.TelephonyStatsLog.RCS_CLIENT_PROVISIONING_STATS__EVENT__DMA_CHANGED;
+import static com.android.internal.telephony.TelephonyStatsLog.RCS_CLIENT_PROVISIONING_STATS__EVENT__TRIGGER_RCS_RECONFIGURATION;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNull;
@@ -64,6 +68,7 @@
import com.android.ims.FeatureConnector;
import com.android.ims.RcsFeatureManager;
import com.android.internal.telephony.ITelephony;
+import com.android.internal.telephony.metrics.RcsStats;
import org.junit.After;
import org.junit.Before;
@@ -179,6 +184,10 @@
private IRcsConfigCallback mCallback;
@Mock
private PackageManager mPackageManager;
+ @Mock
+ private RcsStats mRcsStats;
+ @Mock
+ private RcsStats.RcsProvisioningCallback mRcsProvisioningCallback;
private Executor mExecutor = new Executor() {
@Override
@@ -768,6 +777,66 @@
assertNull(mRcsProvisioningMonitor.getImsFeatureValidationOverride(FAKE_SUB_ID_BASE));
}
+ @Test
+ @SmallTest
+ public void testMetricsAcsNotUsed() throws Exception {
+ createMonitor(1);
+
+ // Not used ACS
+ mBundle.putBoolean(CarrierConfigManager.KEY_USE_ACS_FOR_RCS_BOOL, false);
+ broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
+ processAllMessages();
+ mRcsProvisioningMonitor.updateConfig(FAKE_SUB_ID_BASE, CONFIG_DEFAULT.getBytes(), false);
+ processAllMessages();
+ verify(mRcsStats, never()).onRcsAcsProvisioningStats(anyInt(), anyInt(),
+ anyInt(), anyBoolean());
+ }
+
+ @Test
+ @SmallTest
+ public void testMetricsAcsUsed() throws Exception {
+ when(mRcsStats.getRcsProvisioningCallback(anyInt(), anyBoolean()))
+ .thenReturn(mRcsProvisioningCallback);
+ createMonitor(1);
+
+ verify(mIImsConfig, times(1))
+ .notifyRcsAutoConfigurationReceived(any(), anyBoolean());
+ // verify RcsStats.getRcsProvisioningCallback() is called
+ verify(mRcsStats, times(1)).getRcsProvisioningCallback(
+ eq(FAKE_SUB_ID_BASE), anyBoolean());
+ // verify registered callback obj which comes from RcsStats.getRcsProvisioningCallback()
+ verify(mIImsConfig, times(1))
+ .addRcsConfigCallback(eq(mRcsProvisioningCallback));
+
+ // Config data received and ACS used
+ int errorCode = 200;
+ mBundle.putBoolean(CarrierConfigManager.KEY_USE_ACS_FOR_RCS_BOOL, true);
+ broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
+ processAllMessages();
+ mRcsProvisioningMonitor.updateConfig(FAKE_SUB_ID_BASE, CONFIG_DEFAULT.getBytes(), false);
+ processAllMessages();
+ verify(mRcsStats, times(1)).onRcsAcsProvisioningStats(eq(FAKE_SUB_ID_BASE), eq(errorCode),
+ eq(RCS_ACS_PROVISIONING_STATS__RESPONSE_TYPE__PROVISIONING_XML), anyBoolean());
+ }
+
+ @Test
+ @SmallTest
+ public void testMetricsClientProvisioningStats() throws Exception {
+ createMonitor(1);
+
+ // reconfig trigger
+ mRcsProvisioningMonitor.requestReconfig(FAKE_SUB_ID_BASE);
+ processAllMessages();
+ verify(mRcsStats, times(1)).onRcsClientProvisioningStats(eq(FAKE_SUB_ID_BASE),
+ eq(RCS_CLIENT_PROVISIONING_STATS__EVENT__TRIGGER_RCS_RECONFIGURATION));
+
+ // DMA changed
+ updateDefaultMessageApplication(DEFAULT_MESSAGING_APP2);
+ processAllMessages();
+ verify(mRcsStats, times(1)).onRcsClientProvisioningStats(eq(FAKE_SUB_ID_BASE),
+ eq(RCS_CLIENT_PROVISIONING_STATS__EVENT__DMA_CHANGED));
+ }
+
private void createMonitor(int subCount) throws Exception {
if (Looper.myLooper() == null) {
Looper.prepare();
@@ -777,7 +846,7 @@
.thenReturn(mFeatureConnector);
when(mFeatureManager.getConfig()).thenReturn(mIImsConfig);
mRcsProvisioningMonitor = new RcsProvisioningMonitor(mPhone, mHandlerThread.getLooper(),
- mRoleManager, mFeatureFactory);
+ mRoleManager, mFeatureFactory, mRcsStats);
mHandler = mRcsProvisioningMonitor.getHandler();
try {
mLooper = new TestableLooper(mHandler.getLooper());
diff --git a/tests/src/com/android/services/telephony/rcs/DelegateStateTrackerTest.java b/tests/src/com/android/services/telephony/rcs/DelegateStateTrackerTest.java
index 8236f44..25b5339 100644
--- a/tests/src/com/android/services/telephony/rcs/DelegateStateTrackerTest.java
+++ b/tests/src/com/android/services/telephony/rcs/DelegateStateTrackerTest.java
@@ -37,6 +37,7 @@
import androidx.test.runner.AndroidJUnit4;
import com.android.TelephonyTestBase;
+import com.android.internal.telephony.metrics.RcsStats;
import org.junit.After;
import org.junit.Before;
@@ -56,6 +57,7 @@
@Mock private ISipDelegate mSipDelegate;
@Mock private ISipDelegateConnectionStateCallback mAppCallback;
+ @Mock private RcsStats mRcsStats;
@Before
public void setUp() throws Exception {
@@ -76,12 +78,14 @@
@Test
public void testDelegateCreated() throws Exception {
DelegateStateTracker stateTracker = new DelegateStateTracker(TEST_SUB_ID, mAppCallback,
- mSipDelegate);
+ mSipDelegate, mRcsStats);
Set<FeatureTagState> deniedTags = getMmTelDeniedTag();
- stateTracker.sipDelegateConnected(deniedTags);
+ Set<String> supportedTags = getSupportedTags();
+ stateTracker.sipDelegateConnected(supportedTags, deniedTags);
// Calling connected multiple times should not generate multiple onCreated events.
- stateTracker.sipDelegateConnected(deniedTags);
+ stateTracker.sipDelegateConnected(supportedTags, deniedTags);
verify(mAppCallback).onCreated(mSipDelegate);
+ verify(mRcsStats).createSipDelegateStats(TEST_SUB_ID, supportedTags);
// Ensure status updates are sent to app as expected.
DelegateRegistrationState regState = new DelegateRegistrationState.Builder()
@@ -97,8 +101,10 @@
stateTracker.onConfigurationChanged(c);
verify(mAppCallback).onFeatureTagStatusChanged(eq(regState),
eq(new ArrayList<>(deniedTags)));
+ verify(mRcsStats).onSipTransportFeatureTagStats(TEST_SUB_ID, deniedTags,
+ regState.getDeregisteredFeatureTags(),
+ regState.getRegisteredFeatureTags());
verify(mAppCallback).onConfigurationChanged(c);
-
verify(mAppCallback, never()).onDestroyed(anyInt());
}
@@ -109,14 +115,18 @@
@Test
public void testDelegateDestroyed() throws Exception {
DelegateStateTracker stateTracker = new DelegateStateTracker(TEST_SUB_ID, mAppCallback,
- mSipDelegate);
+ mSipDelegate, mRcsStats);
Set<FeatureTagState> deniedTags = getMmTelDeniedTag();
- stateTracker.sipDelegateConnected(deniedTags);
+ Set<String> supportedTags = getSupportedTags();
+ stateTracker.sipDelegateConnected(supportedTags, deniedTags);
+ verify(mRcsStats).createSipDelegateStats(eq(TEST_SUB_ID), eq(supportedTags));
stateTracker.sipDelegateDestroyed(
SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
verify(mAppCallback).onDestroyed(
SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP);
+ verify(mRcsStats).onSipDelegateStats(eq(TEST_SUB_ID), eq(supportedTags),
+ eq(SipDelegateManager.SIP_DELEGATE_DESTROY_REASON_REQUESTED_BY_APP));
}
/**
@@ -130,9 +140,10 @@
@Test
public void testDelegateChangingRegisteredTagsOverride() throws Exception {
DelegateStateTracker stateTracker = new DelegateStateTracker(TEST_SUB_ID, mAppCallback,
- mSipDelegate);
+ mSipDelegate, mRcsStats);
Set<FeatureTagState> deniedTags = getMmTelDeniedTag();
- stateTracker.sipDelegateConnected(deniedTags);
+ Set<String> supportedTags = getSupportedTags();
+ stateTracker.sipDelegateConnected(supportedTags, deniedTags);
// SipDelegate created
verify(mAppCallback).onCreated(mSipDelegate);
DelegateRegistrationState regState = new DelegateRegistrationState.Builder()
@@ -158,7 +169,7 @@
DelegateRegistrationState.DEREGISTERED_REASON_NOT_PROVISIONED)
.build();
// new underlying SipDelegate created
- stateTracker.sipDelegateConnected(deniedTags);
+ stateTracker.sipDelegateConnected(supportedTags, deniedTags);
stateTracker.onRegistrationStateChanged(regState);
// Verify registration state through the process:
@@ -187,9 +198,10 @@
@Test
public void testDelegateChangingDeniedTagsChanged() throws Exception {
DelegateStateTracker stateTracker = new DelegateStateTracker(TEST_SUB_ID, mAppCallback,
- mSipDelegate);
+ mSipDelegate, mRcsStats);
Set<FeatureTagState> deniedTags = getMmTelDeniedTag();
- stateTracker.sipDelegateConnected(deniedTags);
+ Set<String> supportedTags = getSupportedTags();
+ stateTracker.sipDelegateConnected(supportedTags, deniedTags);
// SipDelegate created
verify(mAppCallback).onCreated(mSipDelegate);
DelegateRegistrationState regState = new DelegateRegistrationState.Builder()
@@ -220,7 +232,7 @@
// new underlying SipDelegate created, but SipDelegate denied one to one chat
deniedTags.add(new FeatureTagState(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG,
SipDelegateManager.DENIED_REASON_NOT_ALLOWED));
- stateTracker.sipDelegateConnected(deniedTags);
+ stateTracker.sipDelegateConnected(supportedTags, deniedTags);
DelegateRegistrationState fullyDeniedRegState = new DelegateRegistrationState.Builder()
.build();
// In this special case, it will be the SipDelegateConnectionBase that will trigger
@@ -244,9 +256,10 @@
@Test
public void testDelegateChangingDeniedTagsChangingToDestroy() throws Exception {
DelegateStateTracker stateTracker = new DelegateStateTracker(TEST_SUB_ID, mAppCallback,
- mSipDelegate);
+ mSipDelegate, mRcsStats);
Set<FeatureTagState> deniedTags = getMmTelDeniedTag();
- stateTracker.sipDelegateConnected(deniedTags);
+ Set<String> supportedTags = getSupportedTags();
+ stateTracker.sipDelegateConnected(supportedTags, deniedTags);
// SipDelegate created
verify(mAppCallback).onCreated(mSipDelegate);
DelegateRegistrationState regState = new DelegateRegistrationState.Builder()
@@ -296,4 +309,11 @@
SipDelegateManager.DENIED_REASON_NOT_ALLOWED));
return deniedTags;
}
+
+ private Set<String> getSupportedTags() {
+ Set<String> supportedTags = new ArraySet<>();
+ supportedTags.add(ImsSignallingUtils.ONE_TO_ONE_CHAT_TAG);
+ supportedTags.add(ImsSignallingUtils.GROUP_CHAT_TAG);
+ return supportedTags;
+ }
}
diff --git a/tests/src/com/android/services/telephony/rcs/SipDelegateControllerTest.java b/tests/src/com/android/services/telephony/rcs/SipDelegateControllerTest.java
index 5b0e7c5..78f6894 100644
--- a/tests/src/com/android/services/telephony/rcs/SipDelegateControllerTest.java
+++ b/tests/src/com/android/services/telephony/rcs/SipDelegateControllerTest.java
@@ -107,7 +107,8 @@
assertTrue(future.get());
verify(mMockMessageTracker).openTransport(mMockSipDelegate, request.getFeatureTags(),
Collections.emptySet());
- verify(mMockDelegateStateTracker).sipDelegateConnected(Collections.emptySet());
+ verify(mMockDelegateStateTracker).sipDelegateConnected(request.getFeatureTags(),
+ Collections.emptySet());
}
@SmallTest
@@ -138,7 +139,7 @@
allowedTags.removeAll(deniedTags.stream().map(FeatureTagState::getFeatureTag)
.collect(Collectors.toSet()));
verify(mMockMessageTracker).openTransport(mMockSipDelegate, allowedTags, deniedTags);
- verify(mMockDelegateStateTracker).sipDelegateConnected(deniedTags);
+ verify(mMockDelegateStateTracker).sipDelegateConnected(allowedTags, deniedTags);
}
@SmallTest
@@ -249,7 +250,9 @@
Collections.emptySet());
verify(mMockMessageTracker).openTransport(mMockSipDelegate, newFts,
Collections.emptySet());
- verify(mMockDelegateStateTracker, times(2)).sipDelegateConnected(Collections.emptySet());
+ verify(mMockDelegateStateTracker).sipDelegateConnected(
+ request.getFeatureTags(), Collections.emptySet());
+ verify(mMockDelegateStateTracker).sipDelegateConnected(newFts, Collections.emptySet());
}
private void createSipDelegate(DelegateRequest request, SipDelegateController controller)
diff --git a/tests/src/com/android/services/telephony/rcs/SipSessionTrackerTest.java b/tests/src/com/android/services/telephony/rcs/SipSessionTrackerTest.java
index 823a8be..37abb83 100644
--- a/tests/src/com/android/services/telephony/rcs/SipSessionTrackerTest.java
+++ b/tests/src/com/android/services/telephony/rcs/SipSessionTrackerTest.java
@@ -16,19 +16,28 @@
package com.android.services.telephony.rcs;
+import static com.android.internal.telephony.TelephonyStatsLog.SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.verify;
+
import android.net.Uri;
import android.telephony.ims.SipMessage;
import android.util.Base64;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import com.android.internal.telephony.metrics.RcsStats;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import java.nio.ByteBuffer;
import java.util.Arrays;
@@ -90,11 +99,104 @@
// Keep track of the string entry so we can generate unique strings.
private int mStringEntryCounter = 0;
private SipSessionTracker mTrackerUT;
+ private static final int TEST_SUB_ID = 1;
+ private static final String TEST_INVITE_SIP_METHOD = "INVITE";
+ private static final int TEST_SIP_RESPONSE_CODE = 200;
+ private static final int TEST_SIP_CLOSE_RESPONSE_CODE = 0;
+ @Mock
+ private RcsStats mRcsStats;
@Before
public void setUp() {
mStringEntryCounter = 0;
- mTrackerUT = new SipSessionTracker();
+ MockitoAnnotations.initMocks(this);
+ mTrackerUT = new SipSessionTracker(TEST_SUB_ID, mRcsStats);
+ }
+
+ @Test
+ public void testMetricsEndedGracefullyBye() {
+ DialogAttributes attr = new DialogAttributes();
+ // INVITE
+ SipMessage inviteRequest = generateSipRequest(SipMessageUtils.INVITE_SIP_METHOD, attr);
+ filterMessage(inviteRequest, attr);
+ assertTrue(mTrackerUT.getConfirmedDialogs().isEmpty());
+ verifyContainsCallIds(mTrackerUT.getEarlyDialogs(), attr);
+
+ // confirmed dialog
+ attr.setToTag();
+ SipMessage inviteConfirm = generateSipResponse("200", "OK", attr);
+ filterMessage(inviteConfirm, attr);
+ assertTrue(mTrackerUT.getEarlyDialogs().isEmpty());
+ verifyContainsCallIds(mTrackerUT.getConfirmedDialogs(), attr);
+
+ // Gracefully Ended
+ SipMessage inviteClose = generateSipRequest(SipMessageUtils.BYE_SIP_METHOD, attr);
+ filterMessage(inviteClose, attr);
+
+ assertTrue(mTrackerUT.getEarlyDialogs().isEmpty());
+ assertTrue(mTrackerUT.getConfirmedDialogs().isEmpty());
+ verifyContainsCallIds(mTrackerUT.getClosedDialogs(), attr);
+
+ // verify Metrics information
+ verify(mRcsStats).onSipTransportSessionClosed(eq(TEST_SUB_ID), eq(attr.callId),
+ eq(TEST_SIP_CLOSE_RESPONSE_CODE), eq(true));
+ }
+
+ @Test
+ public void testMetricsCloseCleanupSession() {
+ //mTrackerUT.setRcsStats(mRcsStats);
+ DialogAttributes attr = new DialogAttributes();
+ // INVITE A -> B
+ SipMessage inviteRequest = generateSipRequest(SipMessageUtils.INVITE_SIP_METHOD, attr);
+ filterMessage(inviteRequest, attr);
+ assertTrue(mTrackerUT.getConfirmedDialogs().isEmpty());
+ verifyContainsCallIds(mTrackerUT.getEarlyDialogs(), attr);
+
+ // confirmed dialog
+ attr.setToTag();
+ SipMessage inviteConfirm = generateSipResponse("200", "OK", attr);
+ filterMessage(inviteConfirm, attr);
+ assertTrue(mTrackerUT.getEarlyDialogs().isEmpty());
+ verifyContainsCallIds(mTrackerUT.getConfirmedDialogs(), attr);
+
+ //forcefully close session
+ mTrackerUT.cleanupSession(attr.callId);
+ assertTrue(mTrackerUT.getEarlyDialogs().isEmpty());
+ assertTrue(mTrackerUT.getConfirmedDialogs().isEmpty());
+ assertTrue(mTrackerUT.getClosedDialogs().isEmpty());
+
+ // verify Metrics information
+ verify(mRcsStats).onSipTransportSessionClosed(eq(TEST_SUB_ID), eq(attr.callId),
+ eq(TEST_SIP_CLOSE_RESPONSE_CODE), eq(false));
+ }
+
+ @Test
+ public void testMetricsCloseClearAllSessions() {
+ //mTrackerUT.setRcsStats(mRcsStats);
+ DialogAttributes attr = new DialogAttributes();
+
+ // INVITE
+ SipMessage inviteRequest = generateSipRequest(SipMessageUtils.INVITE_SIP_METHOD, attr);
+ filterMessage(inviteRequest, attr);
+ assertTrue(mTrackerUT.getConfirmedDialogs().isEmpty());
+ verifyContainsCallIds(mTrackerUT.getEarlyDialogs(), attr);
+
+ // confirmed dialog
+ attr.setToTag();
+ SipMessage inviteConfirm = generateSipResponse("200", "OK", attr);
+ filterMessage(inviteConfirm, attr);
+ assertTrue(mTrackerUT.getEarlyDialogs().isEmpty());
+ verifyContainsCallIds(mTrackerUT.getConfirmedDialogs(), attr);
+
+ //forcefully close session
+ mTrackerUT.clearAllSessions();
+ assertTrue(mTrackerUT.getEarlyDialogs().isEmpty());
+ assertTrue(mTrackerUT.getConfirmedDialogs().isEmpty());
+ assertTrue(mTrackerUT.getClosedDialogs().isEmpty());
+
+ // verify Metrics information
+ verify(mRcsStats).onSipTransportSessionClosed(eq(TEST_SUB_ID), eq(attr.callId),
+ eq(TEST_SIP_CLOSE_RESPONSE_CODE), eq(false));
}
@Test
@@ -291,7 +393,8 @@
public void testAcknowledgeMessageFailed() {
DialogAttributes attr = new DialogAttributes();
SipMessage inviteRequest = generateSipRequest(SipMessageUtils.INVITE_SIP_METHOD, attr);
- mTrackerUT.filterSipMessage(inviteRequest);
+ mTrackerUT.filterSipMessage(
+ SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING, inviteRequest);
// Do not acknowledge the request and ensure that the operation has not been applied yet.
assertTrue(mTrackerUT.getConfirmedDialogs().isEmpty());
assertTrue(mTrackerUT.getEarlyDialogs().isEmpty());
@@ -310,8 +413,10 @@
// We unexpectedly received two filter requests for the same branchId without
// acknowledgePendingMessage being called in between. Ensure that when it is called, it
// applies both operations.
- mTrackerUT.filterSipMessage(inviteRequest);
- mTrackerUT.filterSipMessage(inviteConfirm);
+ mTrackerUT.filterSipMessage(
+ SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING, inviteRequest);
+ mTrackerUT.filterSipMessage(
+ SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING, inviteConfirm);
assertTrue(mTrackerUT.getEarlyDialogs().isEmpty());
assertTrue(mTrackerUT.getConfirmedDialogs().isEmpty());
// we should skip right to confirmed as both operations run back-to-back
@@ -321,7 +426,8 @@
}
private void filterMessage(SipMessage m, DialogAttributes attr) {
- mTrackerUT.filterSipMessage(m);
+ mTrackerUT.filterSipMessage(
+ SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING, m);
mTrackerUT.acknowledgePendingMessage(attr.branchId);
}
private void verifyContainsCallIds(Set<SipDialog> callIdSet, DialogAttributes... attrs) {
diff --git a/tests/src/com/android/services/telephony/rcs/TransportSipMessageValidatorTest.java b/tests/src/com/android/services/telephony/rcs/TransportSipMessageValidatorTest.java
index 4d222e3..0fe897f 100644
--- a/tests/src/com/android/services/telephony/rcs/TransportSipMessageValidatorTest.java
+++ b/tests/src/com/android/services/telephony/rcs/TransportSipMessageValidatorTest.java
@@ -16,6 +16,9 @@
package com.android.services.telephony.rcs;
+import static com.android.internal.telephony.TelephonyStatsLog.SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__INCOMING;
+import static com.android.internal.telephony.TelephonyStatsLog.SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
@@ -23,6 +26,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -37,6 +41,7 @@
import com.android.TelephonyTestBase;
import com.android.TestExecutorService;
+import com.android.internal.telephony.metrics.RcsStats;
import com.android.services.telephony.rcs.validator.IncomingTransportStateValidator;
import com.android.services.telephony.rcs.validator.OutgoingTransportStateValidator;
import com.android.services.telephony.rcs.validator.ValidationResult;
@@ -76,6 +81,8 @@
private IncomingTransportStateValidator mIncomingStateValidator;
@Mock
private OutgoingTransportStateValidator mOutgoingStateValidator;
+ @Mock
+ private RcsStats mRcsStats;
@Before
public void setUp() throws Exception {
@@ -117,12 +124,50 @@
}
@Test
+ public void testMetricsResponse() {
+ String testSipInviteMethod = "INVITE";
+ String testSipMessageMethod = "MESSAGE";
+ int testSipResponseCode = 200;
+ int testMessageError = 0;
+
+ TestExecutorService executor = new TestExecutorService();
+ TransportSipMessageValidator tracker = openTransport(executor);
+ // Since the incoming/outgoing messages were verified, there should have been two calls
+ // to filter the message.
+ verify(mSipSessionTracker).filterSipMessage(
+ SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING, TEST_MESSAGE);
+ verify(mSipSessionTracker).filterSipMessage(
+ SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__INCOMING, TEST_MESSAGE);
+
+ assertTrue(tracker.verifyOutgoingMessage(generateSipRequest("INVITE",
+ "testId1"), TEST_CONFIG_VERSION).isValidated);
+ verify(mRcsStats).onSipMessageRequest(eq("testId1"),
+ eq(testSipInviteMethod),
+ eq(SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING));
+
+ assertTrue(tracker.verifyOutgoingMessage(generateSipRequest("MESSAGE",
+ "testId2"), TEST_CONFIG_VERSION).isValidated);
+ verify(mRcsStats).onSipMessageRequest(eq("testId2"),
+ eq(testSipMessageMethod),
+ eq(SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING));
+
+ assertTrue(tracker.verifyIncomingMessage(
+ generateSipResponse("200", "OK", "testId2"))
+ .isValidated);
+ verify(mRcsStats).onSipMessageResponse(eq(TEST_SUB_ID), eq("testId2"),
+ eq(testSipResponseCode), eq(testMessageError));
+ }
+
+ @Test
public void testSessionTrackerFiltering() {
TestExecutorService executor = new TestExecutorService();
TransportSipMessageValidator tracker = openTransport(executor);
// Since the incoming/outgoing messages were verified, there should have been two calls
// to filter the message.
- verify(mSipSessionTracker, times(2)).filterSipMessage(TEST_MESSAGE);
+ verify(mSipSessionTracker).filterSipMessage(
+ SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING, TEST_MESSAGE);
+ verify(mSipSessionTracker).filterSipMessage(
+ SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__INCOMING, TEST_MESSAGE);
// ensure pass through methods are working
tracker.acknowledgePendingMessage("abc");
verify(mSipSessionTracker).acknowledgePendingMessage("abc");
@@ -140,7 +185,10 @@
assertFalse(tracker.verifyOutgoingMessage(TEST_MESSAGE, TEST_CONFIG_VERSION).isValidated);
// The number of times the filter method was called should still only be two after these
// messages were not validated.
- verify(mSipSessionTracker, times(2)).filterSipMessage(TEST_MESSAGE);
+ verify(mSipSessionTracker).filterSipMessage(
+ SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__OUTGOING, TEST_MESSAGE);
+ verify(mSipSessionTracker).filterSipMessage(
+ SIP_TRANSPORT_SESSION__SIP_MESSAGE_DIRECTION__INCOMING, TEST_MESSAGE);
}
@@ -482,6 +530,27 @@
doReturn(ValidationResult.SUCCESS).when(mIncomingStateValidator).validate(any());
doReturn(mIncomingStateValidator).when(mIncomingStateValidator).andThen(any());
return new TransportSipMessageValidator(TEST_SUB_ID, executor, mSipSessionTracker,
- mOutgoingStateValidator, mIncomingStateValidator);
+ mOutgoingStateValidator, mIncomingStateValidator, mRcsStats);
+ }
+
+ private SipMessage generateSipResponse(String statusCode, String statusString, String callId) {
+ String fromHeader = "Alice <sip:alice@atlanta.com>;tag=1928301774";
+ String toHeader = "Bob <sip:bob@biloxi.com>";
+ String branchId = "AAAA";
+ String fromTag = "tag=1928301774";
+ String toTag = "";
+ return SipMessageUtils.generateSipResponse(statusCode, statusString, fromHeader,
+ toHeader, branchId, callId, fromTag, toTag);
+ }
+
+ private SipMessage generateSipRequest(String requestMethod, String callId) {
+ String fromHeader = "Alice <sip:alice@atlanta.com>;tag=1928301774";
+ String toHeader = "Bob <sip:bob@biloxi.com>";
+ String branchId = "AAAA";
+ String fromTag = "tag=1928301774";
+ String toTag = "";
+ String toUri = "sip:bob@biloxi.com";
+ return SipMessageUtils.generateSipRequest(requestMethod, fromHeader, toHeader,
+ toUri, branchId, callId, fromTag, toTag);
}
}